@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.
Files changed (42) hide show
  1. package/dist/client-bundle.d.ts +29 -0
  2. package/dist/client-bundle.d.ts.map +1 -1
  3. package/dist/client-bundle.js +333 -52
  4. package/dist/dev-api.d.ts +78 -0
  5. package/dist/dev-api.d.ts.map +1 -0
  6. package/dist/dev-api.js +338 -0
  7. package/dist/dev-config.d.ts +48 -0
  8. package/dist/dev-config.d.ts.map +1 -0
  9. package/dist/dev-config.js +964 -0
  10. package/dist/dev-server.d.ts +85 -0
  11. package/dist/dev-server.d.ts.map +1 -1
  12. package/dist/dev-server.js +329 -8
  13. package/dist/error-codeframe.d.ts +23 -0
  14. package/dist/error-codeframe.d.ts.map +1 -0
  15. package/dist/error-codeframe.js +127 -0
  16. package/dist/error-tips.d.ts +7 -0
  17. package/dist/error-tips.d.ts.map +1 -0
  18. package/dist/error-tips.js +91 -0
  19. package/dist/hmr-utils.d.ts +14 -0
  20. package/dist/hmr-utils.d.ts.map +1 -0
  21. package/dist/hmr-utils.js +56 -0
  22. package/dist/hmr.d.ts +40 -0
  23. package/dist/hmr.d.ts.map +1 -1
  24. package/dist/hmr.js +139 -20
  25. package/dist/index.d.ts +37 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +105 -22
  28. package/dist/paths.d.ts +8 -0
  29. package/dist/paths.d.ts.map +1 -1
  30. package/dist/paths.js +32 -0
  31. package/dist/platform-handler.d.ts.map +1 -1
  32. package/dist/platform-handler.js +2 -1
  33. package/dist/plugins.d.ts +147 -0
  34. package/dist/plugins.d.ts.map +1 -0
  35. package/dist/plugins.js +1109 -0
  36. package/dist/prod-server.d.ts.map +1 -1
  37. package/dist/prod-server.js +43 -9
  38. package/dist/ssr-function.d.ts.map +1 -1
  39. package/dist/ssr-function.js +14 -2
  40. package/dist/types.d.ts +1 -1
  41. package/dist/types.d.ts.map +1 -1
  42. 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;AAsBjG,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,CA0YxI"}
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"}
@@ -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
- const body = await response.text();
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
- const body = await response.text();
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
- notFoundHtml = await renderFullPage(src, compName, { params: {}, url: url.pathname }, new Map(), { hydrate: true, cssUrls: ['/_vesk/static/_tailwind.css', '/_vesk/static/global.css'], security: securityConfig?.security || {}, externalDataScript: storeDataScriptGlobal, sourcePath: nfPath });
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
- 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: ['/_vesk/static/_tailwind.css', '/_vesk/static/global.css'], clientScriptUrl: '/_vesk/static/client.js', security: securityConfig?.security || {}, externalDataScript: storeDataScriptGlobal, sourcePath: errPath });
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,CAyWtD"}
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"}
@@ -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
- bodyCode = dataCode;
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
@@ -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,GACjB,MAAM,aAAa,CAAC"}
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.9",
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.9",
27
- "@vesk/runtime": "^0.2.9",
28
- "@vesk/types": "^0.2.9"
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",