From 5213487393f8d2ef7599a1fe02986c094d54f777 Mon Sep 17 00:00:00 2001 From: Leandro Soares Date: Wed, 14 Aug 2024 11:29:30 +0100 Subject: [PATCH 1/2] fix: rearrange routes to match /presets/[id]/action --- .changeset/tricky-pillows-train.md | 5 ++++ client/composables/use-presets.ts | 6 ++-- playground/nuxt.config.ts | 6 ---- src/module.ts | 28 ++++++++++--------- .../server/management/generate-preset.ts | 7 ++++- .../server/routes/delete-preset.post.ts | 14 ---------- .../server/routes/generate-preset.post.ts | 16 ----------- src/runtime/server/routes/presets.ts | 4 --- .../server/routes/presets/[id]/delete.post.ts | 14 ++++++++++ .../routes/presets/[id]/generate.post.ts | 15 ++++++++++ .../server/routes/presets/[id]/set.post.ts | 14 ++++++++++ src/runtime/server/routes/presets/index.ts | 4 +++ src/runtime/server/routes/set-preset.post.ts | 14 ---------- 13 files changed, 76 insertions(+), 71 deletions(-) create mode 100644 .changeset/tricky-pillows-train.md delete mode 100644 src/runtime/server/routes/delete-preset.post.ts delete mode 100644 src/runtime/server/routes/generate-preset.post.ts delete mode 100644 src/runtime/server/routes/presets.ts create mode 100644 src/runtime/server/routes/presets/[id]/delete.post.ts create mode 100644 src/runtime/server/routes/presets/[id]/generate.post.ts create mode 100644 src/runtime/server/routes/presets/[id]/set.post.ts create mode 100644 src/runtime/server/routes/presets/index.ts delete mode 100644 src/runtime/server/routes/set-preset.post.ts diff --git a/.changeset/tricky-pillows-train.md b/.changeset/tricky-pillows-train.md new file mode 100644 index 0000000..2ae52cd --- /dev/null +++ b/.changeset/tricky-pillows-train.md @@ -0,0 +1,5 @@ +--- +"nuxt-mock-server": patch +--- + +Rearrange routes to match /presets/[id]/ diff --git a/client/composables/use-presets.ts b/client/composables/use-presets.ts index d62829c..b4f31da 100644 --- a/client/composables/use-presets.ts +++ b/client/composables/use-presets.ts @@ -30,7 +30,7 @@ export function usePresets() { isLoading.value = true; try { if (appFetch.value) { - await appFetch.value("/__mock-server__/set-preset", { method: "POST", query: { preset: name } }); + await appFetch.value(`/__mock-server__/presets/${name}/set`, { method: "POST" }); await appFetch.value("/"); await loadPresets(false); } @@ -47,7 +47,7 @@ export function usePresets() { isLoading.value = true; try { if (appFetch.value) { - await appFetch.value("/__mock-server__/delete-preset", { method: "POST", query: { preset: name } }); + await appFetch.value(`/__mock-server__/presets/${name}/delete`, { method: "POST" }); await appFetch.value("/"); await loadPresets(false); } @@ -64,7 +64,7 @@ export function usePresets() { isLoading.value = true; try { if (appFetch.value) { - await appFetch.value("/__mock-server__/generate-preset", { method: "POST", query: { preset: name } }); + await appFetch.value(`/__mock-server__/presets/${name}/generate`, { method: "POST" }); await loadPresets(false); } } diff --git a/playground/nuxt.config.ts b/playground/nuxt.config.ts index 7c2e713..3222f92 100644 --- a/playground/nuxt.config.ts +++ b/playground/nuxt.config.ts @@ -49,12 +49,6 @@ export default defineNuxtConfig({ enabled: true, auto: false, debug: true, - devtools: { - createPreset: false, - deletePreset: true, - generatePreset: true, - setPreset: false, - }, generate: { routes: [ "/api/pages/product?slug=/product/Cheese", diff --git a/src/module.ts b/src/module.ts index d004d21..d2b496d 100644 --- a/src/module.ts +++ b/src/module.ts @@ -80,36 +80,38 @@ export default defineNuxtModule({ if (devtools.enabled) { addServerHandler({ - route: "/__mock-server__/presets", - handler: resolver.resolve("./runtime/server/routes/presets"), + route: "/__mock-server__/meta", + method: "get", + handler: resolver.resolve("./runtime/server/routes/meta"), }); addServerHandler({ - route: "/__mock-server__/meta", - handler: resolver.resolve("./runtime/server/routes/meta"), + route: "/__mock-server__/presets", + method: "get", + handler: resolver.resolve("./runtime/server/routes/presets/index"), }); if (devtools.createPreset || devtools.setPreset) { addServerHandler({ - route: "/__mock-server__/set-preset", - method: "POST", - handler: resolver.resolve("./runtime/server/routes/set-preset.post"), + route: "/__mock-server__/presets/:id/set", + method: "post", + handler: resolver.resolve("./runtime/server/routes/presets/[id]/set.post"), }); } if (devtools.deletePreset) { addServerHandler({ - route: "/__mock-server__/delete-preset", - method: "POST", - handler: resolver.resolve("./runtime/server/routes/delete-preset.post"), + route: "/__mock-server__/presets/:id/delete", + method: "post", + handler: resolver.resolve("./runtime/server/routes/presets/[id]/delete.post"), }); } if (devtools.generatePreset) { addServerHandler({ - route: "/__mock-server__/generate-preset", - method: "POST", - handler: resolver.resolve("./runtime/server/routes/generate-preset.post"), + route: "/__mock-server__/presets/:id/generate", + method: "post", + handler: resolver.resolve("./runtime/server/routes/presets/[id]/generate.post"), }); } diff --git a/src/runtime/server/management/generate-preset.ts b/src/runtime/server/management/generate-preset.ts index 1fd4859..7e87971 100644 --- a/src/runtime/server/management/generate-preset.ts +++ b/src/runtime/server/management/generate-preset.ts @@ -37,7 +37,7 @@ export const generatePreset = async ( const { mockServer: { defaultPreset, generate, auto, debug } = {} } = runtimeConfig; const preset = _preset || defaultPreset; - if (!generate || !generate.routes?.length) { + if (!generate) { throw new TypeError("[mock-server] Generation is not enabled"); } @@ -48,6 +48,11 @@ export const generatePreset = async ( const routes = generate.routes || []; await nitro.hooks.callHook("mock-server:extendRoutes", { routes, preset }); + if (!generate.routes?.length) { + consola.warn("[mock-server] No routes to generate"); + return; + } + if (generate.parallel) { const routeCalls = await Promise.allSettled(routes.map(route => request(nitro.localFetch, route, preset, !!auto, !!debug))); diff --git a/src/runtime/server/routes/delete-preset.post.ts b/src/runtime/server/routes/delete-preset.post.ts deleted file mode 100644 index a03cc75..0000000 --- a/src/runtime/server/routes/delete-preset.post.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { getQuery } from "h3"; -import { useMockServer } from "../composables"; -import { definePresetHandler } from "../handlers"; - -export default definePresetHandler(async (event) => { - const query = getQuery(event); - const { deletePreset } = useMockServer(event); - - if (!query?.preset || typeof query.preset !== "string") { - return; - } - - await deletePreset(query.preset); -}); diff --git a/src/runtime/server/routes/generate-preset.post.ts b/src/runtime/server/routes/generate-preset.post.ts deleted file mode 100644 index dd93957..0000000 --- a/src/runtime/server/routes/generate-preset.post.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { getQuery } from "h3"; -import { definePresetHandler } from "../handlers"; -import { generatePreset } from "../management"; -import { useRuntimeConfig } from "#imports"; - -export default definePresetHandler(async (event) => { - const query = getQuery(event); - const preset = query.preset; - const runtimeConfig = useRuntimeConfig(event); - - if (!preset || typeof preset !== "string") { - throw new Error("Preset is required and must be a string"); - } - - await generatePreset(runtimeConfig, preset); -}); diff --git a/src/runtime/server/routes/presets.ts b/src/runtime/server/routes/presets.ts deleted file mode 100644 index 180aaa1..0000000 --- a/src/runtime/server/routes/presets.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { getPresets } from "../management"; -import { definePresetHandler } from "../handlers"; - -export default definePresetHandler(getPresets); diff --git a/src/runtime/server/routes/presets/[id]/delete.post.ts b/src/runtime/server/routes/presets/[id]/delete.post.ts new file mode 100644 index 0000000..b1fc757 --- /dev/null +++ b/src/runtime/server/routes/presets/[id]/delete.post.ts @@ -0,0 +1,14 @@ +import { getRouterParam } from "h3"; +import { useMockServer } from "../../../composables"; +import { definePresetHandler } from "../../../handlers"; + +export default definePresetHandler(async (event) => { + const preset = getRouterParam(event, "id"); + const { deletePreset } = useMockServer(event); + + if (!preset) { + throw new Error("Id not found"); + } + + await deletePreset(preset); +}); diff --git a/src/runtime/server/routes/presets/[id]/generate.post.ts b/src/runtime/server/routes/presets/[id]/generate.post.ts new file mode 100644 index 0000000..989433b --- /dev/null +++ b/src/runtime/server/routes/presets/[id]/generate.post.ts @@ -0,0 +1,15 @@ +import { getRouterParam } from "h3"; +import { definePresetHandler } from "../../../handlers"; +import { generatePreset } from "../../../management"; +import { useRuntimeConfig } from "#imports"; + +export default definePresetHandler(async (event) => { + const preset = getRouterParam(event, "id"); + const runtimeConfig = useRuntimeConfig(event); + + if (!preset) { + throw new Error("Id not found"); + } + + await generatePreset(runtimeConfig, preset); +}); diff --git a/src/runtime/server/routes/presets/[id]/set.post.ts b/src/runtime/server/routes/presets/[id]/set.post.ts new file mode 100644 index 0000000..fe7c775 --- /dev/null +++ b/src/runtime/server/routes/presets/[id]/set.post.ts @@ -0,0 +1,14 @@ +import { getRouterParam } from "h3"; +import { useMockServer } from "../../../composables"; +import { definePresetHandler } from "../../../handlers"; + +export default definePresetHandler(async (event) => { + const preset = getRouterParam(event, "id"); + const { setPreset } = useMockServer(event); + + if (!preset) { + throw new Error("Id not found"); + } + + await setPreset(preset); +}); diff --git a/src/runtime/server/routes/presets/index.ts b/src/runtime/server/routes/presets/index.ts new file mode 100644 index 0000000..5491755 --- /dev/null +++ b/src/runtime/server/routes/presets/index.ts @@ -0,0 +1,4 @@ +import { definePresetHandler } from "../../handlers"; +import { getPresets } from "../../management"; + +export default definePresetHandler(getPresets); diff --git a/src/runtime/server/routes/set-preset.post.ts b/src/runtime/server/routes/set-preset.post.ts deleted file mode 100644 index 28eb3cb..0000000 --- a/src/runtime/server/routes/set-preset.post.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { getQuery } from "h3"; -import { useMockServer } from "../composables"; -import { definePresetHandler } from "../handlers"; - -export default definePresetHandler(async (event) => { - const query = getQuery(event); - const { setPreset } = useMockServer(event); - - if (!query?.preset || typeof query.preset !== "string") { - return; - } - - await setPreset(query.preset); -}); From 272faf2915c50aab536fa8cc18be1e07d1c6f6e5 Mon Sep 17 00:00:00 2001 From: Leandro Soares Date: Wed, 14 Aug 2024 11:39:10 +0100 Subject: [PATCH 2/2] feat: add generatePreset on useMockServer --- .changeset/gorgeous-ducks-accept.md | 5 +++++ playground/server/api/pages/homepage.ts | 4 ++-- src/runtime/server/composables/use-mock-server.ts | 3 ++- src/runtime/server/handlers/intercept-request.ts | 8 +++----- src/runtime/server/management/generate-preset.ts | 8 ++++---- src/runtime/server/routes/presets/[id]/generate.post.ts | 7 +++---- src/runtime/utils/index.ts | 1 + src/runtime/utils/transform-headers.ts | 1 + 8 files changed, 21 insertions(+), 16 deletions(-) create mode 100644 .changeset/gorgeous-ducks-accept.md create mode 100644 src/runtime/utils/transform-headers.ts diff --git a/.changeset/gorgeous-ducks-accept.md b/.changeset/gorgeous-ducks-accept.md new file mode 100644 index 0000000..417da51 --- /dev/null +++ b/.changeset/gorgeous-ducks-accept.md @@ -0,0 +1,5 @@ +--- +"nuxt-mock-server": patch +--- + +Add generatePreset on useMockServer composable diff --git a/playground/server/api/pages/homepage.ts b/playground/server/api/pages/homepage.ts index f393684..3bd3e90 100644 --- a/playground/server/api/pages/homepage.ts +++ b/playground/server/api/pages/homepage.ts @@ -1,8 +1,8 @@ import { faker } from "@faker-js/faker"; -import { defineEventHandler } from "h3"; import { wait } from "../../utils/wait"; +import { defineMockInterceptorHandler } from "#imports"; -export default defineEventHandler(async () => { +export default defineMockInterceptorHandler(async () => { await wait(2000); return { diff --git a/src/runtime/server/composables/use-mock-server.ts b/src/runtime/server/composables/use-mock-server.ts index ce73655..db20923 100644 --- a/src/runtime/server/composables/use-mock-server.ts +++ b/src/runtime/server/composables/use-mock-server.ts @@ -1,6 +1,6 @@ import type { H3Event } from "h3"; import type { DeletePresetOptions } from "../management"; -import { getPresets, deletePreset, setPreset, getPreset, existsPreset } from "../management"; +import { getPresets, deletePreset, setPreset, getPreset, existsPreset, generatePreset } from "../management"; export function useMockServer(event: H3Event) { return { @@ -9,5 +9,6 @@ export function useMockServer(event: H3Event) { deletePreset: (name: string, options?: DeletePresetOptions) => deletePreset(event, name, options), setPreset: (name: string) => setPreset(event, name), getPreset: (name: string) => getPreset(event, name), + generatePreset: (name: string) => generatePreset(event, name), }; } diff --git a/src/runtime/server/handlers/intercept-request.ts b/src/runtime/server/handlers/intercept-request.ts index addb654..4c7f664 100644 --- a/src/runtime/server/handlers/intercept-request.ts +++ b/src/runtime/server/handlers/intercept-request.ts @@ -2,7 +2,7 @@ import { defineEventHandler, type EventHandler, type EventHandlerRequest, type H import consola from "consola"; import { AutoFormatter } from "../../formatters"; import type { FormatterDataType } from "../../types"; -import { MAIN_HEADER_KEY, MAIN_HEADER_VALUE } from "../../utils"; +import { MAIN_HEADER_KEY, MAIN_HEADER_VALUE, transformHeaders } from "../../utils"; import { definePresetHandler } from "./define-preset-handler"; import { useNitroApp, useRuntimeConfig } from "#imports"; @@ -10,8 +10,6 @@ export type InterceptRequestOptions = { defaultPreset?: string; } & ({ routeRegExp: RegExp; forceRouteMatch: false; } | { forceRouteMatch: true; }); -const getHeaders = (headers: Headers) => Object.fromEntries(headers.entries()); - export const interceptRequest = ( handler: EventHandler, options: InterceptRequestOptions = { forceRouteMatch: true }, @@ -46,7 +44,7 @@ export const interceptRequest = ( method: "GET", cache: "no-cache", headers: { - ...getHeaders(event.headers), + ...transformHeaders(event.headers), [MAIN_HEADER_KEY]: MAIN_HEADER_VALUE.IGNORE, }, }); @@ -58,7 +56,7 @@ export const interceptRequest = ( path: event.path, lastModified: new Date(), headers: { - ...getHeaders(localResponse.headers), + ...transformHeaders(localResponse.headers), "content-type": localResponse.headers.get("content-type") as FormatterDataType || "text/plain", }, }, diff --git a/src/runtime/server/management/generate-preset.ts b/src/runtime/server/management/generate-preset.ts index 7e87971..06f3222 100644 --- a/src/runtime/server/management/generate-preset.ts +++ b/src/runtime/server/management/generate-preset.ts @@ -1,8 +1,8 @@ import consola from "consola"; import type { createFetch as createLocalFetch } from "unenv/runtime/fetch/index"; -import type { RuntimeConfig } from "@nuxt/schema"; +import type { H3Event } from "h3"; import { MAIN_HEADER_KEY, PRESET_GENERATION_HEADER_KEY } from "../../utils"; -import { useNitroApp } from "#imports"; +import { useNitroApp, useRuntimeConfig } from "#imports"; async function request(localFetch: ReturnType, route: string, preset: string, isAutoMode: boolean, debug: boolean) { try { @@ -29,12 +29,12 @@ async function request(localFetch: ReturnType, route: s } export const generatePreset = async ( - runtimeConfig: RuntimeConfig, + event: H3Event, _preset: string | undefined = undefined, ) => { const nitro = useNitroApp(); - const { mockServer: { defaultPreset, generate, auto, debug } = {} } = runtimeConfig; + const { mockServer: { defaultPreset, generate, auto, debug } = {} } = useRuntimeConfig(event); const preset = _preset || defaultPreset; if (!generate) { diff --git a/src/runtime/server/routes/presets/[id]/generate.post.ts b/src/runtime/server/routes/presets/[id]/generate.post.ts index 989433b..6b97fb6 100644 --- a/src/runtime/server/routes/presets/[id]/generate.post.ts +++ b/src/runtime/server/routes/presets/[id]/generate.post.ts @@ -1,15 +1,14 @@ import { getRouterParam } from "h3"; import { definePresetHandler } from "../../../handlers"; -import { generatePreset } from "../../../management"; -import { useRuntimeConfig } from "#imports"; +import { useMockServer } from "../../../composables"; export default definePresetHandler(async (event) => { const preset = getRouterParam(event, "id"); - const runtimeConfig = useRuntimeConfig(event); + const { generatePreset } = useMockServer(event); if (!preset) { throw new Error("Id not found"); } - await generatePreset(runtimeConfig, preset); + await generatePreset(preset); }); diff --git a/src/runtime/utils/index.ts b/src/runtime/utils/index.ts index 5982b49..d2ef413 100644 --- a/src/runtime/utils/index.ts +++ b/src/runtime/utils/index.ts @@ -1,3 +1,4 @@ export * from "./not-undefined"; export * from "./constants"; export * from "./transform-devtools-option"; +export * from "./transform-headers"; diff --git a/src/runtime/utils/transform-headers.ts b/src/runtime/utils/transform-headers.ts new file mode 100644 index 0000000..17f0dea --- /dev/null +++ b/src/runtime/utils/transform-headers.ts @@ -0,0 +1 @@ +export const transformHeaders = (headers: Headers) => Object.fromEntries(headers.entries());