@vesk/adapter 0.2.9 → 0.2.11
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/dist/client-bundle.d.ts +29 -0
- package/dist/client-bundle.d.ts.map +1 -1
- package/dist/client-bundle.js +333 -52
- package/dist/dev-api.d.ts +78 -0
- package/dist/dev-api.d.ts.map +1 -0
- package/dist/dev-api.js +338 -0
- package/dist/dev-config.d.ts +48 -0
- package/dist/dev-config.d.ts.map +1 -0
- package/dist/dev-config.js +964 -0
- package/dist/dev-server.d.ts +85 -0
- package/dist/dev-server.d.ts.map +1 -1
- package/dist/dev-server.js +329 -8
- package/dist/error-codeframe.d.ts +23 -0
- package/dist/error-codeframe.d.ts.map +1 -0
- package/dist/error-codeframe.js +127 -0
- package/dist/error-tips.d.ts +7 -0
- package/dist/error-tips.d.ts.map +1 -0
- package/dist/error-tips.js +91 -0
- package/dist/hmr-utils.d.ts +14 -0
- package/dist/hmr-utils.d.ts.map +1 -0
- package/dist/hmr-utils.js +56 -0
- package/dist/hmr.d.ts +40 -0
- package/dist/hmr.d.ts.map +1 -1
- package/dist/hmr.js +139 -20
- package/dist/index.d.ts +37 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +105 -22
- package/dist/paths.d.ts +8 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +32 -0
- package/dist/platform-handler.d.ts.map +1 -1
- package/dist/platform-handler.js +2 -1
- package/dist/plugins.d.ts +147 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +1109 -0
- package/dist/prod-server.d.ts.map +1 -1
- package/dist/prod-server.js +43 -9
- package/dist/ssr-function.d.ts.map +1 -1
- package/dist/ssr-function.js +14 -2
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prod-server.d.ts","sourceRoot":"","sources":["../src/prod-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2D,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"prod-server.d.ts","sourceRoot":"","sources":["../src/prod-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2D,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AA8CjG,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAIzE;AA4FD,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAiZxI"}
|
package/dist/prod-server.js
CHANGED
|
@@ -5,7 +5,7 @@ import { createRequire } from 'node:module';
|
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
import { createRateLimiter, resolveComponentName, safeJsonForScript, getClientProtocol, DEFAULT_MAX_BODY_BYTES } from '@vesk/compiler/src/server-codegen';
|
|
7
7
|
import { securityHeaders } from '@vesk/compiler/src/server-utils';
|
|
8
|
-
import { resolveWithin } from '@vesk/adapter/src/paths';
|
|
8
|
+
import { resolveWithin, installMdReadHook } from '@vesk/adapter/src/paths';
|
|
9
9
|
const _require = createRequire(import.meta.url);
|
|
10
10
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
11
|
async function readBody(req, maxBytes = DEFAULT_MAX_BODY_BYTES) {
|
|
@@ -19,6 +19,31 @@ async function readBody(req, maxBytes = DEFAULT_MAX_BODY_BYTES) {
|
|
|
19
19
|
}
|
|
20
20
|
return Buffer.concat(chunks);
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Writes a handler Response to the socket, piping a streaming body
|
|
24
|
+
* chunk-by-chunk (SSE / text streams) instead of buffering everything.
|
|
25
|
+
*/
|
|
26
|
+
async function deliverResponse(res, response) {
|
|
27
|
+
res.writeHead(response.status, Object.fromEntries(response.headers));
|
|
28
|
+
const body = response.body;
|
|
29
|
+
if (body && typeof body.getReader === 'function') {
|
|
30
|
+
const reader = body.getReader();
|
|
31
|
+
try {
|
|
32
|
+
for (;;) {
|
|
33
|
+
const { done, value } = await reader.read();
|
|
34
|
+
if (done)
|
|
35
|
+
break;
|
|
36
|
+
res.write(Buffer.from(value));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
/* stream aborted by the client */
|
|
41
|
+
}
|
|
42
|
+
res.end();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
res.end(await response.text());
|
|
46
|
+
}
|
|
22
47
|
export function bodyTooLarge(maxBytes) {
|
|
23
48
|
const err = new Error(`Request body exceeds limit (${maxBytes} bytes)`);
|
|
24
49
|
err.status = 413;
|
|
@@ -97,6 +122,7 @@ export async function startProdServer(outDir, options) {
|
|
|
97
122
|
process.env.NODE_ENV = 'production';
|
|
98
123
|
const staticDir = resolve(outDir, 'static');
|
|
99
124
|
const configPath = resolve(outDir, 'config.json');
|
|
125
|
+
installMdReadHook([resolve(staticDir, 'public')]);
|
|
100
126
|
if (!existsSync(configPath)) {
|
|
101
127
|
console.error(`vesk start: no build found at ${outDir}`);
|
|
102
128
|
console.error('Run "vesk build" first');
|
|
@@ -345,9 +371,7 @@ export async function startProdServer(outDir, options) {
|
|
|
345
371
|
try {
|
|
346
372
|
const webRequest = makeWebRequest(req, url.href, maxBodyBytes);
|
|
347
373
|
const response = await mod.handleAction(webRequest, actionId);
|
|
348
|
-
|
|
349
|
-
res.writeHead(response.status, Object.fromEntries(response.headers));
|
|
350
|
-
res.end(body);
|
|
374
|
+
await deliverResponse(res, response);
|
|
351
375
|
}
|
|
352
376
|
catch (e) {
|
|
353
377
|
const status = errorStatus(e, 500);
|
|
@@ -369,9 +393,7 @@ export async function startProdServer(outDir, options) {
|
|
|
369
393
|
try {
|
|
370
394
|
const webRequest = makeWebRequest(req, url.href, maxBodyBytes);
|
|
371
395
|
const response = await mod.handle(webRequest);
|
|
372
|
-
|
|
373
|
-
res.writeHead(response.status, Object.fromEntries(response.headers));
|
|
374
|
-
res.end(body);
|
|
396
|
+
await deliverResponse(res, response);
|
|
375
397
|
return;
|
|
376
398
|
}
|
|
377
399
|
catch (e) {
|
|
@@ -394,7 +416,13 @@ export async function startProdServer(outDir, options) {
|
|
|
394
416
|
const { renderFullPage, storeDataScriptGlobal } = await import(runtimePath);
|
|
395
417
|
const src = readFileSync(nfPath, 'utf-8');
|
|
396
418
|
const compName = resolveComponentName(src) || 'NotFound';
|
|
397
|
-
|
|
419
|
+
const tailwindPathNF = resolve(outDir, 'static', '_tailwind.css');
|
|
420
|
+
const hasTailwindNF = existsSync(tailwindPathNF) && readFileSync(tailwindPathNF, 'utf-8').trim().length > 0;
|
|
421
|
+
const cssUrlsNF = [];
|
|
422
|
+
if (hasTailwindNF)
|
|
423
|
+
cssUrlsNF.push('/_vesk/static/_tailwind.css');
|
|
424
|
+
cssUrlsNF.push('/_vesk/static/global.css');
|
|
425
|
+
notFoundHtml = await renderFullPage(src, compName, { params: {}, url: url.pathname }, new Map(), { hydrate: true, cssUrls: cssUrlsNF, security: securityConfig?.security || {}, externalDataScript: storeDataScriptGlobal, sourcePath: nfPath });
|
|
398
426
|
}
|
|
399
427
|
catch { }
|
|
400
428
|
}
|
|
@@ -463,7 +491,13 @@ export async function startProdServer(outDir, options) {
|
|
|
463
491
|
const compName = resolveComponentName(src) || 'Error';
|
|
464
492
|
// never leak stack traces / internal messages to prod error pages
|
|
465
493
|
const expose = process.env.NODE_ENV !== 'production';
|
|
466
|
-
|
|
494
|
+
const tailwindPathErr = resolve(outDir, 'static', '_tailwind.css');
|
|
495
|
+
const hasTailwindErr = existsSync(tailwindPathErr) && readFileSync(tailwindPathErr, 'utf-8').trim().length > 0;
|
|
496
|
+
const cssUrlsErr = [];
|
|
497
|
+
if (hasTailwindErr)
|
|
498
|
+
cssUrlsErr.push('/_vesk/static/_tailwind.css');
|
|
499
|
+
cssUrlsErr.push('/_vesk/static/global.css');
|
|
500
|
+
errorHtml = await renderFullPage(src, compName, { error: expose ? err.message : 'Internal Server Error', stack: expose ? err.stack : '', statusCode: 500, url: url.pathname }, new Map(), { hydrate: true, cssUrls: cssUrlsErr, clientScriptUrl: '/_vesk/static/client.js', security: securityConfig?.security || {}, externalDataScript: storeDataScriptGlobal, sourcePath: errPath });
|
|
467
501
|
}
|
|
468
502
|
catch { }
|
|
469
503
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr-function.d.ts","sourceRoot":"","sources":["../src/ssr-function.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAkB,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAW7F,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQjF;AAiDD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,kBAAkB,GAC3B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"ssr-function.d.ts","sourceRoot":"","sources":["../src/ssr-function.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAkB,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAW7F,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQjF;AAiDD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,kBAAkB,GAC3B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqXtD"}
|
package/dist/ssr-function.js
CHANGED
|
@@ -278,6 +278,7 @@ export function generateSsrFunction(routeNode, appDir, outDir, componentMap, opt
|
|
|
278
278
|
' url,',
|
|
279
279
|
" locals: Object.assign({}, __rootLocals),",
|
|
280
280
|
" cookies: parseCookies(request.headers.get('cookie') || ''),",
|
|
281
|
+
' resolveUrl(u) { return new URL(u, request.url).href; },',
|
|
281
282
|
' set(key, value) { this.locals[key] = value; },',
|
|
282
283
|
' get(key) { return this.locals[key]; },',
|
|
283
284
|
' };',
|
|
@@ -294,7 +295,17 @@ export function generateSsrFunction(routeNode, appDir, outDir, componentMap, opt
|
|
|
294
295
|
].join('\n');
|
|
295
296
|
}
|
|
296
297
|
else {
|
|
297
|
-
|
|
298
|
+
const indentedRender = dataCode.split('\n').map(l => l ? ` ${l}` : '').join('\n');
|
|
299
|
+
bodyCode = [
|
|
300
|
+
' // Request context for SSR helpers (useParams/useRequest, relative useFetch resolution).',
|
|
301
|
+
' const prevReq = globalThis.__vesk_request;',
|
|
302
|
+
' globalThis.__vesk_request = VeskRequest.from(request, { params });',
|
|
303
|
+
' try {',
|
|
304
|
+
indentedRender,
|
|
305
|
+
' } finally {',
|
|
306
|
+
' globalThis.__vesk_request = prevReq;',
|
|
307
|
+
' }',
|
|
308
|
+
].join('\n');
|
|
298
309
|
}
|
|
299
310
|
let registerActionsCode;
|
|
300
311
|
if (hasLayout || hasAncestorLayout) {
|
|
@@ -368,6 +379,7 @@ export function generateSsrFunction(routeNode, appDir, outDir, componentMap, opt
|
|
|
368
379
|
' url: pageUrl,',
|
|
369
380
|
' locals: {},',
|
|
370
381
|
" cookies: parseCookies(request.headers.get('cookie') || ''),",
|
|
382
|
+
' resolveUrl(u) { return new URL(u, pageUrl.href).href; },',
|
|
371
383
|
' };',
|
|
372
384
|
' try {',
|
|
373
385
|
' const result = await action.execute(input, {',
|
|
@@ -398,7 +410,7 @@ export function generateSsrFunction(routeNode, appDir, outDir, componentMap, opt
|
|
|
398
410
|
'',
|
|
399
411
|
].join('\n');
|
|
400
412
|
const funcCode = [
|
|
401
|
-
"import { renderFullPage, renderPageStream, renderPage, compileFile, setVskHydrate, parseCookies, getAction, validateActionInput, issuesToFieldMap, storeDataScriptGlobal, withSsrStore, assertSameOrigin } from '../runtime.js';",
|
|
413
|
+
"import { renderFullPage, renderPageStream, renderPage, compileFile, setVskHydrate, parseCookies, getAction, validateActionInput, issuesToFieldMap, storeDataScriptGlobal, withSsrStore, assertSameOrigin, VeskRequest } from '../runtime.js';",
|
|
402
414
|
'',
|
|
403
415
|
middlewareCode || '',
|
|
404
416
|
registryCode,
|
package/dist/types.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export type { RouteNode, ApiRouteNode, VeskPlugin, VeskSecurity, VeskCors, VeskRateLimit, VeskSecurityPreset, SecurityConfig, MiddlewareChainItem, MiddlewareExtractResult, AncestorLayout, BuildOptions, DevServerOptions, ProdServerOptions, SsrFunctionOptions, ApiFunctionOptions, ClientBundleOptions, ClientBundleFileEntry, ClientBundleCache, ChunkEntry, ClientBundleResult, MonolithicBundleParts, Manifest, ManifestRouteEntry, ManifestActionEntry, ManifestPrerenderedEntry, SsgRouteResult, BuildResult, ImageRef, ImageResult, SeoCheckIssue, SeoAuditResult, CombinedPageInfo, } from '@vesk/types';
|
|
1
|
+
export type { RouteNode, ApiRouteNode, VeskPlugin, VeskSecurity, VeskCors, VeskRateLimit, VeskSecurityPreset, SecurityConfig, MiddlewareChainItem, MiddlewareExtractResult, AncestorLayout, BuildOptions, DevServerOptions, ProdServerOptions, SsrFunctionOptions, ApiFunctionOptions, ClientBundleOptions, ClientBundleFileEntry, ClientBundleCache, ChunkEntry, ClientBundleResult, MonolithicBundleParts, Manifest, ManifestRouteEntry, ManifestActionEntry, ManifestPrerenderedEntry, SsgRouteResult, BuildResult, ImageRef, ImageResult, SeoCheckIssue, SeoAuditResult, CombinedPageInfo, Tracked, Resource, UseFetchOptions, UseFetchStreamOptions, VeskRequest, VeskResponse, SetCookieOptions, CookieStore, ServerRequest, SsrDataSink, MdProps, MdConfig, MdHtmlMode, MarkdownOptions, MdHtmlWarning, } from '@vesk/types';
|
|
2
2
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACrB,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,cAAc,EACd,WAAW,EACX,QAAQ,EACR,WAAW,EACX,aAAa,EACb,cAAc,EACd,gBAAgB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACrB,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,cAAc,EACd,WAAW,EACX,QAAQ,EACR,WAAW,EACX,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACR,eAAe,EACf,qBAAqB,EACrB,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,WAAW,EACX,OAAO,EACP,QAAQ,EACR,UAAU,EACV,eAAe,EACf,aAAa,GACd,MAAM,aAAa,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vesk/adapter",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.11",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Vesk adapter — builds deployable .vesk/ output for Deno and Node serverless",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"sharp": "^0.35.3"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@vesk/compiler": "^0.2.
|
|
27
|
-
"@vesk/runtime": "^0.2.
|
|
28
|
-
"@vesk/types": "^0.2.
|
|
26
|
+
"@vesk/compiler": "^0.2.11",
|
|
27
|
+
"@vesk/runtime": "^0.2.11",
|
|
28
|
+
"@vesk/types": "^0.2.11"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/ws": "^8.18.1",
|