diff --git a/.changeset/plain-rivers-design.md b/.changeset/plain-rivers-design.md new file mode 100644 index 000000000000..6217f1da36c9 --- /dev/null +++ b/.changeset/plain-rivers-design.md @@ -0,0 +1,6 @@ +--- +'@modern-js/create-request': patch +--- + +feat: bff query supports obj +feat: bff query 支持对象类型 diff --git a/packages/server/create-request/src/browser.ts b/packages/server/create-request/src/browser.ts index 7164d825be34..2b0926c620e5 100644 --- a/packages/server/create-request/src/browser.ts +++ b/packages/server/create-request/src/browser.ts @@ -8,7 +8,7 @@ import type { Sender, UploadCreator, } from './types'; -import { getUploadPayload } from './utiles'; +import { getUploadPayload, processQueryValues } from './utiles'; const realRequest: Map = new Map(); @@ -100,7 +100,7 @@ export const createRequest: RequestCreator = ({ const finalPath = getFinalPath(payload.params); finalURL = payload.query - ? `${finalPath}?${stringify(payload.query)}` + ? `${finalPath}?${stringify(processQueryValues(payload.query))}` : finalPath; headers = payload.headers || {}; body = diff --git a/packages/server/create-request/src/node.ts b/packages/server/create-request/src/node.ts index 095016e65f56..b1925b747a39 100644 --- a/packages/server/create-request/src/node.ts +++ b/packages/server/create-request/src/node.ts @@ -11,7 +11,7 @@ import type { Sender, UploadCreator, } from './types'; -import { getUploadPayload } from './utiles'; +import { getUploadPayload, processQueryValues } from './utiles'; type Fetch = typeof nodeFetch; @@ -104,7 +104,7 @@ export const createRequest: RequestCreator = ({ const plainPath = getFinalPath(payload.params); const finalPath = payload.query - ? `${plainPath}?${stringify(payload.query)}` + ? `${plainPath}?${stringify(processQueryValues(payload.query))}` : plainPath; headers = payload.headers || {}; diff --git a/packages/server/create-request/src/utiles.ts b/packages/server/create-request/src/utiles.ts index dd8d1427e44b..bcbc8f176d5f 100644 --- a/packages/server/create-request/src/utiles.ts +++ b/packages/server/create-request/src/utiles.ts @@ -24,3 +24,20 @@ export const getUploadPayload = (args: any) => { return { body, headers: payload.headers, params: payload.params }; }; + +export const processQueryValues = ( + query: Record, +): Record => { + const processedQuery: Record = {}; + + Object.keys(query).forEach(key => { + const value = query[key]; + processedQuery[key] = + typeof value === 'string' || + (Array.isArray(value) && value.every(item => typeof item === 'string')) + ? value + : JSON.stringify(value); + }); + + return processedQuery; +}; diff --git a/tests/integration/bff-hono/api/index.ts b/tests/integration/bff-hono/api/index.ts index aa2052b52241..986170988a94 100644 --- a/tests/integration/bff-hono/api/index.ts +++ b/tests/integration/bff-hono/api/index.ts @@ -24,8 +24,27 @@ export const post = async ({ formUrlencoded }: { formUrlencoded: any }) => { }; }; +const ArrayObjectSchema = z.array(z.object({ from: z.string() })); + +const StringOrArrayObject = z + .union([ + ArrayObjectSchema, + z.string().refine(str => { + try { + const parsed = JSON.parse(str); + return ArrayObjectSchema.safeParse(parsed).success; + } catch (error) { + return false; + } + }), + ]) + .transform(value => { + return typeof value === 'string' ? JSON.parse(value) : value; + }); + const QuerySchema = z.object({ user: z.string().email(), + ext: StringOrArrayObject, }); const DataSchema = z.object({ @@ -63,6 +82,7 @@ export const postHello = Api( return input; }), async ({ query, data, params, headers }) => { + console.log('query:>>', query.ext[0]); const c = useHonoContext(); c.res.headers.set('x-bff-api', c.req.path); return { @@ -75,9 +95,13 @@ export const postHello = Api( }, ); +const GetQuerySchema = z.object({ + user: z.string().email(), +}); + export const getHello = Api( Get('/hello/get'), - Query(QuerySchema), + Query(GetQuerySchema), async ({ query }) => { try { const c = useHonoContext(); diff --git a/tests/integration/bff-hono/src/routes/base/page.tsx b/tests/integration/bff-hono/src/routes/base/page.tsx index 2ce8c15e016b..abc8bf82e4e0 100644 --- a/tests/integration/bff-hono/src/routes/base/page.tsx +++ b/tests/integration/bff-hono/src/routes/base/page.tsx @@ -27,6 +27,7 @@ const Page = () => { }, query: { user: 'modern@email.com', + ext: [{ from: '123' }], }, data: { message: '3333',