@mhbdev/unicms 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +17 -0
- package/dist/client.js.map +1 -1
- package/dist/http.d.ts +6 -10
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +69 -10
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/methods/externalUsersLogin.d.ts +35 -0
- package/dist/methods/externalUsersLogin.d.ts.map +1 -0
- package/dist/methods/externalUsersLogin.js +38 -0
- package/dist/methods/externalUsersLogin.js.map +1 -0
- package/dist/next/index.d.ts +3 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +2 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/serverClient.d.ts +6 -0
- package/dist/next/serverClient.d.ts.map +1 -0
- package/dist/next/serverClient.js +133 -0
- package/dist/next/serverClient.js.map +1 -0
- package/dist/next/types.d.ts +16 -0
- package/dist/next/types.d.ts.map +1 -0
- package/dist/next/types.js +2 -0
- package/dist/next/types.js.map +1 -0
- package/dist/react/hooks.d.ts +33 -0
- package/dist/react/hooks.d.ts.map +1 -0
- package/dist/react/hooks.js +260 -0
- package/dist/react/hooks.js.map +1 -0
- package/dist/react/index.d.ts +6 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +5 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/provider.d.ts +5 -0
- package/dist/react/provider.d.ts.map +1 -0
- package/dist/react/provider.js +133 -0
- package/dist/react/provider.js.map +1 -0
- package/dist/react/types.d.ts +95 -0
- package/dist/react/types.d.ts.map +1 -0
- package/dist/react/types.js +2 -0
- package/dist/react/types.js.map +1 -0
- package/dist/types.d.ts +38 -5
- package/dist/types.d.ts.map +1 -1
- package/package.json +20 -1
package/README.md
CHANGED
|
@@ -56,6 +56,143 @@ await cms.listFaqs({ includeRawContent: true })
|
|
|
56
56
|
|
|
57
57
|
await cms.listCategories()
|
|
58
58
|
await cms.listTags()
|
|
59
|
+
|
|
60
|
+
await cms.externalUsersLogin({
|
|
61
|
+
username: 'tenant-admin',
|
|
62
|
+
password: 'secret',
|
|
63
|
+
})
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Generic typed requests
|
|
67
|
+
|
|
68
|
+
Use `request` for advanced/custom endpoints with schema-validated responses:
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
import { z } from 'zod'
|
|
72
|
+
|
|
73
|
+
const response = await cms.request({
|
|
74
|
+
path: '/api/public/v1/posts',
|
|
75
|
+
query: { page: 1, limit: 5 },
|
|
76
|
+
schema: z.object({
|
|
77
|
+
data: z.object({
|
|
78
|
+
docs: z.array(z.object({ id: z.number(), slug: z.string() })),
|
|
79
|
+
}),
|
|
80
|
+
}),
|
|
81
|
+
})
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## React / Next.js integration
|
|
85
|
+
|
|
86
|
+
Install React peer deps if needed:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
pnpm add react react-dom
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Use the React entrypoint:
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
'use client'
|
|
96
|
+
|
|
97
|
+
import { createUniCmsClient } from '@mhbdev/unicms'
|
|
98
|
+
import { UniCmsProvider, usePageBySlugQuery, useSiteSettingsQuery } from '@mhbdev/unicms/react'
|
|
99
|
+
|
|
100
|
+
const client = createUniCmsClient({
|
|
101
|
+
baseUrl: 'https://cms.example.com',
|
|
102
|
+
tenant: { slug: 'acme' },
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
function HomePage() {
|
|
106
|
+
const siteSettings = useSiteSettingsQuery()
|
|
107
|
+
const page = usePageBySlugQuery({ slug: 'home' })
|
|
108
|
+
|
|
109
|
+
if (siteSettings.isLoading || page.isLoading) return <p>Loading...</p>
|
|
110
|
+
if (siteSettings.error || page.error) return <p>Failed to load</p>
|
|
111
|
+
|
|
112
|
+
return <h1>{page.data?.title}</h1>
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export default function App() {
|
|
116
|
+
return (
|
|
117
|
+
<UniCmsProvider
|
|
118
|
+
client={client}
|
|
119
|
+
defaultQueryOptions={{ staleTimeMs: 30_000 }}
|
|
120
|
+
namespace="acme-frontend"
|
|
121
|
+
>
|
|
122
|
+
<HomePage />
|
|
123
|
+
</UniCmsProvider>
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Available hooks:
|
|
129
|
+
- `useUniCmsClient`
|
|
130
|
+
- `useUniCmsQuery`
|
|
131
|
+
- `useUniCmsMutation`
|
|
132
|
+
- `useUniCmsInvalidate`
|
|
133
|
+
- `useSiteSettingsQuery`
|
|
134
|
+
- `usePageBySlugQuery`
|
|
135
|
+
- `usePostsQuery`
|
|
136
|
+
- `usePostBySlugQuery`
|
|
137
|
+
- `useFaqsQuery`
|
|
138
|
+
- `useCategoriesQuery`
|
|
139
|
+
- `useTagsQuery`
|
|
140
|
+
- `useExternalUsersLoginMutation`
|
|
141
|
+
|
|
142
|
+
## Next App Router SSR helpers
|
|
143
|
+
|
|
144
|
+
Use `@mhbdev/unicms/next` inside Server Components, Route Handlers, and Server Actions:
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
import { createNextAppRouterUniCmsClient } from '@mhbdev/unicms/next'
|
|
148
|
+
|
|
149
|
+
const cms = await createNextAppRouterUniCmsClient({
|
|
150
|
+
tenant: { slug: 'acme' },
|
|
151
|
+
// Optional. If omitted, it tries:
|
|
152
|
+
// UNICMS_BASE_URL -> NEXT_PUBLIC_SERVER_URL -> PAYLOAD_PUBLIC_SERVER_URL -> NEXT_PUBLIC_SITE_URL
|
|
153
|
+
baseUrl: 'https://cms.example.com',
|
|
154
|
+
})
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Server Component example
|
|
158
|
+
|
|
159
|
+
```tsx
|
|
160
|
+
import { createNextAppRouterUniCmsClient } from '@mhbdev/unicms/next'
|
|
161
|
+
|
|
162
|
+
export default async function Page() {
|
|
163
|
+
const cms = await createNextAppRouterUniCmsClient({
|
|
164
|
+
tenant: { slug: 'acme' },
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
const settings = await cms.getSiteSettings()
|
|
168
|
+
return <h1>{settings.siteName}</h1>
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Route Handler example (request-scoped forwarding)
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
import { createNextAppRouterUniCmsClient } from '@mhbdev/unicms/next'
|
|
176
|
+
|
|
177
|
+
export async function GET(request: Request) {
|
|
178
|
+
const cms = await createNextAppRouterUniCmsClient({
|
|
179
|
+
request, // forwards selected request headers + cookie header by default
|
|
180
|
+
tenant: { domain: 'acme.example.com' },
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
const posts = await cms.listPosts({ page: 1, limit: 10 })
|
|
184
|
+
return Response.json(posts)
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Custom forwarding
|
|
189
|
+
|
|
190
|
+
```ts
|
|
191
|
+
const cms = await createNextAppRouterUniCmsClient({
|
|
192
|
+
tenant: { slug: 'acme' },
|
|
193
|
+
includeCookies: true,
|
|
194
|
+
requestHeaders: ['authorization', 'x-request-id'],
|
|
195
|
+
})
|
|
59
196
|
```
|
|
60
197
|
|
|
61
198
|
## Error handling
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAe,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAYhF,eAAO,MAAM,kBAAkB,GAAI,SAAS,mBAAmB,KAAG,YAoCjE,CAAA"}
|
package/dist/client.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHttpClient } from './http.js';
|
|
2
|
+
import { externalUsersLogin } from './methods/externalUsersLogin.js';
|
|
2
3
|
import { getPageBySlug } from './methods/getPageBySlug.js';
|
|
3
4
|
import { getPostBySlug } from './methods/getPostBySlug.js';
|
|
4
5
|
import { getSiteSettings } from './methods/getSiteSettings.js';
|
|
@@ -17,7 +18,22 @@ const assertTenantScope = (options) => {
|
|
|
17
18
|
export const createUniCmsClient = (options) => {
|
|
18
19
|
assertTenantScope(options);
|
|
19
20
|
const http = createHttpClient(options);
|
|
21
|
+
const toTenantBody = (tenant) => 'slug' in tenant
|
|
22
|
+
? {
|
|
23
|
+
tenantSlug: tenant.slug,
|
|
24
|
+
}
|
|
25
|
+
: {
|
|
26
|
+
tenantDomain: tenant.domain,
|
|
27
|
+
};
|
|
20
28
|
return {
|
|
29
|
+
externalUsersLogin: (credentials, opts) => {
|
|
30
|
+
const tenant = credentials.tenant ?? options.tenant;
|
|
31
|
+
return externalUsersLogin(http, {
|
|
32
|
+
...toTenantBody(tenant),
|
|
33
|
+
password: credentials.password,
|
|
34
|
+
username: credentials.username,
|
|
35
|
+
}, opts);
|
|
36
|
+
},
|
|
21
37
|
getSiteSettings: () => getSiteSettings(http),
|
|
22
38
|
getPageBySlug: (slug, opts) => getPageBySlug(http, slug, opts),
|
|
23
39
|
listPosts: (params) => listPosts(http, params),
|
|
@@ -25,6 +41,7 @@ export const createUniCmsClient = (options) => {
|
|
|
25
41
|
listFaqs: (opts) => listFaqs(http, opts),
|
|
26
42
|
listCategories: () => listCategories(http),
|
|
27
43
|
listTags: () => listTags(http),
|
|
44
|
+
request: (requestOptions) => http.request(requestOptions),
|
|
28
45
|
};
|
|
29
46
|
};
|
|
30
47
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAGhD,MAAM,iBAAiB,GAAG,CAAC,OAA4B,EAAE,EAAE;IACzD,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAC7D,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAA4B,EAAgB,EAAE;IAC/E,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAE1B,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAGhD,MAAM,iBAAiB,GAAG,CAAC,OAA4B,EAAE,EAAE;IACzD,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAC7D,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAA4B,EAAgB,EAAE;IAC/E,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAE1B,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACtC,MAAM,YAAY,GAAG,CAAC,MAAmB,EAAE,EAAE,CAC3C,MAAM,IAAI,MAAM;QACd,CAAC,CAAC;YACE,UAAU,EAAE,MAAM,CAAC,IAAI;SACxB;QACH,CAAC,CAAC;YACE,YAAY,EAAE,MAAM,CAAC,MAAM;SAC5B,CAAA;IAEP,OAAO;QACL,kBAAkB,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAA;YAEnD,OAAO,kBAAkB,CACvB,IAAI,EACJ;gBACE,GAAG,YAAY,CAAC,MAAM,CAAC;gBACvB,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ;aAC/B,EACD,IAAI,CACL,CAAA;QACH,CAAC;QACD,eAAe,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;QAC5C,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QAC9D,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;QAC9C,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QAC9D,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;QACxC,cAAc,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC;QAC1C,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC9B,OAAO,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;KAC1D,CAAA;AACH,CAAC,CAAA"}
|
package/dist/http.d.ts
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
type
|
|
4
|
-
type QueryRecord = Record<string, QueryValue>;
|
|
5
|
-
interface RequestOptions<T> {
|
|
6
|
-
path: string;
|
|
7
|
-
query?: QueryRecord;
|
|
8
|
-
schema: z.ZodType<T>;
|
|
9
|
-
}
|
|
1
|
+
import type { UniCmsClientOptions, UniCmsRequestOptions } from './types.js';
|
|
2
|
+
type GetOptions<TResponse> = Omit<UniCmsRequestOptions<TResponse, never>, 'body' | 'method'>;
|
|
3
|
+
type PostOptions<TResponse, TBody> = Omit<UniCmsRequestOptions<TResponse, TBody>, 'method'>;
|
|
10
4
|
export interface HttpClient {
|
|
11
|
-
get<
|
|
5
|
+
get<TResponse>(options: GetOptions<TResponse>): Promise<TResponse>;
|
|
6
|
+
post<TResponse, TBody = unknown>(options: PostOptions<TResponse, TBody>): Promise<TResponse>;
|
|
7
|
+
request<TResponse, TBody = unknown>(options: UniCmsRequestOptions<TResponse, TBody>): Promise<TResponse>;
|
|
12
8
|
}
|
|
13
9
|
export declare const createHttpClient: (options: UniCmsClientOptions) => HttpClient;
|
|
14
10
|
export {};
|
package/dist/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,mBAAmB,EAInB,oBAAoB,EACrB,MAAM,YAAY,CAAA;AAEnB,KAAK,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAA;AAC5F,KAAK,WAAW,CAAC,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAA;AAE3F,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IAClE,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IAC5F,OAAO,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,EAAE,OAAO,EAAE,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;CACzG;AA+HD,eAAO,MAAM,gBAAgB,GAAI,SAAS,mBAAmB,KAAG,UA2F/D,CAAA"}
|
package/dist/http.js
CHANGED
|
@@ -30,15 +30,22 @@ const tenantToQuery = (tenant) => {
|
|
|
30
30
|
tenantDomain: tenant.domain,
|
|
31
31
|
};
|
|
32
32
|
};
|
|
33
|
+
const appendQueryValue = (url, key, value) => {
|
|
34
|
+
if (value === undefined || value === null || value === '') {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
url.searchParams.append(key, String(value));
|
|
38
|
+
};
|
|
33
39
|
const addQueryParams = (url, query) => {
|
|
34
40
|
if (!query) {
|
|
35
41
|
return;
|
|
36
42
|
}
|
|
37
43
|
Object.entries(query).forEach(([key, value]) => {
|
|
38
|
-
if (value
|
|
44
|
+
if (Array.isArray(value)) {
|
|
45
|
+
value.forEach((entry) => appendQueryValue(url, key, entry));
|
|
39
46
|
return;
|
|
40
47
|
}
|
|
41
|
-
url
|
|
48
|
+
appendQueryValue(url, key, value);
|
|
42
49
|
});
|
|
43
50
|
};
|
|
44
51
|
const resolveHeaderInput = async (headers) => {
|
|
@@ -50,6 +57,18 @@ const resolveHeaderInput = async (headers) => {
|
|
|
50
57
|
}
|
|
51
58
|
return headers;
|
|
52
59
|
};
|
|
60
|
+
const mergeHeaders = async (base, request) => {
|
|
61
|
+
const merged = new Headers(await resolveHeaderInput(base));
|
|
62
|
+
const requestHeaders = await resolveHeaderInput(request);
|
|
63
|
+
if (!requestHeaders) {
|
|
64
|
+
return merged;
|
|
65
|
+
}
|
|
66
|
+
const normalizedRequestHeaders = new Headers(requestHeaders);
|
|
67
|
+
normalizedRequestHeaders.forEach((value, key) => {
|
|
68
|
+
merged.set(key, value);
|
|
69
|
+
});
|
|
70
|
+
return merged;
|
|
71
|
+
};
|
|
53
72
|
const parseResponseBody = async (response) => {
|
|
54
73
|
const rawBody = await response.text();
|
|
55
74
|
if (!rawBody) {
|
|
@@ -62,24 +81,62 @@ const parseResponseBody = async (response) => {
|
|
|
62
81
|
return rawBody;
|
|
63
82
|
}
|
|
64
83
|
};
|
|
84
|
+
const isBodyInitLike = (value) => {
|
|
85
|
+
if (typeof value === 'string')
|
|
86
|
+
return true;
|
|
87
|
+
if (value instanceof URLSearchParams)
|
|
88
|
+
return true;
|
|
89
|
+
if (typeof Blob !== 'undefined' && value instanceof Blob)
|
|
90
|
+
return true;
|
|
91
|
+
if (typeof FormData !== 'undefined' && value instanceof FormData)
|
|
92
|
+
return true;
|
|
93
|
+
if (typeof ReadableStream !== 'undefined' && value instanceof ReadableStream)
|
|
94
|
+
return true;
|
|
95
|
+
if (value instanceof ArrayBuffer)
|
|
96
|
+
return true;
|
|
97
|
+
if (ArrayBuffer.isView(value))
|
|
98
|
+
return true;
|
|
99
|
+
return false;
|
|
100
|
+
};
|
|
101
|
+
const serializeBody = (method, body, headers) => {
|
|
102
|
+
if (body === undefined || method === 'GET') {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
if (isBodyInitLike(body)) {
|
|
106
|
+
return body;
|
|
107
|
+
}
|
|
108
|
+
if (!headers.has('content-type')) {
|
|
109
|
+
headers.set('content-type', 'application/json');
|
|
110
|
+
}
|
|
111
|
+
return JSON.stringify(body);
|
|
112
|
+
};
|
|
65
113
|
export const createHttpClient = (options) => {
|
|
66
114
|
const fetchFn = options.fetch ?? globalThis.fetch;
|
|
67
115
|
if (!fetchFn) {
|
|
68
116
|
throw new Error('fetch implementation is required');
|
|
69
117
|
}
|
|
70
118
|
const baseUrl = normalizeBaseUrl(options.baseUrl);
|
|
71
|
-
const
|
|
119
|
+
const defaultTimeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
72
120
|
const tenantQuery = tenantToQuery(options.tenant);
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
const
|
|
76
|
-
|
|
121
|
+
const request = async (requestOptions) => {
|
|
122
|
+
const method = requestOptions.method ?? 'GET';
|
|
123
|
+
const query = requestOptions.includeTenantScope === false
|
|
124
|
+
? requestOptions.query
|
|
125
|
+
: { ...tenantQuery, ...(requestOptions.query ?? {}) };
|
|
126
|
+
const mergedHeaders = await mergeHeaders(options.headers, requestOptions.headers);
|
|
127
|
+
const url = new URL(requestOptions.path.replace(/^\//, ''), baseUrl);
|
|
128
|
+
addQueryParams(url, query);
|
|
77
129
|
const controller = new AbortController();
|
|
130
|
+
const timeoutMs = requestOptions.timeoutMs ?? defaultTimeoutMs;
|
|
78
131
|
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
132
|
+
const body = serializeBody(method, requestOptions.body, mergedHeaders);
|
|
79
133
|
try {
|
|
80
134
|
const response = await fetchFn(url, {
|
|
135
|
+
...(options.requestInit ?? {}),
|
|
136
|
+
...(requestOptions.requestInit ?? {}),
|
|
137
|
+
...(body === undefined ? {} : { body }),
|
|
81
138
|
headers: mergedHeaders,
|
|
82
|
-
method
|
|
139
|
+
method,
|
|
83
140
|
signal: controller.signal,
|
|
84
141
|
});
|
|
85
142
|
const responseBody = await parseResponseBody(response);
|
|
@@ -96,7 +153,7 @@ export const createHttpClient = (options) => {
|
|
|
96
153
|
status: response.status,
|
|
97
154
|
});
|
|
98
155
|
}
|
|
99
|
-
const parsedResponse = schema.safeParse(responseBody);
|
|
156
|
+
const parsedResponse = requestOptions.schema.safeParse(responseBody);
|
|
100
157
|
if (!parsedResponse.success) {
|
|
101
158
|
throw new UniCmsError('PARSE_ERROR', 'Response validation failed.', {
|
|
102
159
|
details: parsedResponse.error.flatten(),
|
|
@@ -123,7 +180,9 @@ export const createHttpClient = (options) => {
|
|
|
123
180
|
}
|
|
124
181
|
};
|
|
125
182
|
return {
|
|
126
|
-
get,
|
|
183
|
+
get: (requestOptions) => request({ ...requestOptions, method: 'GET' }),
|
|
184
|
+
post: (requestOptions) => request({ ...requestOptions, method: 'POST' }),
|
|
185
|
+
request,
|
|
127
186
|
};
|
|
128
187
|
};
|
|
129
188
|
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createUniCmsClient } from './client.js';
|
|
2
2
|
export { UniCmsError } from './errors.js';
|
|
3
|
-
export type { UniCmsClient, UniCmsClientOptions,
|
|
3
|
+
export type { ExternalUserLoginCredentials, ExternalUserLoginResult, ExternalUserRecord, HeaderResolver, TenantScope, UniCmsClient, UniCmsClientOptions, UniCmsQueryPrimitive, UniCmsQueryRecord, UniCmsQueryValue, UniCmsRequestMethod, UniCmsRequestOptions, } from './types.js';
|
|
4
4
|
export type { ApiError, ApiErrorCode, CategoryDTO, FaqDTO, ListPostsParams, MediaDTO, PageDTO, Paginated, Pagination, PostDTO, PostSummaryDTO, SeoDTO, SiteSettingsDTO, TagDTO, TenantDTO, } from './contracts/v1.js';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,YAAY,EACV,4BAA4B,EAC5B,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,MAAM,EACN,eAAe,EACf,QAAQ,EACR,OAAO,EACP,SAAS,EACT,UAAU,EACV,OAAO,EACP,cAAc,EACd,MAAM,EACN,eAAe,EACf,MAAM,EACN,SAAS,GACV,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { HttpClient } from '../http.js';
|
|
3
|
+
import type { ExternalUserLoginResult, ExternalUserRecord } from '../types.js';
|
|
4
|
+
declare const externalUsersLoginBodySchema: z.ZodEffects<z.ZodObject<{
|
|
5
|
+
password: z.ZodString;
|
|
6
|
+
tenantDomain: z.ZodOptional<z.ZodString>;
|
|
7
|
+
tenantSlug: z.ZodOptional<z.ZodString>;
|
|
8
|
+
username: z.ZodString;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
username: string;
|
|
11
|
+
password: string;
|
|
12
|
+
tenantDomain?: string | undefined;
|
|
13
|
+
tenantSlug?: string | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
username: string;
|
|
16
|
+
password: string;
|
|
17
|
+
tenantDomain?: string | undefined;
|
|
18
|
+
tenantSlug?: string | undefined;
|
|
19
|
+
}>, {
|
|
20
|
+
username: string;
|
|
21
|
+
password: string;
|
|
22
|
+
tenantDomain?: string | undefined;
|
|
23
|
+
tenantSlug?: string | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
username: string;
|
|
26
|
+
password: string;
|
|
27
|
+
tenantDomain?: string | undefined;
|
|
28
|
+
tenantSlug?: string | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
type ExternalUsersLoginBody = z.infer<typeof externalUsersLoginBodySchema>;
|
|
31
|
+
export declare const externalUsersLogin: <TUser extends ExternalUserRecord = ExternalUserRecord>(http: HttpClient, body: ExternalUsersLoginBody, opts?: {
|
|
32
|
+
userSchema?: z.ZodType<TUser>;
|
|
33
|
+
}) => Promise<ExternalUserLoginResult<TUser>>;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=externalUsersLogin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"externalUsersLogin.d.ts","sourceRoot":"","sources":["../../src/methods/externalUsersLogin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAEnB,MAAM,aAAa,CAAA;AAIpB,QAAA,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;EAgB9B,CAAA;AAEJ,KAAK,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAA;AAa1E,eAAO,MAAM,kBAAkB,GAAU,KAAK,SAAS,kBAAkB,GAAG,kBAAkB,EAC5F,MAAM,UAAU,EAChB,MAAM,sBAAsB,EAC5B,OAAO;IAAE,UAAU,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;CAAE,KACvC,OAAO,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAaxC,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const nonEmptyStringSchema = z.string().trim().min(1);
|
|
3
|
+
const externalUsersLoginBodySchema = z
|
|
4
|
+
.object({
|
|
5
|
+
password: nonEmptyStringSchema,
|
|
6
|
+
tenantDomain: nonEmptyStringSchema.optional(),
|
|
7
|
+
tenantSlug: nonEmptyStringSchema.optional(),
|
|
8
|
+
username: nonEmptyStringSchema,
|
|
9
|
+
})
|
|
10
|
+
.superRefine((value, context) => {
|
|
11
|
+
const tenantCount = Number(Boolean(value.tenantSlug)) + Number(Boolean(value.tenantDomain));
|
|
12
|
+
if (tenantCount !== 1) {
|
|
13
|
+
context.addIssue({
|
|
14
|
+
code: z.ZodIssueCode.custom,
|
|
15
|
+
message: 'Provide exactly one of tenantSlug or tenantDomain.',
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const buildExternalUsersLoginResponseSchema = (userSchema) => z
|
|
20
|
+
.object({
|
|
21
|
+
exp: z.number(),
|
|
22
|
+
token: nonEmptyStringSchema,
|
|
23
|
+
user: userSchema,
|
|
24
|
+
})
|
|
25
|
+
.passthrough();
|
|
26
|
+
export const externalUsersLogin = async (http, body, opts) => {
|
|
27
|
+
const parsedBody = externalUsersLoginBodySchema.parse(body);
|
|
28
|
+
const userSchema = opts?.userSchema ?? z.record(z.string(), z.unknown());
|
|
29
|
+
const schema = buildExternalUsersLoginResponseSchema(userSchema);
|
|
30
|
+
const requestOptions = {
|
|
31
|
+
body: parsedBody,
|
|
32
|
+
includeTenantScope: false,
|
|
33
|
+
path: '/api/users/external-users/login',
|
|
34
|
+
schema,
|
|
35
|
+
};
|
|
36
|
+
return http.post(requestOptions);
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=externalUsersLogin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"externalUsersLogin.js","sourceRoot":"","sources":["../../src/methods/externalUsersLogin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AASvB,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAErD,MAAM,4BAA4B,GAAG,CAAC;KACnC,MAAM,CAAC;IACN,QAAQ,EAAE,oBAAoB;IAC9B,YAAY,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IAC7C,UAAU,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IAC3C,QAAQ,EAAE,oBAAoB;CAC/B,CAAC;KACD,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAA;IAE3F,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,QAAQ,CAAC;YACf,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,oDAAoD;SAC9D,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA;AAIJ,MAAM,qCAAqC,GAAG,CAC5C,UAA4B,EAC5B,EAAE,CACF,CAAC;KACE,MAAM,CAAC;IACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,KAAK,EAAE,oBAAoB;IAC3B,IAAI,EAAE,UAAU;CACjB,CAAC;KACD,WAAW,EAA+C,CAAA;AAE/D,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,IAAgB,EAChB,IAA4B,EAC5B,IAAwC,EACC,EAAE;IAC3C,MAAM,UAAU,GAAG,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC3D,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAsB,CAAA;IAC9F,MAAM,MAAM,GAAG,qCAAqC,CAAC,UAAU,CAAC,CAAA;IAChE,MAAM,cAAc,GAClB;QACE,IAAI,EAAE,UAAU;QAChB,kBAAkB,EAAE,KAAK;QACzB,IAAI,EAAE,iCAAiC;QACvC,MAAM;KACP,CAAA;IAEH,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;AAClC,CAAC,CAAA"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createNextAppRouterUniCmsClient, resolveNextAppRouterUniCmsBaseUrl, withNextAppRouterUniCmsClient, } from './serverClient.js';
|
|
2
|
+
export type { NextAppRouterUniCmsClientFactory, NextAppRouterUniCmsClientOptions, NextForwardHeadersRule, NextRequestLike, } from './types.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,iCAAiC,EACjC,6BAA6B,GAC9B,MAAM,mBAAmB,CAAA;AAE1B,YAAY,EACV,gCAAgC,EAChC,gCAAgC,EAChC,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,iCAAiC,EACjC,6BAA6B,GAC9B,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { UniCmsClient } from '../types.js';
|
|
2
|
+
import type { NextAppRouterUniCmsClientFactory, NextAppRouterUniCmsClientOptions } from './types.js';
|
|
3
|
+
export declare const resolveNextAppRouterUniCmsBaseUrl: (options?: Pick<NextAppRouterUniCmsClientOptions, "baseUrl" | "resolveBaseUrl">) => string;
|
|
4
|
+
export declare const createNextAppRouterUniCmsClient: NextAppRouterUniCmsClientFactory;
|
|
5
|
+
export declare const withNextAppRouterUniCmsClient: <T>(options: NextAppRouterUniCmsClientOptions, run: (client: UniCmsClient) => Promise<T>) => Promise<T>;
|
|
6
|
+
//# sourceMappingURL=serverClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverClient.d.ts","sourceRoot":"","sources":["../../src/next/serverClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,KAAK,EACV,gCAAgC,EAChC,gCAAgC,EAGjC,MAAM,YAAY,CAAA;AAiJnB,eAAO,MAAM,iCAAiC,GAC5C,UAAU,IAAI,CAAC,gCAAgC,EAAE,SAAS,GAAG,gBAAgB,CAAC,KAC7E,MAGF,CAAA;AAED,eAAO,MAAM,+BAA+B,EAAE,gCAsB7C,CAAA;AAED,eAAO,MAAM,6BAA6B,GAAU,CAAC,EACnD,SAAS,gCAAgC,EACzC,KAAK,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,KACxC,OAAO,CAAC,CAAC,CAGX,CAAA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { cookies as nextCookies, headers as nextHeaders } from 'next/headers';
|
|
2
|
+
import { createUniCmsClient } from '../client.js';
|
|
3
|
+
const DEFAULT_BASE_URL_ENV_KEYS = [
|
|
4
|
+
'UNICMS_BASE_URL',
|
|
5
|
+
'NEXT_PUBLIC_SERVER_URL',
|
|
6
|
+
'PAYLOAD_PUBLIC_SERVER_URL',
|
|
7
|
+
'NEXT_PUBLIC_SITE_URL',
|
|
8
|
+
];
|
|
9
|
+
const DEFAULT_FORWARDED_HEADERS = [
|
|
10
|
+
'authorization',
|
|
11
|
+
'accept-language',
|
|
12
|
+
'user-agent',
|
|
13
|
+
'x-forwarded-for',
|
|
14
|
+
'x-forwarded-host',
|
|
15
|
+
'x-forwarded-proto',
|
|
16
|
+
'x-real-ip',
|
|
17
|
+
'x-request-id',
|
|
18
|
+
];
|
|
19
|
+
const resolveHeaderInput = async (headers) => {
|
|
20
|
+
if (!headers) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
if (typeof headers === 'function') {
|
|
24
|
+
return headers();
|
|
25
|
+
}
|
|
26
|
+
return headers;
|
|
27
|
+
};
|
|
28
|
+
const mergeHeaders = async (...sources) => {
|
|
29
|
+
const merged = new Headers();
|
|
30
|
+
for (const source of sources) {
|
|
31
|
+
const resolved = await resolveHeaderInput(source);
|
|
32
|
+
if (!resolved) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const normalized = new Headers(resolved);
|
|
36
|
+
normalized.forEach((value, key) => {
|
|
37
|
+
merged.set(key, value);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return merged;
|
|
41
|
+
};
|
|
42
|
+
const resolveUniCmsBaseUrlFromEnv = () => {
|
|
43
|
+
for (const envKey of DEFAULT_BASE_URL_ENV_KEYS) {
|
|
44
|
+
const value = process.env[envKey];
|
|
45
|
+
if (value?.trim()) {
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return undefined;
|
|
50
|
+
};
|
|
51
|
+
const normalizeBaseUrl = (baseUrl) => {
|
|
52
|
+
if (!baseUrl?.trim()) {
|
|
53
|
+
throw new Error(`UniCMS base URL is required. Provide options.baseUrl or set one of: ${DEFAULT_BASE_URL_ENV_KEYS.join(', ')}`);
|
|
54
|
+
}
|
|
55
|
+
return baseUrl;
|
|
56
|
+
};
|
|
57
|
+
const shouldForwardHeader = (rule, name, value) => {
|
|
58
|
+
if (!rule) {
|
|
59
|
+
return DEFAULT_FORWARDED_HEADERS.includes(name);
|
|
60
|
+
}
|
|
61
|
+
if (typeof rule === 'function') {
|
|
62
|
+
return rule(name, value);
|
|
63
|
+
}
|
|
64
|
+
const allowed = new Set(rule.map((entry) => entry.toLowerCase()));
|
|
65
|
+
return allowed.has(name);
|
|
66
|
+
};
|
|
67
|
+
const readNextHeaders = async () => {
|
|
68
|
+
const incoming = await Promise.resolve(nextHeaders());
|
|
69
|
+
const normalized = new Headers();
|
|
70
|
+
incoming.forEach((value, key) => {
|
|
71
|
+
normalized.set(key, value);
|
|
72
|
+
});
|
|
73
|
+
return normalized;
|
|
74
|
+
};
|
|
75
|
+
const readNextCookieHeader = async () => {
|
|
76
|
+
const cookieStore = await Promise.resolve(nextCookies());
|
|
77
|
+
const cookieHeader = cookieStore.toString();
|
|
78
|
+
return cookieHeader || null;
|
|
79
|
+
};
|
|
80
|
+
const readIncomingHeaders = async (request) => {
|
|
81
|
+
if (request) {
|
|
82
|
+
return new Headers(request.headers);
|
|
83
|
+
}
|
|
84
|
+
return readNextHeaders();
|
|
85
|
+
};
|
|
86
|
+
const collectRequestScopedHeaders = async (options) => {
|
|
87
|
+
const includeRequestHeaders = options.includeRequestHeaders ?? true;
|
|
88
|
+
const includeCookies = options.includeCookies ?? true;
|
|
89
|
+
if (!includeRequestHeaders && !includeCookies) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
const incomingHeaders = await readIncomingHeaders(options.request);
|
|
93
|
+
const scopedHeaders = new Headers();
|
|
94
|
+
if (includeRequestHeaders) {
|
|
95
|
+
incomingHeaders.forEach((value, rawName) => {
|
|
96
|
+
const name = rawName.toLowerCase();
|
|
97
|
+
if (name === 'cookie')
|
|
98
|
+
return;
|
|
99
|
+
if (shouldForwardHeader(options.requestHeaders, name, value)) {
|
|
100
|
+
scopedHeaders.set(name, value);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (includeCookies) {
|
|
105
|
+
const cookieHeader = incomingHeaders.get('cookie') ?? (await readNextCookieHeader());
|
|
106
|
+
if (cookieHeader) {
|
|
107
|
+
scopedHeaders.set('cookie', cookieHeader);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return scopedHeaders;
|
|
111
|
+
};
|
|
112
|
+
export const resolveNextAppRouterUniCmsBaseUrl = (options) => {
|
|
113
|
+
const baseUrl = options?.baseUrl ?? options?.resolveBaseUrl?.() ?? resolveUniCmsBaseUrlFromEnv();
|
|
114
|
+
return normalizeBaseUrl(baseUrl);
|
|
115
|
+
};
|
|
116
|
+
export const createNextAppRouterUniCmsClient = async (options) => {
|
|
117
|
+
const { baseUrl, headers, includeCookies: _includeCookies, includeRequestHeaders: _includeRequestHeaders, request: _request, requestHeaders: _requestHeaders, resolveBaseUrl, ...clientOptions } = options;
|
|
118
|
+
const requestScopedHeaders = await collectRequestScopedHeaders(options);
|
|
119
|
+
const headerResolver = async () => mergeHeaders(requestScopedHeaders, headers);
|
|
120
|
+
return createUniCmsClient({
|
|
121
|
+
...clientOptions,
|
|
122
|
+
baseUrl: resolveNextAppRouterUniCmsBaseUrl({
|
|
123
|
+
baseUrl,
|
|
124
|
+
resolveBaseUrl,
|
|
125
|
+
}),
|
|
126
|
+
headers: headerResolver,
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
export const withNextAppRouterUniCmsClient = async (options, run) => {
|
|
130
|
+
const client = await createNextAppRouterUniCmsClient(options);
|
|
131
|
+
return run(client);
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=serverClient.js.map
|