diff --git a/src/Umbraco.Web.UI.Client/index.ts b/src/Umbraco.Web.UI.Client/index.ts index 841103f1bccc..183011fac6cb 100644 --- a/src/Umbraco.Web.UI.Client/index.ts +++ b/src/Umbraco.Web.UI.Client/index.ts @@ -2,33 +2,40 @@ import { startMockServiceWorker } from './src/mocks/index.js'; import { UmbAppElement } from '@umbraco-cms/backoffice/app'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -const appElement = new UmbAppElement(); -appElement.backofficePath = '/'; +/** + * + */ +async function bootstrap() { + const appElement = new UmbAppElement(); + appElement.backofficePath = '/'; -//#region Vite Mock Setup -if (import.meta.env.VITE_UMBRACO_USE_MSW === 'on') { - appElement.bypassAuth = true; - startMockServiceWorker(); -} else { - appElement.serverUrl = import.meta.env.VITE_UMBRACO_API_URL; -} + //#region Vite Mock Setup + if (import.meta.env.VITE_UMBRACO_USE_MSW === 'on') { + appElement.bypassAuth = true; + await startMockServiceWorker(); + } else { + appElement.serverUrl = import.meta.env.VITE_UMBRACO_API_URL; + } + + // Example injector: + if (import.meta.env.VITE_EXAMPLE_PATH) { + import(/* @vite-ignore */ './' + import.meta.env.VITE_EXAMPLE_PATH + '/index.ts').then((js) => { + if (js) { + Object.keys(js).forEach((key) => { + const value = js[key]; -// Example injector: -if (import.meta.env.VITE_EXAMPLE_PATH) { - import(/* @vite-ignore */ './' + import.meta.env.VITE_EXAMPLE_PATH + '/index.ts').then((js) => { - if (js) { - Object.keys(js).forEach((key) => { - const value = js[key]; + if (Array.isArray(value)) { + umbExtensionsRegistry.registerMany(value); + } else if (typeof value === 'object') { + umbExtensionsRegistry.register(value); + } + }); + } + }); + } + //#endregion - if (Array.isArray(value)) { - umbExtensionsRegistry.registerMany(value); - } else if (typeof value === 'object') { - umbExtensionsRegistry.register(value); - } - }); - } - }); + document.body.append(appElement); } -//#endregion -document.body.append(appElement); +bootstrap(); diff --git a/src/Umbraco.Web.UI.Client/mockServiceWorker.js b/src/Umbraco.Web.UI.Client/mockServiceWorker.js index c72c0c89c156..558540fa5762 100644 --- a/src/Umbraco.Web.UI.Client/mockServiceWorker.js +++ b/src/Umbraco.Web.UI.Client/mockServiceWorker.js @@ -2,301 +2,348 @@ /* tslint:disable */ /** - * Mock Service Worker (1.3.5). + * Mock Service Worker. * @see https://github.com/mswjs/msw * - Please do NOT modify this file. - * - Please do NOT serve this file on production. */ -const INTEGRITY_CHECKSUM = '3d6b9f06410d179a7f7404d4bf4c3c70'; -const activeClientIds = new Set(); - -self.addEventListener('install', function () { - self.skipWaiting(); -}); - -self.addEventListener('activate', function (event) { - event.waitUntil(self.clients.claim()); -}); - -self.addEventListener('message', async function (event) { - const clientId = event.source.id; - - if (!clientId || !self.clients) { - return; - } - - const client = await self.clients.get(clientId); - - if (!client) { - return; - } - - const allClients = await self.clients.matchAll({ - type: 'window', - }); - - switch (event.data) { - case 'KEEPALIVE_REQUEST': { - sendToClient(client, { - type: 'KEEPALIVE_RESPONSE', - }); - break; - } - - case 'INTEGRITY_CHECK_REQUEST': { - sendToClient(client, { - type: 'INTEGRITY_CHECK_RESPONSE', - payload: INTEGRITY_CHECKSUM, - }); - break; - } - - case 'MOCK_ACTIVATE': { - activeClientIds.add(clientId); - - sendToClient(client, { - type: 'MOCKING_ENABLED', - payload: true, - }); - break; - } - - case 'MOCK_DEACTIVATE': { - activeClientIds.delete(clientId); - break; - } - - case 'CLIENT_CLOSED': { - activeClientIds.delete(clientId); - - const remainingClients = allClients.filter((client) => { - return client.id !== clientId; - }); - - // Unregister itself when there are no more clients - if (remainingClients.length === 0) { - self.registration.unregister(); - } - - break; - } - } -}); - -self.addEventListener('fetch', function (event) { - const { request } = event; - const accept = request.headers.get('accept') || ''; - - // Bypass server-sent events. - if (accept.includes('text/event-stream')) { - return; - } - - // Bypass navigation requests. - if (request.mode === 'navigate') { - return; - } - - // Opening the DevTools triggers the "only-if-cached" request - // that cannot be handled by the worker. Bypass such requests. - if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { - return; - } - - // Bypass all requests when there are no active clients. - // Prevents the self-unregistered worked from handling requests - // after it's been deleted (still remains active until the next reload). - if (activeClientIds.size === 0) { - return; - } - - // Generate unique request ID. - const requestId = Math.random().toString(16).slice(2); - - event.respondWith( - handleRequest(event, requestId).catch((error) => { - if (error.name === 'NetworkError') { - console.warn( - '[MSW] Successfully emulated a network error for the "%s %s" request.', - request.method, - request.url, - ); - return; - } - - // At this point, any exception indicates an issue with the original request/response. - console.error( - `\ -[MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`, - request.method, - request.url, - `${error.name}: ${error.message}`, - ); - }), - ); -}); - -async function handleRequest(event, requestId) { - const client = await resolveMainClient(event); - const response = await getResponse(event, client, requestId); - - // Send back the response clone for the "response:*" life-cycle events. - // Ensure MSW is active and ready to handle the message, otherwise - // this message will pend indefinitely. - if (client && activeClientIds.has(client.id)) { - (async function () { - const clonedResponse = response.clone(); - sendToClient(client, { - type: 'RESPONSE', - payload: { - requestId, - type: clonedResponse.type, - ok: clonedResponse.ok, - status: clonedResponse.status, - statusText: clonedResponse.statusText, - body: clonedResponse.body === null ? null : await clonedResponse.text(), - headers: Object.fromEntries(clonedResponse.headers.entries()), - redirected: clonedResponse.redirected, - }, - }); - })(); - } - - return response; +const PACKAGE_VERSION = '2.12.4' +const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82' +const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') +const activeClientIds = new Set() + +addEventListener('install', function () { + self.skipWaiting() +}) + +addEventListener('activate', function (event) { + event.waitUntil(self.clients.claim()) +}) + +addEventListener('message', async function (event) { + const clientId = Reflect.get(event.source || {}, 'id') + + if (!clientId || !self.clients) { + return + } + + const client = await self.clients.get(clientId) + + if (!client) { + return + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }) + + switch (event.data) { + case 'KEEPALIVE_REQUEST': { + sendToClient(client, { + type: 'KEEPALIVE_RESPONSE', + }) + break + } + + case 'INTEGRITY_CHECK_REQUEST': { + sendToClient(client, { + type: 'INTEGRITY_CHECK_RESPONSE', + payload: { + packageVersion: PACKAGE_VERSION, + checksum: INTEGRITY_CHECKSUM, + }, + }) + break + } + + case 'MOCK_ACTIVATE': { + activeClientIds.add(clientId) + + sendToClient(client, { + type: 'MOCKING_ENABLED', + payload: { + client: { + id: client.id, + frameType: client.frameType, + }, + }, + }) + break + } + + case 'CLIENT_CLOSED': { + activeClientIds.delete(clientId) + + const remainingClients = allClients.filter((client) => { + return client.id !== clientId + }) + + // Unregister itself when there are no more clients + if (remainingClients.length === 0) { + self.registration.unregister() + } + + break + } + } +}) + +addEventListener('fetch', function (event) { + const requestInterceptedAt = Date.now() + + // Bypass navigation requests. + if (event.request.mode === 'navigate') { + return + } + + // Opening the DevTools triggers the "only-if-cached" request + // that cannot be handled by the worker. Bypass such requests. + if ( + event.request.cache === 'only-if-cached' && + event.request.mode !== 'same-origin' + ) { + return + } + + // Bypass all requests when there are no active clients. + // Prevents the self-unregistered worked from handling requests + // after it's been terminated (still remains active until the next reload). + if (activeClientIds.size === 0) { + return + } + + const requestId = crypto.randomUUID() + event.respondWith(handleRequest(event, requestId, requestInterceptedAt)) +}) + +/** + * @param {FetchEvent} event + * @param {string} requestId + * @param {number} requestInterceptedAt + */ +async function handleRequest(event, requestId, requestInterceptedAt) { + const client = await resolveMainClient(event) + const requestCloneForEvents = event.request.clone() + const response = await getResponse( + event, + client, + requestId, + requestInterceptedAt, + ) + + // Send back the response clone for the "response:*" life-cycle events. + // Ensure MSW is active and ready to handle the message, otherwise + // this message will pend indefinitely. + if (client && activeClientIds.has(client.id)) { + const serializedRequest = await serializeRequest(requestCloneForEvents) + + // Clone the response so both the client and the library could consume it. + const responseClone = response.clone() + + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + isMockedResponse: IS_MOCKED_RESPONSE in response, + request: { + id: requestId, + ...serializedRequest, + }, + response: { + type: responseClone.type, + status: responseClone.status, + statusText: responseClone.statusText, + headers: Object.fromEntries(responseClone.headers.entries()), + body: responseClone.body, + }, + }, + }, + responseClone.body ? [serializedRequest.body, responseClone.body] : [], + ) + } + + return response } -// Resolve the main client for the given event. -// Client that issues a request doesn't necessarily equal the client -// that registered the worker. It's with the latter the worker should -// communicate with during the response resolving phase. +/** + * Resolve the main client for the given event. + * Client that issues a request doesn't necessarily equal the client + * that registered the worker. It's with the latter the worker should + * communicate with during the response resolving phase. + * @param {FetchEvent} event + * @returns {Promise} + */ async function resolveMainClient(event) { - const client = await self.clients.get(event.clientId); - - if (client?.frameType === 'top-level') { - return client; - } - - const allClients = await self.clients.matchAll({ - type: 'window', - }); - - return allClients - .filter((client) => { - // Get only those clients that are currently visible. - return client.visibilityState === 'visible'; - }) - .find((client) => { - // Find the client ID that's recorded in the - // set of clients that have registered the worker. - return activeClientIds.has(client.id); - }); + const client = await self.clients.get(event.clientId) + + if (activeClientIds.has(event.clientId)) { + return client + } + + if (client?.frameType === 'top-level') { + return client + } + + const allClients = await self.clients.matchAll({ + type: 'window', + }) + + return allClients + .filter((client) => { + // Get only those clients that are currently visible. + return client.visibilityState === 'visible' + }) + .find((client) => { + // Find the client ID that's recorded in the + // set of clients that have registered the worker. + return activeClientIds.has(client.id) + }) } -async function getResponse(event, client, requestId) { - const { request } = event; - const clonedRequest = request.clone(); - - function passthrough() { - // Clone the request because it might've been already used - // (i.e. its body has been read and sent to the client). - const headers = Object.fromEntries(clonedRequest.headers.entries()); - - // Remove MSW-specific request headers so the bypassed requests - // comply with the server's CORS preflight check. - // Operate with the headers as an object because request "Headers" - // are immutable. - delete headers['x-msw-bypass']; - - return fetch(clonedRequest, { headers }); - } - - // Bypass mocking when the client is not active. - if (!client) { - return passthrough(); - } - - // Bypass initial page load requests (i.e. static assets). - // The absence of the immediate/parent client in the map of the active clients - // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet - // and is not ready to handle requests. - if (!activeClientIds.has(client.id)) { - return passthrough(); - } - - // Bypass requests with the explicit bypass header. - // Such requests can be issued by "ctx.fetch()". - if (request.headers.get('x-msw-bypass') === 'true') { - return passthrough(); - } - - // Notify the client that a request has been intercepted. - const clientMessage = await sendToClient(client, { - type: 'REQUEST', - payload: { - id: requestId, - url: request.url, - method: request.method, - headers: Object.fromEntries(request.headers.entries()), - cache: request.cache, - mode: request.mode, - credentials: request.credentials, - destination: request.destination, - integrity: request.integrity, - redirect: request.redirect, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - body: await request.text(), - bodyUsed: request.bodyUsed, - keepalive: request.keepalive, - }, - }); - - switch (clientMessage.type) { - case 'MOCK_RESPONSE': { - return respondWithMock(clientMessage.data); - } - - case 'MOCK_NOT_FOUND': { - return passthrough(); - } - - case 'NETWORK_ERROR': { - const { name, message } = clientMessage.data; - const networkError = new Error(message); - networkError.name = name; - - // Rejecting a "respondWith" promise emulates a network error. - throw networkError; - } - } - - return passthrough(); +/** + * @param {FetchEvent} event + * @param {Client | undefined} client + * @param {string} requestId + * @param {number} requestInterceptedAt + * @returns {Promise} + */ +async function getResponse(event, client, requestId, requestInterceptedAt) { + // Clone the request because it might've been already used + // (i.e. its body has been read and sent to the client). + const requestClone = event.request.clone() + + function passthrough() { + // Cast the request headers to a new Headers instance + // so the headers can be manipulated with. + const headers = new Headers(requestClone.headers) + + // Remove the "accept" header value that marked this request as passthrough. + // This prevents request alteration and also keeps it compliant with the + // user-defined CORS policies. + const acceptHeader = headers.get('accept') + if (acceptHeader) { + const values = acceptHeader.split(',').map((value) => value.trim()) + const filteredValues = values.filter( + (value) => value !== 'msw/passthrough', + ) + + if (filteredValues.length > 0) { + headers.set('accept', filteredValues.join(', ')) + } else { + headers.delete('accept') + } + } + + return fetch(requestClone, { headers }) + } + + // Bypass mocking when the client is not active. + if (!client) { + return passthrough() + } + + // Bypass initial page load requests (i.e. static assets). + // The absence of the immediate/parent client in the map of the active clients + // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet + // and is not ready to handle requests. + if (!activeClientIds.has(client.id)) { + return passthrough() + } + + // Notify the client that a request has been intercepted. + const serializedRequest = await serializeRequest(event.request) + const clientMessage = await sendToClient( + client, + { + type: 'REQUEST', + payload: { + id: requestId, + interceptedAt: requestInterceptedAt, + ...serializedRequest, + }, + }, + [serializedRequest.body], + ) + + switch (clientMessage.type) { + case 'MOCK_RESPONSE': { + return respondWithMock(clientMessage.data) + } + + case 'PASSTHROUGH': { + return passthrough() + } + } + + return passthrough() } -function sendToClient(client, message) { - return new Promise((resolve, reject) => { - const channel = new MessageChannel(); - - channel.port1.onmessage = (event) => { - if (event.data && event.data.error) { - return reject(event.data.error); - } - - resolve(event.data); - }; - - client.postMessage(message, [channel.port2]); - }); +/** + * @param {Client} client + * @param {any} message + * @param {Array} transferrables + * @returns {Promise} + */ +function sendToClient(client, message, transferrables = []) { + return new Promise((resolve, reject) => { + const channel = new MessageChannel() + + channel.port1.onmessage = (event) => { + if (event.data && event.data.error) { + return reject(event.data.error) + } + + resolve(event.data) + } + + client.postMessage(message, [ + channel.port2, + ...transferrables.filter(Boolean), + ]) + }) } -function sleep(timeMs) { - return new Promise((resolve) => { - setTimeout(resolve, timeMs); - }); +/** + * @param {Response} response + * @returns {Response} + */ +function respondWithMock(response) { + // Setting response status code to 0 is a no-op. + // However, when responding with a "Response.error()", the produced Response + // instance will have status code set to 0. Since it's not possible to create + // a Response instance with status code 0, handle that use-case separately. + if (response.status === 0) { + return Response.error() + } + + const mockedResponse = new Response(response.body, response) + + Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { + value: true, + enumerable: true, + }) + + return mockedResponse } -async function respondWithMock(response) { - await sleep(response.delay); - return new Response(response.body, response); +/** + * @param {Request} request + */ +async function serializeRequest(request) { + return { + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: await request.arrayBuffer(), + keepalive: request.keepalive, + } } diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index c483781a0c17..95fcc09c9a81 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -46,7 +46,7 @@ "eslint-plugin-wc": "^3.0.2", "globals": "^16.4.0", "madge": "^8.0.0", - "msw": "^1.3.5", + "msw": "^2.12.4", "playwright-msw": "^3.0.1", "postcss": "^8.5.6", "postcss-cli": "^11.0.1", @@ -1216,15 +1216,25 @@ "dev": true, "license": "MIT" }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", - "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dev": true, "license": "MIT", "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.6.3" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -1238,6 +1248,75 @@ } } }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -1347,48 +1426,22 @@ "ws": "^7.5.10" } }, - "node_modules/@mswjs/cookies": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.2.2.tgz", - "integrity": "sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/set-cookie-parser": "^2.4.0", - "set-cookie-parser": "^2.4.6" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/@mswjs/interceptors": { - "version": "0.17.10", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.10.tgz", - "integrity": "sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.40.0.tgz", + "integrity": "sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==", "dev": true, "license": "MIT", "dependencies": { - "@open-draft/until": "^1.0.3", - "@types/debug": "^4.1.7", - "@xmldom/xmldom": "^0.8.3", - "debug": "^4.3.3", - "headers-polyfill": "3.2.5", - "outvariant": "^1.2.1", - "strict-event-emitter": "^0.2.4", - "web-encoding": "^1.1.5" + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@mswjs/interceptors/node_modules/strict-event-emitter": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz", - "integrity": "sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "events": "^3.3.0" + "node": ">=18" } }, "node_modules/@nodelib/fs.scandir": { @@ -1429,10 +1482,28 @@ "node": ">= 8" } }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, "node_modules/@open-draft/until": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-1.0.3.tgz", - "integrity": "sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true, "license": "MIT" }, @@ -2850,13 +2921,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/cookies": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.1.tgz", @@ -2998,13 +3062,6 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/js-levenshtein": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz", - "integrity": "sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -3180,16 +3237,6 @@ "@types/send": "*" } }, - "node_modules/@types/set-cookie-parser": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", - "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/sinon": { "version": "17.0.4", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.4.tgz", @@ -3218,6 +3265,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -5095,24 +5149,6 @@ "node": ">=18.0.0" } }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@zxing/text-encoding": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", - "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", - "dev": true, - "license": "(Unlicense OR Apache-2.0)", - "optional": true - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -6085,13 +6121,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", - "dev": true, - "license": "MIT" - }, "node_modules/check-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", @@ -6186,13 +6215,13 @@ } }, "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, "license": "ISC", "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/cliui": { @@ -6432,13 +6461,17 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/cookies": { @@ -8138,16 +8171,6 @@ "node": ">=6" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/eventsource": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", @@ -8344,32 +8367,6 @@ "tough-cookie": "^4.0.0" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -8902,9 +8899,9 @@ "license": "MIT" }, "node_modules/graphql": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", - "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", + "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", "dev": true, "license": "MIT", "engines": { @@ -9036,9 +9033,9 @@ } }, "node_modules/headers-polyfill": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.2.5.tgz", - "integrity": "sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", "dev": true, "license": "MIT" }, @@ -9145,19 +9142,6 @@ "node": ">=10.17.0" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -9262,33 +9246,6 @@ "dev": true, "license": "ISC" }, - "node_modules/inquirer": { - "version": "8.2.7", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz", - "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/external-editor": "^1.0.0", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/internal-ip": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", @@ -9353,23 +9310,6 @@ "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -10054,16 +9994,6 @@ "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/js-levenshtein-esm": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/js-levenshtein-esm/-/js-levenshtein-esm-2.0.0.tgz", @@ -11706,45 +11636,43 @@ "license": "MIT" }, "node_modules/msw": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/msw/-/msw-1.3.5.tgz", - "integrity": "sha512-nG3fpmBXxFbKSIdk6miPuL3KjU6WMxgoW4tG1YgnP1M+TRG3Qn7b7R0euKAHq4vpwARHb18ZyfZljSxsTnMX2w==", + "version": "2.12.4", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.4.tgz", + "integrity": "sha512-rHNiVfTyKhzc0EjoXUBVGteNKBevdjOlVC6GlIRXpy+/3LHEIGRovnB5WPjcvmNODVQ1TNFnoa7wsGbd0V3epg==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "@mswjs/cookies": "^0.2.2", - "@mswjs/interceptors": "^0.17.10", - "@open-draft/until": "^1.0.3", - "@types/cookie": "^0.4.1", - "@types/js-levenshtein": "^1.1.1", - "chalk": "^4.1.1", - "chokidar": "^3.4.2", - "cookie": "^0.4.2", - "graphql": "^16.8.1", - "headers-polyfill": "3.2.5", - "inquirer": "^8.2.0", + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.40.0", + "@open-draft/deferred-promise": "^2.2.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.0.2", + "graphql": "^16.12.0", + "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", - "js-levenshtein": "^1.1.6", - "node-fetch": "^2.6.7", - "outvariant": "^1.4.0", + "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", - "strict-event-emitter": "^0.4.3", - "type-fest": "^2.19.0", - "yargs": "^17.3.1" + "picocolors": "^1.1.1", + "rettime": "^0.7.0", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.0", + "type-fest": "^5.2.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" }, "bin": { "msw": "cli/index.js" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mswjs" + "url": "https://github.com/sponsors/mswjs" }, "peerDependencies": { - "typescript": ">= 4.4.x" + "typescript": ">= 4.8.x" }, "peerDependenciesMeta": { "typescript": { @@ -11752,76 +11680,54 @@ } } }, - "node_modules/msw/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/msw/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/msw/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, "engines": { - "node": ">= 6" + "node": ">= 0.8" } }, - "node_modules/msw/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/msw/node_modules/tough-cookie": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", + "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "picomatch": "^2.2.1" + "tldts": "^7.0.5" }, "engines": { - "node": ">=8.10.0" + "node": ">=16" } }, "node_modules/msw/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.1.tgz", + "integrity": "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==", "dev": true, "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, "engines": { - "node": ">=12.20" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, "node_modules/mylas": { "version": "2.1.13", @@ -12657,13 +12563,6 @@ "node": ">=18" } }, - "node_modules/playwright-msw/node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true, - "license": "MIT" - }, "node_modules/plimit-lit": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", @@ -14341,6 +14240,13 @@ "node": ">=8" } }, + "node_modules/rettime": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.7.0.tgz", + "integrity": "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==", + "dev": true, + "license": "MIT" + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -14410,16 +14316,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -15018,9 +14914,9 @@ } }, "node_modules/strict-event-emitter": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz", - "integrity": "sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", "dev": true, "license": "MIT" }, @@ -15327,6 +15223,19 @@ "node": ">=12.17" } }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tapable": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", @@ -15381,13 +15290,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, "node_modules/tiny-glob": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", @@ -15462,6 +15364,26 @@ "node": ">=14.0.0" } }, + "node_modules/tldts": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.19.tgz", + "integrity": "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.19" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz", + "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==", + "dev": true, + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -16231,6 +16153,16 @@ "node": ">=14.0.0" } }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -16282,20 +16214,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16629,19 +16547,6 @@ "node": ">=14.17" } }, - "node_modules/web-encoding": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", - "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "util": "^0.12.3" - }, - "optionalDependencies": { - "@zxing/text-encoding": "0.9.0" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -16950,6 +16855,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index aac3ea025025..bbb0fc218a8c 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -253,7 +253,7 @@ "eslint-plugin-wc": "^3.0.2", "globals": "^16.4.0", "madge": "^8.0.0", - "msw": "^1.3.5", + "msw": "^2.12.4", "playwright-msw": "^3.0.1", "postcss": "^8.5.6", "postcss-cli": "^11.0.1", diff --git a/src/Umbraco.Web.UI.Client/public/mockServiceWorker.js b/src/Umbraco.Web.UI.Client/public/mockServiceWorker.js index 1f45c4cf81d0..558540fa5762 100644 --- a/src/Umbraco.Web.UI.Client/public/mockServiceWorker.js +++ b/src/Umbraco.Web.UI.Client/public/mockServiceWorker.js @@ -2,25 +2,26 @@ /* tslint:disable */ /** - * Mock Service Worker (1.3.5). + * Mock Service Worker. * @see https://github.com/mswjs/msw * - Please do NOT modify this file. - * - Please do NOT serve this file on production. */ -const INTEGRITY_CHECKSUM = '3d6b9f06410d179a7f7404d4bf4c3c70' +const PACKAGE_VERSION = '2.12.4' +const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82' +const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() -self.addEventListener('install', function () { +addEventListener('install', function () { self.skipWaiting() }) -self.addEventListener('activate', function (event) { +addEventListener('activate', function (event) { event.waitUntil(self.clients.claim()) }) -self.addEventListener('message', async function (event) { - const clientId = event.source.id +addEventListener('message', async function (event) { + const clientId = Reflect.get(event.source || {}, 'id') if (!clientId || !self.clients) { return @@ -47,7 +48,10 @@ self.addEventListener('message', async function (event) { case 'INTEGRITY_CHECK_REQUEST': { sendToClient(client, { type: 'INTEGRITY_CHECK_RESPONSE', - payload: INTEGRITY_CHECKSUM, + payload: { + packageVersion: PACKAGE_VERSION, + checksum: INTEGRITY_CHECKSUM, + }, }) break } @@ -57,16 +61,16 @@ self.addEventListener('message', async function (event) { sendToClient(client, { type: 'MOCKING_ENABLED', - payload: true, + payload: { + client: { + id: client.id, + frameType: client.frameType, + }, + }, }) break } - case 'MOCK_DEACTIVATE': { - activeClientIds.delete(clientId) - break - } - case 'CLIENT_CLOSED': { activeClientIds.delete(clientId) @@ -84,96 +88,99 @@ self.addEventListener('message', async function (event) { } }) -self.addEventListener('fetch', function (event) { - const { request } = event - const accept = request.headers.get('accept') || '' - - // Bypass server-sent events. - if (accept.includes('text/event-stream')) { - return - } +addEventListener('fetch', function (event) { + const requestInterceptedAt = Date.now() // Bypass navigation requests. - if (request.mode === 'navigate') { + if (event.request.mode === 'navigate') { return } // Opening the DevTools triggers the "only-if-cached" request // that cannot be handled by the worker. Bypass such requests. - if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + if ( + event.request.cache === 'only-if-cached' && + event.request.mode !== 'same-origin' + ) { return } // Bypass all requests when there are no active clients. // Prevents the self-unregistered worked from handling requests - // after it's been deleted (still remains active until the next reload). + // after it's been terminated (still remains active until the next reload). if (activeClientIds.size === 0) { return } - // Generate unique request ID. - const requestId = Math.random().toString(16).slice(2) - - event.respondWith( - handleRequest(event, requestId).catch((error) => { - if (error.name === 'NetworkError') { - console.warn( - '[MSW] Successfully emulated a network error for the "%s %s" request.', - request.method, - request.url, - ) - return - } - - // At this point, any exception indicates an issue with the original request/response. - console.error( - `\ -[MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`, - request.method, - request.url, - `${error.name}: ${error.message}`, - ) - }), - ) + const requestId = crypto.randomUUID() + event.respondWith(handleRequest(event, requestId, requestInterceptedAt)) }) -async function handleRequest(event, requestId) { +/** + * @param {FetchEvent} event + * @param {string} requestId + * @param {number} requestInterceptedAt + */ +async function handleRequest(event, requestId, requestInterceptedAt) { const client = await resolveMainClient(event) - const response = await getResponse(event, client, requestId) + const requestCloneForEvents = event.request.clone() + const response = await getResponse( + event, + client, + requestId, + requestInterceptedAt, + ) // Send back the response clone for the "response:*" life-cycle events. // Ensure MSW is active and ready to handle the message, otherwise // this message will pend indefinitely. if (client && activeClientIds.has(client.id)) { - ;(async function () { - const clonedResponse = response.clone() - sendToClient(client, { + const serializedRequest = await serializeRequest(requestCloneForEvents) + + // Clone the response so both the client and the library could consume it. + const responseClone = response.clone() + + sendToClient( + client, + { type: 'RESPONSE', payload: { - requestId, - type: clonedResponse.type, - ok: clonedResponse.ok, - status: clonedResponse.status, - statusText: clonedResponse.statusText, - body: - clonedResponse.body === null ? null : await clonedResponse.text(), - headers: Object.fromEntries(clonedResponse.headers.entries()), - redirected: clonedResponse.redirected, + isMockedResponse: IS_MOCKED_RESPONSE in response, + request: { + id: requestId, + ...serializedRequest, + }, + response: { + type: responseClone.type, + status: responseClone.status, + statusText: responseClone.statusText, + headers: Object.fromEntries(responseClone.headers.entries()), + body: responseClone.body, + }, }, - }) - })() + }, + responseClone.body ? [serializedRequest.body, responseClone.body] : [], + ) } return response } -// Resolve the main client for the given event. -// Client that issues a request doesn't necessarily equal the client -// that registered the worker. It's with the latter the worker should -// communicate with during the response resolving phase. +/** + * Resolve the main client for the given event. + * Client that issues a request doesn't necessarily equal the client + * that registered the worker. It's with the latter the worker should + * communicate with during the response resolving phase. + * @param {FetchEvent} event + * @returns {Promise} + */ async function resolveMainClient(event) { const client = await self.clients.get(event.clientId) + if (activeClientIds.has(event.clientId)) { + return client + } + if (client?.frameType === 'top-level') { return client } @@ -194,22 +201,41 @@ async function resolveMainClient(event) { }) } -async function getResponse(event, client, requestId) { - const { request } = event - const clonedRequest = request.clone() +/** + * @param {FetchEvent} event + * @param {Client | undefined} client + * @param {string} requestId + * @param {number} requestInterceptedAt + * @returns {Promise} + */ +async function getResponse(event, client, requestId, requestInterceptedAt) { + // Clone the request because it might've been already used + // (i.e. its body has been read and sent to the client). + const requestClone = event.request.clone() function passthrough() { - // Clone the request because it might've been already used - // (i.e. its body has been read and sent to the client). - const headers = Object.fromEntries(clonedRequest.headers.entries()) + // Cast the request headers to a new Headers instance + // so the headers can be manipulated with. + const headers = new Headers(requestClone.headers) + + // Remove the "accept" header value that marked this request as passthrough. + // This prevents request alteration and also keeps it compliant with the + // user-defined CORS policies. + const acceptHeader = headers.get('accept') + if (acceptHeader) { + const values = acceptHeader.split(',').map((value) => value.trim()) + const filteredValues = values.filter( + (value) => value !== 'msw/passthrough', + ) - // Remove MSW-specific request headers so the bypassed requests - // comply with the server's CORS preflight check. - // Operate with the headers as an object because request "Headers" - // are immutable. - delete headers['x-msw-bypass'] + if (filteredValues.length > 0) { + headers.set('accept', filteredValues.join(', ')) + } else { + headers.delete('accept') + } + } - return fetch(clonedRequest, { headers }) + return fetch(requestClone, { headers }) } // Bypass mocking when the client is not active. @@ -225,57 +251,41 @@ async function getResponse(event, client, requestId) { return passthrough() } - // Bypass requests with the explicit bypass header. - // Such requests can be issued by "ctx.fetch()". - if (request.headers.get('x-msw-bypass') === 'true') { - return passthrough() - } - // Notify the client that a request has been intercepted. - const clientMessage = await sendToClient(client, { - type: 'REQUEST', - payload: { - id: requestId, - url: request.url, - method: request.method, - headers: Object.fromEntries(request.headers.entries()), - cache: request.cache, - mode: request.mode, - credentials: request.credentials, - destination: request.destination, - integrity: request.integrity, - redirect: request.redirect, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - body: await request.text(), - bodyUsed: request.bodyUsed, - keepalive: request.keepalive, + const serializedRequest = await serializeRequest(event.request) + const clientMessage = await sendToClient( + client, + { + type: 'REQUEST', + payload: { + id: requestId, + interceptedAt: requestInterceptedAt, + ...serializedRequest, + }, }, - }) + [serializedRequest.body], + ) switch (clientMessage.type) { case 'MOCK_RESPONSE': { return respondWithMock(clientMessage.data) } - case 'MOCK_NOT_FOUND': { + case 'PASSTHROUGH': { return passthrough() } - - case 'NETWORK_ERROR': { - const { name, message } = clientMessage.data - const networkError = new Error(message) - networkError.name = name - - // Rejecting a "respondWith" promise emulates a network error. - throw networkError - } } return passthrough() } -function sendToClient(client, message) { +/** + * @param {Client} client + * @param {any} message + * @param {Array} transferrables + * @returns {Promise} + */ +function sendToClient(client, message, transferrables = []) { return new Promise((resolve, reject) => { const channel = new MessageChannel() @@ -287,17 +297,53 @@ function sendToClient(client, message) { resolve(event.data) } - client.postMessage(message, [channel.port2]) + client.postMessage(message, [ + channel.port2, + ...transferrables.filter(Boolean), + ]) }) } -function sleep(timeMs) { - return new Promise((resolve) => { - setTimeout(resolve, timeMs) +/** + * @param {Response} response + * @returns {Response} + */ +function respondWithMock(response) { + // Setting response status code to 0 is a no-op. + // However, when responding with a "Response.error()", the produced Response + // instance will have status code set to 0. Since it's not possible to create + // a Response instance with status code 0, handle that use-case separately. + if (response.status === 0) { + return Response.error() + } + + const mockedResponse = new Response(response.body, response) + + Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { + value: true, + enumerable: true, }) + + return mockedResponse } -async function respondWithMock(response) { - await sleep(response.delay) - return new Response(response.body, response) +/** + * @param {Request} request + */ +async function serializeRequest(request) { + return { + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: await request.arrayBuffer(), + keepalive: request.keepalive, + } } diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/backoffice.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/backoffice.handlers.ts index ca9576003e70..32adc21ca2cc 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/backoffice.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/backoffice/backoffice.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; const logoUrl = './umbraco/backoffice/assets/logo.svg'; @@ -8,49 +8,54 @@ const loginLogoAlternativeUrl = './umbraco/backoffice/assets/logo_dark.svg'; const loginBackgroundUrl = './umbraco/backoffice/assets/login.jpg'; export const handlers = [ - rest.get(umbracoPath('/security/back-office/graphics/logo'), async (req, res, ctx) => { + http.get(umbracoPath('/security/back-office/graphics/logo'), async () => { const imageBuffer = await fetch(logoUrl).then((res) => res.arrayBuffer()); - return res( - ctx.set('Content-Length', imageBuffer.byteLength.toString()), - ctx.set('Content-Type', 'image/svg+xml'), - ctx.body(imageBuffer), - ); + return new HttpResponse(imageBuffer, { + headers: { + 'Content-Length': imageBuffer.byteLength.toString(), + 'Content-Type': 'image/svg+xml', + }, + }); }), - rest.get(umbracoPath('/security/back-office/graphics/logo-alternative'), async (req, res, ctx) => { + http.get(umbracoPath('/security/back-office/graphics/logo-alternative'), async () => { const imageBuffer = await fetch(logoAlternativeUrl).then((res) => res.arrayBuffer()); - return res( - ctx.set('Content-Length', imageBuffer.byteLength.toString()), - ctx.set('Content-Type', 'image/svg+xml'), - ctx.body(imageBuffer), - ); + return new HttpResponse(imageBuffer, { + headers: { + 'Content-Length': imageBuffer.byteLength.toString(), + 'Content-Type': 'image/svg+xml', + }, + }); }), - rest.get(umbracoPath('/security/back-office/graphics/login-logo'), async (req, res, ctx) => { + http.get(umbracoPath('/security/back-office/graphics/login-logo'), async () => { const imageBuffer = await fetch(loginLogoUrl).then((res) => res.arrayBuffer()); - return res( - ctx.set('Content-Length', imageBuffer.byteLength.toString()), - ctx.set('Content-Type', 'image/svg+xml'), - ctx.body(imageBuffer), - ); + return new HttpResponse(imageBuffer, { + headers: { + 'Content-Length': imageBuffer.byteLength.toString(), + 'Content-Type': 'image/svg+xml', + }, + }); }), - rest.get(umbracoPath('/security/back-office/graphics/login-logo-alternative'), async (req, res, ctx) => { + http.get(umbracoPath('/security/back-office/graphics/login-logo-alternative'), async () => { const imageBuffer = await fetch(loginLogoAlternativeUrl).then((res) => res.arrayBuffer()); - return res( - ctx.set('Content-Length', imageBuffer.byteLength.toString()), - ctx.set('Content-Type', 'image/svg+xml'), - ctx.body(imageBuffer), - ); + return new HttpResponse(imageBuffer, { + headers: { + 'Content-Length': imageBuffer.byteLength.toString(), + 'Content-Type': 'image/svg+xml', + }, + }); }), - rest.get(umbracoPath('/security/back-office/graphics/login-background'), async (req, res, ctx) => { + http.get(umbracoPath('/security/back-office/graphics/login-background'), async () => { const imageBuffer = await fetch(loginBackgroundUrl).then((res) => res.arrayBuffer()); - return res( - ctx.set('Content-Length', imageBuffer.byteLength.toString()), - ctx.set('Content-Type', 'image/jpeg'), - ctx.body(imageBuffer), - ); + return new HttpResponse(imageBuffer, { + headers: { + 'Content-Length': imageBuffer.byteLength.toString(), + 'Content-Type': 'image/jpeg', + }, + }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/config.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/config.handlers.ts index 0729df34a5e1..410c64e78f15 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/config.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/config.handlers.ts @@ -1,13 +1,9 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { UmbServertimeOffset } from '@umbraco-cms/backoffice/models'; export const handlers = [ - rest.get(umbracoPath('/config/servertimeoffset'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ offset: -120 }), - ); + http.get(umbracoPath('/config/servertimeoffset'), () => { + return HttpResponse.json({ offset: -120 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/culture.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/culture.handlers.ts index 9a14ccfd499e..42da93a9e7aa 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/culture.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/culture.handlers.ts @@ -1,11 +1,11 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbCulturesData } from '../data/culture.data.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath('/culture'), (req, res, ctx) => { + http.get(umbracoPath('/culture'), () => { const data = umbCulturesData.get(); - return res(ctx.status(200), ctx.json(data)); + return HttpResponse.json(data); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/copy.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/copy.handlers.ts index e727fb91f6ad..004987c7ec84 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/copy.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/copy.handlers.ts @@ -1,20 +1,20 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; import type { CopyDataTypeRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const copyHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/:id/copy`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400, 'no id found')); + http.post(umbracoPath(`${UMB_SLUG}/:id/copy`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400, statusText: 'no id found' }); - const requestBody = (await req.json()) as CopyDataTypeRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); - if (!requestBody.target?.id) return res(ctx.status(400, 'no targetId found')); + const requestBody = (await request.json()) as CopyDataTypeRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); + if (!requestBody.target?.id) return new HttpResponse(null, { status: 400, statusText: 'no targetId found' }); const newIds = umbDataTypeMockDb.tree.copy([id], requestBody.target.id); - return res(ctx.status(201), ctx.set({ Location: newIds[0] })); + return new HttpResponse(null, { status: 201, headers: { Location: newIds[0] } }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/detail.handlers.ts index 75804751b80d..56e936f99f8a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; import type { @@ -8,53 +8,53 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateDataTypeRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateDataTypeRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); const id = umbDataTypeMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbDataTypeMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateDataTypeRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateDataTypeRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); umbDataTypeMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbDataTypeMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/filter.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/filter.handlers.ts index c48f8334b463..64cb33b935eb 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/filter.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/filter.handlers.ts @@ -1,16 +1,17 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDataTypeMockDb, type UmbDataTypeFilterOptions } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const filterHandlers = [ - rest.get(umbracoPath(`/filter${UMB_SLUG}`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); - const orderBy = req.url.searchParams.get('orderBy'); - const orderDirection = req.url.searchParams.get('orderDirection'); - const editorUiAlias = req.url.searchParams.get('editorUiAlias'); - const filter = req.url.searchParams.get('filter'); + http.get(umbracoPath(`/filter${UMB_SLUG}`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const skip = Number(searchParams.get('skip')); + const take = Number(searchParams.get('take')); + const orderBy = searchParams.get('orderBy'); + const orderDirection = searchParams.get('orderDirection'); + const editorUiAlias = searchParams.get('editorUiAlias'); + const filter = searchParams.get('filter'); const options: UmbDataTypeFilterOptions = { skip: skip || 0, @@ -22,6 +23,6 @@ export const filterHandlers = [ }; const response = umbDataTypeMockDb.filter(options); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/folder.handlers.ts index 608446abab83..6010c2f45e6f 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/folder.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/folder.handlers.ts @@ -1,44 +1,44 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const folderHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { - const requestBody = await req.json(); - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}/folder`), async ({ request }) => { + const requestBody = await request.json(); + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); const id = umbDataTypeMockDb.folder.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/folder/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); const response = umbDataTypeMockDb.folder.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/folder/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400, 'no id found')); - const requestBody = await req.json(); - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.put(umbracoPath(`${UMB_SLUG}/folder/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400, statusText: 'no id found' }); + const requestBody = await request.json(); + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); umbDataTypeMockDb.folder.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/folder/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); umbDataTypeMockDb.folder.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/item.handlers.ts index 07947aa6acf5..7a37c8a23ed7 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/item.handlers.ts @@ -1,13 +1,13 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const ids = new URL(request.url).searchParams.getAll('id'); if (!ids) return; const items = umbDataTypeMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts index 9dc2b49cc18e..eaca1f302e49 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/move.handlers.ts @@ -1,19 +1,19 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; import type { MoveDataTypeRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const moveHandlers = [ - rest.put(umbracoPath(`${UMB_SLUG}/:id/move`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id/move`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); - const requestBody = (await req.json()) as MoveDataTypeRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); - if (!requestBody.target?.id) return res(ctx.status(400, 'no targetId found')); + const requestBody = (await request.json()) as MoveDataTypeRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); + if (!requestBody.target?.id) return new HttpResponse(null, { status: 400, statusText: 'no targetId found' }); umbDataTypeMockDb.tree.move([id], requestBody.target.id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts index f3610ad5f553..9d99843e9e6e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/data-type/tree.handlers.ts @@ -1,29 +1,32 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDataTypeMockDb } from '../../data/data-type/data-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const skip = Number(searchParams.get('skip')); + const take = Number(searchParams.get('take')); const response = umbDataTypeMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const parentId = searchParams.get('parentId'); if (!parentId) return; - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const skip = Number(searchParams.get('skip')); + const take = Number(searchParams.get('take')); const response = umbDataTypeMockDb.tree.getChildrenOf({ parentId, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), (req, res, ctx) => { - const descendantId = req.url.searchParams.get('descendantId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const descendantId = searchParams.get('descendantId'); if (!descendantId) return; const response = umbDataTypeMockDb.tree.getAncestorsOf({ descendantId }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/detail.handlers.ts index 55e44dd1fc09..fd60c64a336f 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDictionaryMockDb } from '../../data/dictionary/dictionary.db.js'; import { UMB_SLUG } from './slug.js'; import type { @@ -9,58 +9,58 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateDictionaryItemRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateDictionaryItemRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); const id = umbDictionaryMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}`), (req, res, ctx) => { + http.get(umbracoPath(`${UMB_SLUG}`), () => { const response: PagedDictionaryOverviewResponseModel = umbDictionaryMockDb.getOverview(); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbDictionaryMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateDictionaryItemRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateDictionaryItemRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); umbDictionaryMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbDictionaryMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/import-export.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/import-export.handlers.ts index 04b0dd81bfc3..0e9908863359 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/import-export.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/import-export.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; //import type { UmbMockDictionaryModel } from '../../data/dictionary/dictionary.data.js'; import { umbDictionaryMockDb } from '../../data/dictionary/dictionary.db.js'; import { UMB_SLUG } from './slug.js'; @@ -25,14 +25,15 @@ const importResponse: UmbMockDictionaryModel = { */ export const importExportHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/import`), async (req, res, ctx) => { + http.post(umbracoPath(`${UMB_SLUG}/import`), async () => { alert('Dictionary import request received. Does not work in mock mode.'); /* - const file = req.url.searchParams.get('file'); + const searchParams = new URL(request.url).searchParams; + const file = searchParams.get('file'); if (!file) return; - const parentId = req.url.searchParams.get('parentId') ?? null; + const parentId = searchParams.get('parentId') ?? null; importResponse.parent = parentId ? { id: parentId } : null; umbDictionaryData.save(importResponse.id, importResponse); @@ -50,22 +51,23 @@ export const importExportHandlers = [ }; - return res(ctx.status(200), ctx.json(contentResult)); + return HttpResponse.json(contentResult); */ - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), // TODO => handle properly, querystring breaks handler - rest.get(umbracoPath(`${UMB_SLUG}/:id/export`), (req, res, ctx) => { - const id = req.params.id as string; + http.get(umbracoPath(`${UMB_SLUG}/:id/export`), ({ request, params }) => { + const id = params.id as string; if (!id) return; - const includeChildren = req.url.searchParams.get('includeChildren'); + const searchParams = new URL(request.url).searchParams; + const includeChildren = searchParams.get('includeChildren'); const item = umbDictionaryMockDb.detail.read(id); alert( `Downloads file for dictionary "${item?.name}", ${includeChildren === 'true' ? 'with' : 'without'} children.`, ); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/item.handlers.ts index 1e35a11ec915..c72301f29a15 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/item.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDictionaryMockDb } from '../../data/dictionary/dictionary.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const ids = searchParams.getAll('id'); if (!ids) return; const items = umbDictionaryMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/tree.handlers.ts index 620e0f272303..024fe5066aa3 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/tree.handlers.ts @@ -1,29 +1,32 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDictionaryMockDb } from '../../data/dictionary/dictionary.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const skip = Number(searchParams.get('skip')); + const take = Number(searchParams.get('take')); const response = umbDictionaryMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const parentId = searchParams.get('parentId'); if (!parentId) return; - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const skip = Number(searchParams.get('skip')); + const take = Number(searchParams.get('take')); const response = umbDictionaryMockDb.tree.getChildrenOf({ parentId, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), (req, res, ctx) => { - const descendantId = req.url.searchParams.get('descendantId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const descendantId = searchParams.get('descendantId'); if (!descendantId) return; const response = umbDictionaryMockDb.tree.getAncestorsOf({ descendantId }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/upload.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/upload.handlers.ts index d89c31e1f2f8..7d1bbcf7259e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/upload.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dictionary/upload.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { UMB_SLUG } from './slug.js'; import type { ImportDictionaryRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -9,9 +9,9 @@ const uploadResponse: ImportDictionaryRequestModel = { }; export const uploadHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/upload`), async (req, res, ctx) => { - if (!req.arrayBuffer()) return; + http.post(umbracoPath(`${UMB_SLUG}/upload`), async ({ request }) => { + if (!request.arrayBuffer()) return; - return res(ctx.status(200), ctx.json(uploadResponse)); + return HttpResponse.json(uploadResponse); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/detail.handlers.ts index f9ed905395d3..fade45785e01 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentBlueprintMockDb } from '../../data/document-blueprint/document-blueprint.db.js'; import { UMB_SLUG } from './slug.js'; import type { @@ -8,53 +8,53 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateDocumentRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateDocumentRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); const id = umbDocumentBlueprintMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbDocumentBlueprintMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateDocumentRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateDocumentRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); umbDocumentBlueprintMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbDocumentBlueprintMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/item.handlers.ts index 377e4343d896..f00fa03486a0 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/item.handlers.ts @@ -1,13 +1,13 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentBlueprintMockDb } from '../../data/document-blueprint/document-blueprint.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const ids = new URL(request.url).searchParams.getAll('id'); if (!ids) return; const items = umbDocumentBlueprintMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/tree.handlers.ts index fda1cfb47f7b..4160bf763b45 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/tree.handlers.ts @@ -1,22 +1,22 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentBlueprintMockDb } from '../../data/document-blueprint/document-blueprint.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbDocumentBlueprintMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const parentId = new URL(request.url).searchParams.get('parentId'); if (!parentId) return; - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbDocumentBlueprintMockDb.tree.getChildrenOf({ parentId, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/detail.handlers.ts index 6ecfb5ffac85..70591254d3f4 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentBlueprintMockDb } from '../../data/document-blueprint/document-blueprint.db.js'; import { umbDocumentTypeMockDb } from '../../data/document-type/document-type.db.js'; import { UMB_SLUG } from './slug.js'; @@ -10,27 +10,27 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateMediaTypeRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateMediaTypeRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const id = umbDocumentTypeMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id/blueprint`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id/blueprint`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const relevantBlueprints = umbDocumentBlueprintMockDb @@ -40,41 +40,41 @@ export const detailHandlers = [ total: relevantBlueprints.length, items: relevantBlueprints, }; - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbDocumentTypeMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateMediaTypeRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateMediaTypeRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); umbDocumentTypeMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbDocumentTypeMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/folder.handlers.ts index 565890e0b3a0..e41955b0db07 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/folder.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/folder.handlers.ts @@ -1,44 +1,44 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentTypeMockDb } from '../../data/document-type/document-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const folderHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { - const requestBody = await req.json(); - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}/folder`), async ({ request }) => { + const requestBody = await request.json(); + if (!requestBody) return new HttpResponse(null, { status: 400 }); const id = umbDocumentTypeMockDb.folder.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/folder/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); const response = umbDocumentTypeMockDb.folder.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/folder/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400, 'no id found')); - const requestBody = await req.json(); - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.put(umbracoPath(`${UMB_SLUG}/folder/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); + const requestBody = await request.json(); + if (!requestBody) return new HttpResponse(null, { status: 400 }); umbDocumentTypeMockDb.folder.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/folder/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); umbDocumentTypeMockDb.folder.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/item.handlers.ts index ce112f2ac2db..2f37b6701cfb 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/item.handlers.ts @@ -1,13 +1,13 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentTypeMockDb } from '../../data/document-type/document-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const ids = new URL(request.url).searchParams.getAll('id'); if (!ids) return; const items = umbDocumentTypeMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/structure.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/structure.handlers.ts index 3d16440c730e..1048fc35310c 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/structure.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/structure.handlers.ts @@ -1,18 +1,18 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentTypeMockDb } from '../../data/document-type/document-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const structureHandlers = [ - rest.get(umbracoPath(`${UMB_SLUG}/:id/allowed-children`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id/allowed-children`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); const response = umbDocumentTypeMockDb.getAllowedChildren(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`${UMB_SLUG}/allowed-at-root`), (req, res, ctx) => { + http.get(umbracoPath(`${UMB_SLUG}/allowed-at-root`), () => { const response = umbDocumentTypeMockDb.getAllowedAtRoot(); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/tree.handlers.ts index 80a905469de3..c37b9a8ca458 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-type/tree.handlers.ts @@ -1,29 +1,32 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentTypeMockDb } from '../../data/document-type/document-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const skip = Number(searchParams.get('skip')); + const take = Number(searchParams.get('take')); const response = umbDocumentTypeMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const parentId = searchParams.get('parentId'); if (!parentId) return; - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const skip = Number(searchParams.get('skip')); + const take = Number(searchParams.get('take')); const response = umbDocumentTypeMockDb.tree.getChildrenOf({ parentId, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), (req, res, ctx) => { - const descendantId = req.url.searchParams.get('descendantId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const descendantId = searchParams.get('descendantId'); if (!descendantId) return; const response = umbDocumentTypeMockDb.tree.getAncestorsOf({ descendantId }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/collection.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/collection.handlers.ts index 2e80e4738755..425b3bbd0f5e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/collection.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/collection.handlers.ts @@ -1,18 +1,19 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentMockDb } from '../../data/document/document.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const collectionHandlers = [ - rest.get(umbracoPath(`/collection${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`/collection${UMB_SLUG}/:id`), ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const url = new URL(request.url); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbDocumentMockDb.collection.getCollectionDocumentById({ id, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/detail.handlers.ts index 4b02a555c65c..8216f7fccf1b 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import type { UmbMockDocumentModel } from '../../data/document/document.data.js'; import { umbDocumentMockDb } from '../../data/document/document.db.js'; import { items as referenceData } from '../../data/tracked-reference.data.js'; @@ -14,34 +14,35 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateDocumentRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateDocumentRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); const id = umbDocumentMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return HttpResponse.json(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/configuration`), (_req, res, ctx) => { - return res(ctx.status(200), ctx.json(umbDocumentMockDb.getConfiguration())); + http.get(umbracoPath(`${UMB_SLUG}/configuration`), () => { + return HttpResponse.json(umbDocumentMockDb.getConfiguration()); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id/referenced-by`), (_req, res, ctx) => { - const id = _req.params.id as string; + http.get(umbracoPath(`${UMB_SLUG}/:id/referenced-by`), ({ request, params }) => { + const id = params.id as string; if (!id) return; if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const query = _req.url.searchParams; + const url = new URL(request.url); + const query = url.searchParams; const skip = query.get('skip') ? parseInt(query.get('skip') as string, 10) : 0; const take = query.get('take') ? parseInt(query.get('take') as string, 10) : 100; @@ -56,15 +57,15 @@ export const detailHandlers = [ items: data.slice(skip, skip + take), }; - return res(ctx.status(200), ctx.json(PagedTrackedReference)); + return HttpResponse.json(PagedTrackedReference); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id/referenced-descendants`), (_req, res, ctx) => { - const id = _req.params.id as string; + http.get(umbracoPath(`${UMB_SLUG}/:id/referenced-descendants`), ({ params }) => { + const id = params.id as string; if (!id) return; if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const ReferencedDescendantsResponse: GetDocumentByIdReferencedDescendantsResponse = { @@ -72,19 +73,19 @@ export const detailHandlers = [ items: [], }; - return res(ctx.status(200), ctx.json(ReferencedDescendantsResponse)); + return HttpResponse.json(ReferencedDescendantsResponse); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id/available-segment-options`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id/available-segment-options`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); let document: UmbMockDocumentModel | null = null; try { document = umbDocumentMockDb.detail.read(id); } catch { - return res(ctx.status(404)); + return new HttpResponse(null, { status: 404 }); } const availableSegments = document.variants.filter((v) => !!v.segment).map((v) => v.segment!) ?? []; @@ -115,52 +116,52 @@ export const detailHandlers = [ }), }; - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id/validate`, 'v1.1'), (_req, res, ctx) => { - const id = _req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id/validate`, 'v1.1'), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbDocumentMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateDocumentRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateDocumentRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); umbDocumentMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbDocumentMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/domain.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/domain.handlers.ts index 3d44b343f229..59dcb78d1ab3 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/domain.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/domain.handlers.ts @@ -1,14 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentMockDb } from '../../data/document/document.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; // TODO: temp handlers until we have a real API export const domainHandlers = [ - rest.get(umbracoPath(`${UMB_SLUG}/:id/domains`), (req, res, ctx) => { - const id = req.params.id as string; + http.get(umbracoPath(`${UMB_SLUG}/:id/domains`), ({ params }) => { + const id = params.id as string; if (!id) return; const response = umbDocumentMockDb.getDomainsForDocument(); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/item.handlers.ts index 51c4c66db19d..f0adbf02dc5a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/item.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentMockDb } from '../../data/document/document.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const ids = url.searchParams.getAll('id'); if (!ids) return; const items = umbDocumentMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts index 097afd9fe7c8..7988fa1a7456 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts @@ -1,14 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentMockDb } from '../../data/document/document.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; // TODO: temp handlers until we have a real API export const permissionHandlers = [ - rest.get(umbracoPath(`${UMB_SLUG}/:id/permissions`), (req, res, ctx) => { - const id = req.params.id as string; + http.get(umbracoPath(`${UMB_SLUG}/:id/permissions`), ({ params }) => { + const id = params.id as string; if (!id) return; const response = umbDocumentMockDb.getUserPermissionsForDocument(); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/publishing.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/publishing.handlers.ts index 10a0e5b8c762..8688a15332d9 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/publishing.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/publishing.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { createProblemDetails } from '../../data/utils.js'; import { umbDocumentMockDb } from '../../data/document/document.db.js'; import { UMB_SLUG } from './slug.js'; @@ -13,78 +13,73 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const publishingHandlers = [ - rest.put(umbracoPath(`${UMB_SLUG}/:id/publish`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); - const requestBody = (await req.json()) as PublishDocumentRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.put(umbracoPath(`${UMB_SLUG}/:id/publish`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); + const requestBody = (await request.json()) as PublishDocumentRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); try { umbDocumentMockDb.publishing.publish(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); } catch (error) { if (error instanceof Error) { - return res(ctx.status(400), ctx.json(createProblemDetails({ title: 'Schedule', detail: error.message }))); + return HttpResponse.json(createProblemDetails({ title: 'Schedule', detail: error.message }), { status: 400 }); } throw new Error('An error occurred while publishing the document'); } }), - rest.put(umbracoPath(`${UMB_SLUG}/:id/publish-with-descendants`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); - const requestBody = (await req.json()) as PublishDocumentWithDescendantsRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.put(umbracoPath(`${UMB_SLUG}/:id/publish-with-descendants`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); + const requestBody = (await request.json()) as PublishDocumentWithDescendantsRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); try { const taskId = umbDocumentMockDb.publishing.publishWithDescendants(id, requestBody); - return res(ctx.status(200), ctx.json({ taskId, isComplete: false })); + return HttpResponse.json({ taskId, isComplete: false }); } catch (error) { if (error instanceof Error) { - return res(ctx.status(400), ctx.json(createProblemDetails({ title: 'Schedule', detail: error.message }))); + return HttpResponse.json(createProblemDetails({ title: 'Schedule', detail: error.message }), { status: 400 }); } throw new Error('An error occurred while publishing the document'); } }), - rest.get(umbracoPath(`${UMB_SLUG}/:id/publish-with-descendants/result/:taskId`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); - const taskId = req.params.taskId as string; - if (!taskId) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id/publish-with-descendants/result/:taskId`), async ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); + const taskId = params.taskId as string; + if (!taskId) return new HttpResponse(null, { status: 400 }); try { const isComplete = umbDocumentMockDb.publishing.taskResult(taskId); - return res( - ctx.status(200), - ctx.json({ taskId, isComplete }), - ); + return HttpResponse.json({ taskId, isComplete }); } catch (error) { - return res( - ctx.status(400), - ctx.json( - createProblemDetails({ title: 'Task', detail: error instanceof Error ? error.message : 'An error occurred' }), - ), + return HttpResponse.json( + createProblemDetails({ title: 'Task', detail: error instanceof Error ? error.message : 'An error occurred' }), + { status: 400 }, ); } }), - rest.put(umbracoPath(`${UMB_SLUG}/:id/unpublish`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); - const requestBody = (await req.json()) as UnpublishDocumentRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.put(umbracoPath(`${UMB_SLUG}/:id/unpublish`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); + const requestBody = (await request.json()) as UnpublishDocumentRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); umbDocumentMockDb.publishing.unpublish(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id/published`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id/published`), async ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); const document = umbDocumentMockDb.detail.read(id); - if (!document) return res(ctx.status(404)); + if (!document) return new HttpResponse(null, { status: 404 }); const responseModel: GetDocumentByIdPublishedResponse = { documentType: document.documentType, @@ -96,6 +91,6 @@ export const publishingHandlers = [ flags: document.flags, }; - return res(ctx.status(200), ctx.json(responseModel)); + return HttpResponse.json(responseModel); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/recycle-bin.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/recycle-bin.handlers.ts index 4841e7947464..ae16b8a763f6 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/recycle-bin.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/recycle-bin.handlers.ts @@ -1,29 +1,31 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentMockDb } from '../../data/document/document.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const recycleBinHandlers = [ - rest.get(umbracoPath(`/recycle-bin${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/recycle-bin${UMB_SLUG}/root`), ({ request }) => { + const url = new URL(request.url); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbDocumentMockDb.recycleBin.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/recycle-bin${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); + http.get(umbracoPath(`/recycle-bin${UMB_SLUG}/children`), ({ request }) => { + const url = new URL(request.url); + const parentId = url.searchParams.get('parentId'); if (!parentId) return; - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbDocumentMockDb.recycleBin.tree.getChildrenOf({ parentId, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id/move-to-recycle-bin`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id/move-to-recycle-bin`), async ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); umbDocumentMockDb.recycleBin.trash([id]); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts index 518e475b0023..3802663d7fa0 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/tree.handlers.ts @@ -1,30 +1,33 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbDocumentMockDb } from '../../data/document/document.db.js'; import { UMB_SLUG } from './slug.js'; import type { GetTreeDocumentAncestorsResponse } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const url = new URL(request.url); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbDocumentMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const url = new URL(request.url); + const parentId = url.searchParams.get('parentId'); if (!parentId) return; - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbDocumentMockDb.tree.getChildrenOf({ parentId, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), (req, res, ctx) => { - const descendantId = req.url.searchParams.get('descendantId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), ({ request }) => { + const url = new URL(request.url); + const descendantId = url.searchParams.get('descendantId'); if (!descendantId) return; const response = umbDocumentMockDb.tree.getAncestorsOf({ descendantId }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dynamic-root.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dynamic-root.handlers.ts index 052a905c0281..454b2e47df23 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/dynamic-root.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/dynamic-root.handlers.ts @@ -2,14 +2,14 @@ import { umbDocumentMockDb } from '../data/document/document.db.js'; import type { DynamicRootRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; export const handlers = [ - rest.post(umbracoPath('/dynamic-root/query'), async (req, res, ctx) => { + http.post(umbracoPath('/dynamic-root/query'), async () => { const response = umbDocumentMockDb.tree .getRoot() .items.map((item) => item.id) .slice(0, 1); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/examine-management.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/examine-management.handlers.ts index 51fca662e2e3..077fbf1aaf58 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/examine-management.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/examine-management.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { searchResultMockData, getIndexByName, PagedIndexers } from '../data/examine.data.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -10,68 +10,58 @@ import type { } from '@umbraco-cms/backoffice/external/backend-api'; export const handlers = [ - rest.get(umbracoPath('/indexer'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json(PagedIndexers), - ); + http.get(umbracoPath('/indexer'), () => { + return HttpResponse.json(PagedIndexers); }), - rest.get(umbracoPath('/indexer/:indexName'), (_req, res, ctx) => { - const indexName = _req.params.indexName as string; + http.get(umbracoPath('/indexer/:indexName'), ({ params }) => { + const indexName = params.indexName as string; if (!indexName) return; const indexFound = getIndexByName(indexName); if (indexFound) { - return res(ctx.status(200), ctx.json(indexFound)); + return HttpResponse.json(indexFound); } else { - return res(ctx.status(404)); + return new HttpResponse(null, { status: 404 }); } }), - rest.post(umbracoPath('/indexer/:indexName/rebuild'), async (_req, res, ctx) => { + http.post(umbracoPath('/indexer/:indexName/rebuild'), async ({ params }) => { await new Promise((resolve) => setTimeout(resolve, (Math.random() + 1) * 1000)); // simulate a delay of 1-2 seconds - const indexName = _req.params.indexName as string; + const indexName = params.indexName as string; if (!indexName) return; const indexFound = getIndexByName(indexName); if (indexFound) { - return res(ctx.status(201)); + return new HttpResponse(null, { status: 201 }); } else { - return res(ctx.status(404)); + return new HttpResponse(null, { status: 404 }); } }), - rest.get(umbracoPath('/searcher'), (_req, res, ctx) => { - return res( - ctx.status(200), - ctx.json({ - total: 0, - items: [{ name: 'ExternalSearcher' }, { name: 'InternalSearcher' }, { name: 'InternalMemberSearcher' }], - }), - ); + http.get(umbracoPath('/searcher'), () => { + return HttpResponse.json({ + total: 0, + items: [{ name: 'ExternalSearcher' }, { name: 'InternalSearcher' }, { name: 'InternalMemberSearcher' }], + }); }), - rest.get(umbracoPath('/searcher/:searcherName/query'), (_req, res, ctx) => { - const query = _req.url.searchParams.get('term'); + http.get(umbracoPath('/searcher/:searcherName/query'), ({ request, params }) => { + const query = new URL(request.url).searchParams.get('term'); - const searcherName = _req.params.searcherName as string; + const searcherName = params.searcherName as string; if (!searcherName || !query) return; if (searcherName) { - return res( - ctx.status(200), - ctx.json({ - total: 0, - items: searchResultMockData, - }), - ); + return HttpResponse.json({ + total: 0, + items: searchResultMockData, + }); } else { - return res(ctx.status(404)); + return new HttpResponse(null, { status: 404 }); } }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/health-check.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/health-check.handlers.ts index 1d5938ea8c6e..1ec642054c45 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/health-check.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/health-check.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { getGroupByName, @@ -18,63 +18,56 @@ import { StatusResultTypeModel } from '@umbraco-cms/backoffice/external/backend- import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath('/health-check-group'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ total: 9999, items: healthGroupsWithoutResult }), - ); + http.get(umbracoPath('/health-check-group'), () => { + return HttpResponse.json({ total: 9999, items: healthGroupsWithoutResult }); }), - rest.get(umbracoPath('/health-check-group/:name'), (_req, res, ctx) => { - const name = _req.params.name as string; + http.get(umbracoPath('/health-check-group/:name'), ({ params }) => { + const name = params.name as string; if (!name) return; const group = getGroupByName(name); if (group) { - return res(ctx.status(200), ctx.json(group)); + return HttpResponse.json(group); } else { - return res(ctx.status(404)); + return new HttpResponse(null, { status: 404 }); } }), - rest.post(umbracoPath('/health-check-group/:name/check'), (_req, res, ctx) => { - const name = _req.params.name as string; + http.post(umbracoPath('/health-check-group/:name/check'), ({ params }) => { + const name = params.name as string; if (!name) return; const group = getGroupWithResultsByName(name); if (group) { - return res(ctx.status(200), ctx.json(group)); + return HttpResponse.json(group); } else { - return res(ctx.status(404)); + return new HttpResponse(null, { status: 404 }); } }), - rest.post(umbracoPath('/health-check/execute-action'), async (req, res, ctx) => { - const body = await req.json(); + http.post(umbracoPath('/health-check/execute-action'), async ({ request }) => { + const body = await request.json(); const healthCheckId = body.healthCheck.id; // Find the health check based on the healthCheckId from the healthGroups[].checks const healthCheck = healthGroups.flatMap((group) => group.checks).find((check) => check?.id === healthCheckId); if (!healthCheck) { - return res(ctx.status(404)); + return new HttpResponse(null, { status: 404 }); } const result = healthCheck.results?.at(0); if (!result) { - return res(ctx.status(404)); + return new HttpResponse(null, { status: 404 }); } result.resultType = StatusResultTypeModel.SUCCESS; - return res( - // Respond with a 200 status code - ctx.delay(1000), - ctx.status(200), - ctx.json(result), - ); + // Note: ctx.delay() is not directly supported in v2, needs to be implemented differently if delay is needed + await new Promise((resolve) => setTimeout(resolve, 1000)); + return HttpResponse.json(result); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/images.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/images.handlers.ts index e1602297af16..d1909b829cb2 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/images.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/images.handlers.ts @@ -1,8 +1,8 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; // TODO: add schema export const handlers = [ - rest.get('/umbraco/management/api/v1/images/getprocessedimageurl', (req, res, ctx) => { - return res(ctx.status(200), ctx.json('/url/to/processed/image')); + http.get('/umbraco/management/api/v1/images/getprocessedimageurl', () => { + return HttpResponse.json('/url/to/processed/image'); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/install.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/install.handlers.ts index 6866a2071c60..58501028ba69 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/install.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/install.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import type { DatabaseInstallRequestModel, InstallRequestModel, @@ -9,119 +9,109 @@ import { TelemetryLevelModel } from '@umbraco-cms/backoffice/external/backend-ap import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath('/install/settings'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - user: { - minCharLength: 2, - minNonAlphaNumericLength: 0, - consentLevels: [ - { - level: TelemetryLevelModel.MINIMAL, - description: 'We will only send an anonymized site ID to let us know that the site exists.', - }, - { - level: TelemetryLevelModel.BASIC, - description: 'We will send an anonymized site ID, umbraco version, and packages installed', - }, - { - level: TelemetryLevelModel.DETAILED, - description: - 'We will send:
  • Anonymized site ID, umbraco version, and packages installed.
  • Number of: Root nodes, Content nodes, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, and Property Editors in use.
  • System information: Webserver, server OS, server framework, server OS language, and database provider.
  • Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, and if you are in debug mode.
We might change what we send on the Detailed level in the future. If so, it will be listed above.
By choosing "Detailed" you agree to current and future anonymized information being collected.
', - }, - ], - }, - databases: [ + http.get(umbracoPath('/install/settings'), () => { + return HttpResponse.json({ + user: { + minCharLength: 2, + minNonAlphaNumericLength: 0, + consentLevels: [ { - id: '1', - sortOrder: -1, - displayName: 'SQLite', - defaultDatabaseName: 'Umbraco', - providerName: 'Microsoft.Data.SQLite', - isConfigured: false, - requiresServer: false, - serverPlaceholder: '', - requiresCredentials: false, - supportsIntegratedAuthentication: false, - supportsTrustServerCertificate: false, - requiresConnectionTest: false, + level: TelemetryLevelModel.MINIMAL, + description: 'We will only send an anonymized site ID to let us know that the site exists.', }, { - id: '2', - sortOrder: 2, - displayName: 'SQL Server', - defaultDatabaseName: '', - providerName: 'Microsoft.Data.SqlClient', - isConfigured: false, - requiresServer: true, - serverPlaceholder: '(local)\\SQLEXPRESS', - requiresCredentials: true, - supportsIntegratedAuthentication: true, - supportsTrustServerCertificate: true, - requiresConnectionTest: true, + level: TelemetryLevelModel.BASIC, + description: 'We will send an anonymized site ID, umbraco version, and packages installed', }, { - id: '42c0eafd-1650-4bdb-8cf6-d226e8941698', - sortOrder: 2147483647, - displayName: 'Custom', - defaultDatabaseName: '', - providerName: 'My.Custom.Data.Provider', - isConfigured: false, - requiresServer: false, - serverPlaceholder: 'undefined', - requiresCredentials: false, - supportsIntegratedAuthentication: false, - supportsTrustServerCertificate: false, - requiresConnectionTest: true, + level: TelemetryLevelModel.DETAILED, + description: + 'We will send:
  • Anonymized site ID, umbraco version, and packages installed.
  • Number of: Root nodes, Content nodes, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, and Property Editors in use.
  • System information: Webserver, server OS, server framework, server OS language, and database provider.
  • Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, and if you are in debug mode.
We might change what we send on the Detailed level in the future. If so, it will be listed above.
By choosing "Detailed" you agree to current and future anonymized information being collected.
', }, ], - }), - ); + }, + databases: [ + { + id: '1', + sortOrder: -1, + displayName: 'SQLite', + defaultDatabaseName: 'Umbraco', + providerName: 'Microsoft.Data.SQLite', + isConfigured: false, + requiresServer: false, + serverPlaceholder: '', + requiresCredentials: false, + supportsIntegratedAuthentication: false, + supportsTrustServerCertificate: false, + requiresConnectionTest: false, + }, + { + id: '2', + sortOrder: 2, + displayName: 'SQL Server', + defaultDatabaseName: '', + providerName: 'Microsoft.Data.SqlClient', + isConfigured: false, + requiresServer: true, + serverPlaceholder: '(local)\\SQLEXPRESS', + requiresCredentials: true, + supportsIntegratedAuthentication: true, + supportsTrustServerCertificate: true, + requiresConnectionTest: true, + }, + { + id: '42c0eafd-1650-4bdb-8cf6-d226e8941698', + sortOrder: 2147483647, + displayName: 'Custom', + defaultDatabaseName: '', + providerName: 'My.Custom.Data.Provider', + isConfigured: false, + requiresServer: false, + serverPlaceholder: 'undefined', + requiresCredentials: false, + supportsIntegratedAuthentication: false, + supportsTrustServerCertificate: false, + requiresConnectionTest: true, + }, + ], + }); }), - rest.post(umbracoPath('/install/validate-database'), async (req, res, ctx) => { - const body = await req.json(); + http.post(umbracoPath('/install/validate-database'), async ({ request }) => { + const body = await request.json(); if (body.name === 'validate') { - return res( - ctx.status(400), - ctx.json({ + return HttpResponse.json( + { type: 'connection', status: 400, detail: 'Database connection failed', - }), + }, + { status: 400 }, ); } - return res( - // Respond with a 200 status code - ctx.status(201), - ); + return new HttpResponse(null, { status: 201 }); }), - rest.post(umbracoPath('/install/setup'), async (req, res, ctx) => { - const body = await req.json(); + http.post(umbracoPath('/install/setup'), async ({ request }) => { + const body = await request.json(); if (body.database?.name === 'fail') { - return res( - // Respond with a 200 status code - ctx.status(400), - ctx.delay(1000), - ctx.json({ + // Note: ctx.delay() is not directly supported in v2, needs to be implemented differently if delay is needed + await new Promise((resolve) => setTimeout(resolve, 1000)); + return HttpResponse.json( + { type: 'validation', status: 400, detail: 'Something went wrong', errors: { name: ['Database name is invalid'], }, - }), + }, + { status: 400 }, ); } - return res( - // Respond with a 200 status code - ctx.status(201), - ); + return new HttpResponse(null, { status: 201 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/language/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/language/detail.handlers.ts index bd5d474db46b..6d75ad801cea 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/language/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/language/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbLanguageMockDb } from '../../data/language/language.db.js'; import { UMB_SLUG } from './slug.js'; import type { @@ -8,64 +8,65 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateLanguageRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateLanguageRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); const id = umbLanguageMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}`), (req, res, ctx) => { - const skipParam = req.url.searchParams.get('skip'); + http.get(umbracoPath(`${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const skipParam = url.searchParams.get('skip'); const skip = skipParam ? Number.parseInt(skipParam) : undefined; - const takeParam = req.url.searchParams.get('take'); + const takeParam = url.searchParams.get('take'); const take = takeParam ? Number.parseInt(takeParam) : undefined; const response = umbLanguageMockDb.get({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbLanguageMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateLanguageRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateLanguageRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); umbLanguageMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbLanguageMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/language/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/language/item.handlers.ts index 546fb7d292ea..5c91938070a7 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/language/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/language/item.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbLanguageMockDb } from '../../data/language/language.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const isoCodes = req.url.searchParams.getAll('isoCode'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const isoCodes = url.searchParams.getAll('isoCode'); if (!isoCodes) return; const items = umbLanguageMockDb.item.getItems(isoCodes); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/log-viewer.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/log-viewer.handlers.ts index acf457650e63..ddea200364e3 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/log-viewer.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/log-viewer.handlers.ts @@ -1,14 +1,15 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbLogViewerData } from '../data/log-viewer.data.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { SavedLogSearchRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; export const handlers = [ //#region Searches - rest.get(umbracoPath('/log-viewer/saved-search'), (req, res, ctx) => { - const skip = req.url.searchParams.get('skip'); + http.get(umbracoPath('/log-viewer/saved-search'), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const skip = searchParams.get('skip'); const skipNumber = skip ? Number.parseInt(skip) : undefined; - const take = req.url.searchParams.get('take'); + const take = searchParams.get('take'); const takeNumber = take ? Number.parseInt(take) : undefined; const items = umbLogViewerData.searches.getSavedSearches(skipNumber, takeNumber); @@ -18,33 +19,34 @@ export const handlers = [ items, }; - return res(ctx.delay(), ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath('/log-viewer/saved-search/:name'), (req, res, ctx) => { - const name = req.params.name as string; + http.get(umbracoPath('/log-viewer/saved-search/:name'), ({ params }) => { + const name = params.name as string; if (!name) return; const item = umbLogViewerData.searches.getByName(name); - return res(ctx.delay(), ctx.status(200), ctx.json(item)); + return HttpResponse.json(item); }), - rest.post(umbracoPath('/log-viewer/saved-search'), async (req, res, ctx) => { - return res(ctx.delay(), ctx.status(200)); + http.post(umbracoPath('/log-viewer/saved-search'), async () => { + return HttpResponse.json(null); }), - rest.delete(umbracoPath('/log-viewer/saved-search/:name'), async (req, res, ctx) => { + http.delete(umbracoPath('/log-viewer/saved-search/:name'), async () => { // TODO: implement this - return res(ctx.status(200)); + return HttpResponse.json(null); }), //#endregion //#region Templates - rest.get(umbracoPath('/log-viewer/message-template'), (req, res, ctx) => { - const skip = req.url.searchParams.get('skip'); + http.get(umbracoPath('/log-viewer/message-template'), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const skip = searchParams.get('skip'); const skipNumber = skip ? Number.parseInt(skip) : undefined; - const take = req.url.searchParams.get('take'); + const take = searchParams.get('take'); const takeNumber = take ? Number.parseInt(take) : undefined; const items = umbLogViewerData.templates.getTemplates(skipNumber, takeNumber); @@ -54,27 +56,28 @@ export const handlers = [ items, }; - return res(ctx.delay(), ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), //#endregion //#region Logs - rest.get(umbracoPath('/log-viewer/level'), (req, res, ctx) => { - return res(ctx.delay(), ctx.status(200), ctx.json(umbLogViewerData.logLevels)); + http.get(umbracoPath('/log-viewer/level'), () => { + return HttpResponse.json(umbLogViewerData.logLevels); }), - rest.get(umbracoPath('/log-viewer/level-count'), (req, res, ctx) => { - return res(ctx.delay(), ctx.status(200), ctx.json(umbLogViewerData.logs.getLevelCount())); + http.get(umbracoPath('/log-viewer/level-count'), () => { + return HttpResponse.json(umbLogViewerData.logs.getLevelCount()); }), - rest.get(umbracoPath('/log-viewer/validate-logs-size'), (req, res, ctx) => { - return res(ctx.delay(), ctx.status(200)); + http.get(umbracoPath('/log-viewer/validate-logs-size'), () => { + return HttpResponse.json(null); }), - rest.get(umbracoPath('/log-viewer/log'), (req, res, ctx) => { - const skip = req.url.searchParams.get('skip'); + http.get(umbracoPath('/log-viewer/log'), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const skip = searchParams.get('skip'); const skipNumber = skip ? Number.parseInt(skip) : undefined; - const take = req.url.searchParams.get('take'); + const take = searchParams.get('take'); const takeNumber = take ? Number.parseInt(take) : undefined; const items = umbLogViewerData.logs.getLogs(skipNumber, takeNumber); @@ -83,6 +86,6 @@ export const handlers = [ items, }; - return res(ctx.delay(), ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts index e75253ceafc8..c246bee37e8a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import type { UmbPackageManifestResponse } from '../../packages/packages/types.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -144,29 +144,25 @@ const publicManifests: UmbPackageManifestResponse = [ ]; export const manifestDevelopmentHandlers = [ - rest.get(umbracoPath('/manifest/manifest/private'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json(privateManifests), - ); + http.get(umbracoPath('/manifest/manifest/private'), () => { + return HttpResponse.json(privateManifests); }), - rest.get(umbracoPath('/manifest/manifest/public'), (_req, res, ctx) => { - return res(ctx.status(200), ctx.json(publicManifests)); + http.get(umbracoPath('/manifest/manifest/public'), () => { + return HttpResponse.json(publicManifests); }), - rest.get(umbracoPath('/manifest/manifest'), (_req, res, ctx) => { - return res(ctx.status(200), ctx.json([...privateManifests, ...publicManifests])); + http.get(umbracoPath('/manifest/manifest'), () => { + return HttpResponse.json([...privateManifests, ...publicManifests]); }), ]; export const manifestEmptyHandlers = [ - rest.get(umbracoPath('/manifest/manifest/private'), (_req, res, ctx) => { - return res(ctx.status(200), ctx.json([])); + http.get(umbracoPath('/manifest/manifest/private'), () => { + return HttpResponse.json([]); }), - rest.get(umbracoPath('/manifest/manifest/public'), (_req, res, ctx) => { - return res(ctx.status(200), ctx.json([])); + http.get(umbracoPath('/manifest/manifest/public'), () => { + return HttpResponse.json([]); }), - rest.get(umbracoPath('/manifest/manifest'), (_req, res, ctx) => { - return res(ctx.status(200), ctx.json([])); + http.get(umbracoPath('/manifest/manifest'), () => { + return HttpResponse.json([]); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/detail.handlers.ts index 2e2de688e397..11a78fafd20c 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMediaTypeMockDb } from '../../data/media-type/media-type.db.js'; import { UMB_SLUG } from './slug.js'; import type { @@ -8,53 +8,53 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateMediaTypeRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateMediaTypeRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const id = umbMediaTypeMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbMediaTypeMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateMediaTypeRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateMediaTypeRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); umbMediaTypeMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbMediaTypeMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/folder.handlers.ts index 6d666827d252..5be090e22e70 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/folder.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/folder.handlers.ts @@ -1,44 +1,44 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMediaTypeMockDb } from '../../data/media-type/media-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const folderHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { - const requestBody = await req.json(); - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}/folder`), async ({ request }) => { + const requestBody = await request.json(); + if (!requestBody) return new HttpResponse(null, { status: 400 }); const id = umbMediaTypeMockDb.folder.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/folder/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); const response = umbMediaTypeMockDb.folder.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/folder/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400, 'no id found')); - const requestBody = await req.json(); - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.put(umbracoPath(`${UMB_SLUG}/folder/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); + const requestBody = await request.json(); + if (!requestBody) return new HttpResponse(null, { status: 400 }); umbMediaTypeMockDb.folder.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/folder/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/folder/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); umbMediaTypeMockDb.folder.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/item.handlers.ts index e91ba1b3ebb3..940d2979f60e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/item.handlers.ts @@ -1,22 +1,22 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMediaTypeMockDb } from '../../data/media-type/media-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const ids = new URL(request.url).searchParams.getAll('id'); if (!ids) return; const items = umbMediaTypeMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), - rest.get(umbracoPath(`/item${UMB_SLUG}/allowed`), (req, res, ctx) => { - const fileExtension = req.url.searchParams.get('fileExtension'); + http.get(umbracoPath(`/item${UMB_SLUG}/allowed`), ({ request }) => { + const fileExtension = new URL(request.url).searchParams.get('fileExtension'); if (!fileExtension) return; const response = umbMediaTypeMockDb.getAllowedByFileExtension(fileExtension); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/structure.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/structure.handlers.ts index 6506d1c59a00..aa4a4ad5a853 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/structure.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/structure.handlers.ts @@ -1,18 +1,18 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMediaTypeMockDb } from '../../data/media-type/media-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const structureHandlers = [ - rest.get(umbracoPath(`${UMB_SLUG}/:id/allowed-children`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id/allowed-children`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); const response = umbMediaTypeMockDb.getAllowedChildren(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`${UMB_SLUG}/allowed-at-root`), (req, res, ctx) => { + http.get(umbracoPath(`${UMB_SLUG}/allowed-at-root`), () => { const response = umbMediaTypeMockDb.getAllowedAtRoot(); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts index 75683e8e545f..b15149c40dcc 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media-type/tree.handlers.ts @@ -1,29 +1,29 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMediaTypeMockDb } from '../../data/media-type/media-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbMediaTypeMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const parentId = new URL(request.url).searchParams.get('parentId'); if (!parentId) return; - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbMediaTypeMockDb.tree.getChildrenOf({ parentId, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), (req, res, ctx) => { - const id = req.url.searchParams.get('descendantId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), ({ request }) => { + const id = new URL(request.url).searchParams.get('descendantId'); if (!id) return; const response = umbMediaTypeMockDb.tree.getAncestorsOf({ descendantId: id }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/collection.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/collection.handlers.ts index edf018ab2919..9da53b7a18ed 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/collection.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/collection.handlers.ts @@ -1,17 +1,18 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMediaMockDb } from '../../data/media/media.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const collectionHandlers = [ - rest.get(umbracoPath(`/collection${UMB_SLUG}`), (req, res, ctx) => { - const id = req.url.searchParams.get('id') ?? ''; + http.get(umbracoPath(`/collection${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const id = url.searchParams.get('id') ?? ''; - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbMediaMockDb.collection.getCollectionMedia({ id, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/detail.handlers.ts index 20a53376fe0d..a3bb79892e07 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMediaMockDb } from '../../data/media/media.db.js'; import { items as referenceData } from '../../data/tracked-reference.data.js'; import { UMB_SLUG } from './slug.js'; @@ -11,27 +11,27 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { UmbMediaDetailModel } from '@umbraco-cms/backoffice/media'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateMediaRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateMediaRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); const id = umbMediaMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id/referenced-by`), (_req, res, ctx) => { - const id = _req.params.id as string; + http.get(umbracoPath(`${UMB_SLUG}/:id/referenced-by`), ({ params }) => { + const id = params.id as string; if (!id) return; if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const PagedTrackedReference = { @@ -39,62 +39,62 @@ export const detailHandlers = [ items: referenceData, }; - return res(ctx.status(200), ctx.json(PagedTrackedReference)); + return HttpResponse.json(PagedTrackedReference); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbMediaMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id/validate`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id/validate`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const model = await req.json(); - if (!model) return res(ctx.status(400)); + const model = (await request.json()) as UmbMediaDetailModel; + if (!model) return new HttpResponse(null, { status: 400 }); const hasMediaPickerOrFileUploadValue = model.values.some((v) => { return v.editorAlias === 'Umbraco.UploadField' && v.value; }); if (!hasMediaPickerOrFileUploadValue) { - return res(ctx.status(400, 'No media picker or file upload value found')); + return new HttpResponse(null, { status: 400, statusText: 'No media picker or file upload value found' }); } - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateMediaRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateMediaRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); umbMediaMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbMediaMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/imaging.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/imaging.handlers.ts index 4f3b73d33c43..a1703881f06b 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/imaging.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/imaging.handlers.ts @@ -1,12 +1,13 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMediaMockDb } from '../../data/media/media.db.js'; import type { GetImagingResizeUrlsResponse } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const imagingHandlers = [ - rest.get(umbracoPath('/imaging/resize/urls'), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); - if (!ids) return res(ctx.status(404)); + http.get(umbracoPath('/imaging/resize/urls'), ({ request }) => { + const url = new URL(request.url); + const ids = url.searchParams.getAll('id'); + if (!ids) return new HttpResponse(null, { status: 404 }); const media = umbMediaMockDb.getAll().filter((item) => ids.includes(item.id)); @@ -16,10 +17,6 @@ export const imagingHandlers = [ urlInfos: [], // item.urls, })); - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json(response), - ); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/item.handlers.ts index f6c17abf1185..9efaaed19f60 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/item.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMediaMockDb } from '../../data/media/media.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const ids = url.searchParams.getAll('id'); if (!ids) return; const items = umbMediaMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/recycle-bin.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/recycle-bin.handlers.ts index cf260a291235..f642c2b35a97 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/recycle-bin.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/recycle-bin.handlers.ts @@ -1,29 +1,31 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMediaMockDb } from '../../data/media/media.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const recycleBinHandlers = [ - rest.get(umbracoPath(`/recycle-bin${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/recycle-bin${UMB_SLUG}/root`), ({ request }) => { + const url = new URL(request.url); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbMediaMockDb.recycleBin.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/recycle-bin${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); + http.get(umbracoPath(`/recycle-bin${UMB_SLUG}/children`), ({ request }) => { + const url = new URL(request.url); + const parentId = url.searchParams.get('parentId'); if (!parentId) return; - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbMediaMockDb.recycleBin.tree.getChildrenOf({ parentId, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id/move-to-recycle-bin`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id/move-to-recycle-bin`), async ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); umbMediaMockDb.recycleBin.trash([id]); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/tree.handlers.ts index 53e112cba419..632f47a94827 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/media/tree.handlers.ts @@ -1,29 +1,32 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMediaMockDb } from '../../data/media/media.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const url = new URL(request.url); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbMediaMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const url = new URL(request.url); + const parentId = url.searchParams.get('parentId'); if (!parentId) return; - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbMediaMockDb.tree.getChildrenOf({ parentId, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), (req, res, ctx) => { - const descendantId = req.url.searchParams.get('descendantId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/ancestors`), ({ request }) => { + const url = new URL(request.url); + const descendantId = url.searchParams.get('descendantId'); if (!descendantId) return; const response = umbMediaMockDb.tree.getAncestorsOf({ descendantId }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/detail.handlers.ts index 8bf3d1e4f257..3a1a63e48976 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/detail.handlers.ts @@ -1,67 +1,68 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMemberGroupMockDb } from '../../data/member-group/member-group.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as any; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as any; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const id = umbMemberGroupMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}`), (req, res, ctx) => { - const skipParam = req.url.searchParams.get('skip'); + http.get(umbracoPath(`${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const skipParam = url.searchParams.get('skip'); const skip = skipParam ? Number.parseInt(skipParam) : undefined; - const takeParam = req.url.searchParams.get('take'); + const takeParam = url.searchParams.get('take'); const take = takeParam ? Number.parseInt(takeParam) : undefined; const response = umbMemberGroupMockDb.get({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbMemberGroupMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as any; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as any; + if (!requestBody) return new HttpResponse(null, { status: 400 }); umbMemberGroupMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbMemberGroupMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/filter.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/filter.handlers.ts index 9ee9cac2d152..2b1692546e0e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/filter.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/filter.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMemberGroupMockDb } from '../../data/member-group/member-group.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const filterHandlers = [ - rest.get(umbracoPath(`${UMB_SLUG}/filter`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); - const filter = req.url.searchParams.get('filter'); + http.get(umbracoPath(`${UMB_SLUG}/filter`), ({ request }) => { + const url = new URL(request.url); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); + const filter = url.searchParams.get('filter'); const options = { skip: skip || undefined, @@ -16,6 +17,6 @@ export const filterHandlers = [ }; const response = umbMemberGroupMockDb.filter(options); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/item.handlers.ts index 6f35fb9639d1..0f7345bc9a23 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-group/item.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMemberGroupMockDb } from '../../data/member-group/member-group.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const ids = url.searchParams.getAll('id'); if (!ids) return; const items = umbMemberGroupMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/detail.handlers.ts index 4e1978f99aa8..4fec0eb5e052 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMemberTypeMockDb } from '../../data/member-type/member-type.db.js'; import { UMB_SLUG } from './slug.js'; import type { @@ -8,53 +8,53 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateMemberTypeRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateMemberTypeRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const id = umbMemberTypeMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbMemberTypeMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateMemberTypeRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateMemberTypeRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); umbMemberTypeMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbMemberTypeMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/item.handlers.ts index b7876cf140f4..fffa62cf2aeb 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/item.handlers.ts @@ -1,13 +1,13 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMemberTypeMockDb } from '../../data/member-type/member-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const ids = new URL(request.url).searchParams.getAll('id'); if (!ids) return; const items = umbMemberTypeMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/tree.handlers.ts index ab08a7bde265..ec4059f7e13c 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member-type/tree.handlers.ts @@ -1,22 +1,24 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMemberTypeMockDb } from '../../data/member-type/member-type.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip') ?? '0'); - const take = Number(req.url.searchParams.get('take') ?? '100'); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const skip = Number(searchParams.get('skip') ?? '0'); + const take = Number(searchParams.get('take') ?? '100'); const response = umbMemberTypeMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const parentId = searchParams.get('parentId'); if (!parentId) return; - const skip = Number(req.url.searchParams.get('skip') ?? '0'); - const take = Number(req.url.searchParams.get('take') ?? '100'); + const skip = Number(searchParams.get('skip') ?? '0'); + const take = Number(searchParams.get('take') ?? '100'); const response = umbMemberTypeMockDb.tree.getChildrenOf({ parentId, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/collection.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/collection.handlers.ts index 6cbc9f858936..414762241763 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/collection.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/collection.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMemberMockDb } from '../../data/member/member.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const collectionHandlers = [ - rest.get(umbracoPath(`/collection${UMB_SLUG}`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); - const filter = req.url.searchParams.get('filter'); + http.get(umbracoPath(`/collection${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); + const filter = url.searchParams.get('filter'); const options = { skip: skip || undefined, @@ -16,6 +17,6 @@ export const collectionHandlers = [ }; const items = umbMemberMockDb.collection.getItems(options); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/detail.handlers.ts index c25a194ad1ce..27131937f769 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/detail.handlers.ts @@ -1,57 +1,57 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMemberMockDb } from '../../data/member/member.db.js'; import { UMB_SLUG } from './slug.js'; import type { CreateMemberRequestModel, UpdateMemberRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateMemberRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateMemberRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const id = umbMemberMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return HttpResponse.json(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbMemberMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateMemberRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateMemberRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); umbMemberMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbMemberMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/filter.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/filter.handlers.ts index 3047ca203fb4..9f9a629a0898 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/filter.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/filter.handlers.ts @@ -1,17 +1,18 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMemberMockDb } from '../../data/member/member.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath(`/filter${UMB_SLUG}`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); - const orderBy = req.url.searchParams.get('orderBy'); - const orderDirection = req.url.searchParams.get('orderDirection'); - const memberGroupIds = req.url.searchParams.getAll('memberGroupIds'); - const memberTypeId = req.url.searchParams.get('memberTypeId'); - const filter = req.url.searchParams.get('filter'); + http.get(umbracoPath(`/filter${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); + const orderBy = url.searchParams.get('orderBy'); + const orderDirection = url.searchParams.get('orderDirection'); + const memberGroupIds = url.searchParams.getAll('memberGroupIds'); + const memberTypeId = url.searchParams.get('memberTypeId'); + const filter = url.searchParams.get('filter'); const options: any = { skip: skip || undefined, @@ -24,6 +25,6 @@ export const handlers = [ }; const response = umbMemberMockDb.filter(options); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/item.handlers.ts index f849090f0d9a..d0f57a64a119 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/member/item.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbMemberMockDb } from '../../data/member/member.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const ids = url.searchParams.getAll('id'); if (!ids) return; const items = umbMemberMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/modelsbuilder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/modelsbuilder.handlers.ts index 334c767e264d..fb40c7fd8f85 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/modelsbuilder.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/modelsbuilder.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { @@ -8,28 +8,20 @@ import type { import { OutOfDateTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; export const handlers = [ - rest.post(umbracoPath('/models-builder/build'), async (_req, res, ctx) => { + http.post(umbracoPath('/models-builder/build'), async () => { await new Promise((resolve) => setTimeout(resolve, (Math.random() + 1) * 1000)); // simulate a delay of 1-2 seconds model = modelAfterBuild; - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({}), - ); + return HttpResponse.json({}); }), - rest.get(umbracoPath('/models-builder/dashboard'), async (_req, res, ctx) => { - return res(ctx.status(200), ctx.json(model)); + http.get(umbracoPath('/models-builder/dashboard'), async () => { + return HttpResponse.json(model); }), - rest.get(umbracoPath('/models-builder/status'), async (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - status: OutOfDateTypeModel.CURRENT, - }), - ); + http.get(umbracoPath('/models-builder/status'), async () => { + return HttpResponse.json({ + status: OutOfDateTypeModel.CURRENT, + }); }), ]; @@ -49,6 +41,7 @@ at Context.resolveId (file:///C:/Users/Umbraco/Documents/Umbraco.CMS.Backoffice/ at async Object.resolveId (file:///C:/Users/Umbraco/Documents/Umbraco.CMS.Backoffice/node_modules/vite/dist/node/chunks/dep-67e7f8ab.js:40156:32) at async TransformContext.resolve (file:///C:/Users/Umbraco/Documents/Umbraco.CMS.Backoffice/node_modules/vite/dist/node/chunks/dep-67e7f8ab.js:39921:23) at async normalizeUrl (file:///C:/Users/Umbraco/Documents/Umbraco.CMS.Backoffice/node_modules/vite/dist/node/chunks/dep-67e7f8ab.js:36831:34) +at async TransformContext.transform (file:///C:/Users/Umbraco/Documents/Umbraco.CMS.Backoffice/node_modules/vite/dist/node/chunks/dep-67e7f8ab.js:36831:34) at async TransformContext.transform (file:///C:/Users/Umbraco/Documents/Umbraco.CMS.Backoffice/node_modules/vite`, version: '13.0.0', modelsNamespace: 'Umbraco.Cms.Web.Common.PublishedModels', diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/item.handlers.ts index 0d4426e00d28..ab22c294010f 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/object-type/item.handlers.ts @@ -1,11 +1,11 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbObjectTypeData } from '../../data/object-type/object-type.data.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath(`${UMB_SLUG}`), (req, res, ctx) => { + http.get(umbracoPath(`${UMB_SLUG}`), () => { const response = umbObjectTypeData.getAll(); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/package.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/package.handlers.ts index 144a1f38488b..4371cc355638 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/package.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/package.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { UmbId } from '@umbraco-cms/backoffice/id'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -11,96 +11,85 @@ import type { } from '@umbraco-cms/backoffice/external/backend-api'; export const handlers = [ - rest.get(umbracoPath('/package/configuration'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - marketplaceUrl: 'https://marketplace.umbraco.com', - }), - ); + http.get(umbracoPath('/package/configuration'), () => { + return HttpResponse.json({ + marketplaceUrl: 'https://marketplace.umbraco.com', + }); }), - rest.get(umbracoPath('/package/migration-status'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - total: 3, - items: [ - { - hasPendingMigrations: true, - packageName: 'Named Package', - }, - { - hasPendingMigrations: true, - packageName: 'My Custom Migration', - }, - { - hasPendingMigrations: false, - packageName: 'Package with a view', - }, - ], - }), - ); + http.get(umbracoPath('/package/migration-status'), () => { + return HttpResponse.json({ + total: 3, + items: [ + { + hasPendingMigrations: true, + packageName: 'Named Package', + }, + { + hasPendingMigrations: true, + packageName: 'My Custom Migration', + }, + { + hasPendingMigrations: false, + packageName: 'Package with a view', + }, + ], + }); }), - rest.post(umbracoPath('/package/:name/run-migration'), async (_req, res, ctx) => { - const name = _req.params.name as string; - if (!name) return res(ctx.status(404)); - return res(ctx.status(200)); + http.post(umbracoPath('/package/:name/run-migration'), async ({ params }) => { + const name = params.name as string; + if (!name) return new HttpResponse(null, { status: 404 }); + return new HttpResponse(null, { status: 200 }); }), - rest.get(umbracoPath('/package/created'), async (_req, res, ctx) => { + http.get(umbracoPath('/package/created'), async () => { // read all - return res( - ctx.status(200), - ctx.json({ - total: packageArray.length, - items: packageArray, - }), - ); + return HttpResponse.json({ + total: packageArray.length, + items: packageArray, + }); }), - rest.post(umbracoPath('/package/created'), async (_req, res, ctx) => { + http.post(umbracoPath('/package/created'), async ({ request }) => { //save - const data: CreatePackageRequestModel = await _req.json(); + const data: CreatePackageRequestModel = await request.json(); const newPackage: PackageDefinitionResponseModel = { ...data, id: UmbId.new(), packagePath: '' }; packageArray.push(newPackage); - return res(ctx.status(200), ctx.json(newPackage)); + return HttpResponse.json(newPackage); }), - rest.get(umbracoPath('/package/created/:id'), (_req, res, ctx) => { + http.get(umbracoPath('/package/created/:id'), ({ params }) => { //read 1 - const id = _req.params.id as string; - if (!id) return res(ctx.status(404)); + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 404 }); const found = packageArray.find((p) => p.id == id); - if (!found) return res(ctx.status(404)); - return res(ctx.status(200), ctx.json(found)); + if (!found) return new HttpResponse(null, { status: 404 }); + return HttpResponse.json(found); }), - rest.put(umbracoPath('/package/created/:id'), async (_req, res, ctx) => { + http.put(umbracoPath('/package/created/:id'), async ({ request }) => { //update - const data: PackageDefinitionResponseModel = await _req.json(); + const data: PackageDefinitionResponseModel = await request.json(); if (!data.id) return; const index = packageArray.findIndex((x) => x.id === data.id); packageArray[index] = data; - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath('/package/created/:id'), (_req, res, ctx) => { + http.delete(umbracoPath('/package/created/:id'), ({ params }) => { //delete - const id = _req.params.id as string; - if (!id) return res(ctx.status(404)); + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 404 }); const index = packageArray.findIndex((p) => p.id == id); - if (index <= -1) return res(ctx.status(404)); + if (index <= -1) return new HttpResponse(null, { status: 404 }); packageArray.splice(index, 1); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.get(umbracoPath('/package/created/:id/download'), (_req, res, ctx) => { + http.get(umbracoPath('/package/created/:id/download'), () => { //download - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/detail.handlers.ts index 4d06d535b56d..962455c37bce 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { createProblemDetails } from '../../data/utils.js'; import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; import { UMB_SLUG } from './slug.js'; @@ -9,61 +9,60 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(UMB_SLUG), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreatePartialViewRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(UMB_SLUG), async ({ request }) => { + const requestBody = (await request.json()) as CreatePartialViewRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); // Validate name if (!requestBody.name) { - return res( - ctx.status(400, 'name is required'), - ctx.json(createProblemDetails({ title: 'Validation', detail: 'name is required' })), - ); + return HttpResponse.json(createProblemDetails({ title: 'Validation', detail: 'name is required' }), { + status: 400, + }); } const path = umbPartialViewMockDB.file.create(requestBody); const encodedPath = encodeURIComponent(path); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + encodedPath, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + encodedPath, 'Umb-Generated-Resource': encodedPath, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); if (path.endsWith('forbidden')) { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbPartialViewMockDB.file.read(decodeURIComponent(path)); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); if (path.endsWith('forbidden')) { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbPartialViewMockDB.file.delete(decodeURIComponent(path)); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.put(umbracoPath(`${UMB_SLUG}/:path`), async (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:path`), async ({ request, params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); if (path.endsWith('forbidden')) { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdatePartialViewRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdatePartialViewRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); umbPartialViewMockDB.file.update(decodeURIComponent(path), requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/folder.handlers.ts index f214cf7be068..86b127b3c766 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/folder.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/folder.handlers.ts @@ -1,36 +1,36 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; import { UMB_SLUG } from './slug.js'; import type { CreatePartialViewFolderRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const folderHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreatePartialViewFolderRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}/folder`), async ({ request }) => { + const requestBody = (await request.json()) as CreatePartialViewFolderRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const path = umbPartialViewMockDB.folder.create(requestBody); const encodedPath = encodeURIComponent(path); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + encodedPath, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + encodedPath, 'Umb-Generated-Resource': encodedPath, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/folder/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); const response = umbPartialViewMockDB.folder.read(decodeURIComponent(path)); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.delete(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/folder/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); umbPartialViewMockDB.folder.delete(decodeURIComponent(path)); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/item.handlers.ts index 1cc387e182cc..48a3b4f7ea83 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/item.handlers.ts @@ -1,14 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const paths = req.url.searchParams.getAll('path'); - if (!paths) return res(ctx.status(400, 'no body found')); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const paths = new URL(request.url).searchParams.getAll('path'); + if (!paths) return new HttpResponse(null, { status: 400 }); const decodedPaths = paths.map((path) => decodeURI(path)); const items = umbPartialViewMockDB.item.getItems(decodedPaths); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/rename.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/rename.handlers.ts index 8b6d10ab17e1..f2b0f0c9b619 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/rename.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/rename.handlers.ts @@ -1,26 +1,26 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; import { UMB_SLUG } from './slug.js'; import type { RenamePartialViewRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const renameHandlers = [ - rest.put(umbracoPath(`${UMB_SLUG}/:path/rename`), async (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:path/rename`), async ({ request, params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); - const requestBody = (await req.json()) as RenamePartialViewRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as RenamePartialViewRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const newPath = umbPartialViewMockDB.file.rename(decodeURIComponent(path), requestBody.name); const encodedPath = encodeURIComponent(newPath); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + encodedPath, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + encodedPath, 'Umb-Generated-Resource': encodedPath, - }), - ); + }, + }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/snippet.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/snippet.handlers.ts index 035570ad3ee1..80f5081daa82 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/snippet.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/snippet.handlers.ts @@ -1,18 +1,18 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const snippetHandlers = [ - rest.get(umbracoPath(`${UMB_SLUG}/snippet`), (req, res, ctx) => { + http.get(umbracoPath(`${UMB_SLUG}/snippet`), () => { const response = umbPartialViewMockDB.getSnippets(); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`${UMB_SLUG}/snippet/:fileName`), (req, res, ctx) => { - const fileName = req.params.fileName as string; - if (!fileName) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/snippet/:fileName`), ({ params }) => { + const fileName = params.fileName as string; + if (!fileName) return new HttpResponse(null, { status: 400 }); const response = umbPartialViewMockDB.getSnippet(fileName); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/tree.handlers.ts index 6838f10ca6c3..1647358581af 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/partial-view/tree.handlers.ts @@ -1,22 +1,22 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbPartialViewMockDB } from '../../data/partial-view/partial-view.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbPartialViewMockDB.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentPath = req.url.searchParams.get('parentPath'); - if (!parentPath) return res(ctx.status(400)); - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const parentPath = new URL(request.url).searchParams.get('parentPath'); + if (!parentPath) return new HttpResponse(null, { status: 400 }); + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbPartialViewMockDB.tree.getChildrenOf({ parentPath, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/performance-profiling.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/performance-profiling.handlers.ts index 07be7c9be86c..1805fe3fbde3 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/performance-profiling.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/performance-profiling.handlers.ts @@ -1,21 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { ProfilingStatusResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; export const handlers = [ - rest.get(umbracoPath('/profiling/status'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ enabled: true }), - ); + http.get(umbracoPath('/profiling/status'), () => { + return HttpResponse.json({ enabled: true }); }), - rest.put(umbracoPath('/profiling/status'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ); + http.put(umbracoPath('/profiling/status'), () => { + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/published-status.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/published-status.handlers.ts index c4e655b2d265..54d2545d5193 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/published-status.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/published-status.handlers.ts @@ -1,40 +1,27 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath('/published-cache/status'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json( - 'Database cache is ok. ContentStore contains 1 item and has 1 generation and 0 snapshot. MediaStore contains 5 items and has 1 generation and 0 snapshot.', - ), + http.get(umbracoPath('/published-cache/status'), () => { + return HttpResponse.json( + 'Database cache is ok. ContentStore contains 1 item and has 1 generation and 0 snapshot. MediaStore contains 5 items and has 1 generation and 0 snapshot.', ); }), - rest.post(umbracoPath('/published-cache/reload'), async (_req, res, ctx) => { + http.post(umbracoPath('/published-cache/reload'), async () => { await new Promise((resolve) => setTimeout(resolve, (Math.random() + 1) * 1000)); // simulate a delay of 1-2 seconds - return res( - // Respond with a 200 status code - ctx.status(200), - ); + return new HttpResponse(null, { status: 200 }); }), - rest.post(umbracoPath('/published-cache/rebuild'), async (_req, res, ctx) => { + http.post(umbracoPath('/published-cache/rebuild'), async () => { await new Promise((resolve) => setTimeout(resolve, (Math.random() + 1) * 1000)); // simulate a delay of 1-2 seconds - return res( - // Respond with a 200 status code - ctx.status(200), - ); + return new HttpResponse(null, { status: 200 }); }), - rest.post(umbracoPath('/published-cache/collect'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ); + http.post(umbracoPath('/published-cache/collect'), () => { + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/redirect-management.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/redirect-management.handlers.ts index b50d812f2680..1677abc42f35 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/redirect-management.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/redirect-management.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { PagedRedirectUrlResponseModel, @@ -8,10 +8,11 @@ import type { import { RedirectStatusModel } from '@umbraco-cms/backoffice/external/backend-api'; export const handlers = [ - rest.get(umbracoPath('/redirect-management'), (_req, res, ctx) => { - const filter = _req.url.searchParams.get('filter'); - const skip = parseInt(_req.url.searchParams.get('skip') ?? '0', 10); - const take = parseInt(_req.url.searchParams.get('take') ?? '20', 10); + http.get(umbracoPath('/redirect-management'), ({ request }) => { + const url = new URL(request.url); + const filter = url.searchParams.get('filter'); + const skip = parseInt(url.searchParams.get('skip') ?? '0', 10); + const take = parseInt(url.searchParams.get('take') ?? '20', 10); if (filter) { const filtered: RedirectUrlResponseModel[] = []; @@ -23,7 +24,7 @@ export const handlers = [ total: filtered.length, items: filtered.slice(skip, skip + take), }; - return res(ctx.status(200), ctx.json(filteredPagedData)); + return HttpResponse.json(filteredPagedData); } else { const items = PagedRedirectUrlData.items.slice(skip, skip + take); @@ -31,37 +32,37 @@ export const handlers = [ total: PagedRedirectUrlData.total, items, }; - return res(ctx.status(200), ctx.json(PagedData)); + return HttpResponse.json(PagedData); } }), - rest.get(umbracoPath('/redirect-management/:id'), async (_req, res, ctx) => { - const id = _req.params.id as string; - if (!id) return res(ctx.status(404)); - if (id === 'status') return res(ctx.status(200), ctx.json(UrlTracker)); + http.get(umbracoPath('/redirect-management/:id'), async ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 404 }); + if (id === 'status') return HttpResponse.json(UrlTracker); const PagedRedirectUrlObject = _getRedirectUrlByKey(id); - return res(ctx.status(200), ctx.json(PagedRedirectUrlObject)); + return HttpResponse.json(PagedRedirectUrlObject); }), - rest.delete(umbracoPath('/redirect-management/:id'), async (_req, res, ctx) => { - const id = _req.params.id as string; - if (!id) return res(ctx.status(404)); + http.delete(umbracoPath('/redirect-management/:id'), async ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 404 }); const PagedRedirectUrlObject = _deleteRedirectUrlByKey(id); - return res(ctx.status(200), ctx.json(PagedRedirectUrlObject)); + return HttpResponse.json(PagedRedirectUrlObject); }), - /*rest.get(umbracoPath('/redirect-management/status'), (_req, res, ctx) => { - return res(ctx.status(200), ctx.json(UrlTracker)); + /*http.get(umbracoPath('/redirect-management/status'), () => { + return HttpResponse.json(UrlTracker); }),*/ - rest.post(umbracoPath('/redirect-management/status'), async (_req, res, ctx) => { + http.post(umbracoPath('/redirect-management/status'), async () => { UrlTracker.status = UrlTracker.status === RedirectStatusModel.ENABLED ? RedirectStatusModel.DISABLED : RedirectStatusModel.ENABLED; - return res(ctx.status(200), ctx.json(UrlTracker.status)); + return HttpResponse.json(UrlTracker.status); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relation-type/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relation-type/detail.handlers.ts index 279b973f5807..793ea2fa6d05 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relation-type/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relation-type/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbRelationTypeMockDb } from '../../data/relation-type/relationType.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; @@ -8,25 +8,25 @@ import type { } from '@umbraco-cms/backoffice/external/backend-api'; export const detailHandlers = [ - rest.get(umbracoPath(`${UMB_SLUG}`), (req, res, ctx) => { - const skipParam = req.url.searchParams.get('skip'); + http.get(umbracoPath(`${UMB_SLUG}`), ({ request }) => { + const skipParam = new URL(request.url).searchParams.get('skip'); const skip = skipParam ? Number.parseInt(skipParam) : undefined; - const takeParam = req.url.searchParams.get('take'); + const takeParam = new URL(request.url).searchParams.get('take'); const take = takeParam ? Number.parseInt(takeParam) : undefined; const response = umbRelationTypeMockDb.get({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbRelationTypeMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relation/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relation/item.handlers.ts index cc88e57737ed..46249ccee184 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/relation/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/relation/item.handlers.ts @@ -1,19 +1,19 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbRelationMockDb } from '../../data/relation/relation.db.js'; import type { GetRelationByRelationTypeIdResponse } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath('/relation/type/:id'), (req, res, ctx) => { - const skipParam = req.url.searchParams.get('skip'); + http.get(umbracoPath('/relation/type/:id'), ({ request, params }) => { + const skipParam = new URL(request.url).searchParams.get('skip'); const skip = skipParam ? Number.parseInt(skipParam) : undefined; - const takeParam = req.url.searchParams.get('take'); + const takeParam = new URL(request.url).searchParams.get('take'); const take = takeParam ? Number.parseInt(takeParam) : undefined; const response = umbRelationMockDb.get({ skip, take }); - response.items = response.items.filter((item) => item.relationType.id === req.params.id); + response.items = response.items.filter((item) => item.relationType.id === params.id); response.total = response.items.length; - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/rte-embed.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/rte-embed.handlers.ts index 7f20c63c294f..fb8d77527713 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/rte-embed.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/rte-embed.handlers.ts @@ -1,19 +1,20 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import type { OEmbedResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath('/oembed/query'), (req, res, ctx) => { - const widthParam = req.url.searchParams.get('maxWidth'); + http.get(umbracoPath('/oembed/query'), ({ request }) => { + const url = new URL(request.url); + const widthParam = url.searchParams.get('maxWidth'); const width = widthParam ? parseInt(widthParam) : 360; - const heightParam = req.url.searchParams.get('maxHeight'); + const heightParam = url.searchParams.get('maxHeight'); const height = heightParam ? parseInt(heightParam) : 240; const response: OEmbedResponseModel = { markup: ``, }; - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/detail.handlers.ts index f85e6c08000c..1a84adf869d5 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { createProblemDetails } from '../../data/utils.js'; import { umbScriptMockDb } from '../../data/script/script.db.js'; import { UMB_SLUG } from './slug.js'; @@ -6,61 +6,60 @@ import type { CreateScriptRequestModel, UpdateScriptRequestModel } from '@umbrac import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(UMB_SLUG), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateScriptRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(UMB_SLUG), async ({ request }) => { + const requestBody = (await request.json()) as CreateScriptRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); // Validate name if (!requestBody.name) { - return res( - ctx.status(400, 'name is required'), - ctx.json(createProblemDetails({ title: 'Validation', detail: 'name is required' })), - ); + return HttpResponse.json(createProblemDetails({ title: 'Validation', detail: 'name is required' }), { + status: 400, + }); } const path = umbScriptMockDb.file.create(requestBody); const encodedPath = encodeURIComponent(path); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + encodedPath, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + encodedPath, 'Umb-Generated-Resource': encodedPath, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); if (path.endsWith('forbidden')) { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbScriptMockDb.file.read(decodeURIComponent(path)); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); if (path.endsWith('forbidden')) { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbScriptMockDb.file.delete(decodeURIComponent(path)); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.put(umbracoPath(`${UMB_SLUG}/:path`), async (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:path`), async ({ request, params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); if (path.endsWith('forbidden')) { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateScriptRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateScriptRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); umbScriptMockDb.file.update(decodeURIComponent(path), requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/folder.handlers.ts index 1a310e8d3b4e..4e75608ad7d3 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/folder.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/folder.handlers.ts @@ -1,36 +1,36 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbScriptMockDb } from '../../data/script/script.db.js'; import { UMB_SLUG } from './slug.js'; import type { CreateScriptFolderRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const folderHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateScriptFolderRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}/folder`), async ({ request }) => { + const requestBody = (await request.json()) as CreateScriptFolderRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const path = umbScriptMockDb.folder.create(requestBody); const encodedPath = encodeURIComponent(path); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + encodedPath, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + encodedPath, 'Umb-Generated-Resource': encodedPath, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/folder/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); const response = umbScriptMockDb.folder.read(decodeURIComponent(path)); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.delete(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/folder/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); umbScriptMockDb.folder.delete(decodeURIComponent(path)); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/item.handlers.ts index 7bd03f8a2347..c18b3f3b6a16 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/item.handlers.ts @@ -1,14 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbScriptMockDb } from '../../data/script/script.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const paths = req.url.searchParams.getAll('path'); - if (!paths) return res(ctx.status(400, 'no body found')); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const paths = new URL(request.url).searchParams.getAll('path'); + if (!paths) return new HttpResponse(null, { status: 400 }); const decodedPaths = paths.map((path) => decodeURI(path)); const items = umbScriptMockDb.item.getItems(decodedPaths); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/rename.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/rename.handlers.ts index fbb3abec2b09..d75180e09349 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/rename.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/rename.handlers.ts @@ -1,26 +1,26 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbScriptMockDb } from '../../data/script/script.db.js'; import { UMB_SLUG } from './slug.js'; import type { RenameStylesheetRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const renameHandlers = [ - rest.put(umbracoPath(`${UMB_SLUG}/:path/rename`), async (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:path/rename`), async ({ request, params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); - const requestBody = (await req.json()) as RenameStylesheetRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as RenameStylesheetRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const newPath = umbScriptMockDb.file.rename(decodeURIComponent(path), requestBody.name); const encodedPath = encodeURIComponent(newPath); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + encodedPath, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + encodedPath, 'Umb-Generated-Resource': encodedPath, - }), - ); + }, + }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/tree.handlers.ts index 216321e50f52..633761d42cf2 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/script/tree.handlers.ts @@ -1,22 +1,22 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbScriptMockDb } from '../../data/script/script.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbScriptMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentPath = req.url.searchParams.get('parentPath'); - if (!parentPath) return res(ctx.status(400)); - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const parentPath = new URL(request.url).searchParams.get('parentPath'); + if (!parentPath) return new HttpResponse(null, { status: 400 }); + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbScriptMockDb.tree.getChildrenOf({ parentPath, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/segment.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/segment.handlers.ts index 2eeca2a961df..11af631d0cb7 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/segment.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/segment.handlers.ts @@ -1,17 +1,13 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { PagedSegmentResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; export const handlers = [ - rest.get(umbracoPath('/segment'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - total: 0, - items: [], - }), - ); + http.get(umbracoPath('/segment'), () => { + return HttpResponse.json({ + total: 0, + items: [], + }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/server.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/server.handlers.ts index 6f23bbe3bf00..d575cd2912b6 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/server.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/server.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { version } from '../../../package.json'; import { RuntimeLevelModel, @@ -10,72 +10,48 @@ import { } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -export const serverRunningHandler = rest.get(umbracoPath('/server/status'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - serverStatus: RuntimeLevelModel.RUN, - }), - ); +export const serverRunningHandler = http.get(umbracoPath('/server/status'), () => { + return HttpResponse.json({ + serverStatus: RuntimeLevelModel.RUN, + }); }); -export const serverMustInstallHandler = rest.get(umbracoPath('/server/status'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - serverStatus: RuntimeLevelModel.INSTALL, - }), - ); +export const serverMustInstallHandler = http.get(umbracoPath('/server/status'), () => { + return HttpResponse.json({ + serverStatus: RuntimeLevelModel.INSTALL, + }); }); -export const serverMustUpgradeHandler = rest.get(umbracoPath('/server/status'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - serverStatus: RuntimeLevelModel.UPGRADE, - }), - ); +export const serverMustUpgradeHandler = http.get(umbracoPath('/server/status'), () => { + return HttpResponse.json({ + serverStatus: RuntimeLevelModel.UPGRADE, + }); }); export const serverInformationHandlers = [ - rest.get(umbracoPath('/server/configuration'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - allowPasswordReset: true, - versionCheckPeriod: 7, // days - allowLocalLogin: true, - umbracoCssPath: '/css', - }), - ); + http.get(umbracoPath('/server/configuration'), () => { + return HttpResponse.json({ + allowPasswordReset: true, + versionCheckPeriod: 7, // days + allowLocalLogin: true, + umbracoCssPath: '/css', + }); }), - rest.get(umbracoPath('/server/information'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - version, - assemblyVersion: version, - baseUtcOffset: '01:00:00', - runtimeMode: RuntimeModeModel.BACKOFFICE_DEVELOPMENT, - }), - ); + http.get(umbracoPath('/server/information'), () => { + return HttpResponse.json({ + version, + assemblyVersion: version, + baseUtcOffset: '01:00:00', + runtimeMode: RuntimeModeModel.BACKOFFICE_DEVELOPMENT, + }); }), - rest.get(umbracoPath('/server/troubleshooting'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - items: [ - { name: 'Umbraco base url', data: location.origin }, - { name: 'Mocked server', data: 'true' }, - { name: 'Umbraco version', data: version }, - ], - }), - ); + http.get(umbracoPath('/server/troubleshooting'), () => { + return HttpResponse.json({ + items: [ + { name: 'Umbraco base url', data: location.origin }, + { name: 'Mocked server', data: 'true' }, + { name: 'Umbraco version', data: version }, + ], + }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/item.handlers.ts index 90e1743e8b24..c8b1c644eb23 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/item.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbStaticFileMockDb } from '../../data/static-file/static-file.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const paths = req.url.searchParams.getAll('path'); - if (!paths) return res(ctx.status(400, 'no body found')); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const paths = url.searchParams.getAll('path'); + if (!paths) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); const items = umbStaticFileMockDb.item.getItems(paths); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/tree.handlers.ts index 056811101863..5671e8ed01c0 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/static-file/tree.handlers.ts @@ -1,22 +1,24 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbStaticFileMockDb } from '../../data/static-file/static-file.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const url = new URL(request.url); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbStaticFileMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentPath = req.url.searchParams.get('parentPath'); - if (!parentPath) return res(ctx.status(400)); - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const url = new URL(request.url); + const parentPath = url.searchParams.get('parentPath'); + if (!parentPath) return new HttpResponse(null, { status: 400 }); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); const response = umbStaticFileMockDb.tree.getChildrenOf({ parentPath, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/detail.handlers.ts index efcb3d5a28c1..9e5f08877fc2 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { createProblemDetails } from '../../data/utils.js'; import { umbStylesheetMockDb } from '../../data/stylesheet/stylesheet.db.js'; import { UMB_SLUG } from './slug.js'; @@ -9,61 +9,60 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(UMB_SLUG), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateStylesheetRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(UMB_SLUG), async ({ request }) => { + const requestBody = (await request.json()) as CreateStylesheetRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const path = umbStylesheetMockDb.file.create(requestBody); const encodedPath = encodeURIComponent(path); // Validate name if (!requestBody.name) { - return res( - ctx.status(400, 'name is required'), - ctx.json(createProblemDetails({ title: 'Validation', detail: 'name is required' })), - ); + return HttpResponse.json(createProblemDetails({ title: 'Validation', detail: 'name is required' }), { + status: 400, + }); } - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + encodedPath, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + encodedPath, 'Umb-Generated-Resource': encodedPath, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); if (path.endsWith('forbidden')) { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbStylesheetMockDb.file.read(decodeURIComponent(path)); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); if (path.endsWith('forbidden')) { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbStylesheetMockDb.file.delete(decodeURIComponent(path)); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.put(umbracoPath(`${UMB_SLUG}/:path`), async (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:path`), async ({ request, params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); if (path.endsWith('forbidden')) { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateStylesheetRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateStylesheetRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); umbStylesheetMockDb.file.update(decodeURIComponent(path), requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/folder.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/folder.handlers.ts index a4dcc2f43b0a..4bc7fe9e1825 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/folder.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/folder.handlers.ts @@ -1,37 +1,37 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbStylesheetMockDb } from '../../data/stylesheet/stylesheet.db.js'; import { UMB_SLUG } from './slug.js'; import type { CreateStylesheetFolderRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const folderHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/folder`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateStylesheetFolderRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}/folder`), async ({ request }) => { + const requestBody = (await request.json()) as CreateStylesheetFolderRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const path = umbStylesheetMockDb.folder.create(requestBody); const encodedPath = encodeURIComponent(path); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + encodedPath, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + encodedPath, 'Umb-Generated-Resource': encodedPath, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/folder/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); const response = umbStylesheetMockDb.folder.read(decodeURIComponent(path)); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.delete(umbracoPath(`${UMB_SLUG}/folder/:path`), (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/folder/:path`), ({ params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); umbStylesheetMockDb.folder.delete(decodeURIComponent(path)); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/item.handlers.ts index 85ac40e53a09..b805ad2d4195 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/item.handlers.ts @@ -1,14 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbStylesheetMockDb } from '../../data/stylesheet/stylesheet.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const paths = req.url.searchParams.getAll('path'); - if (!paths) return res(ctx.status(400, 'no body found')); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const paths = new URL(request.url).searchParams.getAll('path'); + if (!paths) return new HttpResponse(null, { status: 400 }); const decodedPaths = paths.map((path) => decodeURI(path)); const items = umbStylesheetMockDb.item.getItems(decodedPaths); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/rename.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/rename.handlers.ts index 3755eb996ff9..b1d48bcee7c1 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/rename.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/rename.handlers.ts @@ -1,26 +1,26 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbStylesheetMockDb } from '../../data/stylesheet/stylesheet.db.js'; import { UMB_SLUG } from './slug.js'; import type { RenameStylesheetRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const renameHandlers = [ - rest.put(umbracoPath(`${UMB_SLUG}/:path/rename`), async (req, res, ctx) => { - const path = req.params.path as string; - if (!path) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:path/rename`), async ({ request, params }) => { + const path = params.path as string; + if (!path) return new HttpResponse(null, { status: 400 }); - const requestBody = (await req.json()) as RenameStylesheetRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as RenameStylesheetRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const newPath = umbStylesheetMockDb.file.rename(decodeURIComponent(path), requestBody.name); const encodedPath = encodeURIComponent(newPath); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + encodedPath, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + encodedPath, 'Umb-Generated-Resource': encodedPath, - }), - ); + }, + }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/tree.handlers.ts index 760a43d9c33c..057a0bc70028 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/stylesheet/tree.handlers.ts @@ -1,22 +1,22 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbStylesheetMockDb } from '../../data/stylesheet/stylesheet.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbStylesheetMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentPath = req.url.searchParams.get('parentPath'); - if (!parentPath) return res(ctx.status(400)); - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const parentPath = new URL(request.url).searchParams.get('parentPath'); + if (!parentPath) return new HttpResponse(null, { status: 400 }); + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbStylesheetMockDb.tree.getChildrenOf({ parentPath, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/tag-handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/tag-handlers.ts index 2732de88bacc..efa4e159b485 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/tag-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/tag-handlers.ts @@ -1,17 +1,18 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { PagedTagResponseModel, TagResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; export const handlers = [ - rest.get(umbracoPath('/tag'), (_req, res, ctx) => { + http.get(umbracoPath('/tag'), ({ request }) => { // didnt add culture logic here - const query = _req.url.searchParams.get('query'); + const url = new URL(request.url); + const query = url.searchParams.get('query'); if (!query || !query.length) return; - const tagGroup = _req.url.searchParams.get('tagGroup') ?? 'default'; - const skip = parseInt(_req.url.searchParams.get('skip') ?? '0', 10); - const take = parseInt(_req.url.searchParams.get('take') ?? '5', 10); + const tagGroup = url.searchParams.get('tagGroup') ?? 'default'; + const skip = parseInt(url.searchParams.get('skip') ?? '0', 10); + const take = parseInt(url.searchParams.get('take') ?? '5', 10); const TagsByGroup = TagData.filter((tag) => tag.group?.toLocaleLowerCase() === tagGroup.toLocaleLowerCase()); const TagsMatch = TagsByGroup.filter((tag) => tag.text?.toLocaleLowerCase().includes(query.toLocaleLowerCase())); @@ -23,7 +24,7 @@ export const handlers = [ items: Tags, }; - return res(ctx.status(200), ctx.json(PagedData)); + return HttpResponse.json(PagedData); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/telemetry.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/telemetry.handlers.ts index efcf9451be7d..7d6c72013319 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/telemetry.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/telemetry.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { PagedTelemetryResponseModel, TelemetryResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; @@ -7,41 +7,30 @@ import { TelemetryLevelModel } from '@umbraco-cms/backoffice/external/backend-ap let telemetryLevel = TelemetryLevelModel.BASIC; export const handlers = [ - rest.get(umbracoPath('/telemetry/level'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - telemetryLevel, - }), - ); + http.get(umbracoPath('/telemetry/level'), () => { + return HttpResponse.json({ + telemetryLevel, + }); }), - rest.get(umbracoPath('/telemetry'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - total: 3, - items: [ - { telemetryLevel: TelemetryLevelModel.MINIMAL }, - { telemetryLevel: TelemetryLevelModel.BASIC }, - { telemetryLevel: TelemetryLevelModel.DETAILED }, - ], - }), - ); + http.get(umbracoPath('/telemetry'), () => { + return HttpResponse.json({ + total: 3, + items: [ + { telemetryLevel: TelemetryLevelModel.MINIMAL }, + { telemetryLevel: TelemetryLevelModel.BASIC }, + { telemetryLevel: TelemetryLevelModel.DETAILED }, + ], + }); }), - rest.post(umbracoPath('/telemetry/level'), async (_req, res, ctx) => { - const newLevel = (await _req.json()).telemetryLevel; + http.post(umbracoPath('/telemetry/level'), async ({ request }) => { + const newLevel = (await request.json()).telemetryLevel; if (newLevel) { telemetryLevel = newLevel; - return res( - // Respond with a 200 status code - ctx.status(200), - ); + return new HttpResponse(null, { status: 200 }); } else { - return res(ctx.status(400)); + return new HttpResponse(null, { status: 400 }); } }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/detail.handlers.ts index 134b4fbf9924..37ebfd94fede 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { createProblemDetails } from '../../data/utils.js'; import { umbTemplateMockDb } from '../../data/template/template.db.js'; import { UMB_SLUG } from './slug.js'; @@ -9,75 +9,73 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateTemplateRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateTemplateRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); // Validate name and alias if (!requestBody.name || !requestBody.alias) { - return res( - ctx.status(400, 'name and alias are required'), - ctx.json(createProblemDetails({ title: 'Validation', detail: 'name and alias are required' })), - ); + return HttpResponse.json(createProblemDetails({ title: 'Validation', detail: 'name and alias are required' }), { + status: 400, + }); } const id = umbTemplateMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/scaffold`), (req, res, ctx) => { + http.get(umbracoPath(`${UMB_SLUG}/scaffold`), () => { const response = umbTemplateMockDb.detail.createScaffold(); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbTemplateMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateTemplateRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateTemplateRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); // Validate name and alias if (!requestBody.name || !requestBody.alias) { - return res( - ctx.status(400, 'name and alias are required'), - ctx.json(createProblemDetails({ title: 'Validation', detail: 'name and alias are required' })), - ); + return HttpResponse.json(createProblemDetails({ title: 'Validation', detail: 'name and alias are required' }), { + status: 400, + }); } umbTemplateMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbTemplateMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/item.handlers.ts index 4bbf173086cf..76c1cc3e417d 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/item.handlers.ts @@ -1,13 +1,13 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbTemplateMockDb } from '../../data/template/template.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const ids = new URL(request.url).searchParams.getAll('id'); if (!ids) return; const items = umbTemplateMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/query.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/query.handlers.ts index 6e05162f6892..9f74e0bf7a66 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/query.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/query.handlers.ts @@ -1,16 +1,16 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbTemplateMockDb } from '../../data/template/template.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const queryHandlers = [ - rest.get(umbracoPath(`${UMB_SLUG}/query/settings`), (req, res, ctx) => { + http.get(umbracoPath(`${UMB_SLUG}/query/settings`), () => { const response = umbTemplateMockDb.query.getQuerySettings(); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.post(umbracoPath(`${UMB_SLUG}/query/execute`), (req, res, ctx) => { + http.post(umbracoPath(`${UMB_SLUG}/query/execute`), () => { const response = umbTemplateMockDb.query.getQueryResult(); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/tree.handlers.ts index d177d705fd50..3f07b85ddae3 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/tree.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/template/tree.handlers.ts @@ -1,22 +1,22 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbTemplateMockDb } from '../../data/template/template.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const treeHandlers = [ - rest.get(umbracoPath(`/tree${UMB_SLUG}/root`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + http.get(umbracoPath(`/tree${UMB_SLUG}/root`), ({ request }) => { + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbTemplateMockDb.tree.getRoot({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`/tree${UMB_SLUG}/children`), (req, res, ctx) => { - const parentId = req.url.searchParams.get('parentId'); + http.get(umbracoPath(`/tree${UMB_SLUG}/children`), ({ request }) => { + const parentId = new URL(request.url).searchParams.get('parentId'); if (!parentId) return; - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); + const skip = Number(new URL(request.url).searchParams.get('skip')); + const take = Number(new URL(request.url).searchParams.get('take')); const response = umbTemplateMockDb.tree.getChildrenOf({ parentId, skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/temporary-file/temporary-file.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/temporary-file/temporary-file.handlers.ts index f84422ecd3cd..b2e02d2a1744 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/temporary-file/temporary-file.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/temporary-file/temporary-file.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { GetTemporaryFileConfigurationResponse } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbId } from '@umbraco-cms/backoffice/id'; @@ -6,20 +6,17 @@ import { UmbId } from '@umbraco-cms/backoffice/id'; const UMB_SLUG = 'temporary-file'; export const handlers = [ - rest.post(umbracoPath(`/${UMB_SLUG}`), async (_req, res, ctx) => { + http.post(umbracoPath(`/${UMB_SLUG}`), async () => { const guid = UmbId.new(); - return res(ctx.delay(), ctx.status(201), ctx.set('Umb-Generated-Resource', guid)); + return new HttpResponse(null, { status: 201, headers: { 'Umb-Generated-Resource': guid } }); }), - rest.get(umbracoPath(`/${UMB_SLUG}/configuration`), async (_req, res, ctx) => { - return res( - ctx.delay(), - ctx.json({ - allowedUploadedFileExtensions: [], - disallowedUploadedFilesExtensions: ['exe', 'dll', 'bat', 'msi'], - maxFileSize: 1468007, - imageFileTypes: ['jpg', 'png', 'gif', 'jpeg', 'svg'], - }), - ); + http.get(umbracoPath(`/${UMB_SLUG}/configuration`), async () => { + return HttpResponse.json({ + allowedUploadedFileExtensions: [], + disallowedUploadedFilesExtensions: ['exe', 'dll', 'bat', 'msi'], + maxFileSize: 1468007, + imageFileTypes: ['jpg', 'png', 'gif', 'jpeg', 'svg'], + }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/umbraco-news.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/umbraco-news.handlers.ts index 748bed633427..e2fa5c9ef24f 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/umbraco-news.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/umbraco-news.handlers.ts @@ -1,10 +1,11 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse, delay } = window.MockServiceWorker; import { umbNewsData } from '../data/umbraco-news.data.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath('/news-dashboard'), (req, res, ctx) => { + http.get(umbracoPath('/news-dashboard'), async () => { + await delay(); const response = umbNewsData; - return res(ctx.delay(), ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/upgrade.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/upgrade.handlers.ts index 6c733ed23fab..455ceb554924 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/upgrade.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/upgrade.handlers.ts @@ -1,29 +1,22 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { UpgradeSettingsResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; export const handlers = [ - rest.get(umbracoPath('/upgrade/settings'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json({ - currentState: '2b20c6e7', - newState: '2b20c6e8', - oldVersion: '13.0.0', - newVersion: '17.0.0', - reportUrl: 'https://our.umbraco.com/download/releases/1700', - }), - ); + http.get(umbracoPath('/upgrade/settings'), () => { + return HttpResponse.json({ + currentState: '2b20c6e7', + newState: '2b20c6e8', + oldVersion: '13.0.0', + newVersion: '17.0.0', + reportUrl: 'https://our.umbraco.com/download/releases/1700', + }); }), - rest.post(umbracoPath('/upgrade/authorize'), async (_req, res, ctx) => { + http.post(umbracoPath('/upgrade/authorize'), async () => { await new Promise((resolve) => setTimeout(resolve, (Math.random() + 1) * 1000)); // simulate a delay of 1-2 seconds - return res( - // Respond with a 200 status code - ctx.status(201), - ); + return new HttpResponse(null, { status: 201 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/detail.handlers.ts index 64e2db87a5c0..4e95e180981e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/detail.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserGroupMockDb } from '../../data/user-group/user-group.db.js'; import { UMB_SLUG } from './slug.js'; import type { @@ -8,63 +8,64 @@ import type { import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateUserGroupRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateUserGroupRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); const id = umbUserGroupMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}`), (req, res, ctx) => { - const skipParam = req.url.searchParams.get('skip'); + http.get(umbracoPath(`${UMB_SLUG}`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const skipParam = searchParams.get('skip'); const skip = skipParam ? Number.parseInt(skipParam) : undefined; - const takeParam = req.url.searchParams.get('take'); + const takeParam = searchParams.get('take'); const take = takeParam ? Number.parseInt(takeParam) : undefined; const response = umbUserGroupMockDb.get({ skip, take }); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbUserGroupMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateUserGroupRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateUserGroupRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400 }); umbUserGroupMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbUserGroupMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/filter.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/filter.handlers.ts index 931b80e09482..18773a34491a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/filter.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/filter.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserGroupMockDb } from '../../data/user-group/user-group.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath(`/filter${UMB_SLUG}`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); - const filter = req.url.searchParams.get('filter'); + http.get(umbracoPath(`/filter${UMB_SLUG}`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const skip = Number(searchParams.get('skip')); + const take = Number(searchParams.get('take')); + const filter = searchParams.get('filter'); const options: any = { skip: skip || undefined, @@ -16,6 +17,6 @@ export const handlers = [ }; const response = umbUserGroupMockDb.filter(options); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/item.handlers.ts index a1d8443e0bcb..4e95295b6395 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/item.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserGroupMockDb } from '../../data/user-group/user-group.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const searchParams = new URL(request.url).searchParams; + const ids = searchParams.getAll('id'); if (!ids) return; const items = umbUserGroupMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/change-password.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/change-password.handlers.ts index 08bd614829e5..f75916305747 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/change-password.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/change-password.handlers.ts @@ -1,16 +1,16 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { UMB_SLUG } from './slug.js'; import type { ChangePasswordUserRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/change-password/:id`), async (req, res, ctx) => { - const data = await req.json(); + http.post(umbracoPath(`${UMB_SLUG}/change-password/:id`), async ({ request }) => { + const data = await request.json(); if (!data) return; if (!data.newPassword) return; /* we don't have to update any mock data when a password is changed so we just return a 200 */ - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts index 15dc2ca3c93c..dbd4cb7dd025 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/current.handlers.ts @@ -1,82 +1,74 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import type { GetUserCurrentLoginProvidersResponse } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath(`${UMB_SLUG}/current`), (_req, res, ctx) => { + http.get(umbracoPath(`${UMB_SLUG}/current`), () => { const loggedInUser = umbUserMockDb.getCurrentUser(); - return res(ctx.status(200), ctx.json(loggedInUser)); + return HttpResponse.json(loggedInUser); }), - rest.get( - umbracoPath(`${UMB_SLUG}/current/login-providers`), - (_req, res, ctx) => { - return res( - ctx.status(200), - ctx.json([ - { - hasManualLinkingEnabled: true, - isLinkedOnUser: true, - providerKey: 'google', - providerSchemeName: 'Umbraco.Google', - }, - ]), - ); - }, - ), - rest.get(umbracoPath(`${UMB_SLUG}/current/2fa`), (_req, res, ctx) => { + http.get(umbracoPath(`${UMB_SLUG}/current/login-providers`), () => { + return HttpResponse.json([ + { + hasManualLinkingEnabled: true, + isLinkedOnUser: true, + providerKey: 'google', + providerSchemeName: 'Umbraco.Google', + }, + ]); + }), + http.get(umbracoPath(`${UMB_SLUG}/current/2fa`), () => { const mfaLoginProviders = umbUserMockDb.getMfaLoginProviders(); - return res(ctx.status(200), ctx.json(mfaLoginProviders)); + return HttpResponse.json(mfaLoginProviders); }), - rest.get(umbracoPath(`${UMB_SLUG}/current/2fa/:providerName`), (req, res, ctx) => { - if (!req.params.providerName) { - return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/current/2fa/:providerName`), ({ params }) => { + if (!params.providerName) { + return new HttpResponse(null, { status: 400 }); } const mfaProviders = umbUserMockDb.getMfaLoginProviders(); - const mfaProvider = mfaProviders.find((p) => p.providerName === req.params.providerName.toString()); + const mfaProvider = mfaProviders.find((p) => p.providerName === params.providerName.toString()); if (!mfaProvider) { - return res(ctx.status(404)); + return new HttpResponse(null, { status: 404 }); } - return res( - ctx.status(200), - ctx.json({ - $type: 'TwoFactorAuthInfo', - qrCodeSetupImageUrl: 'https://placehold.co/200x200?text=QR+Code+here', - secret: '8b713fc7-8f17-4f5d-b2ac-b53879c75953', - }), - ); + return HttpResponse.json({ + $type: 'TwoFactorAuthInfo', + qrCodeSetupImageUrl: 'https://placehold.co/200x200?text=QR+Code+here', + secret: '8b713fc7-8f17-4f5d-b2ac-b53879c75953', + }); }), - rest.post<{ code: string; secret: string }>( + http.post<{ code: string; secret: string }>( umbracoPath(`${UMB_SLUG}/current/2fa/:providerName`), - async (req, res, ctx) => { - const body = await req.json(); - if (!req.params.providerName || !body.code || !body.secret) { - return res(ctx.status(400)); + async ({ request, params }) => { + const body = await request.json(); + if (!params.providerName || !body.code || !body.secret) { + return new HttpResponse(null, { status: 400 }); } if (body.code === 'fail') { - return res(ctx.delay(), ctx.status(400)); + return new HttpResponse(null, { status: 400 }); } - const result = umbUserMockDb.enableMfaProvider(req.params.providerName.toString()); - return res(ctx.delay(), ctx.status(result ? 200 : 404)); + const result = umbUserMockDb.enableMfaProvider(params.providerName.toString()); + return new HttpResponse(null, { status: result ? 200 : 404 }); }, ), - rest.delete<{ code: string }>(umbracoPath(`${UMB_SLUG}/current/2fa/:providerName`), (req, res, ctx) => { - const code = req.url.searchParams.get('code'); - if (!req.params.providerName || !code) { - return res(ctx.status(400)); + http.delete<{ code: string }>(umbracoPath(`${UMB_SLUG}/current/2fa/:providerName`), ({ request, params }) => { + const url = new URL(request.url); + const code = url.searchParams.get('code'); + if (!params.providerName || !code) { + return new HttpResponse(null, { status: 400 }); } if (code === 'fail') { - return res(ctx.delay(), ctx.status(400)); + return new HttpResponse(null, { status: 400 }); } - const result = umbUserMockDb.disableMfaProvider(req.params.providerName.toString()); - return res(ctx.delay(), ctx.status(result ? 200 : 404)); + const result = umbUserMockDb.disableMfaProvider(params.providerName.toString()); + return new HttpResponse(null, { status: result ? 200 : 404 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/detail.handlers.ts index c9f4bfa4a6ad..7ea57e8895f4 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/detail.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/detail.handlers.ts @@ -1,81 +1,81 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import type { CreateUserRequestModel, UpdateUserRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const detailHandlers = [ - rest.post(umbracoPath(`${UMB_SLUG}`), async (req, res, ctx) => { - const requestBody = (await req.json()) as CreateUserRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + http.post(umbracoPath(`${UMB_SLUG}`), async ({ request }) => { + const requestBody = (await request.json()) as CreateUserRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); const id = umbUserMockDb.detail.create(requestBody); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + id, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + id, 'Umb-Generated-Resource': id, - }), - ); + }, + }); }), - rest.get(umbracoPath(`${UMB_SLUG}/configuration`), (_req, res, ctx) => { - return res(ctx.status(200), ctx.json(umbUserMockDb.getConfiguration())); + http.get(umbracoPath(`${UMB_SLUG}/configuration`), () => { + return HttpResponse.json(umbUserMockDb.getConfiguration()); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id/calculate-start-nodes`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id/calculate-start-nodes`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - return res(ctx.status(200), ctx.json(umbUserMockDb.calculateStartNodes(id))); + return HttpResponse.json(umbUserMockDb.calculateStartNodes(id)); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id/client-credentials`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id/client-credentials`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - return res(ctx.status(200), ctx.json(umbUserMockDb.clientCredentials(id))); + return HttpResponse.json(umbUserMockDb.clientCredentials(id)); }), - rest.get(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.get(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } const response = umbUserMockDb.detail.read(id); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), - rest.put(umbracoPath(`${UMB_SLUG}/:id`), async (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.put(umbracoPath(`${UMB_SLUG}/:id`), async ({ request, params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } - const requestBody = (await req.json()) as UpdateUserRequestModel; - if (!requestBody) return res(ctx.status(400, 'no body found')); + const requestBody = (await request.json()) as UpdateUserRequestModel; + if (!requestBody) return new HttpResponse(null, { status: 400, statusText: 'no body found' }); umbUserMockDb.detail.update(id, requestBody); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id`), (req, res, ctx) => { - const id = req.params.id as string; - if (!id) return res(ctx.status(400)); + http.delete(umbracoPath(`${UMB_SLUG}/:id`), ({ params }) => { + const id = params.id as string; + if (!id) return new HttpResponse(null, { status: 400 }); if (id === 'forbidden') { // Simulate a forbidden response - return res(ctx.status(403)); + return new HttpResponse(null, { status: 403 }); } umbUserMockDb.detail.delete(id); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts index 833dd3040c78..1057f69dd83a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/disable.handlers.ts @@ -1,17 +1,17 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import type { DisableUserRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/disable`), async (req, res, ctx) => { - const data = await req.json(); + http.post(umbracoPath(`${UMB_SLUG}/disable`), async ({ request }) => { + const data = await request.json(); if (!data) return; if (!data.userIds) return; umbUserMockDb.disable(data.userIds); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts index 202003c5f889..570428b0ea3f 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/enable.handlers.ts @@ -1,17 +1,17 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import type { EnableUserRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/enable`), async (req, res, ctx) => { - const data = await req.json(); + http.post(umbracoPath(`${UMB_SLUG}/enable`), async ({ request }) => { + const data = await request.json(); if (!data) return; if (!data.userIds) return; umbUserMockDb.enable(data.userIds); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts index f01d2922a3ba..2bee78160f84 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts @@ -1,17 +1,18 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath(`/filter${UMB_SLUG}`), (req, res, ctx) => { - const skip = Number(req.url.searchParams.get('skip')); - const take = Number(req.url.searchParams.get('take')); - const orderBy = req.url.searchParams.get('orderBy'); - const orderDirection = req.url.searchParams.get('orderDirection'); - const userGroupIds = req.url.searchParams.getAll('userGroupIds'); - const userStates = req.url.searchParams.getAll('userStates'); - const filter = req.url.searchParams.get('filter'); + http.get(umbracoPath(`/filter${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const skip = Number(url.searchParams.get('skip')); + const take = Number(url.searchParams.get('take')); + const orderBy = url.searchParams.get('orderBy'); + const orderDirection = url.searchParams.get('orderDirection'); + const userGroupIds = url.searchParams.getAll('userGroupIds'); + const userStates = url.searchParams.getAll('userStates'); + const filter = url.searchParams.get('filter'); const options: any = { skip: skip || undefined, @@ -24,6 +25,6 @@ export const handlers = [ }; const response = umbUserMockDb.filter(options); - return res(ctx.status(200), ctx.json(response)); + return HttpResponse.json(response); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts index 063d9f2c3669..7ea0aaa7a01f 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/invite.handlers.ts @@ -1,4 +1,4 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import type { InviteUserRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; @@ -7,27 +7,27 @@ import { umbracoPath } from '@umbraco-cms/backoffice/utils'; const inviteSlug = `${UMB_SLUG}/invite`; export const handlers = [ - rest.post(umbracoPath(`${inviteSlug}`), async (req, res, ctx) => { - const data = await req.json(); + http.post(umbracoPath(`${inviteSlug}`), async ({ request }) => { + const data = await request.json(); if (!data) return; const { userId } = umbUserMockDb.invite(data); - if (!userId) return res(ctx.status(400)); + if (!userId) return new HttpResponse(null, { status: 400 }); - return res( - ctx.status(201), - ctx.set({ - Location: req.url.href + '/' + userId, + return new HttpResponse(null, { + status: 201, + headers: { + Location: request.url + '/' + userId, 'Umb-Generated-Resource': userId, - }), - ); + }, + }); }), - rest.post(umbracoPath(`${inviteSlug}/resend`), async (req, res, ctx) => { - const data = await req.json(); + http.post(umbracoPath(`${inviteSlug}/resend`), async ({ request }) => { + const data = await request.json(); if (!data) return; - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/item.handlers.ts index e7ab718517f4..103b356a7297 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/item.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/item.handlers.ts @@ -1,13 +1,14 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const itemHandlers = [ - rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); + http.get(umbracoPath(`/item${UMB_SLUG}`), ({ request }) => { + const url = new URL(request.url); + const ids = url.searchParams.getAll('id'); if (!ids) return; const items = umbUserMockDb.item.getItems(ids); - return res(ctx.status(200), ctx.json(items)); + return HttpResponse.json(items); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/mfa.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/mfa.handlers.ts index e3316bf1b01e..a2af59f0e53f 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/mfa.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/mfa.handlers.ts @@ -1,21 +1,21 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.get(umbracoPath(`${UMB_SLUG}/:id/2fa`), (_req, res, ctx) => { + http.get(umbracoPath(`${UMB_SLUG}/:id/2fa`), () => { const mfaLoginProviders = umbUserMockDb.getMfaLoginProviders(); - return res(ctx.status(200), ctx.json(mfaLoginProviders)); + return HttpResponse.json(mfaLoginProviders); }), - rest.delete(umbracoPath(`${UMB_SLUG}/:id/2fa/:providerName`), async (req, res, ctx) => { + http.delete(umbracoPath(`${UMB_SLUG}/:id/2fa/:providerName`), async ({ params }) => { const mfaLoginProviders = umbUserMockDb.getMfaLoginProviders(); - const provider = mfaLoginProviders.find((p) => p.providerName === req.params.providerName); + const provider = mfaLoginProviders.find((p) => p.providerName === params.providerName); if (!provider) { - return res(ctx.status(404)); + return new HttpResponse(null, { status: 404 }); } provider.isEnabledOnUser = false; - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/set-user-groups.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/set-user-groups.handlers.ts index 98178720b2c3..6f276e0fd653 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/set-user-groups.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/set-user-groups.handlers.ts @@ -1,15 +1,15 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/set-user-groups`), async (req, res, ctx) => { - const data = await req.json(); + http.post(umbracoPath(`${UMB_SLUG}/set-user-groups`), async ({ request }) => { + const data = await request.json(); if (!data) return; umbUserMockDb.setUserGroups(data); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts index b310df3830f0..bb920b098022 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/unlock.handlers.ts @@ -1,17 +1,17 @@ -const { rest } = window.MockServiceWorker; +const { http, HttpResponse } = window.MockServiceWorker; import { umbUserMockDb } from '../../data/user/user.db.js'; import { UMB_SLUG } from './slug.js'; import type { UnlockUsersRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const handlers = [ - rest.post(umbracoPath(`${UMB_SLUG}/unlock`), async (req, res, ctx) => { - const data = await req.json(); + http.post(umbracoPath(`${UMB_SLUG}/unlock`), async ({ request }) => { + const data = await request.json(); if (!data) return; if (!data.userIds) return; umbUserMockDb.unlock(data.userIds); - return res(ctx.status(200)); + return new HttpResponse(null, { status: 200 }); }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/index.ts index 52f338914f0c..1ec3dc830ed3 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/index.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/index.ts @@ -1,15 +1,17 @@ const { setupWorker } = window.MockServiceWorker; import { handlers } from './browser-handlers.js'; -import type { MockedRequest, setupWorker as setupWorkType, rest, StartOptions } from 'msw'; +import type { setupWorker as setupWorkerType, StartOptions } from 'msw/browser'; +import type { http as httpType, HttpResponse as HttpResponseType, delay as delayType } from 'msw'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; const worker = setupWorker(...handlers); export { setupWorker }; -export const onUnhandledRequest = (req: MockedRequest) => { - if (req.url.pathname.startsWith(umbracoPath(''))) { - console.warn('Found an unhandled %s request to %s', req.method, req.url.href); +export const onUnhandledRequest = (request: Request) => { + const url = new URL(request.url); + if (url.pathname.startsWith(umbracoPath(''))) { + console.warn('Found an unhandled %s request to %s', request.method, request.url); } }; @@ -22,8 +24,10 @@ export const startMockServiceWorker = (config?: StartOptions) => declare global { interface Window { MockServiceWorker: { - setupWorker: typeof setupWorkType; - rest: typeof rest; + setupWorker: typeof setupWorkerType; + http: typeof httpType; + HttpResponse: typeof HttpResponseType; + delay: typeof delayType; }; } } diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs index 806dd72ffb1b..a6088c1023cb 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs +++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs @@ -64,19 +64,22 @@ export default { window.__UMBRACO_TEST_RUN_A11Y_TEST = ${(!devMode).toString()}; - - - `, }; diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.index.ts b/src/Umbraco.Web.UI.Client/web-test-runner.index.ts index aebc7461a68d..b2fbca7e8297 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.index.ts +++ b/src/Umbraco.Web.UI.Client/web-test-runner.index.ts @@ -3,7 +3,7 @@ import { onUnhandledRequest, setupWorker } from './src/mocks/index.js'; const worker = setupWorker(...handlers); -worker.start({ +await worker.start({ onUnhandledRequest, quiet: true, });