@vistagenic/vista 0.3.2 → 0.3.4
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/bin/vista.js +79 -109
- package/dist/ai/embeddings.d.ts +11 -11
- package/dist/ai/embeddings.js +71 -71
- package/dist/ai/index.d.ts +10 -10
- package/dist/ai/index.js +26 -26
- package/dist/ai/providers/base.js +85 -85
- package/dist/ai/react/react-server.d.ts +1 -1
- package/dist/ai/react/react-server.js +17 -17
- package/dist/ai/react/use-agent.js +138 -138
- package/dist/auth/core.d.ts +140 -140
- package/dist/auth/core.js +165 -165
- package/dist/auth/index.d.ts +20 -20
- package/dist/auth/index.js +369 -369
- package/dist/auth/react-server.d.ts +1 -1
- package/dist/auth/react-server.js +10 -10
- package/dist/auth/react.d.ts +18 -18
- package/dist/auth/react.js +71 -71
- package/dist/bin/build-rsc-flashpack.js +6 -0
- package/dist/bin/build-rsc.js +555 -492
- package/dist/bin/build.js +365 -353
- package/dist/bin/generate.js +513 -510
- package/dist/bin/webpack.config.d.ts +3 -1
- package/dist/bin/webpack.config.js +7 -4
- package/dist/build/manifest.d.ts +169 -169
- package/dist/build/manifest.js +423 -423
- package/dist/build/rsc/client-manifest.d.ts +62 -62
- package/dist/build/rsc/client-manifest.js +295 -295
- package/dist/build/rsc/compiler.d.ts +3 -1
- package/dist/build/rsc/compiler.js +12 -7
- package/dist/build/rsc/native-scanner.d.ts +135 -135
- package/dist/build/rsc/native-scanner.js +203 -203
- package/dist/build/rsc/react-client-reference-manifest.d.ts +35 -28
- package/dist/build/rsc/react-client-reference-manifest.js +366 -240
- package/dist/build/standalone.js +260 -254
- package/dist/client/dynamic.react-server.d.ts +2 -2
- package/dist/client/dynamic.react-server.js +23 -23
- package/dist/client/link.js +1 -1
- package/dist/client/link.react-server.d.ts +2 -2
- package/dist/client/link.react-server.js +11 -11
- package/dist/client/navigation.js +2 -2
- package/dist/client/navigation.react-server.d.ts +1 -1
- package/dist/client/navigation.react-server.js +17 -17
- package/dist/client/router.react-server.d.ts +1 -1
- package/dist/client/router.react-server.js +17 -17
- package/dist/client/rsc-router.d.ts +1 -3
- package/dist/client/rsc-router.js +98 -45
- package/dist/client/rsc-router.react-server.d.ts +1 -1
- package/dist/client/rsc-router.react-server.js +17 -17
- package/dist/client/script.react-server.d.ts +2 -2
- package/dist/client/script.react-server.js +23 -23
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -7
- package/dist/deploy/adapters/cloudflare.js +42 -41
- package/dist/deploy/adapters/docker.d.ts +1 -0
- package/dist/deploy/adapters/docker.js +5 -4
- package/dist/deploy/adapters/netlify.js +60 -27
- package/dist/deploy/adapters/vercel.js +80 -50
- package/dist/deploy/preflight.js +4 -3
- package/dist/deploy/runtime-pack.d.ts +11 -0
- package/dist/deploy/runtime-pack.js +300 -0
- package/dist/deploy/utils.d.ts +7 -1
- package/dist/deploy/utils.js +95 -3
- package/dist/flashpack/command.js +1 -0
- package/dist/flashpack/runtime.js +2 -1
- package/dist/image/get-img-props.js +21 -11
- package/dist/image/image-config.d.ts +2 -0
- package/dist/image/image-config.js +17 -0
- package/dist/image/index.d.ts +18 -3
- package/dist/image/index.js +1 -1
- package/dist/image/react-server.d.ts +1 -2
- package/dist/image/react-server.js +1 -1
- package/dist/index.d.ts +23 -23
- package/dist/index.js +61 -61
- package/dist/server/app-dir.d.ts +22 -0
- package/dist/server/app-dir.js +77 -0
- package/dist/server/app-router-runtime.d.ts +1 -0
- package/dist/server/app-router-runtime.js +34 -9
- package/dist/server/cookie-parse.d.ts +4 -4
- package/dist/server/cookie-parse.js +14 -14
- package/dist/server/engine.js +5 -5
- package/dist/server/hydration-chunks.d.ts +7 -0
- package/dist/server/hydration-chunks.js +49 -0
- package/dist/server/image-optimizer.js +2 -1
- package/dist/server/index.d.ts +109 -109
- package/dist/server/index.js +315 -315
- package/dist/server/middleware-runner.d.ts +125 -125
- package/dist/server/middleware-runner.js +607 -615
- package/dist/server/middleware-security.d.ts +36 -36
- package/dist/server/middleware-security.js +183 -183
- package/dist/server/module-compile-hook.js +706 -695
- package/dist/server/root-resolver.js +6 -5
- package/dist/server/rsc-engine-flashpack.d.ts +3 -1
- package/dist/server/rsc-engine-flashpack.js +12 -1
- package/dist/server/rsc-engine.d.ts +6 -1
- package/dist/server/rsc-engine.js +217 -280
- package/dist/server/rsc-upstream.js +900 -892
- package/dist/server/ssr-webpack-shim.d.ts +6 -0
- package/dist/server/ssr-webpack-shim.js +29 -0
- package/dist/server/static-generator.d.ts +2 -0
- package/dist/server/static-generator.js +33 -32
- package/dist/server/structure-validator.js +2 -1
- package/dist/server/structure-watch.js +2 -0
- package/dist/server/typed-api-runtime.js +639 -635
- package/dist/server/vista-import-map.js +134 -134
- package/dist/stack/index.d.ts +34 -34
- package/dist/stack/index.js +49 -49
- package/dist/stack/server/caller.d.ts +13 -13
- package/dist/stack/server/caller.js +42 -42
- package/dist/stack/server/executor.d.ts +40 -40
- package/dist/stack/server/executor.js +222 -222
- package/dist/stack/server/index.d.ts +11 -11
- package/dist/stack/server/index.js +24 -24
- package/dist/stack/server/procedure.d.ts +20 -20
- package/dist/stack/server/procedure.js +66 -66
- package/dist/stack/server/types.d.ts +113 -113
- package/dist/theme/react-server.d.ts +10 -10
- package/dist/theme/react-server.js +16 -16
- package/package.json +1 -1
package/dist/server/index.js
CHANGED
|
@@ -1,315 +1,315 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Vista Server Utilities
|
|
4
|
-
*
|
|
5
|
-
* Next.js-compatible server-only functions for use in Server Components and API routes.
|
|
6
|
-
* These functions only work on the server side.
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.sanitizeRequestHeaderMap = exports.isSafeRedirectLocation = exports.securityHeaders = exports.rateLimit = exports.cors = exports.chain = exports.shouldRunMiddleware = exports.patternToRegExp = exports.buildNextRequest = exports.clearMiddlewareCaches = exports.discoverRouteMiddlewares = exports.discoverGlobalMiddleware = exports.applyMiddlewareResult = exports.runMiddleware = exports.unstable_cache = exports.revalidateTag = exports.revalidatePath = exports.cacheTag = exports.cacheLife = exports.NextResponse = exports.NotFoundError = exports.RedirectError = void 0;
|
|
10
|
-
exports.cookies = cookies;
|
|
11
|
-
exports.headers = headers;
|
|
12
|
-
exports.draftMode = draftMode;
|
|
13
|
-
exports.redirect = redirect;
|
|
14
|
-
exports.permanentRedirect = permanentRedirect;
|
|
15
|
-
exports.notFound = notFound;
|
|
16
|
-
exports.json = json;
|
|
17
|
-
const request_context_1 = require("./request-context");
|
|
18
|
-
const cookie_parse_1 = require("./cookie-parse");
|
|
19
|
-
function parseCookieHeader(header) {
|
|
20
|
-
const cookieMap = new Map();
|
|
21
|
-
if (!header) {
|
|
22
|
-
return cookieMap;
|
|
23
|
-
}
|
|
24
|
-
for (const segment of header.split(';')) {
|
|
25
|
-
const [rawName, ...valueParts] = segment.split('=');
|
|
26
|
-
const name = rawName?.trim();
|
|
27
|
-
if (!name)
|
|
28
|
-
continue;
|
|
29
|
-
cookieMap.set(name, (0, cookie_parse_1.safeDecodeURIComponent)(valueParts.join('=').trim()));
|
|
30
|
-
}
|
|
31
|
-
return cookieMap;
|
|
32
|
-
}
|
|
33
|
-
function serializeCookie(name, value, options = {}) {
|
|
34
|
-
const parts = [`${name}=${encodeURIComponent(value)}`];
|
|
35
|
-
if (options.maxAge !== undefined)
|
|
36
|
-
parts.push(`Max-Age=${options.maxAge}`);
|
|
37
|
-
if (options.expires)
|
|
38
|
-
parts.push(`Expires=${options.expires.toUTCString()}`);
|
|
39
|
-
if (options.domain)
|
|
40
|
-
parts.push(`Domain=${options.domain}`);
|
|
41
|
-
parts.push(`Path=${options.path || '/'}`);
|
|
42
|
-
if (options.secure)
|
|
43
|
-
parts.push('Secure');
|
|
44
|
-
if (options.httpOnly)
|
|
45
|
-
parts.push('HttpOnly');
|
|
46
|
-
if (options.sameSite)
|
|
47
|
-
parts.push(`SameSite=${options.sameSite}`);
|
|
48
|
-
if (options.priority)
|
|
49
|
-
parts.push(`Priority=${options.priority}`);
|
|
50
|
-
return parts.join('; ');
|
|
51
|
-
}
|
|
52
|
-
function appendSetCookie(serializedCookie) {
|
|
53
|
-
const res = (0, request_context_1.getRequestContext)()?.res;
|
|
54
|
-
if (!res) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const current = res.getHeader('Set-Cookie');
|
|
58
|
-
if (!current) {
|
|
59
|
-
res.setHeader('Set-Cookie', [serializedCookie]);
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
if (Array.isArray(current)) {
|
|
63
|
-
res.setHeader('Set-Cookie', [...current.map((entry) => String(entry)), serializedCookie]);
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
res.setHeader('Set-Cookie', [String(current), serializedCookie]);
|
|
67
|
-
}
|
|
68
|
-
function createCookieStore() {
|
|
69
|
-
const request = (0, request_context_1.getRequestContext)()?.req;
|
|
70
|
-
const cookieMap = parseCookieHeader(request?.headers?.cookie);
|
|
71
|
-
const syncRequestCookieHeader = () => {
|
|
72
|
-
if (!request || !request.headers) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
request.headers.cookie = Array.from(cookieMap.entries())
|
|
76
|
-
.map(([name, cookieValue]) => `${name}=${encodeURIComponent(cookieValue)}`)
|
|
77
|
-
.join('; ');
|
|
78
|
-
};
|
|
79
|
-
return {
|
|
80
|
-
get(name) {
|
|
81
|
-
const value = cookieMap.get(name);
|
|
82
|
-
return value === undefined ? undefined : { name, value };
|
|
83
|
-
},
|
|
84
|
-
getAll() {
|
|
85
|
-
return Array.from(cookieMap.entries()).map(([name, value]) => ({ name, value }));
|
|
86
|
-
},
|
|
87
|
-
has(name) {
|
|
88
|
-
return cookieMap.has(name);
|
|
89
|
-
},
|
|
90
|
-
set(name, value, options) {
|
|
91
|
-
cookieMap.set(name, value);
|
|
92
|
-
syncRequestCookieHeader();
|
|
93
|
-
appendSetCookie(serializeCookie(name, value, options));
|
|
94
|
-
},
|
|
95
|
-
delete(name) {
|
|
96
|
-
cookieMap.delete(name);
|
|
97
|
-
syncRequestCookieHeader();
|
|
98
|
-
appendSetCookie(serializeCookie(name, '', {
|
|
99
|
-
expires: new Date(0),
|
|
100
|
-
maxAge: 0,
|
|
101
|
-
path: '/',
|
|
102
|
-
}));
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
function createReadonlyHeaders() {
|
|
107
|
-
const request = (0, request_context_1.getRequestContext)()?.req;
|
|
108
|
-
const headerMap = new Map();
|
|
109
|
-
if (request?.headers) {
|
|
110
|
-
for (const [key, value] of Object.entries(request.headers)) {
|
|
111
|
-
if (Array.isArray(value)) {
|
|
112
|
-
headerMap.set(key.toLowerCase(), value.join(', '));
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
if (value !== undefined) {
|
|
116
|
-
headerMap.set(key.toLowerCase(), String(value));
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
return {
|
|
121
|
-
get(name) {
|
|
122
|
-
return headerMap.get(name.toLowerCase()) ?? null;
|
|
123
|
-
},
|
|
124
|
-
has(name) {
|
|
125
|
-
return headerMap.has(name.toLowerCase());
|
|
126
|
-
},
|
|
127
|
-
entries() {
|
|
128
|
-
return headerMap.entries();
|
|
129
|
-
},
|
|
130
|
-
keys() {
|
|
131
|
-
return headerMap.keys();
|
|
132
|
-
},
|
|
133
|
-
values() {
|
|
134
|
-
return headerMap.values();
|
|
135
|
-
},
|
|
136
|
-
forEach(callback) {
|
|
137
|
-
headerMap.forEach((value, key) => callback(value, key));
|
|
138
|
-
},
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Access cookies in Server Components and API routes.
|
|
143
|
-
* Note: This is a simplified implementation - in production, integrate with actual request.
|
|
144
|
-
*/
|
|
145
|
-
function cookies() {
|
|
146
|
-
// Check if we're in a server context
|
|
147
|
-
if (typeof window !== 'undefined') {
|
|
148
|
-
console.warn('cookies() should only be called on the server');
|
|
149
|
-
}
|
|
150
|
-
return createCookieStore();
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Access request headers in Server Components.
|
|
154
|
-
* Note: This is a simplified implementation - in production, integrate with actual request.
|
|
155
|
-
*/
|
|
156
|
-
function headers() {
|
|
157
|
-
if (typeof window !== 'undefined') {
|
|
158
|
-
console.warn('headers() should only be called on the server');
|
|
159
|
-
}
|
|
160
|
-
return createReadonlyHeaders();
|
|
161
|
-
}
|
|
162
|
-
// ============================================================================
|
|
163
|
-
// Draft Mode
|
|
164
|
-
// ============================================================================
|
|
165
|
-
const DRAFT_MODE_COOKIE = '__vista_draft_mode';
|
|
166
|
-
function draftMode() {
|
|
167
|
-
const store = cookies();
|
|
168
|
-
return {
|
|
169
|
-
get isEnabled() {
|
|
170
|
-
return store.has(DRAFT_MODE_COOKIE);
|
|
171
|
-
},
|
|
172
|
-
enable() {
|
|
173
|
-
store.set(DRAFT_MODE_COOKIE, '1', {
|
|
174
|
-
httpOnly: true,
|
|
175
|
-
path: '/',
|
|
176
|
-
sameSite: 'lax',
|
|
177
|
-
});
|
|
178
|
-
},
|
|
179
|
-
disable() {
|
|
180
|
-
store.delete(DRAFT_MODE_COOKIE);
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
class RedirectError extends Error {
|
|
185
|
-
url;
|
|
186
|
-
type;
|
|
187
|
-
constructor(url, type = 'replace') {
|
|
188
|
-
super(`Redirect to ${url}`);
|
|
189
|
-
this.name = 'RedirectError';
|
|
190
|
-
this.url = url;
|
|
191
|
-
this.type = type;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
exports.RedirectError = RedirectError;
|
|
195
|
-
/**
|
|
196
|
-
* Redirect to another URL from a Server Component or API route.
|
|
197
|
-
* @param url - The URL to redirect to
|
|
198
|
-
* @param type - The type of redirect ('push' or 'replace')
|
|
199
|
-
* @throws RedirectError - Always throws to interrupt rendering
|
|
200
|
-
*/
|
|
201
|
-
function redirect(url, type = 'replace') {
|
|
202
|
-
throw new RedirectError(url, type);
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Permanent redirect (HTTP 308) to another URL.
|
|
206
|
-
* @param url - The URL to redirect to
|
|
207
|
-
* @throws RedirectError - Always throws to interrupt rendering
|
|
208
|
-
*/
|
|
209
|
-
function permanentRedirect(url) {
|
|
210
|
-
throw new RedirectError(url, 'replace');
|
|
211
|
-
}
|
|
212
|
-
// ============================================================================
|
|
213
|
-
// Not Found
|
|
214
|
-
// ============================================================================
|
|
215
|
-
class NotFoundError extends Error {
|
|
216
|
-
constructor() {
|
|
217
|
-
super('Not Found');
|
|
218
|
-
this.name = 'NotFoundError';
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
exports.NotFoundError = NotFoundError;
|
|
222
|
-
/**
|
|
223
|
-
* Trigger a 404 Not Found response from a Server Component.
|
|
224
|
-
* @throws NotFoundError - Always throws to interrupt rendering
|
|
225
|
-
*/
|
|
226
|
-
function notFound() {
|
|
227
|
-
throw new NotFoundError();
|
|
228
|
-
}
|
|
229
|
-
// ============================================================================
|
|
230
|
-
// Response Helpers
|
|
231
|
-
// ============================================================================
|
|
232
|
-
/**
|
|
233
|
-
* Create a JSON response (for API routes).
|
|
234
|
-
*/
|
|
235
|
-
function json(data, init) {
|
|
236
|
-
return new Response(JSON.stringify(data), {
|
|
237
|
-
...init,
|
|
238
|
-
headers: {
|
|
239
|
-
'Content-Type': 'application/json',
|
|
240
|
-
...init?.headers,
|
|
241
|
-
},
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Create a NextResponse-compatible response object.
|
|
246
|
-
*/
|
|
247
|
-
class NextResponse extends Response {
|
|
248
|
-
static json(data, init) {
|
|
249
|
-
return new NextResponse(JSON.stringify(data), {
|
|
250
|
-
...init,
|
|
251
|
-
headers: {
|
|
252
|
-
'Content-Type': 'application/json',
|
|
253
|
-
...init?.headers,
|
|
254
|
-
},
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
static redirect(url, status = 307) {
|
|
258
|
-
return new NextResponse(null, {
|
|
259
|
-
status,
|
|
260
|
-
headers: {
|
|
261
|
-
Location: url.toString(),
|
|
262
|
-
},
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
static rewrite(url) {
|
|
266
|
-
// Rewrite implementation would go here
|
|
267
|
-
return new NextResponse(null, {
|
|
268
|
-
headers: {
|
|
269
|
-
'x-middleware-rewrite': url.toString(),
|
|
270
|
-
},
|
|
271
|
-
});
|
|
272
|
-
}
|
|
273
|
-
static next(options) {
|
|
274
|
-
const responseHeaders = new Headers();
|
|
275
|
-
responseHeaders.set('x-middleware-next', '1');
|
|
276
|
-
const incoming = options?.request?.headers;
|
|
277
|
-
if (incoming) {
|
|
278
|
-
const entries = incoming instanceof Headers ? Array.from(incoming.entries()) : Object.entries(incoming);
|
|
279
|
-
for (const [key, value] of entries) {
|
|
280
|
-
if (value == null)
|
|
281
|
-
continue;
|
|
282
|
-
responseHeaders.set(`x-middleware-request-${key}`, String(value));
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
return new NextResponse(null, {
|
|
286
|
-
headers: responseHeaders,
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
exports.NextResponse = NextResponse;
|
|
291
|
-
var cache_1 = require("./cache");
|
|
292
|
-
Object.defineProperty(exports, "cacheLife", { enumerable: true, get: function () { return cache_1.cacheLife; } });
|
|
293
|
-
Object.defineProperty(exports, "cacheTag", { enumerable: true, get: function () { return cache_1.cacheTag; } });
|
|
294
|
-
Object.defineProperty(exports, "revalidatePath", { enumerable: true, get: function () { return cache_1.revalidatePath; } });
|
|
295
|
-
Object.defineProperty(exports, "revalidateTag", { enumerable: true, get: function () { return cache_1.revalidateTag; } });
|
|
296
|
-
Object.defineProperty(exports, "unstable_cache", { enumerable: true, get: function () { return cache_1.unstable_cache; } });
|
|
297
|
-
// ============================================================================
|
|
298
|
-
// Middleware System
|
|
299
|
-
// ============================================================================
|
|
300
|
-
var middleware_runner_1 = require("./middleware-runner");
|
|
301
|
-
Object.defineProperty(exports, "runMiddleware", { enumerable: true, get: function () { return middleware_runner_1.runMiddleware; } });
|
|
302
|
-
Object.defineProperty(exports, "applyMiddlewareResult", { enumerable: true, get: function () { return middleware_runner_1.applyMiddlewareResult; } });
|
|
303
|
-
Object.defineProperty(exports, "discoverGlobalMiddleware", { enumerable: true, get: function () { return middleware_runner_1.discoverGlobalMiddleware; } });
|
|
304
|
-
Object.defineProperty(exports, "discoverRouteMiddlewares", { enumerable: true, get: function () { return middleware_runner_1.discoverRouteMiddlewares; } });
|
|
305
|
-
Object.defineProperty(exports, "clearMiddlewareCaches", { enumerable: true, get: function () { return middleware_runner_1.clearMiddlewareCaches; } });
|
|
306
|
-
Object.defineProperty(exports, "buildNextRequest", { enumerable: true, get: function () { return middleware_runner_1.buildNextRequest; } });
|
|
307
|
-
Object.defineProperty(exports, "patternToRegExp", { enumerable: true, get: function () { return middleware_runner_1.patternToRegExp; } });
|
|
308
|
-
Object.defineProperty(exports, "shouldRunMiddleware", { enumerable: true, get: function () { return middleware_runner_1.shouldRunMiddleware; } });
|
|
309
|
-
var middleware_security_1 = require("./middleware-security");
|
|
310
|
-
Object.defineProperty(exports, "chain", { enumerable: true, get: function () { return middleware_security_1.chain; } });
|
|
311
|
-
Object.defineProperty(exports, "cors", { enumerable: true, get: function () { return middleware_security_1.cors; } });
|
|
312
|
-
Object.defineProperty(exports, "rateLimit", { enumerable: true, get: function () { return middleware_security_1.rateLimit; } });
|
|
313
|
-
Object.defineProperty(exports, "securityHeaders", { enumerable: true, get: function () { return middleware_security_1.securityHeaders; } });
|
|
314
|
-
Object.defineProperty(exports, "isSafeRedirectLocation", { enumerable: true, get: function () { return middleware_security_1.isSafeRedirectLocation; } });
|
|
315
|
-
Object.defineProperty(exports, "sanitizeRequestHeaderMap", { enumerable: true, get: function () { return middleware_security_1.sanitizeRequestHeaderMap; } });
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Vista Server Utilities
|
|
4
|
+
*
|
|
5
|
+
* Next.js-compatible server-only functions for use in Server Components and API routes.
|
|
6
|
+
* These functions only work on the server side.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.sanitizeRequestHeaderMap = exports.isSafeRedirectLocation = exports.securityHeaders = exports.rateLimit = exports.cors = exports.chain = exports.shouldRunMiddleware = exports.patternToRegExp = exports.buildNextRequest = exports.clearMiddlewareCaches = exports.discoverRouteMiddlewares = exports.discoverGlobalMiddleware = exports.applyMiddlewareResult = exports.runMiddleware = exports.unstable_cache = exports.revalidateTag = exports.revalidatePath = exports.cacheTag = exports.cacheLife = exports.NextResponse = exports.NotFoundError = exports.RedirectError = void 0;
|
|
10
|
+
exports.cookies = cookies;
|
|
11
|
+
exports.headers = headers;
|
|
12
|
+
exports.draftMode = draftMode;
|
|
13
|
+
exports.redirect = redirect;
|
|
14
|
+
exports.permanentRedirect = permanentRedirect;
|
|
15
|
+
exports.notFound = notFound;
|
|
16
|
+
exports.json = json;
|
|
17
|
+
const request_context_1 = require("./request-context");
|
|
18
|
+
const cookie_parse_1 = require("./cookie-parse");
|
|
19
|
+
function parseCookieHeader(header) {
|
|
20
|
+
const cookieMap = new Map();
|
|
21
|
+
if (!header) {
|
|
22
|
+
return cookieMap;
|
|
23
|
+
}
|
|
24
|
+
for (const segment of header.split(';')) {
|
|
25
|
+
const [rawName, ...valueParts] = segment.split('=');
|
|
26
|
+
const name = rawName?.trim();
|
|
27
|
+
if (!name)
|
|
28
|
+
continue;
|
|
29
|
+
cookieMap.set(name, (0, cookie_parse_1.safeDecodeURIComponent)(valueParts.join('=').trim()));
|
|
30
|
+
}
|
|
31
|
+
return cookieMap;
|
|
32
|
+
}
|
|
33
|
+
function serializeCookie(name, value, options = {}) {
|
|
34
|
+
const parts = [`${name}=${encodeURIComponent(value)}`];
|
|
35
|
+
if (options.maxAge !== undefined)
|
|
36
|
+
parts.push(`Max-Age=${options.maxAge}`);
|
|
37
|
+
if (options.expires)
|
|
38
|
+
parts.push(`Expires=${options.expires.toUTCString()}`);
|
|
39
|
+
if (options.domain)
|
|
40
|
+
parts.push(`Domain=${options.domain}`);
|
|
41
|
+
parts.push(`Path=${options.path || '/'}`);
|
|
42
|
+
if (options.secure)
|
|
43
|
+
parts.push('Secure');
|
|
44
|
+
if (options.httpOnly)
|
|
45
|
+
parts.push('HttpOnly');
|
|
46
|
+
if (options.sameSite)
|
|
47
|
+
parts.push(`SameSite=${options.sameSite}`);
|
|
48
|
+
if (options.priority)
|
|
49
|
+
parts.push(`Priority=${options.priority}`);
|
|
50
|
+
return parts.join('; ');
|
|
51
|
+
}
|
|
52
|
+
function appendSetCookie(serializedCookie) {
|
|
53
|
+
const res = (0, request_context_1.getRequestContext)()?.res;
|
|
54
|
+
if (!res) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const current = res.getHeader('Set-Cookie');
|
|
58
|
+
if (!current) {
|
|
59
|
+
res.setHeader('Set-Cookie', [serializedCookie]);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(current)) {
|
|
63
|
+
res.setHeader('Set-Cookie', [...current.map((entry) => String(entry)), serializedCookie]);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
res.setHeader('Set-Cookie', [String(current), serializedCookie]);
|
|
67
|
+
}
|
|
68
|
+
function createCookieStore() {
|
|
69
|
+
const request = (0, request_context_1.getRequestContext)()?.req;
|
|
70
|
+
const cookieMap = parseCookieHeader(request?.headers?.cookie);
|
|
71
|
+
const syncRequestCookieHeader = () => {
|
|
72
|
+
if (!request || !request.headers) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
request.headers.cookie = Array.from(cookieMap.entries())
|
|
76
|
+
.map(([name, cookieValue]) => `${name}=${encodeURIComponent(cookieValue)}`)
|
|
77
|
+
.join('; ');
|
|
78
|
+
};
|
|
79
|
+
return {
|
|
80
|
+
get(name) {
|
|
81
|
+
const value = cookieMap.get(name);
|
|
82
|
+
return value === undefined ? undefined : { name, value };
|
|
83
|
+
},
|
|
84
|
+
getAll() {
|
|
85
|
+
return Array.from(cookieMap.entries()).map(([name, value]) => ({ name, value }));
|
|
86
|
+
},
|
|
87
|
+
has(name) {
|
|
88
|
+
return cookieMap.has(name);
|
|
89
|
+
},
|
|
90
|
+
set(name, value, options) {
|
|
91
|
+
cookieMap.set(name, value);
|
|
92
|
+
syncRequestCookieHeader();
|
|
93
|
+
appendSetCookie(serializeCookie(name, value, options));
|
|
94
|
+
},
|
|
95
|
+
delete(name) {
|
|
96
|
+
cookieMap.delete(name);
|
|
97
|
+
syncRequestCookieHeader();
|
|
98
|
+
appendSetCookie(serializeCookie(name, '', {
|
|
99
|
+
expires: new Date(0),
|
|
100
|
+
maxAge: 0,
|
|
101
|
+
path: '/',
|
|
102
|
+
}));
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function createReadonlyHeaders() {
|
|
107
|
+
const request = (0, request_context_1.getRequestContext)()?.req;
|
|
108
|
+
const headerMap = new Map();
|
|
109
|
+
if (request?.headers) {
|
|
110
|
+
for (const [key, value] of Object.entries(request.headers)) {
|
|
111
|
+
if (Array.isArray(value)) {
|
|
112
|
+
headerMap.set(key.toLowerCase(), value.join(', '));
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (value !== undefined) {
|
|
116
|
+
headerMap.set(key.toLowerCase(), String(value));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
get(name) {
|
|
122
|
+
return headerMap.get(name.toLowerCase()) ?? null;
|
|
123
|
+
},
|
|
124
|
+
has(name) {
|
|
125
|
+
return headerMap.has(name.toLowerCase());
|
|
126
|
+
},
|
|
127
|
+
entries() {
|
|
128
|
+
return headerMap.entries();
|
|
129
|
+
},
|
|
130
|
+
keys() {
|
|
131
|
+
return headerMap.keys();
|
|
132
|
+
},
|
|
133
|
+
values() {
|
|
134
|
+
return headerMap.values();
|
|
135
|
+
},
|
|
136
|
+
forEach(callback) {
|
|
137
|
+
headerMap.forEach((value, key) => callback(value, key));
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Access cookies in Server Components and API routes.
|
|
143
|
+
* Note: This is a simplified implementation - in production, integrate with actual request.
|
|
144
|
+
*/
|
|
145
|
+
function cookies() {
|
|
146
|
+
// Check if we're in a server context
|
|
147
|
+
if (typeof window !== 'undefined') {
|
|
148
|
+
console.warn('cookies() should only be called on the server');
|
|
149
|
+
}
|
|
150
|
+
return createCookieStore();
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Access request headers in Server Components.
|
|
154
|
+
* Note: This is a simplified implementation - in production, integrate with actual request.
|
|
155
|
+
*/
|
|
156
|
+
function headers() {
|
|
157
|
+
if (typeof window !== 'undefined') {
|
|
158
|
+
console.warn('headers() should only be called on the server');
|
|
159
|
+
}
|
|
160
|
+
return createReadonlyHeaders();
|
|
161
|
+
}
|
|
162
|
+
// ============================================================================
|
|
163
|
+
// Draft Mode
|
|
164
|
+
// ============================================================================
|
|
165
|
+
const DRAFT_MODE_COOKIE = '__vista_draft_mode';
|
|
166
|
+
function draftMode() {
|
|
167
|
+
const store = cookies();
|
|
168
|
+
return {
|
|
169
|
+
get isEnabled() {
|
|
170
|
+
return store.has(DRAFT_MODE_COOKIE);
|
|
171
|
+
},
|
|
172
|
+
enable() {
|
|
173
|
+
store.set(DRAFT_MODE_COOKIE, '1', {
|
|
174
|
+
httpOnly: true,
|
|
175
|
+
path: '/',
|
|
176
|
+
sameSite: 'lax',
|
|
177
|
+
});
|
|
178
|
+
},
|
|
179
|
+
disable() {
|
|
180
|
+
store.delete(DRAFT_MODE_COOKIE);
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
class RedirectError extends Error {
|
|
185
|
+
url;
|
|
186
|
+
type;
|
|
187
|
+
constructor(url, type = 'replace') {
|
|
188
|
+
super(`Redirect to ${url}`);
|
|
189
|
+
this.name = 'RedirectError';
|
|
190
|
+
this.url = url;
|
|
191
|
+
this.type = type;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
exports.RedirectError = RedirectError;
|
|
195
|
+
/**
|
|
196
|
+
* Redirect to another URL from a Server Component or API route.
|
|
197
|
+
* @param url - The URL to redirect to
|
|
198
|
+
* @param type - The type of redirect ('push' or 'replace')
|
|
199
|
+
* @throws RedirectError - Always throws to interrupt rendering
|
|
200
|
+
*/
|
|
201
|
+
function redirect(url, type = 'replace') {
|
|
202
|
+
throw new RedirectError(url, type);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Permanent redirect (HTTP 308) to another URL.
|
|
206
|
+
* @param url - The URL to redirect to
|
|
207
|
+
* @throws RedirectError - Always throws to interrupt rendering
|
|
208
|
+
*/
|
|
209
|
+
function permanentRedirect(url) {
|
|
210
|
+
throw new RedirectError(url, 'replace');
|
|
211
|
+
}
|
|
212
|
+
// ============================================================================
|
|
213
|
+
// Not Found
|
|
214
|
+
// ============================================================================
|
|
215
|
+
class NotFoundError extends Error {
|
|
216
|
+
constructor() {
|
|
217
|
+
super('Not Found');
|
|
218
|
+
this.name = 'NotFoundError';
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.NotFoundError = NotFoundError;
|
|
222
|
+
/**
|
|
223
|
+
* Trigger a 404 Not Found response from a Server Component.
|
|
224
|
+
* @throws NotFoundError - Always throws to interrupt rendering
|
|
225
|
+
*/
|
|
226
|
+
function notFound() {
|
|
227
|
+
throw new NotFoundError();
|
|
228
|
+
}
|
|
229
|
+
// ============================================================================
|
|
230
|
+
// Response Helpers
|
|
231
|
+
// ============================================================================
|
|
232
|
+
/**
|
|
233
|
+
* Create a JSON response (for API routes).
|
|
234
|
+
*/
|
|
235
|
+
function json(data, init) {
|
|
236
|
+
return new Response(JSON.stringify(data), {
|
|
237
|
+
...init,
|
|
238
|
+
headers: {
|
|
239
|
+
'Content-Type': 'application/json',
|
|
240
|
+
...init?.headers,
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Create a NextResponse-compatible response object.
|
|
246
|
+
*/
|
|
247
|
+
class NextResponse extends Response {
|
|
248
|
+
static json(data, init) {
|
|
249
|
+
return new NextResponse(JSON.stringify(data), {
|
|
250
|
+
...init,
|
|
251
|
+
headers: {
|
|
252
|
+
'Content-Type': 'application/json',
|
|
253
|
+
...init?.headers,
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
static redirect(url, status = 307) {
|
|
258
|
+
return new NextResponse(null, {
|
|
259
|
+
status,
|
|
260
|
+
headers: {
|
|
261
|
+
Location: url.toString(),
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
static rewrite(url) {
|
|
266
|
+
// Rewrite implementation would go here
|
|
267
|
+
return new NextResponse(null, {
|
|
268
|
+
headers: {
|
|
269
|
+
'x-middleware-rewrite': url.toString(),
|
|
270
|
+
},
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
static next(options) {
|
|
274
|
+
const responseHeaders = new Headers();
|
|
275
|
+
responseHeaders.set('x-middleware-next', '1');
|
|
276
|
+
const incoming = options?.request?.headers;
|
|
277
|
+
if (incoming) {
|
|
278
|
+
const entries = incoming instanceof Headers ? Array.from(incoming.entries()) : Object.entries(incoming);
|
|
279
|
+
for (const [key, value] of entries) {
|
|
280
|
+
if (value == null)
|
|
281
|
+
continue;
|
|
282
|
+
responseHeaders.set(`x-middleware-request-${key}`, String(value));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return new NextResponse(null, {
|
|
286
|
+
headers: responseHeaders,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
exports.NextResponse = NextResponse;
|
|
291
|
+
var cache_1 = require("./cache");
|
|
292
|
+
Object.defineProperty(exports, "cacheLife", { enumerable: true, get: function () { return cache_1.cacheLife; } });
|
|
293
|
+
Object.defineProperty(exports, "cacheTag", { enumerable: true, get: function () { return cache_1.cacheTag; } });
|
|
294
|
+
Object.defineProperty(exports, "revalidatePath", { enumerable: true, get: function () { return cache_1.revalidatePath; } });
|
|
295
|
+
Object.defineProperty(exports, "revalidateTag", { enumerable: true, get: function () { return cache_1.revalidateTag; } });
|
|
296
|
+
Object.defineProperty(exports, "unstable_cache", { enumerable: true, get: function () { return cache_1.unstable_cache; } });
|
|
297
|
+
// ============================================================================
|
|
298
|
+
// Middleware System
|
|
299
|
+
// ============================================================================
|
|
300
|
+
var middleware_runner_1 = require("./middleware-runner");
|
|
301
|
+
Object.defineProperty(exports, "runMiddleware", { enumerable: true, get: function () { return middleware_runner_1.runMiddleware; } });
|
|
302
|
+
Object.defineProperty(exports, "applyMiddlewareResult", { enumerable: true, get: function () { return middleware_runner_1.applyMiddlewareResult; } });
|
|
303
|
+
Object.defineProperty(exports, "discoverGlobalMiddleware", { enumerable: true, get: function () { return middleware_runner_1.discoverGlobalMiddleware; } });
|
|
304
|
+
Object.defineProperty(exports, "discoverRouteMiddlewares", { enumerable: true, get: function () { return middleware_runner_1.discoverRouteMiddlewares; } });
|
|
305
|
+
Object.defineProperty(exports, "clearMiddlewareCaches", { enumerable: true, get: function () { return middleware_runner_1.clearMiddlewareCaches; } });
|
|
306
|
+
Object.defineProperty(exports, "buildNextRequest", { enumerable: true, get: function () { return middleware_runner_1.buildNextRequest; } });
|
|
307
|
+
Object.defineProperty(exports, "patternToRegExp", { enumerable: true, get: function () { return middleware_runner_1.patternToRegExp; } });
|
|
308
|
+
Object.defineProperty(exports, "shouldRunMiddleware", { enumerable: true, get: function () { return middleware_runner_1.shouldRunMiddleware; } });
|
|
309
|
+
var middleware_security_1 = require("./middleware-security");
|
|
310
|
+
Object.defineProperty(exports, "chain", { enumerable: true, get: function () { return middleware_security_1.chain; } });
|
|
311
|
+
Object.defineProperty(exports, "cors", { enumerable: true, get: function () { return middleware_security_1.cors; } });
|
|
312
|
+
Object.defineProperty(exports, "rateLimit", { enumerable: true, get: function () { return middleware_security_1.rateLimit; } });
|
|
313
|
+
Object.defineProperty(exports, "securityHeaders", { enumerable: true, get: function () { return middleware_security_1.securityHeaders; } });
|
|
314
|
+
Object.defineProperty(exports, "isSafeRedirectLocation", { enumerable: true, get: function () { return middleware_security_1.isSafeRedirectLocation; } });
|
|
315
|
+
Object.defineProperty(exports, "sanitizeRequestHeaderMap", { enumerable: true, get: function () { return middleware_security_1.sanitizeRequestHeaderMap; } });
|