@devlusoft/devix 0.4.1-beta.1 → 0.4.1-beta.10

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 (84) hide show
  1. package/dist/cli/build.d.ts +1 -0
  2. package/dist/cli/build.js +86 -7
  3. package/dist/cli/build.js.map +4 -4
  4. package/dist/cli/dev-server.d.ts +1 -0
  5. package/dist/cli/dev-server.js +234 -0
  6. package/dist/cli/dev-server.js.map +7 -0
  7. package/dist/cli/dev.d.ts +1 -0
  8. package/dist/cli/dev.js +1 -1
  9. package/dist/cli/dev.js.map +3 -3
  10. package/dist/cli/generate.d.ts +1 -0
  11. package/dist/cli/generate.js +88 -9
  12. package/dist/cli/generate.js.map +4 -4
  13. package/dist/cli/index.d.ts +2 -0
  14. package/dist/cli/index.js +102 -23
  15. package/dist/cli/index.js.map +4 -4
  16. package/dist/cli/start.d.ts +1 -0
  17. package/dist/cli/start.js +1 -1
  18. package/dist/cli/start.js.map +3 -3
  19. package/dist/config.d.ts +22 -0
  20. package/dist/runtime/api-context.d.ts +24 -0
  21. package/dist/runtime/client-router.d.ts +13 -0
  22. package/dist/runtime/context.d.ts +32 -0
  23. package/dist/runtime/create-handler.d.ts +10 -0
  24. package/dist/runtime/error-boundary.d.ts +19 -0
  25. package/dist/runtime/fetch.d.ts +39 -0
  26. package/dist/runtime/head.d.ts +7 -0
  27. package/dist/runtime/head.js +1 -1
  28. package/dist/runtime/head.js.map +3 -3
  29. package/dist/runtime/index.d.ts +14 -0
  30. package/dist/runtime/index.js +1 -1
  31. package/dist/runtime/index.js.map +3 -3
  32. package/dist/runtime/link.d.ts +8 -0
  33. package/dist/runtime/metadata.d.ts +10 -0
  34. package/dist/runtime/router-provider.d.ts +25 -0
  35. package/dist/runtime/router-provider.js +1 -1
  36. package/dist/runtime/router-provider.js.map +3 -3
  37. package/dist/runtime/server-app.d.ts +15 -0
  38. package/dist/runtime/server-app.js +1 -1
  39. package/dist/runtime/server-app.js.map +3 -3
  40. package/dist/server/api-router.d.ts +22 -0
  41. package/dist/server/api.d.ts +2 -0
  42. package/dist/server/collect-css.d.ts +2 -0
  43. package/dist/server/handler-store.d.ts +10 -0
  44. package/dist/server/index.d.ts +6 -0
  45. package/dist/server/pages-router.d.ts +21 -0
  46. package/dist/server/public-index.d.ts +1 -0
  47. package/dist/server/render.d.ts +62 -0
  48. package/dist/server/render.js +1 -1
  49. package/dist/server/render.js.map +3 -3
  50. package/dist/server/routes.d.ts +11 -0
  51. package/dist/server/types.d.ts +52 -0
  52. package/dist/src/cli/dev-server.d.ts +1 -0
  53. package/dist/types.d.ts +49 -0
  54. package/dist/utils/async.d.ts +1 -0
  55. package/dist/utils/banner.d.ts +1 -0
  56. package/dist/utils/banner.js +1 -1
  57. package/dist/utils/banner.js.map +1 -1
  58. package/dist/utils/cookies.d.ts +12 -0
  59. package/dist/utils/duration.d.ts +1 -0
  60. package/dist/utils/env.d.ts +1 -0
  61. package/dist/utils/html.d.ts +2 -0
  62. package/dist/utils/load-config.d.ts +2 -0
  63. package/dist/utils/load-config.js +2 -0
  64. package/dist/utils/load-config.js.map +7 -0
  65. package/dist/utils/patterns.d.ts +1 -0
  66. package/dist/utils/response.d.ts +19 -0
  67. package/dist/vite/codegen/api.d.ts +6 -0
  68. package/dist/vite/codegen/client-routes.d.ts +6 -0
  69. package/dist/vite/codegen/context.d.ts +1 -0
  70. package/dist/vite/codegen/entry-client.d.ts +5 -0
  71. package/dist/vite/codegen/entry-client.js +11 -3
  72. package/dist/vite/codegen/entry-client.js.map +2 -2
  73. package/dist/vite/codegen/extract-methods.d.ts +4 -0
  74. package/dist/vite/codegen/render.d.ts +6 -0
  75. package/dist/vite/codegen/routes-dts.d.ts +10 -0
  76. package/dist/vite/codegen/scan-api.d.ts +2 -0
  77. package/dist/vite/codegen/server-entry.d.ts +6 -0
  78. package/dist/vite/codegen/server-entry.js +73 -0
  79. package/dist/vite/codegen/server-entry.js.map +7 -0
  80. package/dist/vite/codegen/write-routes-dts.d.ts +1 -0
  81. package/dist/vite/index.d.ts +3 -0
  82. package/dist/vite/index.js +84 -5
  83. package/dist/vite/index.js.map +4 -4
  84. package/package.json +1 -1
@@ -0,0 +1,15 @@
1
+ import { ComponentType } from 'react';
2
+ import { LayoutProps, PageProps } from '../server/types';
3
+ import { Metadata, Viewport } from '../types';
4
+ export interface ServerAppProps {
5
+ pathname: string;
6
+ params: Record<string, string>;
7
+ loaderData: unknown;
8
+ layoutsData: unknown[];
9
+ Page: ComponentType<PageProps>;
10
+ layouts: ComponentType<LayoutProps>[];
11
+ metadata: Metadata | null;
12
+ viewport?: Viewport;
13
+ clientEntry: string;
14
+ }
15
+ export declare function ServerApp({ pathname, params, loaderData, layoutsData, Page, layouts, metadata, viewport, clientEntry, }: ServerAppProps): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
- import{createContext as h}from"react";var l=globalThis;l.__devix_RouterContext__??=h(null);var y=l.__devix_RouterContext__;l.__devix_PageMetaContext__??=h(null);l.__devix_RouteDataContext__??=h(null);var P=l.__devix_PageMetaContext__,d=l.__devix_RouteDataContext__;import{Fragment as _,jsx as u}from"react/jsx-runtime";function M(t,e){let o=[];t.title&&o.push({tag:"title",children:t.title}),t.description&&o.push({tag:"meta",name:"description",content:t.description}),t.keywords?.length&&o.push({tag:"meta",name:"keywords",content:t.keywords.join(", ")});let r=t.og?.title??t.title;r&&o.push({tag:"meta",property:"og:title",content:r});let i=t.og?.description??t.description;i&&o.push({tag:"meta",property:"og:description",content:i}),t.og?.image&&o.push({tag:"meta",property:"og:image",content:t.og.image}),t.og?.type&&o.push({tag:"meta",property:"og:type",content:t.og.type}),t.og?.url&&o.push({tag:"meta",property:"og:url",content:t.og.url});let s=t.twitter?.title??t.title;s&&o.push({tag:"meta",name:"twitter:title",content:s});let p=t.twitter?.description??t.description;if(p&&o.push({tag:"meta",name:"twitter:description",content:p}),t.twitter?.card&&o.push({tag:"meta",name:"twitter:card",content:t.twitter.card}),t.twitter?.image&&o.push({tag:"meta",name:"twitter:image",content:t.twitter.image}),t.twitter?.creator&&o.push({tag:"meta",name:"twitter:creator",content:t.twitter.creator}),t.canonical&&o.push({tag:"link",rel:"canonical",href:t.canonical}),t.robots&&o.push({tag:"meta",name:"robots",content:t.robots}),t.alternates)for(let[n,f]of Object.entries(t.alternates))o.push({tag:"link",rel:"alternate",href:f,hrefLang:n});if(e){let n=[];e.width!==void 0&&n.push(`width=${e.width}`),e.initialScale!==void 0&&n.push(`initial-scale=${e.initialScale}`),e.maximumScale!==void 0&&n.push(`maximum-scale=${e.maximumScale}`),e.userScalable!==void 0&&n.push(`user-scalable=${e.userScalable?"yes":"no"}`),n.length&&o.push({tag:"meta",name:"viewport",content:n.join(", ")}),e.themeColor&&o.push({tag:"meta",name:"theme-color",content:e.themeColor})}return o}function w({metadata:t,viewport:e}){return typeof window>"u"||!t?null:u(_,{children:k(t,e)})}function k(t,e){let o=M(t,e);return u(_,{children:o.map((r,i)=>r.tag==="title"?u("title",{children:r.children},i):r.tag==="link"?u("link",{rel:r.rel,href:r.href,hrefLang:r.hrefLang},i):u("meta",{name:r.name,property:r.property,content:r.content},i))})}import{Component as V}from"react";import{jsx as R}from"react/jsx-runtime";var c=class extends V{state={error:null};static getDerivedStateFromError(e){return e instanceof x?{error:{statusCode:e.statusCode,message:e.message}}:{error:{statusCode:500,message:e instanceof Error?e.message:"Unknown error"}}}render(){return this.state.error&&this.props.ErrorPage?R(this.props.ErrorPage,{...this.state.error}):this.state.error?R("h1",{children:this.state.error.statusCode}):this.props.children}},x=class extends Error{statusCode;constructor(e,o){super(o),this.statusCode=e}};import{jsx as a,jsxs as T}from"react/jsx-runtime";var D=(t,e)=>Promise.resolve(),S=()=>Promise.resolve();function I({pathname:t,params:e,loaderData:o,layoutsData:r,Page:i,layouts:s,metadata:p,viewport:n,clientEntry:f}){let m=a(d,{value:{loaderData:o,params:e},children:a(i,{data:o,params:e,url:t})});for(let g=s.length-1;g>=0;g--){let v=s[g],C=r[g];m=a(d,{value:{loaderData:C,params:e},children:a(v,{data:C,params:e,children:m})})}return T(P,{value:{metadata:p,viewport:n,clientEntry:f},children:[a(w,{metadata:p,viewport:n}),a(y,{value:{pathname:t,params:e,loaderData:o,layoutsData:r,Page:i,layouts:s,metadata:p,viewport:n,isNavigating:!1,navigate:D,revalidate:S},children:a(c,{children:m},t)})]})}export{I as ServerApp};
1
+ import{createContext as m}from"react";var g=globalThis;g.__devix_RouterContext__??=m(null);var C=g.__devix_RouterContext__;g.__devix_PageMetaContext__??=m(null);g.__devix_RouteDataContext__??=m(null);var w=g.__devix_PageMetaContext__,d=g.__devix_RouteDataContext__;import{Fragment as _,jsx as c}from"react/jsx-runtime";function M(t,e){let o=[];t.title&&o.push({tag:"title",children:t.title}),t.description&&o.push({tag:"meta",name:"description",content:t.description}),t.keywords?.length&&o.push({tag:"meta",name:"keywords",content:t.keywords.join(", ")});let r=t.og?.title??t.title;r&&o.push({tag:"meta",property:"og:title",content:r});let a=t.og?.description??t.description;a&&o.push({tag:"meta",property:"og:description",content:a}),t.og?.image&&o.push({tag:"meta",property:"og:image",content:t.og.image}),t.og?.type&&o.push({tag:"meta",property:"og:type",content:t.og.type}),t.og?.url&&o.push({tag:"meta",property:"og:url",content:t.og.url});let l=t.twitter?.title??t.title;l&&o.push({tag:"meta",name:"twitter:title",content:l});let u=t.twitter?.description??t.description;if(u&&o.push({tag:"meta",name:"twitter:description",content:u}),t.twitter?.card&&o.push({tag:"meta",name:"twitter:card",content:t.twitter.card}),t.twitter?.image&&o.push({tag:"meta",name:"twitter:image",content:t.twitter.image}),t.twitter?.creator&&o.push({tag:"meta",name:"twitter:creator",content:t.twitter.creator}),t.canonical&&o.push({tag:"link",rel:"canonical",href:t.canonical}),t.robots&&o.push({tag:"meta",name:"robots",content:t.robots}),t.alternates)for(let[n,s]of Object.entries(t.alternates))o.push({tag:"link",rel:"alternate",href:s,hrefLang:n});if(t.icons){let n=Array.isArray(t.icons)?t.icons:[t.icons];for(let s of n){let i=typeof s=="string"?{href:s}:s;o.push({tag:"link",rel:i.rel??"icon",href:i.href,...i.type&&{type:i.type},...i.sizes&&{sizes:i.sizes}})}}if(e){let n=[];e.width!==void 0&&n.push(`width=${e.width}`),e.initialScale!==void 0&&n.push(`initial-scale=${e.initialScale}`),e.maximumScale!==void 0&&n.push(`maximum-scale=${e.maximumScale}`),e.userScalable!==void 0&&n.push(`user-scalable=${e.userScalable?"yes":"no"}`),n.length&&o.push({tag:"meta",name:"viewport",content:n.join(", ")}),e.themeColor&&o.push({tag:"meta",name:"theme-color",content:e.themeColor})}return o}function P({metadata:t,viewport:e}){return typeof window>"u"||!t?null:c(_,{children:k(t,e)})}function k(t,e){let o=M(t,e);return c(_,{children:o.map((r,a)=>r.tag==="title"?c("title",{children:r.children},a):r.tag==="link"?c("link",{rel:r.rel,href:r.href,hrefLang:r.hrefLang,type:r.type,sizes:r.sizes},a):c("meta",{name:r.name,property:r.property,content:r.content},a))})}import{Component as V}from"react";import{jsx as R}from"react/jsx-runtime";var h=class extends V{state={error:null};static getDerivedStateFromError(e){return e instanceof y?{error:{statusCode:e.statusCode,message:e.message}}:{error:{statusCode:500,message:e instanceof Error?e.message:"Unknown error"}}}render(){return this.state.error&&this.props.ErrorPage?R(this.props.ErrorPage,{...this.state.error}):this.state.error?R("h1",{children:this.state.error.statusCode}):this.props.children}},y=class extends Error{statusCode;constructor(e,o){super(o),this.statusCode=e}};import{jsx as p,jsxs as T}from"react/jsx-runtime";var D=(t,e)=>Promise.resolve(),S=()=>Promise.resolve();function G({pathname:t,params:e,loaderData:o,layoutsData:r,Page:a,layouts:l,metadata:u,viewport:n,clientEntry:s}){let i=p(d,{value:{loaderData:o,params:e},children:p(a,{data:o,params:e,url:t})});for(let f=l.length-1;f>=0;f--){let v=l[f],x=r[f];i=p(d,{value:{loaderData:x,params:e},children:p(v,{data:x,params:e,children:i})})}return T(w,{value:{metadata:u,viewport:n,clientEntry:s},children:[p(P,{metadata:u,viewport:n}),p(C,{value:{pathname:t,params:e,loaderData:o,layoutsData:r,Page:a,layouts:l,metadata:u,viewport:n,isNavigating:!1,navigate:D,revalidate:S},children:p(h,{children:i},t)})]})}export{G as ServerApp};
2
2
  //# sourceMappingURL=server-app.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/runtime/context.tsx", "../../src/runtime/head.tsx", "../../src/runtime/error-boundary.tsx", "../../src/runtime/server-app.tsx"],
4
- "sourcesContent": ["import {createContext, Context, ComponentType} from \"react\";\nimport {Metadata, Viewport} from \"../types\";\nimport {LayoutProps, PageProps} from \"../server/types\";\n\nexport interface NavigateOptions {\n replace?: boolean\n viewTransition?: boolean\n}\n\nexport interface RouterContextValue {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n navigate: (to: string, options?: NavigateOptions) => Promise<void>\n revalidate: () => Promise<void>\n isNavigating: boolean\n}\n\nexport interface PageMetaContextValue {\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry?: string\n}\n\nexport interface RouteDataContextValue {\n loaderData: unknown\n params: Record<string, string>\n}\n\nconst g = globalThis as any\n\ng.__devix_RouterContext__ ??= createContext<RouterContextValue | null>(null)\nexport const RouterContext: Context<RouterContextValue | null> = g.__devix_RouterContext__\n\ng.__devix_PageMetaContext__ ??= createContext<PageMetaContextValue | null>(null)\ng.__devix_RouteDataContext__ ??= createContext<RouteDataContextValue | null>(null)\n\nexport const PageMetaContext: Context<PageMetaContextValue | null> = g.__devix_PageMetaContext__\nexport const RouteDataContext: Context<RouteDataContextValue | null> = g.__devix_RouteDataContext__\n\n", "import {Metadata, Viewport} from \"../types\";\nimport {ReactNode} from \"react\";\n\ntype MetaTag =\n | { tag: 'title'; children: string }\n | { tag: 'meta'; name?: string; property?: string; content: string }\n | { tag: 'link'; rel: string; href: string; hrefLang?: string }\n\nfunction collectTags(metadata: Metadata, viewport?: Viewport): MetaTag[] {\n const tags: MetaTag[] = []\n\n if (metadata.title)\n tags.push({tag: 'title', children: metadata.title})\n if (metadata.description)\n tags.push({tag: 'meta', name: 'description', content: metadata.description})\n if (metadata.keywords?.length)\n tags.push({tag: 'meta', name: 'keywords', content: metadata.keywords.join(', ')})\n\n const ogTitle = metadata.og?.title ?? metadata.title\n if (ogTitle) tags.push({tag: 'meta', property: 'og:title', content: ogTitle})\n const ogDesc = metadata.og?.description ?? metadata.description\n if (ogDesc) tags.push({tag: 'meta', property: 'og:description', content: ogDesc})\n if (metadata.og?.image) tags.push({tag: 'meta', property: 'og:image', content: metadata.og.image})\n if (metadata.og?.type) tags.push({tag: 'meta', property: 'og:type', content: metadata.og.type})\n if (metadata.og?.url) tags.push({tag: 'meta', property: 'og:url', content: metadata.og.url})\n\n const twTitle = metadata.twitter?.title ?? metadata.title\n if (twTitle) tags.push({tag: 'meta', name: 'twitter:title', content: twTitle})\n const twDesc = metadata.twitter?.description ?? metadata.description\n if (twDesc) tags.push({tag: 'meta', name: 'twitter:description', content: twDesc})\n if (metadata.twitter?.card) tags.push({\n tag: 'meta', name: 'twitter:card', content:\n metadata.twitter.card\n })\n if (metadata.twitter?.image) tags.push({\n tag: 'meta', name: 'twitter:image', content:\n metadata.twitter.image\n })\n if (metadata.twitter?.creator) tags.push({\n tag: 'meta', name: 'twitter:creator', content:\n metadata.twitter.creator\n })\n\n if (metadata.canonical) tags.push({tag: 'link', rel: 'canonical', href: metadata.canonical})\n if (metadata.robots) tags.push({tag: 'meta', name: 'robots', content: metadata.robots})\n if (metadata.alternates) {\n for (const [lang, href] of Object.entries(metadata.alternates))\n tags.push({tag: 'link', rel: 'alternate', href, hrefLang: lang})\n }\n\n if (viewport) {\n const parts: string[] = []\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`)\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`)\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`)\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' :\n 'no'}`)\n if (parts.length) tags.push({tag: 'meta', name: 'viewport', content: parts.join(', ')})\n if (viewport.themeColor) tags.push({\n tag: 'meta', name: 'theme-color', content: viewport.themeColor\n })\n }\n\n return tags\n}\n\nexport function HeadSlot({metadata, viewport}: {metadata: Metadata | null, viewport?: Viewport}) {\n if (typeof window === 'undefined' || !metadata) return null\n return <>{buildHeadNodes(metadata, viewport)}</>\n}\n\nexport function buildHeadNodes(metadata: Metadata, viewport?: Viewport): ReactNode {\n const tags = collectTags(metadata, viewport)\n\n return <>\n {tags.map((t, i) => {\n if (t.tag === 'title') return <title key={i}>{t.children}</title>\n if (t.tag === 'link') return <link key={i} rel={t.rel} href={t.href} hrefLang={t.hrefLang}/>\n return <meta key={i} name={t.name} property={t.property} content={t.content}/>\n })}\n </>\n}", "import {Component, ComponentType, ReactNode} from \"react\";\nimport {ErrorProps} from \"../server/types\";\n\ninterface Props {\n ErrorPage?: ComponentType<ErrorProps>\n children: ReactNode\n}\n\ninterface State {\n error: ErrorProps | null\n}\n\nexport class DevixErrorBoundary extends Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(err: unknown): State {\n if (err instanceof DevixError) {\n return {\n error: {statusCode: err.statusCode, message: err.message}\n }\n }\n return {\n error: {statusCode: 500, message: err instanceof Error ? err.message : 'Unknown error'}\n }\n }\n\n render() {\n if (this.state.error && this.props.ErrorPage) {\n return <this.props.ErrorPage {...this.state.error} />\n }\n if (this.state.error) {\n return <h1>{this.state.error.statusCode}</h1>\n }\n return this.props.children\n }\n}\n\nexport class DevixError extends Error {\n statusCode: number\n constructor(statusCode: number, message: string) {\n super(message)\n this.statusCode = statusCode\n }\n}\n", "import {ComponentType, ReactNode} from 'react'\nimport {RouterContext, PageMetaContext, RouteDataContext, NavigateOptions} from './context'\nimport {HeadSlot} from './head'\nimport {DevixErrorBoundary} from './error-boundary'\nimport {LayoutProps, PageProps} from '../server/types'\nimport {Metadata, Viewport} from '../types'\n\nconst noopNavigate = (_to: string, _opts?: NavigateOptions) => Promise.resolve()\nconst noopRevalidate = () => Promise.resolve()\n\nexport interface ServerAppProps {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry: string\n}\n\nexport function ServerApp({\n pathname, params, loaderData, layoutsData,\n Page, layouts, metadata, viewport, clientEntry,\n}: ServerAppProps) {\n let tree: ReactNode = (\n <RouteDataContext value={{loaderData, params}}>\n <Page data={loaderData as any} params={params} url={pathname}/>\n </RouteDataContext>\n )\n\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i]\n const layoutData = layoutsData[i]\n tree = (\n <RouteDataContext value={{loaderData: layoutData, params}}>\n <Layout data={layoutData as any} params={params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n return (\n <PageMetaContext value={{metadata, viewport, clientEntry}}>\n <HeadSlot metadata={metadata} viewport={viewport}/>\n <RouterContext value={{\n pathname,\n params,\n loaderData,\n layoutsData,\n Page,\n layouts,\n metadata,\n viewport,\n isNavigating: false,\n navigate: noopNavigate,\n revalidate: noopRevalidate,\n }}>\n <DevixErrorBoundary key={pathname}>\n {tree}\n </DevixErrorBoundary>\n </RouterContext>\n </PageMetaContext>\n )\n}\n"],
5
- "mappings": "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",
6
- "names": ["createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "parts", "HeadSlot", "buildHeadNodes", "t", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "jsx", "jsxs", "noopNavigate", "_to", "_opts", "noopRevalidate", "ServerApp", "pathname", "params", "loaderData", "layoutsData", "Page", "layouts", "metadata", "viewport", "clientEntry", "tree", "RouteDataContext", "i", "Layout", "layoutData", "PageMetaContext", "HeadSlot", "RouterContext", "DevixErrorBoundary"]
4
+ "sourcesContent": ["import {createContext, Context, ComponentType} from \"react\";\nimport {Metadata, Viewport} from \"../types\";\nimport {LayoutProps, PageProps} from \"../server/types\";\n\nexport interface NavigateOptions {\n replace?: boolean\n viewTransition?: boolean\n}\n\nexport interface RouterContextValue {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n navigate: (to: string, options?: NavigateOptions) => Promise<void>\n revalidate: () => Promise<void>\n isNavigating: boolean\n}\n\nexport interface PageMetaContextValue {\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry?: string\n}\n\nexport interface RouteDataContextValue {\n loaderData: unknown\n params: Record<string, string>\n}\n\nconst g = globalThis as any\n\ng.__devix_RouterContext__ ??= createContext<RouterContextValue | null>(null)\nexport const RouterContext: Context<RouterContextValue | null> = g.__devix_RouterContext__\n\ng.__devix_PageMetaContext__ ??= createContext<PageMetaContextValue | null>(null)\ng.__devix_RouteDataContext__ ??= createContext<RouteDataContextValue | null>(null)\n\nexport const PageMetaContext: Context<PageMetaContextValue | null> = g.__devix_PageMetaContext__\nexport const RouteDataContext: Context<RouteDataContextValue | null> = g.__devix_RouteDataContext__\n\n", "import { Metadata, MetadataIcon, Viewport } from \"../types\";\nimport { ReactNode } from \"react\";\n\ntype MetaTag =\n | { tag: 'title'; children: string }\n | { tag: 'meta'; name?: string; property?: string; content: string }\n | { tag: 'link'; rel: string; href: string; hrefLang?: string; type?: string; sizes?: string }\n\nfunction collectTags(metadata: Metadata, viewport?: Viewport): MetaTag[] {\n const tags: MetaTag[] = []\n\n if (metadata.title)\n tags.push({ tag: 'title', children: metadata.title })\n if (metadata.description)\n tags.push({ tag: 'meta', name: 'description', content: metadata.description })\n if (metadata.keywords?.length)\n tags.push({ tag: 'meta', name: 'keywords', content: metadata.keywords.join(', ') })\n\n const ogTitle = metadata.og?.title ?? metadata.title\n if (ogTitle) tags.push({ tag: 'meta', property: 'og:title', content: ogTitle })\n const ogDesc = metadata.og?.description ?? metadata.description\n if (ogDesc) tags.push({ tag: 'meta', property: 'og:description', content: ogDesc })\n if (metadata.og?.image) tags.push({ tag: 'meta', property: 'og:image', content: metadata.og.image })\n if (metadata.og?.type) tags.push({ tag: 'meta', property: 'og:type', content: metadata.og.type })\n if (metadata.og?.url) tags.push({ tag: 'meta', property: 'og:url', content: metadata.og.url })\n\n const twTitle = metadata.twitter?.title ?? metadata.title\n if (twTitle) tags.push({ tag: 'meta', name: 'twitter:title', content: twTitle })\n const twDesc = metadata.twitter?.description ?? metadata.description\n if (twDesc) tags.push({ tag: 'meta', name: 'twitter:description', content: twDesc })\n if (metadata.twitter?.card) tags.push({\n tag: 'meta', name: 'twitter:card', content:\n metadata.twitter.card\n })\n if (metadata.twitter?.image) tags.push({\n tag: 'meta', name: 'twitter:image', content:\n metadata.twitter.image\n })\n if (metadata.twitter?.creator) tags.push({\n tag: 'meta', name: 'twitter:creator', content:\n metadata.twitter.creator\n })\n\n if (metadata.canonical) tags.push({ tag: 'link', rel: 'canonical', href: metadata.canonical })\n if (metadata.robots) tags.push({ tag: 'meta', name: 'robots', content: metadata.robots })\n if (metadata.alternates) {\n for (const [lang, href] of Object.entries(metadata.alternates))\n tags.push({ tag: 'link', rel: 'alternate', href, hrefLang: lang })\n }\n\n if (metadata.icons) {\n const raw = Array.isArray(metadata.icons) ? metadata.icons : [metadata.icons]\n for (const icon of raw) {\n const resolved: MetadataIcon = typeof icon === 'string' ? { href: icon } : icon\n tags.push({\n tag: 'link',\n rel: resolved.rel ?? 'icon',\n href: resolved.href,\n ...(resolved.type && { type: resolved.type }),\n ...(resolved.sizes && { sizes: resolved.sizes }),\n })\n }\n }\n\n if (viewport) {\n const parts: string[] = []\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`)\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`)\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`)\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' :\n 'no'}`)\n if (parts.length) tags.push({ tag: 'meta', name: 'viewport', content: parts.join(', ') })\n if (viewport.themeColor) tags.push({\n tag: 'meta', name: 'theme-color', content: viewport.themeColor\n })\n }\n\n return tags\n}\n\nexport function HeadSlot({ metadata, viewport }: { metadata: Metadata | null, viewport?: Viewport }) {\n if (typeof window === 'undefined' || !metadata) return null\n return <>{buildHeadNodes(metadata, viewport)}</>\n}\n\nexport function buildHeadNodes(metadata: Metadata, viewport?: Viewport): ReactNode {\n const tags = collectTags(metadata, viewport)\n\n return <>\n {tags.map((t, i) => {\n if (t.tag === 'title') return <title key={i}>{t.children}</title>\n if (t.tag === 'link') return <link key={i} rel={t.rel} href={t.href} hrefLang={t.hrefLang} type={t.type} sizes={t.sizes} />\n return <meta key={i} name={t.name} property={t.property} content={t.content} />\n })}\n </>\n}", "import {Component, ComponentType, ReactNode} from \"react\";\nimport {ErrorProps} from \"../server/types\";\n\ninterface Props {\n ErrorPage?: ComponentType<ErrorProps>\n children: ReactNode\n}\n\ninterface State {\n error: ErrorProps | null\n}\n\nexport class DevixErrorBoundary extends Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(err: unknown): State {\n if (err instanceof DevixError) {\n return {\n error: {statusCode: err.statusCode, message: err.message}\n }\n }\n return {\n error: {statusCode: 500, message: err instanceof Error ? err.message : 'Unknown error'}\n }\n }\n\n render() {\n if (this.state.error && this.props.ErrorPage) {\n return <this.props.ErrorPage {...this.state.error} />\n }\n if (this.state.error) {\n return <h1>{this.state.error.statusCode}</h1>\n }\n return this.props.children\n }\n}\n\nexport class DevixError extends Error {\n statusCode: number\n constructor(statusCode: number, message: string) {\n super(message)\n this.statusCode = statusCode\n }\n}\n", "import {ComponentType, ReactNode} from 'react'\nimport {RouterContext, PageMetaContext, RouteDataContext, NavigateOptions} from './context'\nimport {HeadSlot} from './head'\nimport {DevixErrorBoundary} from './error-boundary'\nimport {LayoutProps, PageProps} from '../server/types'\nimport {Metadata, Viewport} from '../types'\n\nconst noopNavigate = (_to: string, _opts?: NavigateOptions) => Promise.resolve()\nconst noopRevalidate = () => Promise.resolve()\n\nexport interface ServerAppProps {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry: string\n}\n\nexport function ServerApp({\n pathname, params, loaderData, layoutsData,\n Page, layouts, metadata, viewport, clientEntry,\n}: ServerAppProps) {\n let tree: ReactNode = (\n <RouteDataContext value={{loaderData, params}}>\n <Page data={loaderData as any} params={params} url={pathname}/>\n </RouteDataContext>\n )\n\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i]\n const layoutData = layoutsData[i]\n tree = (\n <RouteDataContext value={{loaderData: layoutData, params}}>\n <Layout data={layoutData as any} params={params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n return (\n <PageMetaContext value={{metadata, viewport, clientEntry}}>\n <HeadSlot metadata={metadata} viewport={viewport}/>\n <RouterContext value={{\n pathname,\n params,\n loaderData,\n layoutsData,\n Page,\n layouts,\n metadata,\n viewport,\n isNavigating: false,\n navigate: noopNavigate,\n revalidate: noopRevalidate,\n }}>\n <DevixErrorBoundary key={pathname}>\n {tree}\n </DevixErrorBoundary>\n </RouterContext>\n </PageMetaContext>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["createContext", "RouterContext", "PageMetaContext", "RouteDataContext", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "raw", "icon", "resolved", "parts", "HeadSlot", "buildHeadNodes", "t", "i", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "jsx", "jsxs", "noopNavigate", "_to", "_opts", "noopRevalidate", "ServerApp", "pathname", "params", "loaderData", "layoutsData", "Page", "layouts", "metadata", "viewport", "clientEntry", "tree", "RouteDataContext", "i", "Layout", "layoutData", "PageMetaContext", "HeadSlot", "RouterContext", "DevixErrorBoundary"]
7
7
  }
@@ -0,0 +1,22 @@
1
+ export interface ApiRoute {
2
+ path: string;
3
+ key: string;
4
+ params: string[];
5
+ regex: RegExp;
6
+ }
7
+ export interface ApiMiddleware {
8
+ dir: string;
9
+ key: string;
10
+ }
11
+ export interface ApiResult {
12
+ routes: ApiRoute[];
13
+ middlewares: ApiMiddleware[];
14
+ }
15
+ export declare function keyToRoutePattern(key: string, apiDir: string): string;
16
+ export declare function invalidateApiCache(): void;
17
+ export declare function buildRoutes(routeKeys: string[], middlewareKeys: string[], apiDir: string): ApiResult;
18
+ export declare function collectMiddlewareChain(routeKey: string, middlewares: ApiMiddleware[]): ApiMiddleware[];
19
+ export declare function matchRoute(pathname: string, routes: ApiRoute[]): {
20
+ route: ApiRoute;
21
+ params: Record<string, string>;
22
+ } | null;
@@ -0,0 +1,2 @@
1
+ import type { ApiGlob } from './types';
2
+ export declare function handleApiRequest(url: string, request: Request, glob: ApiGlob): Promise<Response>;
@@ -0,0 +1,2 @@
1
+ import type { ViteDevServer } from 'vite';
2
+ export declare function collectCss(vite: ViteDevServer): Promise<string[]>;
@@ -0,0 +1,10 @@
1
+ import type { RouteContext } from '../runtime/api-context';
2
+ interface HandlerStore {
3
+ request: Request;
4
+ ctx: RouteContext;
5
+ }
6
+ export declare function withHandlerStore<T>(store: HandlerStore, fn: () => T): T;
7
+ export declare function useRequest(): Request;
8
+ export declare function useCtx(): RouteContext;
9
+ export declare function useParams(): Record<string, string>;
10
+ export {};
@@ -0,0 +1,6 @@
1
+ export { buildPages, collectLayoutChain, matchPage } from './pages-router';
2
+ export { buildRoutes, collectMiddlewareChain, matchRoute } from './api-router';
3
+ export { resolveMetadata, mergeMetadata } from '../runtime/metadata';
4
+ export type { Page, Layout, PagesResult } from './pages-router';
5
+ export type { ApiRoute, ApiMiddleware, ApiResult } from './api-router';
6
+ export type { PageModule, LayoutModule } from './types';
@@ -0,0 +1,21 @@
1
+ export interface Page {
2
+ path: string;
3
+ key: string;
4
+ params: string[];
5
+ regex: RegExp;
6
+ }
7
+ export interface Layout {
8
+ dir: string;
9
+ key: string;
10
+ }
11
+ export interface PagesResult {
12
+ pages: Page[];
13
+ layouts: Layout[];
14
+ }
15
+ export declare function invalidatePagesCache(): void;
16
+ export declare function buildPages(pageKeys: string[], layoutKeys: string[], pagesDir: string): PagesResult;
17
+ export declare function collectLayoutChain(pageKey: string, layouts: Layout[]): Layout[];
18
+ export declare function matchPage(pathname: string, pages: Page[]): {
19
+ page: Page;
20
+ params: Record<string, string>;
21
+ } | null;
@@ -0,0 +1 @@
1
+ export { useRequest, useCtx, useParams } from './handler-store';
@@ -0,0 +1,62 @@
1
+ import type { PageGlob } from './types';
2
+ import type { Manifest } from "vite";
3
+ export declare function runLoader(url: string, request: Request, glob: PageGlob, options?: {
4
+ loaderTimeout?: number;
5
+ }): Promise<{
6
+ error: true;
7
+ loaderData: null;
8
+ params: {};
9
+ layouts: never[];
10
+ metadata: null;
11
+ viewport: undefined;
12
+ redirect?: undefined;
13
+ redirectStatus?: undefined;
14
+ redirectReplace?: undefined;
15
+ } | {
16
+ loaderData: null;
17
+ params: {};
18
+ layouts: never[];
19
+ metadata: null;
20
+ viewport: undefined;
21
+ error?: undefined;
22
+ redirect?: undefined;
23
+ redirectStatus?: undefined;
24
+ redirectReplace?: undefined;
25
+ } | {
26
+ redirect: string | undefined;
27
+ redirectStatus: number | undefined;
28
+ redirectReplace: boolean | undefined;
29
+ error?: undefined;
30
+ loaderData?: undefined;
31
+ params?: undefined;
32
+ layouts?: undefined;
33
+ metadata?: undefined;
34
+ viewport?: undefined;
35
+ } | {
36
+ loaderData: unknown;
37
+ params: Record<string, string>;
38
+ layouts: {
39
+ loaderData: unknown;
40
+ }[];
41
+ metadata: import("../types").Metadata;
42
+ viewport: import("../types").Viewport | undefined;
43
+ error?: undefined;
44
+ redirect?: undefined;
45
+ redirectStatus?: undefined;
46
+ redirectReplace?: undefined;
47
+ }>;
48
+ export declare function render(url: string, request: Request, glob: PageGlob, options?: {
49
+ manifest?: Manifest;
50
+ loaderTimeout?: number;
51
+ }): Promise<{
52
+ html: string;
53
+ statusCode: number | undefined;
54
+ headers: {
55
+ Location: string | undefined;
56
+ };
57
+ } | {
58
+ html: string;
59
+ statusCode: number;
60
+ headers: Record<string, string>;
61
+ }>;
62
+ export declare function getStaticRoutes(glob: PageGlob): Promise<string[]>;
@@ -1,2 +1,2 @@
1
- import{createElement as lt}from"react";import{renderToString as ct,renderToStaticMarkup as ut}from"react-dom/server";import{Fragment as G,jsx as P}from"react/jsx-runtime";function et(t,e){let r=[];t.title&&r.push({tag:"title",children:t.title}),t.description&&r.push({tag:"meta",name:"description",content:t.description}),t.keywords?.length&&r.push({tag:"meta",name:"keywords",content:t.keywords.join(", ")});let o=t.og?.title??t.title;o&&r.push({tag:"meta",property:"og:title",content:o});let n=t.og?.description??t.description;n&&r.push({tag:"meta",property:"og:description",content:n}),t.og?.image&&r.push({tag:"meta",property:"og:image",content:t.og.image}),t.og?.type&&r.push({tag:"meta",property:"og:type",content:t.og.type}),t.og?.url&&r.push({tag:"meta",property:"og:url",content:t.og.url});let a=t.twitter?.title??t.title;a&&r.push({tag:"meta",name:"twitter:title",content:a});let s=t.twitter?.description??t.description;if(s&&r.push({tag:"meta",name:"twitter:description",content:s}),t.twitter?.card&&r.push({tag:"meta",name:"twitter:card",content:t.twitter.card}),t.twitter?.image&&r.push({tag:"meta",name:"twitter:image",content:t.twitter.image}),t.twitter?.creator&&r.push({tag:"meta",name:"twitter:creator",content:t.twitter.creator}),t.canonical&&r.push({tag:"link",rel:"canonical",href:t.canonical}),t.robots&&r.push({tag:"meta",name:"robots",content:t.robots}),t.alternates)for(let[i,c]of Object.entries(t.alternates))r.push({tag:"link",rel:"alternate",href:c,hrefLang:i});if(e){let i=[];e.width!==void 0&&i.push(`width=${e.width}`),e.initialScale!==void 0&&i.push(`initial-scale=${e.initialScale}`),e.maximumScale!==void 0&&i.push(`maximum-scale=${e.maximumScale}`),e.userScalable!==void 0&&i.push(`user-scalable=${e.userScalable?"yes":"no"}`),i.length&&r.push({tag:"meta",name:"viewport",content:i.join(", ")}),e.themeColor&&r.push({tag:"meta",name:"theme-color",content:e.themeColor})}return r}function J({metadata:t,viewport:e}){return typeof window>"u"||!t?null:P(G,{children:A(t,e)})}function A(t,e){let r=et(t,e);return P(G,{children:r.map((o,n)=>o.tag==="title"?P("title",{children:o.children},n):o.tag==="link"?P("link",{rel:o.rel,href:o.href,hrefLang:o.hrefLang},n):P("meta",{name:o.name,property:o.property,content:o.content},n))})}import{createContext as V}from"react";var _=globalThis;_.__devix_RouterContext__??=V(null);var H=_.__devix_RouterContext__;_.__devix_PageMetaContext__??=V(null);_.__devix_RouteDataContext__??=V(null);var Y=_.__devix_PageMetaContext__,N=_.__devix_RouteDataContext__;import{Component as rt}from"react";import{jsx as B}from"react/jsx-runtime";var S=class extends rt{state={error:null};static getDerivedStateFromError(e){return e instanceof O?{error:{statusCode:e.statusCode,message:e.message}}:{error:{statusCode:500,message:e instanceof Error?e.message:"Unknown error"}}}render(){return this.state.error&&this.props.ErrorPage?B(this.props.ErrorPage,{...this.state.error}):this.state.error?B("h1",{children:this.state.error.statusCode}):this.props.children}},O=class extends Error{statusCode;constructor(e,r){super(r),this.statusCode=e}};import{jsx as w,jsxs as at}from"react/jsx-runtime";var ot=(t,e)=>Promise.resolve(),nt=()=>Promise.resolve();function F({pathname:t,params:e,loaderData:r,layoutsData:o,Page:n,layouts:a,metadata:s,viewport:i,clientEntry:c}){let g=w(N,{value:{loaderData:r,params:e},children:w(n,{data:r,params:e,url:t})});for(let u=a.length-1;u>=0;u--){let p=a[u],m=o[u];g=w(N,{value:{loaderData:m,params:e},children:w(p,{data:m,params:e,children:g})})}return at(Y,{value:{metadata:s,viewport:i,clientEntry:c},children:[w(J,{metadata:s,viewport:i}),w(H,{value:{pathname:t,params:e,loaderData:r,layoutsData:o,Page:n,layouts:a,metadata:s,viewport:i,isNavigating:!1,navigate:ot,revalidate:nt},children:w(S,{children:g},t)})]})}function X(t){return t.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}function it(t,e){let r=t.slice(e.length+1).replace(/\\/g,"/"),o=X(r);return o==="/"?"/":`/${o}`}function q(t){return t.slice(0,t.lastIndexOf("/"))}var k=null;function j(t,e,r){if(k)return k;let o=[],n=[];for(let a of e)n.push({dir:q(a),key:a});for(let a of t){let s=it(a,r),i=[...s.matchAll(/:([^/]+)/g)].map(g=>g[1]),c=s.replace(/:[^/]+/g,"([^/]+)").replace(/\//g,"\\/");o.push({path:s,key:a,params:i,regex:new RegExp(`^${c}$`)})}return o.sort((a,s)=>{let i=(a.path.match(/:/g)||[]).length,c=(s.path.match(/:/g)||[]).length;return i!==c?i-c:s.path.length-a.path.length}),k={pages:o,layouts:n},k}function W(t,e){let r=q(t);return e.filter(o=>r.startsWith(o.dir)).sort((o,n)=>o.dir.split("/").length-n.dir.split("/").length)}function z(t,e){for(let r of e){let o=t.match(r.regex);if(o){let n={};return r.params.forEach((a,s)=>{n[a]=decodeURIComponent(o[s+1])}),{page:r,params:n}}}return null}async function I(t,e){let r=t.generateMetadata?await t.generateMetadata(e):t.metadata??{},o=t.generateViewport?await t.generateViewport(e):t.viewport;return{metadata:r,viewport:o}}function K(...t){let e={};for(let r of t){if(!r)continue;let{og:o,twitter:n,...a}=r;Object.assign(e,a),o&&(e.og={...e.og,...o}),n&&(e.twitter={...e.twitter,...n})}return e}function v(t){return JSON.stringify(t).replace(/<\/script>/gi,"<\\/script>")}function Q(t){return t.replace(/"/g,"&quot;")}function U(t,e){let r;return Promise.race([t.finally(()=>clearTimeout(r)),new Promise((o,n)=>{r=setTimeout(()=>n(new Error(`timed out after ${e}ms`)),e)})])}var st=Symbol("devix.redirect");function L(t){return typeof t=="object"&&t!==null&&st in t}var pt="/@id/virtual:devix/entry-client";function Z(t){return typeof t=="string"?{url:t,status:302,replace:!1}:L(t)?{url:t.url,status:t.status,replace:t.replace}:null}async function tt(t,e,r,o){let{pages:n,layouts:a}=j(Object.keys(r.pages),Object.keys(r.layouts),r.pagesDir),s=z(t,n);if(!s)return null;let{page:i,params:c}=s,g=W(i.key,a),[u,...p]=await Promise.all([r.pages[i.key](),...g.map(l=>r.layouts[l.key]())]),m;for(let l of p)if(l.guard){let f=await l.guard({params:c,request:e,guardData:m}),b=Z(f);if(b!==null)return{redirect:b.url,redirectStatus:b.status,redirectReplace:b.replace};f!=null&&(m=f)}if(u.guard){let l=await u.guard({params:c,request:e,guardData:m}),f=Z(l);if(f!==null)return{redirect:f.url,redirectStatus:f.status,redirectReplace:f.replace};l!=null&&(m=l)}let h={params:c,request:e,guardData:m},y=u.loader?await U(u.loader(h),o):null;if(L(y))return{redirect:y.url,redirectStatus:y.status,redirectReplace:y.replace};let x=y,C=await U(Promise.all(p.map(l=>l.loader?l.loader(h):null)),o);for(let l of C)if(L(l))return{redirect:l.url,redirectStatus:l.status,redirectReplace:l.replace};let R=C,T=await I(u,{...h,loaderData:x}),D=await Promise.all(p.map((l,f)=>I(l,{...h,loaderData:R[f]}))),E=K(...D.map(l=>l.metadata),T.metadata),$=T.viewport??D.findLast(l=>l.viewport)?.viewport,M=p[0],d=M?.generateLang?await M.generateLang({...h,loaderData:R[0]}):M?.lang??"en";return{pageMod:u,layoutMods:p,params:c,loaderData:x,layoutsData:R,metadata:E,viewport:$,lang:d}}async function Bt(t,e,r,o){let{pathname:n}=new URL(t,"http://localhost"),a;try{let p=o?.loaderTimeout??1e4;a=await tt(n,e,r,p)}catch(p){return console.error("[devix] render error:",p),{error:!0,loaderData:null,params:{},layouts:[],metadata:null,viewport:void 0}}if(!a)return{loaderData:null,params:{},layouts:[],metadata:null,viewport:void 0};if("redirect"in a)return{redirect:a.redirect,redirectStatus:a.redirectStatus,redirectReplace:a.redirectReplace};let{loaderData:s,params:i,layoutsData:c,metadata:g,viewport:u}=a;return{loaderData:s,params:i,layouts:c.map(p=>({loaderData:p})),metadata:g,viewport:u}}async function Ft(t,e,r,o){let n=o?.manifest?`/${Object.values(o.manifest).find(d=>d.isEntry)?.file}`:pt,s=(o?.manifest?Object.values(o.manifest).find(d=>d.isEntry)?.css??[]:[]).map(d=>`<link rel="stylesheet" href="/${d}">`).join(""),{pathname:i}=new URL(t,"http://localhost"),c;try{let d=o?.loaderTimeout??1e4;c=await tt(i,e,r,d)}catch(d){return console.error("[devix] render error:",d),{html:`<html lang="en"><head><meta charset="utf-8">${s}</head><body><script>window.__DEVIX__=null;window.__LOADER_DATA__=null;window.__LAYOUTS_DATA__=[];</script><script type="module" src="${n}"></script><div id="devix-root"></div></body></html>`,statusCode:500,headers:{}}}if(!c){let d=`<script>window.__DEVIX__=${v({metadata:null,viewport:void 0,clientEntry:n})};window.__LOADER_DATA__=null;window.__LAYOUTS_DATA__=[];</script>`,l=`<script type="module" src="${n}"></script>`;return{html:`<html lang="en"><head><meta charset="utf-8">${s}${d}</head><body><div id="devix-root"></div>${l}</body></html>`,statusCode:404,headers:{}}}if("redirect"in c)return{html:"",statusCode:c.redirectStatus,headers:{Location:c.redirect}};let{pageMod:g,layoutMods:u,params:p,loaderData:m,layoutsData:h,metadata:y,viewport:x,lang:C}=c,R=ct(lt(F,{pathname:i,params:p,loaderData:m,layoutsData:h,Page:g.default,layouts:u.map(d=>d.default),metadata:y??null,viewport:x,clientEntry:n})),T=y?ut(A(y,x)):"",D=`<script>window.__DEVIX__=${v({metadata:y,viewport:x,clientEntry:n})};window.__LOADER_DATA__=${v(m??null)};window.__LAYOUTS_DATA__=${v(h)};</script>`,E=`<script type="module" src="${n}"></script>`,$=g.headers??{};return{html:`<html lang="${Q(C)}"><head><meta charset="utf-8">${T}${s}${D}</head><body><div id="devix-root">${R}</div>${E}</body></html>`,statusCode:200,headers:$}}async function Xt(t){let{pages:e}=j(Object.keys(t.pages),Object.keys(t.layouts),t.pagesDir),r=[];for(let o of e)if(o.params.length===0)r.push(o.path);else{let n=await t.pages[o.key]();if(!n.generateStaticParams)continue;let a=await n.generateStaticParams();for(let s of a){let i=o.path;for(let[c,g]of Object.entries(s))i=i.replace(`:${c}`,encodeURIComponent(g));r.push(i)}}return r}export{Xt as getStaticRoutes,Ft as render,Bt as runLoader};
1
+ import{createElement as ct}from"react";import{renderToString as lt,renderToStaticMarkup as ut}from"react-dom/server";import{Fragment as z,jsx as P}from"react/jsx-runtime";function et(t,e){let r=[];t.title&&r.push({tag:"title",children:t.title}),t.description&&r.push({tag:"meta",name:"description",content:t.description}),t.keywords?.length&&r.push({tag:"meta",name:"keywords",content:t.keywords.join(", ")});let o=t.og?.title??t.title;o&&r.push({tag:"meta",property:"og:title",content:o});let n=t.og?.description??t.description;n&&r.push({tag:"meta",property:"og:description",content:n}),t.og?.image&&r.push({tag:"meta",property:"og:image",content:t.og.image}),t.og?.type&&r.push({tag:"meta",property:"og:type",content:t.og.type}),t.og?.url&&r.push({tag:"meta",property:"og:url",content:t.og.url});let a=t.twitter?.title??t.title;a&&r.push({tag:"meta",name:"twitter:title",content:a});let c=t.twitter?.description??t.description;if(c&&r.push({tag:"meta",name:"twitter:description",content:c}),t.twitter?.card&&r.push({tag:"meta",name:"twitter:card",content:t.twitter.card}),t.twitter?.image&&r.push({tag:"meta",name:"twitter:image",content:t.twitter.image}),t.twitter?.creator&&r.push({tag:"meta",name:"twitter:creator",content:t.twitter.creator}),t.canonical&&r.push({tag:"link",rel:"canonical",href:t.canonical}),t.robots&&r.push({tag:"meta",name:"robots",content:t.robots}),t.alternates)for(let[i,s]of Object.entries(t.alternates))r.push({tag:"link",rel:"alternate",href:s,hrefLang:i});if(t.icons){let i=Array.isArray(t.icons)?t.icons:[t.icons];for(let s of i){let u=typeof s=="string"?{href:s}:s;r.push({tag:"link",rel:u.rel??"icon",href:u.href,...u.type&&{type:u.type},...u.sizes&&{sizes:u.sizes}})}}if(e){let i=[];e.width!==void 0&&i.push(`width=${e.width}`),e.initialScale!==void 0&&i.push(`initial-scale=${e.initialScale}`),e.maximumScale!==void 0&&i.push(`maximum-scale=${e.maximumScale}`),e.userScalable!==void 0&&i.push(`user-scalable=${e.userScalable?"yes":"no"}`),i.length&&r.push({tag:"meta",name:"viewport",content:i.join(", ")}),e.themeColor&&r.push({tag:"meta",name:"theme-color",content:e.themeColor})}return r}function J({metadata:t,viewport:e}){return typeof window>"u"||!t?null:P(z,{children:A(t,e)})}function A(t,e){let r=et(t,e);return P(z,{children:r.map((o,n)=>o.tag==="title"?P("title",{children:o.children},n):o.tag==="link"?P("link",{rel:o.rel,href:o.href,hrefLang:o.hrefLang,type:o.type,sizes:o.sizes},n):P("meta",{name:o.name,property:o.property,content:o.content},n))})}import{createContext as V}from"react";var _=globalThis;_.__devix_RouterContext__??=V(null);var G=_.__devix_RouterContext__;_.__devix_PageMetaContext__??=V(null);_.__devix_RouteDataContext__??=V(null);var H=_.__devix_PageMetaContext__,N=_.__devix_RouteDataContext__;import{Component as rt}from"react";import{jsx as Y}from"react/jsx-runtime";var S=class extends rt{state={error:null};static getDerivedStateFromError(e){return e instanceof O?{error:{statusCode:e.statusCode,message:e.message}}:{error:{statusCode:500,message:e instanceof Error?e.message:"Unknown error"}}}render(){return this.state.error&&this.props.ErrorPage?Y(this.props.ErrorPage,{...this.state.error}):this.state.error?Y("h1",{children:this.state.error.statusCode}):this.props.children}},O=class extends Error{statusCode;constructor(e,r){super(r),this.statusCode=e}};import{jsx as w,jsxs as at}from"react/jsx-runtime";var ot=(t,e)=>Promise.resolve(),nt=()=>Promise.resolve();function B({pathname:t,params:e,loaderData:r,layoutsData:o,Page:n,layouts:a,metadata:c,viewport:i,clientEntry:s}){let u=w(N,{value:{loaderData:r,params:e},children:w(n,{data:r,params:e,url:t})});for(let p=a.length-1;p>=0;p--){let d=a[p],m=o[p];u=w(N,{value:{loaderData:m,params:e},children:w(d,{data:m,params:e,children:u})})}return at(H,{value:{metadata:c,viewport:i,clientEntry:s},children:[w(J,{metadata:c,viewport:i}),w(G,{value:{pathname:t,params:e,loaderData:r,layoutsData:o,Page:n,layouts:a,metadata:c,viewport:i,isNavigating:!1,navigate:ot,revalidate:nt},children:w(S,{children:u},t)})]})}function F(t){return t.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}function it(t,e){let r=t.slice(e.length+1).replace(/\\/g,"/"),o=F(r);return o==="/"?"/":`/${o}`}function X(t){return t.slice(0,t.lastIndexOf("/"))}var k=null;function j(t,e,r){if(k)return k;let o=[],n=[];for(let a of e)n.push({dir:X(a),key:a});for(let a of t){let c=it(a,r),i=[...c.matchAll(/:([^/]+)/g)].map(u=>u[1]),s=c.replace(/:[^/]+/g,"([^/]+)").replace(/\//g,"\\/");o.push({path:c,key:a,params:i,regex:new RegExp(`^${s}$`)})}return o.sort((a,c)=>{let i=(a.path.match(/:/g)||[]).length,s=(c.path.match(/:/g)||[]).length;return i!==s?i-s:c.path.length-a.path.length}),k={pages:o,layouts:n},k}function q(t,e){let r=X(t);return e.filter(o=>r.startsWith(o.dir)).sort((o,n)=>o.dir.split("/").length-n.dir.split("/").length)}function W(t,e){for(let r of e){let o=t.match(r.regex);if(o){let n={};return r.params.forEach((a,c)=>{n[a]=decodeURIComponent(o[c+1])}),{page:r,params:n}}}return null}async function I(t,e){let r=t.generateMetadata?await t.generateMetadata(e):t.metadata??{},o=t.generateViewport?await t.generateViewport(e):t.viewport;return{metadata:r,viewport:o}}function K(...t){let e={};for(let r of t){if(!r)continue;let{og:o,twitter:n,...a}=r;Object.assign(e,a),o&&(e.og={...e.og,...o}),n&&(e.twitter={...e.twitter,...n})}return e}function v(t){return JSON.stringify(t).replace(/<\/script>/gi,"<\\/script>")}function Q(t){return t.replace(/"/g,"&quot;")}function U(t,e){let r;return Promise.race([t.finally(()=>clearTimeout(r)),new Promise((o,n)=>{r=setTimeout(()=>n(new Error(`timed out after ${e}ms`)),e)})])}var st=Symbol("devix.redirect");function L(t){return typeof t=="object"&&t!==null&&st in t}var pt="/@id/virtual:devix/entry-client";function Z(t){return typeof t=="string"?{url:t,status:302,replace:!1}:L(t)?{url:t.url,status:t.status,replace:t.replace}:null}async function tt(t,e,r,o){let{pages:n,layouts:a}=j(Object.keys(r.pages),Object.keys(r.layouts),r.pagesDir),c=W(t,n);if(!c)return null;let{page:i,params:s}=c,u=q(i.key,a),[p,...d]=await Promise.all([r.pages[i.key](),...u.map(l=>r.layouts[l.key]())]),m;for(let l of d)if(l.guard){let f=await l.guard({params:s,request:e,guardData:m}),b=Z(f);if(b!==null)return{redirect:b.url,redirectStatus:b.status,redirectReplace:b.replace};f!=null&&(m=f)}if(p.guard){let l=await p.guard({params:s,request:e,guardData:m}),f=Z(l);if(f!==null)return{redirect:f.url,redirectStatus:f.status,redirectReplace:f.replace};l!=null&&(m=l)}let h={params:s,request:e,guardData:m},y=p.loader?await U(p.loader(h),o):null;if(L(y))return{redirect:y.url,redirectStatus:y.status,redirectReplace:y.replace};let x=y,C=await U(Promise.all(d.map(l=>l.loader?l.loader(h):null)),o);for(let l of C)if(L(l))return{redirect:l.url,redirectStatus:l.status,redirectReplace:l.replace};let R=C,T=await I(p,{...h,loaderData:x}),D=await Promise.all(d.map((l,f)=>I(l,{...h,loaderData:R[f]}))),E=K(...D.map(l=>l.metadata),T.metadata),$=T.viewport??D.findLast(l=>l.viewport)?.viewport,M=d[0],g=M?.generateLang?await M.generateLang({...h,loaderData:R[0]}):M?.lang??"en";return{pageMod:p,layoutMods:d,params:s,loaderData:x,layoutsData:R,metadata:E,viewport:$,lang:g}}async function Yt(t,e,r,o){let{pathname:n}=new URL(t,"http://localhost"),a;try{let d=o?.loaderTimeout??1e4;a=await tt(n,e,r,d)}catch(d){return console.error("[devix] render error:",d),{error:!0,loaderData:null,params:{},layouts:[],metadata:null,viewport:void 0}}if(!a)return{loaderData:null,params:{},layouts:[],metadata:null,viewport:void 0};if("redirect"in a)return{redirect:a.redirect,redirectStatus:a.redirectStatus,redirectReplace:a.redirectReplace};let{loaderData:c,params:i,layoutsData:s,metadata:u,viewport:p}=a;return{loaderData:c,params:i,layouts:s.map(d=>({loaderData:d})),metadata:u,viewport:p}}async function Bt(t,e,r,o){let n=o?.manifest?`/${Object.values(o.manifest).find(g=>g.isEntry)?.file}`:pt,c=(o?.manifest?Object.values(o.manifest).find(g=>g.isEntry)?.css??[]:[]).map(g=>`<link rel="stylesheet" href="/${g}">`).join(""),{pathname:i}=new URL(t,"http://localhost"),s;try{let g=o?.loaderTimeout??1e4;s=await tt(i,e,r,g)}catch(g){return console.error("[devix] render error:",g),{html:`<html lang="en"><head><meta charset="utf-8">${c}</head><body><script>window.__DEVIX__=null;window.__LOADER_DATA__=null;window.__LAYOUTS_DATA__=[];</script><script type="module" src="${n}"></script><div id="devix-root"></div></body></html>`,statusCode:500,headers:{}}}if(!s){let g=`<script>window.__DEVIX__=${v({metadata:null,viewport:void 0,clientEntry:n})};window.__LOADER_DATA__=null;window.__LAYOUTS_DATA__=[];</script>`,l=`<script type="module" src="${n}"></script>`;return{html:`<html lang="en"><head><meta charset="utf-8">${c}${g}</head><body><div id="devix-root"></div>${l}</body></html>`,statusCode:404,headers:{}}}if("redirect"in s)return{html:"",statusCode:s.redirectStatus,headers:{Location:s.redirect}};let{pageMod:u,layoutMods:p,params:d,loaderData:m,layoutsData:h,metadata:y,viewport:x,lang:C}=s,R=lt(ct(B,{pathname:i,params:d,loaderData:m,layoutsData:h,Page:u.default,layouts:p.map(g=>g.default),metadata:y??null,viewport:x,clientEntry:n})),T=y?ut(A(y,x)):"",D=`<script>window.__DEVIX__=${v({metadata:y,viewport:x,clientEntry:n})};window.__LOADER_DATA__=${v(m??null)};window.__LAYOUTS_DATA__=${v(h)};</script>`,E=`<script type="module" src="${n}"></script>`,$=u.headers??{};return{html:`<html lang="${Q(C)}"><head><meta charset="utf-8">${T}${c}${D}</head><body><div id="devix-root">${R}</div>${E}</body></html>`,statusCode:200,headers:$}}async function Ft(t){let{pages:e}=j(Object.keys(t.pages),Object.keys(t.layouts),t.pagesDir),r=[];for(let o of e)if(o.params.length===0)r.push(o.path);else{let n=await t.pages[o.key]();if(!n.generateStaticParams)continue;let a=await n.generateStaticParams();for(let c of a){let i=o.path;for(let[s,u]of Object.entries(c))i=i.replace(`:${s}`,encodeURIComponent(u));r.push(i)}}return r}export{Ft as getStaticRoutes,Bt as render,Yt as runLoader};
2
2
  //# sourceMappingURL=render.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/server/render.tsx", "../../src/runtime/head.tsx", "../../src/runtime/context.tsx", "../../src/runtime/error-boundary.tsx", "../../src/runtime/server-app.tsx", "../../src/utils/patterns.ts", "../../src/server/pages-router.ts", "../../src/runtime/metadata.ts", "../../src/utils/html.ts", "../../src/utils/async.ts", "../../src/utils/response.ts"],
4
- "sourcesContent": ["import {createElement} from 'react'\nimport {renderToString, renderToStaticMarkup} from 'react-dom/server'\nimport {buildHeadNodes} from '../runtime/head'\nimport {ServerApp} from '../runtime/server-app'\nimport {buildPages, matchPage, collectLayoutChain} from './pages-router'\nimport {resolveMetadata, mergeMetadata} from '../runtime/metadata'\nimport type {PageModule, LayoutModule, PageGlob} from './types'\nimport type {Manifest} from \"vite\";\nimport {escapeAttr, safeJsonStringify} from \"../utils/html\";\nimport {withTimeout} from \"../utils/async\";\nimport {isRedirect} from \"../utils/response\";\n\nconst DEV_CLIENT_ENTRY = '/@id/virtual:devix/entry-client'\n\nfunction extractRedirect(result: unknown): {url: string, status: number, replace: boolean} | null {\n if (typeof result === 'string') return {url: result, status: 302, replace: false}\n if (isRedirect(result)) return {url: result.url, status: result.status, replace: result.replace}\n return null\n}\n\nasync function resolvePageData(pathname: string, request: Request, glob: PageGlob, timeout: number) {\n const {pages, layouts} = buildPages(Object.keys(glob.pages), Object.keys(glob.layouts), glob.pagesDir)\n const matched = matchPage(pathname, pages)\n if (!matched) return null\n\n const {page, params} = matched\n const layoutChain = collectLayoutChain(page.key, layouts)\n\n const [pageMod, ...layoutMods] = await Promise.all([\n glob.pages[page.key]() as Promise<PageModule>,\n ...layoutChain.map(l => glob.layouts[l.key]() as Promise<LayoutModule>),\n ])\n\n let guardData: unknown = undefined\n\n for (const mod of layoutMods) {\n if (mod.guard) {\n const result = await mod.guard({params, request, guardData})\n const r = extractRedirect(result)\n if (r !== null) return {redirect: r.url, redirectStatus: r.status, redirectReplace: r.replace}\n if (result !== null && result !== undefined) guardData = result\n }\n }\n\n if (pageMod.guard) {\n const result = await pageMod.guard({params, request, guardData})\n const r = extractRedirect(result)\n if (r !== null) return {redirect: r.url, redirectStatus: r.status, redirectReplace: r.replace}\n if (result !== null && result !== undefined) guardData = result\n }\n\n const ctx = {params, request, guardData}\n\n const rawLoaderData = pageMod.loader\n ? await withTimeout(pageMod.loader(ctx) as Promise<unknown>, timeout)\n : null\n\n if (isRedirect(rawLoaderData)) return {redirect: rawLoaderData.url, redirectStatus: rawLoaderData.status, redirectReplace: rawLoaderData.replace}\n const loaderData = rawLoaderData\n\n const rawLayoutsData = await withTimeout(\n Promise.all(layoutMods.map(mod => mod.loader ? mod.loader(ctx) : null)),\n timeout\n )\n for (const raw of rawLayoutsData) {\n if (isRedirect(raw)) return {redirect: raw.url, redirectStatus: raw.status, redirectReplace: raw.replace}\n }\n const layoutsData = rawLayoutsData\n\n const pageMeta = await resolveMetadata(pageMod, {...ctx, loaderData})\n const layoutsMeta = await Promise.all(\n layoutMods.map((mod, i) => resolveMetadata(mod, {...ctx, loaderData: layoutsData[i]}))\n )\n\n const metadata = mergeMetadata(...layoutsMeta.map(m => m.metadata), pageMeta.metadata)\n const viewport = pageMeta.viewport ?? layoutsMeta.findLast(m => m.viewport)?.viewport\n\n const rootLayoutMod = layoutMods[0]\n const lang = rootLayoutMod?.generateLang\n ? await rootLayoutMod.generateLang({...ctx, loaderData: layoutsData[0]})\n : rootLayoutMod?.lang ?? 'en'\n\n return {pageMod, layoutMods, params, loaderData, layoutsData, metadata, viewport, lang}\n}\n\nexport async function runLoader(url: string, request: Request, glob: PageGlob, options?: { loaderTimeout?: number }) {\n const {pathname} = new URL(url, 'http://localhost')\n let result: Awaited<ReturnType<typeof resolvePageData>>\n try {\n const timeout = options?.loaderTimeout ?? 10_000\n result = await resolvePageData(pathname, request, glob, timeout)\n } catch (err) {\n console.error('[devix] render error:', err)\n return {error: true as const, loaderData: null, params: {}, layouts: [], metadata: null, viewport: undefined}\n }\n\n if (!result) {\n return {loaderData: null, params: {}, layouts: [], metadata: null, viewport: undefined}\n }\n\n if ('redirect' in result) {\n return {redirect: result.redirect, redirectStatus: result.redirectStatus, redirectReplace: result.redirectReplace}\n }\n\n const {loaderData, params, layoutsData, metadata, viewport} = result\n return {\n loaderData,\n params,\n layouts: layoutsData.map(loaderData => ({loaderData})),\n metadata,\n viewport,\n }\n}\n\nexport async function render(\n url: string,\n request: Request,\n glob: PageGlob,\n options?: { manifest?: Manifest, loaderTimeout?: number },\n) {\n const clientEntry = options?.manifest\n ? `/${Object.values(options.manifest).find(chunk => chunk.isEntry)?.file}`\n : DEV_CLIENT_ENTRY\n\n const cssFiles = options?.manifest\n ? (Object.values(options.manifest).find(chunk => chunk.isEntry)?.css ?? [])\n : []\n const cssLinks = cssFiles.map(f => `<link rel=\"stylesheet\" href=\"/${f}\">`).join('')\n\n const {pathname} = new URL(url, 'http://localhost')\n\n let result: Awaited<ReturnType<typeof resolvePageData>>\n try {\n const timeout = options?.loaderTimeout ?? 10_000\n result = await resolvePageData(pathname, request, glob, timeout)\n } catch (err) {\n console.error('[devix] render error:', err)\n const html = `<html lang=\"en\"><head><meta charset=\"utf-8\">${cssLinks}</head><body><script>window.__DEVIX__=null;window.__LOADER_DATA__=null;window.__LAYOUTS_DATA__=[];</script><script type=\"module\" src=\"${clientEntry}\"></script><div id=\"devix-root\"></div></body></html>`\n return {html, statusCode: 500, headers: {}}\n }\n\n if (!result) {\n const dataScript = `<script>window.__DEVIX__=${safeJsonStringify({\n metadata: null,\n viewport: undefined,\n clientEntry\n })};window.__LOADER_DATA__=null;window.__LAYOUTS_DATA__=[];</script>`\n const clientScript = `<script type=\"module\" src=\"${clientEntry}\"></script>`\n const html = `<html lang=\"en\"><head><meta charset=\"utf-8\">${cssLinks}${dataScript}</head><body><div id=\"devix-root\"></div>${clientScript}</body></html>`\n return {html, statusCode: 404, headers: {}}\n }\n\n if ('redirect' in result) {\n return {html: '', statusCode: result.redirectStatus, headers: {Location: result.redirect}}\n }\n\n const {pageMod, layoutMods, params, loaderData, layoutsData, metadata, viewport, lang} = result\n\n const content = renderToString(createElement(ServerApp, {\n pathname,\n params,\n loaderData,\n layoutsData,\n Page: pageMod.default as any,\n layouts: layoutMods.map(m => m.default as any),\n metadata: metadata ?? null,\n viewport,\n clientEntry,\n }))\n const headTags = metadata ? renderToStaticMarkup(buildHeadNodes(metadata, viewport) as any) : ''\n\n const dataScript = `<script>window.__DEVIX__=${safeJsonStringify({\n metadata,\n viewport,\n clientEntry\n })};window.__LOADER_DATA__=${safeJsonStringify(loaderData ?? null)};window.__LAYOUTS_DATA__=${safeJsonStringify(layoutsData)};</script>`\n const clientScript = `<script type=\"module\" src=\"${clientEntry}\"></script>`\n const customHeaders: Record<string, string> = pageMod.headers ?? {}\n\n const html = `<html lang=\"${escapeAttr(lang)}\"><head><meta charset=\"utf-8\">${headTags}${cssLinks}${dataScript}</head><body><div id=\"devix-root\">${content}</div>${clientScript}</body></html>`\n\n return {html, statusCode: 200, headers: customHeaders}\n}\n\nexport async function getStaticRoutes(glob: PageGlob): Promise<string[]> {\n const {pages} = buildPages(Object.keys(glob.pages), Object.keys(glob.layouts), glob.pagesDir)\n const urls: string[] = []\n\n for (const page of pages) {\n if (page.params.length === 0) {\n urls.push(page.path)\n } else {\n const mod = await glob.pages[page.key]() as PageModule\n if (!mod.generateStaticParams) continue\n const paramSets = await mod.generateStaticParams()\n for (const params of paramSets) {\n let url = page.path\n for (const [key, value] of Object.entries(params)) {\n url = url.replace(`:${key}`, encodeURIComponent(value))\n }\n urls.push(url)\n }\n }\n }\n\n return urls\n}\n\n", "import {Metadata, Viewport} from \"../types\";\nimport {ReactNode} from \"react\";\n\ntype MetaTag =\n | { tag: 'title'; children: string }\n | { tag: 'meta'; name?: string; property?: string; content: string }\n | { tag: 'link'; rel: string; href: string; hrefLang?: string }\n\nfunction collectTags(metadata: Metadata, viewport?: Viewport): MetaTag[] {\n const tags: MetaTag[] = []\n\n if (metadata.title)\n tags.push({tag: 'title', children: metadata.title})\n if (metadata.description)\n tags.push({tag: 'meta', name: 'description', content: metadata.description})\n if (metadata.keywords?.length)\n tags.push({tag: 'meta', name: 'keywords', content: metadata.keywords.join(', ')})\n\n const ogTitle = metadata.og?.title ?? metadata.title\n if (ogTitle) tags.push({tag: 'meta', property: 'og:title', content: ogTitle})\n const ogDesc = metadata.og?.description ?? metadata.description\n if (ogDesc) tags.push({tag: 'meta', property: 'og:description', content: ogDesc})\n if (metadata.og?.image) tags.push({tag: 'meta', property: 'og:image', content: metadata.og.image})\n if (metadata.og?.type) tags.push({tag: 'meta', property: 'og:type', content: metadata.og.type})\n if (metadata.og?.url) tags.push({tag: 'meta', property: 'og:url', content: metadata.og.url})\n\n const twTitle = metadata.twitter?.title ?? metadata.title\n if (twTitle) tags.push({tag: 'meta', name: 'twitter:title', content: twTitle})\n const twDesc = metadata.twitter?.description ?? metadata.description\n if (twDesc) tags.push({tag: 'meta', name: 'twitter:description', content: twDesc})\n if (metadata.twitter?.card) tags.push({\n tag: 'meta', name: 'twitter:card', content:\n metadata.twitter.card\n })\n if (metadata.twitter?.image) tags.push({\n tag: 'meta', name: 'twitter:image', content:\n metadata.twitter.image\n })\n if (metadata.twitter?.creator) tags.push({\n tag: 'meta', name: 'twitter:creator', content:\n metadata.twitter.creator\n })\n\n if (metadata.canonical) tags.push({tag: 'link', rel: 'canonical', href: metadata.canonical})\n if (metadata.robots) tags.push({tag: 'meta', name: 'robots', content: metadata.robots})\n if (metadata.alternates) {\n for (const [lang, href] of Object.entries(metadata.alternates))\n tags.push({tag: 'link', rel: 'alternate', href, hrefLang: lang})\n }\n\n if (viewport) {\n const parts: string[] = []\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`)\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`)\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`)\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' :\n 'no'}`)\n if (parts.length) tags.push({tag: 'meta', name: 'viewport', content: parts.join(', ')})\n if (viewport.themeColor) tags.push({\n tag: 'meta', name: 'theme-color', content: viewport.themeColor\n })\n }\n\n return tags\n}\n\nexport function HeadSlot({metadata, viewport}: {metadata: Metadata | null, viewport?: Viewport}) {\n if (typeof window === 'undefined' || !metadata) return null\n return <>{buildHeadNodes(metadata, viewport)}</>\n}\n\nexport function buildHeadNodes(metadata: Metadata, viewport?: Viewport): ReactNode {\n const tags = collectTags(metadata, viewport)\n\n return <>\n {tags.map((t, i) => {\n if (t.tag === 'title') return <title key={i}>{t.children}</title>\n if (t.tag === 'link') return <link key={i} rel={t.rel} href={t.href} hrefLang={t.hrefLang}/>\n return <meta key={i} name={t.name} property={t.property} content={t.content}/>\n })}\n </>\n}", "import {createContext, Context, ComponentType} from \"react\";\nimport {Metadata, Viewport} from \"../types\";\nimport {LayoutProps, PageProps} from \"../server/types\";\n\nexport interface NavigateOptions {\n replace?: boolean\n viewTransition?: boolean\n}\n\nexport interface RouterContextValue {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n navigate: (to: string, options?: NavigateOptions) => Promise<void>\n revalidate: () => Promise<void>\n isNavigating: boolean\n}\n\nexport interface PageMetaContextValue {\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry?: string\n}\n\nexport interface RouteDataContextValue {\n loaderData: unknown\n params: Record<string, string>\n}\n\nconst g = globalThis as any\n\ng.__devix_RouterContext__ ??= createContext<RouterContextValue | null>(null)\nexport const RouterContext: Context<RouterContextValue | null> = g.__devix_RouterContext__\n\ng.__devix_PageMetaContext__ ??= createContext<PageMetaContextValue | null>(null)\ng.__devix_RouteDataContext__ ??= createContext<RouteDataContextValue | null>(null)\n\nexport const PageMetaContext: Context<PageMetaContextValue | null> = g.__devix_PageMetaContext__\nexport const RouteDataContext: Context<RouteDataContextValue | null> = g.__devix_RouteDataContext__\n\n", "import {Component, ComponentType, ReactNode} from \"react\";\nimport {ErrorProps} from \"../server/types\";\n\ninterface Props {\n ErrorPage?: ComponentType<ErrorProps>\n children: ReactNode\n}\n\ninterface State {\n error: ErrorProps | null\n}\n\nexport class DevixErrorBoundary extends Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(err: unknown): State {\n if (err instanceof DevixError) {\n return {\n error: {statusCode: err.statusCode, message: err.message}\n }\n }\n return {\n error: {statusCode: 500, message: err instanceof Error ? err.message : 'Unknown error'}\n }\n }\n\n render() {\n if (this.state.error && this.props.ErrorPage) {\n return <this.props.ErrorPage {...this.state.error} />\n }\n if (this.state.error) {\n return <h1>{this.state.error.statusCode}</h1>\n }\n return this.props.children\n }\n}\n\nexport class DevixError extends Error {\n statusCode: number\n constructor(statusCode: number, message: string) {\n super(message)\n this.statusCode = statusCode\n }\n}\n", "import {ComponentType, ReactNode} from 'react'\nimport {RouterContext, PageMetaContext, RouteDataContext, NavigateOptions} from './context'\nimport {HeadSlot} from './head'\nimport {DevixErrorBoundary} from './error-boundary'\nimport {LayoutProps, PageProps} from '../server/types'\nimport {Metadata, Viewport} from '../types'\n\nconst noopNavigate = (_to: string, _opts?: NavigateOptions) => Promise.resolve()\nconst noopRevalidate = () => Promise.resolve()\n\nexport interface ServerAppProps {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry: string\n}\n\nexport function ServerApp({\n pathname, params, loaderData, layoutsData,\n Page, layouts, metadata, viewport, clientEntry,\n}: ServerAppProps) {\n let tree: ReactNode = (\n <RouteDataContext value={{loaderData, params}}>\n <Page data={loaderData as any} params={params} url={pathname}/>\n </RouteDataContext>\n )\n\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i]\n const layoutData = layoutsData[i]\n tree = (\n <RouteDataContext value={{loaderData: layoutData, params}}>\n <Layout data={layoutData as any} params={params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n return (\n <PageMetaContext value={{metadata, viewport, clientEntry}}>\n <HeadSlot metadata={metadata} viewport={viewport}/>\n <RouterContext value={{\n pathname,\n params,\n loaderData,\n layoutsData,\n Page,\n layouts,\n metadata,\n viewport,\n isNavigating: false,\n navigate: noopNavigate,\n revalidate: noopRevalidate,\n }}>\n <DevixErrorBoundary key={pathname}>\n {tree}\n </DevixErrorBoundary>\n </RouterContext>\n </PageMetaContext>\n )\n}\n", "export function routePattern(rel: string): string {\n return rel\n .replace(/\\.(tsx|ts|jsx|js)$/, '')\n .replace(/\\(.*?\\)\\//g, '')\n .replace(/^index$|\\/index$/, '')\n .replace(/\\[([^\\]]+)]/g, ':$1')\n || '/'\n}", "import {routePattern} from \"../utils/patterns\";\n\nexport interface Page {\n path: string\n key: string\n params: string[]\n regex: RegExp\n}\n\nexport interface Layout {\n dir: string\n key: string\n}\n\nexport interface PagesResult {\n pages: Page[]\n layouts: Layout[]\n}\n\nfunction keyToRoutePattern(key: string, pagesDir: string): string {\n const rel = key.slice(pagesDir.length + 1).replace(/\\\\/g, '/')\n const pattern = routePattern(rel)\n return pattern === \"/\" ? \"/\" : `/${pattern}`\n}\n\nfunction keyToDir(key: string): string {\n return key.slice(0, key.lastIndexOf('/'))\n}\n\nlet cache: PagesResult | null = null\n\nexport function invalidatePagesCache() {\n cache = null\n}\n\nexport function buildPages(pageKeys: string[], layoutKeys: string[], pagesDir: string): PagesResult {\n if (cache) return cache\n\n const pages: Page[] = []\n const layouts: Layout[] = []\n\n for (const key of layoutKeys) {\n layouts.push({dir: keyToDir(key), key})\n }\n\n for (const key of pageKeys) {\n const pattern = keyToRoutePattern(key, pagesDir)\n const params = [...pattern.matchAll(/:([^/]+)/g)].map(m => m[1])\n const regexStr = pattern\n .replace(/:[^/]+/g, '([^/]+)')\n .replace(/\\//g, '\\\\/')\n pages.push({path: pattern, key, params, regex: new RegExp(`^${regexStr}$`)})\n }\n\n pages.sort((a, b) => {\n const aScore = (a.path.match(/:/g) || []).length\n const bScore = (b.path.match(/:/g) || []).length\n if (aScore !== bScore) return aScore - bScore\n return b.path.length - a.path.length\n })\n\n cache = {pages, layouts}\n return cache\n}\n\nexport function collectLayoutChain(pageKey: string, layouts: Layout[]): Layout[] {\n const pageDir = keyToDir(pageKey)\n\n return layouts\n .filter(layout => pageDir.startsWith(layout.dir))\n .sort((a, b) => a.dir.split('/').length - b.dir.split('/').length)\n}\n\nexport function matchPage(pathname: string, pages: Page[]): {\n page: Page\n params: Record<string, string>\n} | null {\n for (const page of pages) {\n const match = pathname.match(page.regex)\n if (match) {\n const params: Record<string, string> = {}\n page.params.forEach((name, i) => {\n params[name] = decodeURIComponent(match[i + 1])\n })\n return {page, params}\n }\n }\n return null\n}\n", "import {LayoutModule, PageModule} from \"../server\";\nimport {LoaderContext, Metadata, Viewport} from \"../types\"\n\nexport interface ResolvedMeta {\n metadata: Metadata\n viewport?: Viewport\n}\n\nexport async function resolveMetadata(module: PageModule | LayoutModule, ctx: LoaderContext & {\n loaderData: unknown\n}): Promise<ResolvedMeta> {\n const metadata = module.generateMetadata\n ? await module.generateMetadata(ctx)\n : module.metadata ?? {}\n\n const viewport = module.generateViewport\n ? await module.generateViewport(ctx)\n : module.viewport\n\n return {metadata, viewport}\n}\n\nexport function mergeMetadata(...sources: (Metadata | null | undefined)[]): Metadata {\n const result: Metadata = {}\n\n for (const source of sources) {\n if (!source) continue\n const { og, twitter, ...rest } = source\n Object.assign(result, rest)\n if (og) result.og = { ...result.og, ...og }\n if (twitter) result.twitter = { ...result.twitter, ...twitter }\n }\n\n return result\n}", "export function safeJsonStringify(value: unknown): string {\n return JSON.stringify(value).replace(/<\\/script>/gi, '<\\\\/script>')\n}\n\nexport function escapeAttr(value: string): string {\n return value.replace(/\"/g, '&quot;')\n}", "export function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout>\n return Promise.race([\n promise.finally(() => clearTimeout(timer)),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms)\n })\n ])\n}", "export type JsonResponse<T = unknown> = Response & { readonly __body: T }\n\nexport const json = <const T>(data: T, status = 200): JsonResponse<T> =>\n new Response(JSON.stringify(data), {\n status,\n headers: {'Content-Type': 'application/json'},\n }) as JsonResponse<T>\n\nexport const text = (body: string, status = 200): Response =>\n new Response(body, {status, headers: {'Content-Type': 'text/plain; charset=utf-8'}})\n\nconst REDIRECT_BRAND = Symbol('devix.redirect')\n\nexport interface RedirectOptions {\n status?: number\n replace?: boolean\n}\n\nexport interface Redirect {\n readonly [REDIRECT_BRAND]: true\n readonly url: string\n readonly status: number\n readonly replace: boolean\n}\n\nexport function redirect(url: string, statusOrOptions?: number | RedirectOptions): Redirect {\n const status = typeof statusOrOptions === 'number' ? statusOrOptions : (statusOrOptions?.status ?? 302)\n const replace = typeof statusOrOptions === 'object' ? (statusOrOptions?.replace ?? false) : false\n return {[REDIRECT_BRAND]: true, url, status, replace} as Redirect\n}\n\nexport function isRedirect(value: unknown): value is Redirect {\n return typeof value === 'object' && value !== null && REDIRECT_BRAND in value\n}\n"],
5
- "mappings": "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",
6
- "names": ["createElement", "renderToString", "renderToStaticMarkup", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "parts", "HeadSlot", "buildHeadNodes", "t", "i", "createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "jsx", "jsxs", "noopNavigate", "_to", "_opts", "noopRevalidate", "ServerApp", "pathname", "params", "loaderData", "layoutsData", "Page", "layouts", "metadata", "viewport", "clientEntry", "tree", "RouteDataContext", "i", "Layout", "layoutData", "PageMetaContext", "HeadSlot", "RouterContext", "DevixErrorBoundary", "routePattern", "rel", "keyToRoutePattern", "key", "pagesDir", "rel", "pattern", "routePattern", "keyToDir", "cache", "buildPages", "pageKeys", "layoutKeys", "pagesDir", "cache", "pages", "layouts", "key", "keyToDir", "pattern", "keyToRoutePattern", "params", "m", "regexStr", "b", "aScore", "bScore", "collectLayoutChain", "pageKey", "pageDir", "layout", "a", "matchPage", "pathname", "page", "match", "name", "i", "resolveMetadata", "module", "ctx", "metadata", "viewport", "mergeMetadata", "sources", "result", "source", "og", "twitter", "rest", "safeJsonStringify", "value", "escapeAttr", "withTimeout", "promise", "ms", "timer", "_", "reject", "REDIRECT_BRAND", "isRedirect", "value", "REDIRECT_BRAND", "DEV_CLIENT_ENTRY", "extractRedirect", "result", "isRedirect", "resolvePageData", "pathname", "request", "glob", "timeout", "pages", "layouts", "buildPages", "matched", "matchPage", "page", "params", "layoutChain", "collectLayoutChain", "pageMod", "layoutMods", "guardData", "mod", "r", "ctx", "rawLoaderData", "withTimeout", "loaderData", "rawLayoutsData", "raw", "layoutsData", "pageMeta", "resolveMetadata", "layoutsMeta", "i", "metadata", "mergeMetadata", "m", "viewport", "rootLayoutMod", "lang", "runLoader", "url", "options", "err", "render", "clientEntry", "chunk", "cssLinks", "f", "dataScript", "safeJsonStringify", "clientScript", "content", "renderToString", "createElement", "ServerApp", "headTags", "renderToStaticMarkup", "buildHeadNodes", "customHeaders", "escapeAttr", "getStaticRoutes", "urls", "paramSets", "key", "value"]
4
+ "sourcesContent": ["import {createElement} from 'react'\nimport {renderToString, renderToStaticMarkup} from 'react-dom/server'\nimport {buildHeadNodes} from '../runtime/head'\nimport {ServerApp} from '../runtime/server-app'\nimport {buildPages, matchPage, collectLayoutChain} from './pages-router'\nimport {resolveMetadata, mergeMetadata} from '../runtime/metadata'\nimport type {PageModule, LayoutModule, PageGlob} from './types'\nimport type {Manifest} from \"vite\";\nimport {escapeAttr, safeJsonStringify} from \"../utils/html\";\nimport {withTimeout} from \"../utils/async\";\nimport {isRedirect} from \"../utils/response\";\n\nconst DEV_CLIENT_ENTRY = '/@id/virtual:devix/entry-client'\n\nfunction extractRedirect(result: unknown): {url: string, status: number, replace: boolean} | null {\n if (typeof result === 'string') return {url: result, status: 302, replace: false}\n if (isRedirect(result)) return {url: result.url, status: result.status, replace: result.replace}\n return null\n}\n\nasync function resolvePageData(pathname: string, request: Request, glob: PageGlob, timeout: number) {\n const {pages, layouts} = buildPages(Object.keys(glob.pages), Object.keys(glob.layouts), glob.pagesDir)\n const matched = matchPage(pathname, pages)\n if (!matched) return null\n\n const {page, params} = matched\n const layoutChain = collectLayoutChain(page.key, layouts)\n\n const [pageMod, ...layoutMods] = await Promise.all([\n glob.pages[page.key]() as Promise<PageModule>,\n ...layoutChain.map(l => glob.layouts[l.key]() as Promise<LayoutModule>),\n ])\n\n let guardData: unknown = undefined\n\n for (const mod of layoutMods) {\n if (mod.guard) {\n const result = await mod.guard({params, request, guardData})\n const r = extractRedirect(result)\n if (r !== null) return {redirect: r.url, redirectStatus: r.status, redirectReplace: r.replace}\n if (result !== null && result !== undefined) guardData = result\n }\n }\n\n if (pageMod.guard) {\n const result = await pageMod.guard({params, request, guardData})\n const r = extractRedirect(result)\n if (r !== null) return {redirect: r.url, redirectStatus: r.status, redirectReplace: r.replace}\n if (result !== null && result !== undefined) guardData = result\n }\n\n const ctx = {params, request, guardData}\n\n const rawLoaderData = pageMod.loader\n ? await withTimeout(pageMod.loader(ctx) as Promise<unknown>, timeout)\n : null\n\n if (isRedirect(rawLoaderData)) return {redirect: rawLoaderData.url, redirectStatus: rawLoaderData.status, redirectReplace: rawLoaderData.replace}\n const loaderData = rawLoaderData\n\n const rawLayoutsData = await withTimeout(\n Promise.all(layoutMods.map(mod => mod.loader ? mod.loader(ctx) : null)),\n timeout\n )\n for (const raw of rawLayoutsData) {\n if (isRedirect(raw)) return {redirect: raw.url, redirectStatus: raw.status, redirectReplace: raw.replace}\n }\n const layoutsData = rawLayoutsData\n\n const pageMeta = await resolveMetadata(pageMod, {...ctx, loaderData})\n const layoutsMeta = await Promise.all(\n layoutMods.map((mod, i) => resolveMetadata(mod, {...ctx, loaderData: layoutsData[i]}))\n )\n\n const metadata = mergeMetadata(...layoutsMeta.map(m => m.metadata), pageMeta.metadata)\n const viewport = pageMeta.viewport ?? layoutsMeta.findLast(m => m.viewport)?.viewport\n\n const rootLayoutMod = layoutMods[0]\n const lang = rootLayoutMod?.generateLang\n ? await rootLayoutMod.generateLang({...ctx, loaderData: layoutsData[0]})\n : rootLayoutMod?.lang ?? 'en'\n\n return {pageMod, layoutMods, params, loaderData, layoutsData, metadata, viewport, lang}\n}\n\nexport async function runLoader(url: string, request: Request, glob: PageGlob, options?: { loaderTimeout?: number }) {\n const {pathname} = new URL(url, 'http://localhost')\n let result: Awaited<ReturnType<typeof resolvePageData>>\n try {\n const timeout = options?.loaderTimeout ?? 10_000\n result = await resolvePageData(pathname, request, glob, timeout)\n } catch (err) {\n console.error('[devix] render error:', err)\n return {error: true as const, loaderData: null, params: {}, layouts: [], metadata: null, viewport: undefined}\n }\n\n if (!result) {\n return {loaderData: null, params: {}, layouts: [], metadata: null, viewport: undefined}\n }\n\n if ('redirect' in result) {\n return {redirect: result.redirect, redirectStatus: result.redirectStatus, redirectReplace: result.redirectReplace}\n }\n\n const {loaderData, params, layoutsData, metadata, viewport} = result\n return {\n loaderData,\n params,\n layouts: layoutsData.map(loaderData => ({loaderData})),\n metadata,\n viewport,\n }\n}\n\nexport async function render(\n url: string,\n request: Request,\n glob: PageGlob,\n options?: { manifest?: Manifest, loaderTimeout?: number },\n) {\n const clientEntry = options?.manifest\n ? `/${Object.values(options.manifest).find(chunk => chunk.isEntry)?.file}`\n : DEV_CLIENT_ENTRY\n\n const cssFiles = options?.manifest\n ? (Object.values(options.manifest).find(chunk => chunk.isEntry)?.css ?? [])\n : []\n const cssLinks = cssFiles.map(f => `<link rel=\"stylesheet\" href=\"/${f}\">`).join('')\n\n const {pathname} = new URL(url, 'http://localhost')\n\n let result: Awaited<ReturnType<typeof resolvePageData>>\n try {\n const timeout = options?.loaderTimeout ?? 10_000\n result = await resolvePageData(pathname, request, glob, timeout)\n } catch (err) {\n console.error('[devix] render error:', err)\n const html = `<html lang=\"en\"><head><meta charset=\"utf-8\">${cssLinks}</head><body><script>window.__DEVIX__=null;window.__LOADER_DATA__=null;window.__LAYOUTS_DATA__=[];</script><script type=\"module\" src=\"${clientEntry}\"></script><div id=\"devix-root\"></div></body></html>`\n return {html, statusCode: 500, headers: {}}\n }\n\n if (!result) {\n const dataScript = `<script>window.__DEVIX__=${safeJsonStringify({\n metadata: null,\n viewport: undefined,\n clientEntry\n })};window.__LOADER_DATA__=null;window.__LAYOUTS_DATA__=[];</script>`\n const clientScript = `<script type=\"module\" src=\"${clientEntry}\"></script>`\n const html = `<html lang=\"en\"><head><meta charset=\"utf-8\">${cssLinks}${dataScript}</head><body><div id=\"devix-root\"></div>${clientScript}</body></html>`\n return {html, statusCode: 404, headers: {}}\n }\n\n if ('redirect' in result) {\n return {html: '', statusCode: result.redirectStatus, headers: {Location: result.redirect}}\n }\n\n const {pageMod, layoutMods, params, loaderData, layoutsData, metadata, viewport, lang} = result\n\n const content = renderToString(createElement(ServerApp, {\n pathname,\n params,\n loaderData,\n layoutsData,\n Page: pageMod.default as any,\n layouts: layoutMods.map(m => m.default as any),\n metadata: metadata ?? null,\n viewport,\n clientEntry,\n }))\n const headTags = metadata ? renderToStaticMarkup(buildHeadNodes(metadata, viewport) as any) : ''\n\n const dataScript = `<script>window.__DEVIX__=${safeJsonStringify({\n metadata,\n viewport,\n clientEntry\n })};window.__LOADER_DATA__=${safeJsonStringify(loaderData ?? null)};window.__LAYOUTS_DATA__=${safeJsonStringify(layoutsData)};</script>`\n const clientScript = `<script type=\"module\" src=\"${clientEntry}\"></script>`\n const customHeaders: Record<string, string> = pageMod.headers ?? {}\n\n const html = `<html lang=\"${escapeAttr(lang)}\"><head><meta charset=\"utf-8\">${headTags}${cssLinks}${dataScript}</head><body><div id=\"devix-root\">${content}</div>${clientScript}</body></html>`\n\n return {html, statusCode: 200, headers: customHeaders}\n}\n\nexport async function getStaticRoutes(glob: PageGlob): Promise<string[]> {\n const {pages} = buildPages(Object.keys(glob.pages), Object.keys(glob.layouts), glob.pagesDir)\n const urls: string[] = []\n\n for (const page of pages) {\n if (page.params.length === 0) {\n urls.push(page.path)\n } else {\n const mod = await glob.pages[page.key]() as PageModule\n if (!mod.generateStaticParams) continue\n const paramSets = await mod.generateStaticParams()\n for (const params of paramSets) {\n let url = page.path\n for (const [key, value] of Object.entries(params)) {\n url = url.replace(`:${key}`, encodeURIComponent(value))\n }\n urls.push(url)\n }\n }\n }\n\n return urls\n}\n\n", "import { Metadata, MetadataIcon, Viewport } from \"../types\";\nimport { ReactNode } from \"react\";\n\ntype MetaTag =\n | { tag: 'title'; children: string }\n | { tag: 'meta'; name?: string; property?: string; content: string }\n | { tag: 'link'; rel: string; href: string; hrefLang?: string; type?: string; sizes?: string }\n\nfunction collectTags(metadata: Metadata, viewport?: Viewport): MetaTag[] {\n const tags: MetaTag[] = []\n\n if (metadata.title)\n tags.push({ tag: 'title', children: metadata.title })\n if (metadata.description)\n tags.push({ tag: 'meta', name: 'description', content: metadata.description })\n if (metadata.keywords?.length)\n tags.push({ tag: 'meta', name: 'keywords', content: metadata.keywords.join(', ') })\n\n const ogTitle = metadata.og?.title ?? metadata.title\n if (ogTitle) tags.push({ tag: 'meta', property: 'og:title', content: ogTitle })\n const ogDesc = metadata.og?.description ?? metadata.description\n if (ogDesc) tags.push({ tag: 'meta', property: 'og:description', content: ogDesc })\n if (metadata.og?.image) tags.push({ tag: 'meta', property: 'og:image', content: metadata.og.image })\n if (metadata.og?.type) tags.push({ tag: 'meta', property: 'og:type', content: metadata.og.type })\n if (metadata.og?.url) tags.push({ tag: 'meta', property: 'og:url', content: metadata.og.url })\n\n const twTitle = metadata.twitter?.title ?? metadata.title\n if (twTitle) tags.push({ tag: 'meta', name: 'twitter:title', content: twTitle })\n const twDesc = metadata.twitter?.description ?? metadata.description\n if (twDesc) tags.push({ tag: 'meta', name: 'twitter:description', content: twDesc })\n if (metadata.twitter?.card) tags.push({\n tag: 'meta', name: 'twitter:card', content:\n metadata.twitter.card\n })\n if (metadata.twitter?.image) tags.push({\n tag: 'meta', name: 'twitter:image', content:\n metadata.twitter.image\n })\n if (metadata.twitter?.creator) tags.push({\n tag: 'meta', name: 'twitter:creator', content:\n metadata.twitter.creator\n })\n\n if (metadata.canonical) tags.push({ tag: 'link', rel: 'canonical', href: metadata.canonical })\n if (metadata.robots) tags.push({ tag: 'meta', name: 'robots', content: metadata.robots })\n if (metadata.alternates) {\n for (const [lang, href] of Object.entries(metadata.alternates))\n tags.push({ tag: 'link', rel: 'alternate', href, hrefLang: lang })\n }\n\n if (metadata.icons) {\n const raw = Array.isArray(metadata.icons) ? metadata.icons : [metadata.icons]\n for (const icon of raw) {\n const resolved: MetadataIcon = typeof icon === 'string' ? { href: icon } : icon\n tags.push({\n tag: 'link',\n rel: resolved.rel ?? 'icon',\n href: resolved.href,\n ...(resolved.type && { type: resolved.type }),\n ...(resolved.sizes && { sizes: resolved.sizes }),\n })\n }\n }\n\n if (viewport) {\n const parts: string[] = []\n if (viewport.width !== undefined) parts.push(`width=${viewport.width}`)\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`)\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`)\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' :\n 'no'}`)\n if (parts.length) tags.push({ tag: 'meta', name: 'viewport', content: parts.join(', ') })\n if (viewport.themeColor) tags.push({\n tag: 'meta', name: 'theme-color', content: viewport.themeColor\n })\n }\n\n return tags\n}\n\nexport function HeadSlot({ metadata, viewport }: { metadata: Metadata | null, viewport?: Viewport }) {\n if (typeof window === 'undefined' || !metadata) return null\n return <>{buildHeadNodes(metadata, viewport)}</>\n}\n\nexport function buildHeadNodes(metadata: Metadata, viewport?: Viewport): ReactNode {\n const tags = collectTags(metadata, viewport)\n\n return <>\n {tags.map((t, i) => {\n if (t.tag === 'title') return <title key={i}>{t.children}</title>\n if (t.tag === 'link') return <link key={i} rel={t.rel} href={t.href} hrefLang={t.hrefLang} type={t.type} sizes={t.sizes} />\n return <meta key={i} name={t.name} property={t.property} content={t.content} />\n })}\n </>\n}", "import {createContext, Context, ComponentType} from \"react\";\nimport {Metadata, Viewport} from \"../types\";\nimport {LayoutProps, PageProps} from \"../server/types\";\n\nexport interface NavigateOptions {\n replace?: boolean\n viewTransition?: boolean\n}\n\nexport interface RouterContextValue {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n navigate: (to: string, options?: NavigateOptions) => Promise<void>\n revalidate: () => Promise<void>\n isNavigating: boolean\n}\n\nexport interface PageMetaContextValue {\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry?: string\n}\n\nexport interface RouteDataContextValue {\n loaderData: unknown\n params: Record<string, string>\n}\n\nconst g = globalThis as any\n\ng.__devix_RouterContext__ ??= createContext<RouterContextValue | null>(null)\nexport const RouterContext: Context<RouterContextValue | null> = g.__devix_RouterContext__\n\ng.__devix_PageMetaContext__ ??= createContext<PageMetaContextValue | null>(null)\ng.__devix_RouteDataContext__ ??= createContext<RouteDataContextValue | null>(null)\n\nexport const PageMetaContext: Context<PageMetaContextValue | null> = g.__devix_PageMetaContext__\nexport const RouteDataContext: Context<RouteDataContextValue | null> = g.__devix_RouteDataContext__\n\n", "import {Component, ComponentType, ReactNode} from \"react\";\nimport {ErrorProps} from \"../server/types\";\n\ninterface Props {\n ErrorPage?: ComponentType<ErrorProps>\n children: ReactNode\n}\n\ninterface State {\n error: ErrorProps | null\n}\n\nexport class DevixErrorBoundary extends Component<Props, State> {\n state: State = { error: null }\n\n static getDerivedStateFromError(err: unknown): State {\n if (err instanceof DevixError) {\n return {\n error: {statusCode: err.statusCode, message: err.message}\n }\n }\n return {\n error: {statusCode: 500, message: err instanceof Error ? err.message : 'Unknown error'}\n }\n }\n\n render() {\n if (this.state.error && this.props.ErrorPage) {\n return <this.props.ErrorPage {...this.state.error} />\n }\n if (this.state.error) {\n return <h1>{this.state.error.statusCode}</h1>\n }\n return this.props.children\n }\n}\n\nexport class DevixError extends Error {\n statusCode: number\n constructor(statusCode: number, message: string) {\n super(message)\n this.statusCode = statusCode\n }\n}\n", "import {ComponentType, ReactNode} from 'react'\nimport {RouterContext, PageMetaContext, RouteDataContext, NavigateOptions} from './context'\nimport {HeadSlot} from './head'\nimport {DevixErrorBoundary} from './error-boundary'\nimport {LayoutProps, PageProps} from '../server/types'\nimport {Metadata, Viewport} from '../types'\n\nconst noopNavigate = (_to: string, _opts?: NavigateOptions) => Promise.resolve()\nconst noopRevalidate = () => Promise.resolve()\n\nexport interface ServerAppProps {\n pathname: string\n params: Record<string, string>\n loaderData: unknown\n layoutsData: unknown[]\n Page: ComponentType<PageProps>\n layouts: ComponentType<LayoutProps>[]\n metadata: Metadata | null\n viewport?: Viewport\n clientEntry: string\n}\n\nexport function ServerApp({\n pathname, params, loaderData, layoutsData,\n Page, layouts, metadata, viewport, clientEntry,\n}: ServerAppProps) {\n let tree: ReactNode = (\n <RouteDataContext value={{loaderData, params}}>\n <Page data={loaderData as any} params={params} url={pathname}/>\n </RouteDataContext>\n )\n\n for (let i = layouts.length - 1; i >= 0; i--) {\n const Layout = layouts[i]\n const layoutData = layoutsData[i]\n tree = (\n <RouteDataContext value={{loaderData: layoutData, params}}>\n <Layout data={layoutData as any} params={params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n return (\n <PageMetaContext value={{metadata, viewport, clientEntry}}>\n <HeadSlot metadata={metadata} viewport={viewport}/>\n <RouterContext value={{\n pathname,\n params,\n loaderData,\n layoutsData,\n Page,\n layouts,\n metadata,\n viewport,\n isNavigating: false,\n navigate: noopNavigate,\n revalidate: noopRevalidate,\n }}>\n <DevixErrorBoundary key={pathname}>\n {tree}\n </DevixErrorBoundary>\n </RouterContext>\n </PageMetaContext>\n )\n}\n", "export function routePattern(rel: string): string {\n return rel\n .replace(/\\.(tsx|ts|jsx|js)$/, '')\n .replace(/\\(.*?\\)\\//g, '')\n .replace(/^index$|\\/index$/, '')\n .replace(/\\[([^\\]]+)]/g, ':$1')\n || '/'\n}", "import {routePattern} from \"../utils/patterns\";\n\nexport interface Page {\n path: string\n key: string\n params: string[]\n regex: RegExp\n}\n\nexport interface Layout {\n dir: string\n key: string\n}\n\nexport interface PagesResult {\n pages: Page[]\n layouts: Layout[]\n}\n\nfunction keyToRoutePattern(key: string, pagesDir: string): string {\n const rel = key.slice(pagesDir.length + 1).replace(/\\\\/g, '/')\n const pattern = routePattern(rel)\n return pattern === \"/\" ? \"/\" : `/${pattern}`\n}\n\nfunction keyToDir(key: string): string {\n return key.slice(0, key.lastIndexOf('/'))\n}\n\nlet cache: PagesResult | null = null\n\nexport function invalidatePagesCache() {\n cache = null\n}\n\nexport function buildPages(pageKeys: string[], layoutKeys: string[], pagesDir: string): PagesResult {\n if (cache) return cache\n\n const pages: Page[] = []\n const layouts: Layout[] = []\n\n for (const key of layoutKeys) {\n layouts.push({dir: keyToDir(key), key})\n }\n\n for (const key of pageKeys) {\n const pattern = keyToRoutePattern(key, pagesDir)\n const params = [...pattern.matchAll(/:([^/]+)/g)].map(m => m[1])\n const regexStr = pattern\n .replace(/:[^/]+/g, '([^/]+)')\n .replace(/\\//g, '\\\\/')\n pages.push({path: pattern, key, params, regex: new RegExp(`^${regexStr}$`)})\n }\n\n pages.sort((a, b) => {\n const aScore = (a.path.match(/:/g) || []).length\n const bScore = (b.path.match(/:/g) || []).length\n if (aScore !== bScore) return aScore - bScore\n return b.path.length - a.path.length\n })\n\n cache = {pages, layouts}\n return cache\n}\n\nexport function collectLayoutChain(pageKey: string, layouts: Layout[]): Layout[] {\n const pageDir = keyToDir(pageKey)\n\n return layouts\n .filter(layout => pageDir.startsWith(layout.dir))\n .sort((a, b) => a.dir.split('/').length - b.dir.split('/').length)\n}\n\nexport function matchPage(pathname: string, pages: Page[]): {\n page: Page\n params: Record<string, string>\n} | null {\n for (const page of pages) {\n const match = pathname.match(page.regex)\n if (match) {\n const params: Record<string, string> = {}\n page.params.forEach((name, i) => {\n params[name] = decodeURIComponent(match[i + 1])\n })\n return {page, params}\n }\n }\n return null\n}\n", "import {LayoutModule, PageModule} from \"../server\";\nimport {LoaderContext, Metadata, Viewport} from \"../types\"\n\nexport interface ResolvedMeta {\n metadata: Metadata\n viewport?: Viewport\n}\n\nexport async function resolveMetadata(module: PageModule | LayoutModule, ctx: LoaderContext & {\n loaderData: unknown\n}): Promise<ResolvedMeta> {\n const metadata = module.generateMetadata\n ? await module.generateMetadata(ctx)\n : module.metadata ?? {}\n\n const viewport = module.generateViewport\n ? await module.generateViewport(ctx)\n : module.viewport\n\n return {metadata, viewport}\n}\n\nexport function mergeMetadata(...sources: (Metadata | null | undefined)[]): Metadata {\n const result: Metadata = {}\n\n for (const source of sources) {\n if (!source) continue\n const { og, twitter, ...rest } = source\n Object.assign(result, rest)\n if (og) result.og = { ...result.og, ...og }\n if (twitter) result.twitter = { ...result.twitter, ...twitter }\n }\n\n return result\n}", "export function safeJsonStringify(value: unknown): string {\n return JSON.stringify(value).replace(/<\\/script>/gi, '<\\\\/script>')\n}\n\nexport function escapeAttr(value: string): string {\n return value.replace(/\"/g, '&quot;')\n}", "export function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n let timer: ReturnType<typeof setTimeout>\n return Promise.race([\n promise.finally(() => clearTimeout(timer)),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms)\n })\n ])\n}", "export type JsonResponse<T = unknown> = Response & { readonly __body: T }\n\nexport const json = <const T>(data: T, status = 200): JsonResponse<T> =>\n new Response(JSON.stringify(data), {\n status,\n headers: {'Content-Type': 'application/json'},\n }) as JsonResponse<T>\n\nexport const text = (body: string, status = 200): Response =>\n new Response(body, {status, headers: {'Content-Type': 'text/plain; charset=utf-8'}})\n\nconst REDIRECT_BRAND = Symbol('devix.redirect')\n\nexport interface RedirectOptions {\n status?: number\n replace?: boolean\n}\n\nexport interface Redirect {\n readonly [REDIRECT_BRAND]: true\n readonly url: string\n readonly status: number\n readonly replace: boolean\n}\n\nexport function redirect(url: string, statusOrOptions?: number | RedirectOptions): Redirect {\n const status = typeof statusOrOptions === 'number' ? statusOrOptions : (statusOrOptions?.status ?? 302)\n const replace = typeof statusOrOptions === 'object' ? (statusOrOptions?.replace ?? false) : false\n return {[REDIRECT_BRAND]: true, url, status, replace} as Redirect\n}\n\nexport function isRedirect(value: unknown): value is Redirect {\n return typeof value === 'object' && value !== null && REDIRECT_BRAND in value\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["createElement", "renderToString", "renderToStaticMarkup", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "raw", "icon", "resolved", "parts", "HeadSlot", "buildHeadNodes", "t", "i", "createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "jsx", "jsxs", "noopNavigate", "_to", "_opts", "noopRevalidate", "ServerApp", "pathname", "params", "loaderData", "layoutsData", "Page", "layouts", "metadata", "viewport", "clientEntry", "tree", "RouteDataContext", "i", "Layout", "layoutData", "PageMetaContext", "HeadSlot", "RouterContext", "DevixErrorBoundary", "routePattern", "rel", "keyToRoutePattern", "key", "pagesDir", "rel", "pattern", "routePattern", "keyToDir", "cache", "buildPages", "pageKeys", "layoutKeys", "pagesDir", "cache", "pages", "layouts", "key", "keyToDir", "pattern", "keyToRoutePattern", "params", "m", "regexStr", "b", "aScore", "bScore", "collectLayoutChain", "pageKey", "pageDir", "layout", "a", "matchPage", "pathname", "page", "match", "name", "i", "resolveMetadata", "module", "ctx", "metadata", "viewport", "mergeMetadata", "sources", "result", "source", "og", "twitter", "rest", "safeJsonStringify", "value", "escapeAttr", "withTimeout", "promise", "ms", "timer", "_", "reject", "REDIRECT_BRAND", "isRedirect", "value", "REDIRECT_BRAND", "DEV_CLIENT_ENTRY", "extractRedirect", "result", "isRedirect", "resolvePageData", "pathname", "request", "glob", "timeout", "pages", "layouts", "buildPages", "matched", "matchPage", "page", "params", "layoutChain", "collectLayoutChain", "pageMod", "layoutMods", "guardData", "mod", "r", "ctx", "rawLoaderData", "withTimeout", "loaderData", "rawLayoutsData", "raw", "layoutsData", "pageMeta", "resolveMetadata", "layoutsMeta", "i", "metadata", "mergeMetadata", "m", "viewport", "rootLayoutMod", "lang", "runLoader", "url", "options", "err", "render", "clientEntry", "chunk", "cssLinks", "f", "dataScript", "safeJsonStringify", "clientScript", "content", "renderToString", "createElement", "ServerApp", "headTags", "renderToStaticMarkup", "buildHeadNodes", "customHeaders", "escapeAttr", "getStaticRoutes", "urls", "paramSets", "key", "value"]
7
7
  }
@@ -0,0 +1,11 @@
1
+ import type { Hono } from 'hono';
2
+ import type { Manifest } from 'vite';
3
+ interface ServerOptions {
4
+ renderModule: any;
5
+ apiModule: any;
6
+ manifest?: Manifest;
7
+ loaderTimeout?: number;
8
+ }
9
+ export declare function registerApiRoutes(app: Hono, { apiModule, renderModule, loaderTimeout }: ServerOptions): void;
10
+ export declare function registerSsrRoute(app: Hono, { renderModule, manifest, loaderTimeout }: ServerOptions): void;
11
+ export {};
@@ -0,0 +1,52 @@
1
+ import type React from "react";
2
+ import { LoaderContext, Metadata, Viewport } from "../types";
3
+ import type { Redirect } from "../utils/response";
4
+ type InferLoaderData<T> = T extends (...args: any[]) => infer R ? [Awaited<R>] extends [void | undefined | Redirect] ? undefined : Exclude<Awaited<R>, Redirect> : T;
5
+ type IsParams<T> = [T] extends [Record<string, string>] ? true : false;
6
+ export interface PageProps<TDataOrParams = unknown, TParams = Record<string, string>> {
7
+ data: IsParams<TDataOrParams> extends true ? unknown : InferLoaderData<TDataOrParams>;
8
+ params: IsParams<TDataOrParams> extends true ? TDataOrParams extends Record<string, string> ? TDataOrParams : Record<string, string> : TParams;
9
+ url: string;
10
+ }
11
+ export interface LayoutProps<TDataOrParams = unknown, TParams = Record<string, string>> {
12
+ children: React.ReactNode;
13
+ data: IsParams<TDataOrParams> extends true ? unknown : InferLoaderData<TDataOrParams>;
14
+ params: IsParams<TDataOrParams> extends true ? TDataOrParams extends Record<string, string> ? TDataOrParams : Record<string, string> : TParams;
15
+ }
16
+ export interface ErrorProps {
17
+ statusCode: number;
18
+ message?: string;
19
+ }
20
+ export interface PageGlob {
21
+ pages: Record<string, () => Promise<unknown>>;
22
+ layouts: Record<string, () => Promise<unknown>>;
23
+ pagesDir: string;
24
+ }
25
+ export interface ApiGlob {
26
+ routes: Record<string, () => Promise<unknown>>;
27
+ middlewares: Record<string, () => Promise<unknown>>;
28
+ apiDir: string;
29
+ }
30
+ interface BaseModule<TData, TParams> {
31
+ loader?: (ctx: LoaderContext<TParams>) => Promise<TData | Redirect | void> | TData | Redirect | void;
32
+ guard?: (ctx: LoaderContext<TParams>) => Promise<string | Redirect | Record<string, unknown> | null> | string | Redirect | Record<string, unknown> | null;
33
+ metadata?: Metadata;
34
+ generateMetadata?: (ctx: LoaderContext<TParams> & {
35
+ loaderData: TData;
36
+ }) => Promise<Metadata> | Metadata;
37
+ viewport?: Viewport;
38
+ generateViewport?: (ctx: LoaderContext<TParams>) => Promise<Viewport> | Viewport;
39
+ headers?: Record<string, string>;
40
+ }
41
+ export interface PageModule<TData = unknown, TParams = Record<string, string>> extends BaseModule<TData, TParams> {
42
+ default: React.ComponentType<PageProps<TData, TParams>>;
43
+ generateStaticParams?: () => Promise<Record<string, string>[]> | Record<string, string>[];
44
+ }
45
+ export interface LayoutModule<TData = unknown, TParams = Record<string, string>> extends BaseModule<TData, TParams> {
46
+ default: React.ComponentType<LayoutProps<TData, TParams>>;
47
+ lang?: string;
48
+ generateLang?: (ctx: LoaderContext<TParams> & {
49
+ loaderData: TData;
50
+ }) => Promise<string> | string;
51
+ }
52
+ export {};
@@ -0,0 +1 @@
1
+ export {};