@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.
- package/dist/cli/build.d.ts +1 -0
- package/dist/cli/build.js +86 -7
- package/dist/cli/build.js.map +4 -4
- package/dist/cli/dev-server.d.ts +1 -0
- package/dist/cli/dev-server.js +234 -0
- package/dist/cli/dev-server.js.map +7 -0
- package/dist/cli/dev.d.ts +1 -0
- package/dist/cli/dev.js +1 -1
- package/dist/cli/dev.js.map +3 -3
- package/dist/cli/generate.d.ts +1 -0
- package/dist/cli/generate.js +88 -9
- package/dist/cli/generate.js.map +4 -4
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +102 -23
- package/dist/cli/index.js.map +4 -4
- package/dist/cli/start.d.ts +1 -0
- package/dist/cli/start.js +1 -1
- package/dist/cli/start.js.map +3 -3
- package/dist/config.d.ts +22 -0
- package/dist/runtime/api-context.d.ts +24 -0
- package/dist/runtime/client-router.d.ts +13 -0
- package/dist/runtime/context.d.ts +32 -0
- package/dist/runtime/create-handler.d.ts +10 -0
- package/dist/runtime/error-boundary.d.ts +19 -0
- package/dist/runtime/fetch.d.ts +39 -0
- package/dist/runtime/head.d.ts +7 -0
- package/dist/runtime/head.js +1 -1
- package/dist/runtime/head.js.map +3 -3
- package/dist/runtime/index.d.ts +14 -0
- package/dist/runtime/index.js +1 -1
- package/dist/runtime/index.js.map +3 -3
- package/dist/runtime/link.d.ts +8 -0
- package/dist/runtime/metadata.d.ts +10 -0
- package/dist/runtime/router-provider.d.ts +25 -0
- package/dist/runtime/router-provider.js +1 -1
- package/dist/runtime/router-provider.js.map +3 -3
- package/dist/runtime/server-app.d.ts +15 -0
- package/dist/runtime/server-app.js +1 -1
- package/dist/runtime/server-app.js.map +3 -3
- package/dist/server/api-router.d.ts +22 -0
- package/dist/server/api.d.ts +2 -0
- package/dist/server/collect-css.d.ts +2 -0
- package/dist/server/handler-store.d.ts +10 -0
- package/dist/server/index.d.ts +6 -0
- package/dist/server/pages-router.d.ts +21 -0
- package/dist/server/public-index.d.ts +1 -0
- package/dist/server/render.d.ts +62 -0
- package/dist/server/render.js +1 -1
- package/dist/server/render.js.map +3 -3
- package/dist/server/routes.d.ts +11 -0
- package/dist/server/types.d.ts +52 -0
- package/dist/src/cli/dev-server.d.ts +1 -0
- package/dist/types.d.ts +49 -0
- package/dist/utils/async.d.ts +1 -0
- package/dist/utils/banner.d.ts +1 -0
- package/dist/utils/banner.js +1 -1
- package/dist/utils/banner.js.map +1 -1
- package/dist/utils/cookies.d.ts +12 -0
- package/dist/utils/duration.d.ts +1 -0
- package/dist/utils/env.d.ts +1 -0
- package/dist/utils/html.d.ts +2 -0
- package/dist/utils/load-config.d.ts +2 -0
- package/dist/utils/load-config.js +2 -0
- package/dist/utils/load-config.js.map +7 -0
- package/dist/utils/patterns.d.ts +1 -0
- package/dist/utils/response.d.ts +19 -0
- package/dist/vite/codegen/api.d.ts +6 -0
- package/dist/vite/codegen/client-routes.d.ts +6 -0
- package/dist/vite/codegen/context.d.ts +1 -0
- package/dist/vite/codegen/entry-client.d.ts +5 -0
- package/dist/vite/codegen/entry-client.js +11 -3
- package/dist/vite/codegen/entry-client.js.map +2 -2
- package/dist/vite/codegen/extract-methods.d.ts +4 -0
- package/dist/vite/codegen/render.d.ts +6 -0
- package/dist/vite/codegen/routes-dts.d.ts +10 -0
- package/dist/vite/codegen/scan-api.d.ts +2 -0
- package/dist/vite/codegen/server-entry.d.ts +6 -0
- package/dist/vite/codegen/server-entry.js +73 -0
- package/dist/vite/codegen/server-entry.js.map +7 -0
- package/dist/vite/codegen/write-routes-dts.d.ts +1 -0
- package/dist/vite/index.d.ts +3 -0
- package/dist/vite/index.js +84 -5
- package/dist/vite/index.js.map +4 -4
- 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
|
|
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
|
|
5
|
-
"mappings": "AAAA,OAAQ,iBAAAA,MAA4C,QAkCpD,
|
|
6
|
-
"names": ["createContext", "
|
|
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,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[]>;
|
package/dist/server/render.js
CHANGED
|
@@ -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,""")}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,""")}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, '"')\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, '"')\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 {};
|