@vesk/adapter 0.2.13 → 0.2.16

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.
@@ -1,6 +1,7 @@
1
1
  import { readFileSync, existsSync } from 'node:fs';
2
2
  import { resolve, relative, join } from 'node:path';
3
3
  import { resolveComponentName } from '@vesk/compiler/src/server-codegen';
4
+ import { resolveCssUrls, hasUserCss, hasBuiltTailwindCss } from '@vesk/adapter/src/css';
4
5
  function escapeSource(src) {
5
6
  return src
6
7
  .replace(/\\/g, '\\\\')
@@ -72,23 +73,22 @@ function buildParamExtraction(node, urlParts) {
72
73
  export function generateSsrFunction(routeNode, appDir, outDir, componentMap, options) {
73
74
  const ancestorLayouts = options?.ancestorLayouts || [];
74
75
  const middlewareCode = options?.middlewareCode || null;
76
+ const headExtra = options?.headExtra || null;
75
77
  const pagePath = resolve(appDir, routeNode.sourceDir, 'page.vsk');
76
78
  const layoutPath = resolve(appDir, routeNode.sourceDir, 'layout.vsk');
77
79
  const parts = routeNode.fullPath.split('/').filter(Boolean);
78
80
  const name = routeName(parts);
79
81
  const funcDir = resolve(outDir, 'server', 'functions');
80
82
  const funcPath = resolve(funcDir, `${name}.js`);
81
- const tailwindPath = resolve(outDir, 'static', '_tailwind.css');
82
- const globalCssPath = resolve(appDir, '..', 'src', 'global.css');
83
- const altCssPath = resolve(appDir, '..', 'src', 'app.css');
84
- const hasGlobalCss = existsSync(globalCssPath) || existsSync(altCssPath);
85
- const hasTailwind = existsSync(tailwindPath) && readFileSync(tailwindPath, 'utf-8').trim().length > 0;
86
- const cssUrls = [];
87
- if (hasTailwind)
88
- cssUrls.push('/_vesk/static/_tailwind.css');
89
- if (hasGlobalCss)
90
- cssUrls.push('/_vesk/static/global.css');
83
+ const cssUrls = resolveCssUrls({
84
+ tailwind: hasBuiltTailwindCss(outDir),
85
+ userCss: hasUserCss(appDir),
86
+ });
91
87
  const cssOption = cssUrls.length > 0 ? `, cssUrls: ${JSON.stringify(cssUrls)}` : '';
88
+ // Static head snippet baked from the active onHead plugins — merged into
89
+ // every rendered head at request time (page tags win via mergeHeadHtml).
90
+ const headExtraOption = headExtra ? `, headExtra: ${JSON.stringify(headExtra)}` : '';
91
+ const bakedOptions = cssOption + headExtraOption;
92
92
  const hasLayout = !!routeNode.layout;
93
93
  const hasAncestorLayout = ancestorLayouts.length > 0;
94
94
  const pageSrc = readFileSync(pagePath, 'utf-8');
@@ -176,7 +176,7 @@ export function generateSsrFunction(routeNode, appDir, outDir, componentMap, opt
176
176
  " const stack = err && typeof err === 'object' && 'stack' in err ? String(err.stack) : '';",
177
177
  " page = { body: await __renderErrorBody({ params, statusCode: 500, error: __expose ? message : 'Internal Server Error', stack: __expose ? stack : '', url: requestUrl || '' }), head: '' };",
178
178
  ' }',
179
- " const html = await renderFullPage(_layoutSrc, _layoutComp, { params, children: (caughtError ? '<!--vesk-ssr-error:' + (caughtError && typeof caughtError === 'object' && 'message' in caughtError ? encodeURIComponent(__expose ? String(caughtError.message) : 'Internal Server Error') : '') + '-->' : '') + page.body }, __componentRegistry, { hydrate: true, cached: _layoutCompiled" + cssOption + clientScriptOption + dataScriptOption + ', pageHead: page.head, sourcePath: _layoutPath });',
179
+ " const html = await renderFullPage(_layoutSrc, _layoutComp, { params, children: (caughtError ? '<!--vesk-ssr-error:' + (caughtError && typeof caughtError === 'object' && 'message' in caughtError ? encodeURIComponent(__expose ? String(caughtError.message) : 'Internal Server Error') : '') + '-->' : '') + page.body }, __componentRegistry, { hydrate: true, cached: _layoutCompiled" + bakedOptions + clientScriptOption + dataScriptOption + ', pageHead: page.head, sourcePath: _layoutPath });',
180
180
  " return new Response(html, { headers: { 'Content-Type': 'text/html' }, status: caughtError ? 500 : 200 });",
181
181
  ' });',
182
182
  '}',
@@ -191,14 +191,14 @@ export function generateSsrFunction(routeNode, appDir, outDir, componentMap, opt
191
191
  " const message = err && typeof err === 'object' && 'message' in err ? String(err.message) : String(err);",
192
192
  " const stack = err && typeof err === 'object' && 'stack' in err ? String(err.stack) : '';",
193
193
  " const props = { params, statusCode: 500, error: __expose ? message : 'Internal Server Error', stack: __expose ? stack : '', url: requestUrl || '' };",
194
- ' return renderFullPage(_errorSrc, _errorComp, props, __componentRegistry, { hydrate: true, cached: _errorCompiled' + cssOption + clientScriptOption + dataScriptOption + ', sourcePath: _errorPath });',
194
+ ' return renderFullPage(_errorSrc, _errorComp, props, __componentRegistry, { hydrate: true, cached: _errorCompiled' + bakedOptions + clientScriptOption + dataScriptOption + ', sourcePath: _errorPath });',
195
195
  '}',
196
196
  '',
197
197
  'async function __renderHtml(params, requestUrl) {',
198
198
  ' return withSsrStore(async () => {',
199
199
  ' let stream;',
200
200
  ' try {',
201
- ' stream = renderPageStream(_src, _comp, { params }, __componentRegistry, { hydrate: true, cached: _srcCompiled' + cssOption + clientScriptOption + dataScriptOption + ', sourcePath: _srcPath });',
201
+ ' stream = renderPageStream(_src, _comp, { params }, __componentRegistry, { hydrate: true, cached: _srcCompiled' + bakedOptions + clientScriptOption + dataScriptOption + ', sourcePath: _srcPath });',
202
202
  ' } catch (err) {',
203
203
  ' if (err && (err.name === \'NotFoundError\' || err.name === \'Redirect\')) throw err;',
204
204
  ' const html = await __renderErrorFullPage(params, requestUrl, err);',
package/dist/static.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { RouteNode, SsgRouteResult } from '@vesk/adapter/src/types';
2
2
  export declare function copyStaticAssets(publicDir: string, outDir: string): void;
3
- export declare function generateSsgRoutes(routeTree: RouteNode[], appDir: string, outDir: string): Promise<SsgRouteResult[]>;
3
+ export declare function generateSsgRoutes(routeTree: RouteNode[], appDir: string, outDir: string, plugins?: import('@vesk/types').VeskPlugin[], headExtra?: string, cssUrls?: string[]): Promise<SsgRouteResult[]>;
4
4
  export declare function generateSitemap(_routeTree: RouteNode[], ssrRoutes: RouteNode[], prerenderedRoutes: SsgRouteResult[], { siteUrl }?: {
5
5
  siteUrl?: string;
6
6
  }): string;
@@ -1 +1 @@
1
- {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../src/static.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAsBxE;AAED,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAwEzH;AAED,wBAAgB,eAAe,CAC7B,UAAU,EAAE,SAAS,EAAE,EACvB,SAAS,EAAE,SAAS,EAAE,EACtB,iBAAiB,EAAE,cAAc,EAAE,EACnC,EAAE,OAAiC,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/D,MAAM,CAoCR;AAED,wBAAgB,iBAAiB,CAAC,OAAO,SAA0B,GAAG,MAAM,CAK3E"}
1
+ {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../src/static.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAsBxE;AAED,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,SAAS,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,aAAa,EAAE,UAAU,EAAE,EAC5C,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,cAAc,EAAE,CAAC,CA0E3B;AAED,wBAAgB,eAAe,CAC7B,UAAU,EAAE,SAAS,EAAE,EACvB,SAAS,EAAE,SAAS,EAAE,EACtB,iBAAiB,EAAE,cAAc,EAAE,EACnC,EAAE,OAAiC,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/D,MAAM,CAoCR;AAED,wBAAgB,iBAAiB,CAAC,OAAO,SAA0B,GAAG,MAAM,CAK3E"}
package/dist/static.js CHANGED
@@ -23,10 +23,11 @@ export function copyStaticAssets(publicDir, outDir) {
23
23
  }
24
24
  copyDir(publicDir, targetDir);
25
25
  }
26
- export async function generateSsgRoutes(routeTree, appDir, outDir) {
26
+ export async function generateSsgRoutes(routeTree, appDir, outDir, plugins, headExtra, cssUrls) {
27
27
  const { ssg } = await import('@vesk/compiler/src/server-render');
28
28
  const prerenderDir = resolve(outDir, 'prerendered');
29
29
  mkdirSync(prerenderDir, { recursive: true });
30
+ const ssgOptions = { plugins, headExtra, cssUrls };
30
31
  const results = [];
31
32
  async function evaluateExport(src, exportName) {
32
33
  try {
@@ -55,7 +56,7 @@ export async function generateSsgRoutes(routeTree, appDir, outDir) {
55
56
  for (const entry of paths) {
56
57
  try {
57
58
  const params = entry.params || {};
58
- const result = await ssg(src, null, params, {});
59
+ const result = await ssg(src, null, params, ssgOptions);
59
60
  const urlPath = entry.path || node.fullPath;
60
61
  // getStaticPaths output is app-controlled but must never write
61
62
  // outside the prerender output dir
@@ -78,7 +79,7 @@ export async function generateSsgRoutes(routeTree, appDir, outDir) {
78
79
  }
79
80
  else if (hasStaticProps) {
80
81
  try {
81
- const result = await ssg(src, null, undefined, {});
82
+ const result = await ssg(src, null, undefined, ssgOptions);
82
83
  const htmlPath = resolve(prerenderDir, node.fullPath === '/' ? 'index.html' : `${node.fullPath.slice(1)}.html`);
83
84
  mkdirSync(resolve(htmlPath, '..'), { recursive: true });
84
85
  writeFileSync(htmlPath, result.html);
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, Tracked, Resource, UseFetchOptions, UseFetchStreamOptions, VeskRequest, VeskResponse, SetCookieOptions, CookieStore, ServerRequest, SsrDataSink, MdProps, MdConfig, MdHtmlMode, MarkdownOptions, MdHtmlWarning, } from '@vesk/types';
1
+ export type { RouteNode, ApiRouteNode, VeskPlugin, ServerEventContext, VeskEventHandlers, 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,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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,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.13",
3
+ "version": "0.2.16",
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.13",
27
- "@vesk/runtime": "^0.2.13",
28
- "@vesk/types": "^0.2.13"
26
+ "@vesk/compiler": "^0.2.16",
27
+ "@vesk/runtime": "^0.2.16",
28
+ "@vesk/types": "^0.2.16"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/ws": "^8.18.1",