@devlusoft/devix 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/cli/build.js +30 -308
  2. package/dist/cli/build.js.map +3 -3
  3. package/dist/cli/dev.js +32 -395
  4. package/dist/cli/dev.js.map +3 -3
  5. package/dist/cli/generate.js +30 -434
  6. package/dist/cli/generate.js.map +3 -3
  7. package/dist/cli/index.js +33 -698
  8. package/dist/cli/index.js.map +3 -3
  9. package/dist/cli/start.js +1 -89
  10. package/dist/cli/start.js.map +2 -2
  11. package/dist/config.js +1 -16
  12. package/dist/config.js.map +2 -2
  13. package/dist/runtime/api-context.js +1 -17
  14. package/dist/runtime/api-context.js.map +2 -2
  15. package/dist/runtime/client-router.js +1 -58
  16. package/dist/runtime/client-router.js.map +2 -2
  17. package/dist/runtime/context.js +1 -14
  18. package/dist/runtime/context.js.map +2 -2
  19. package/dist/runtime/error-boundary.js +1 -36
  20. package/dist/runtime/error-boundary.js.map +2 -2
  21. package/dist/runtime/fetch.js +1 -34
  22. package/dist/runtime/fetch.js.map +2 -2
  23. package/dist/runtime/head.js +1 -68
  24. package/dist/runtime/head.js.map +2 -2
  25. package/dist/runtime/index.d.ts +1 -0
  26. package/dist/runtime/index.js +1 -367
  27. package/dist/runtime/index.js.map +3 -3
  28. package/dist/runtime/link.js +1 -42
  29. package/dist/runtime/link.js.map +2 -2
  30. package/dist/runtime/metadata.js +1 -21
  31. package/dist/runtime/metadata.js.map +2 -2
  32. package/dist/runtime/router-provider.js +1 -258
  33. package/dist/runtime/router-provider.js.map +2 -2
  34. package/dist/server/api-router.js +1 -64
  35. package/dist/server/api-router.js.map +2 -2
  36. package/dist/server/api.js +1 -123
  37. package/dist/server/api.js.map +2 -2
  38. package/dist/server/collect-css.js +1 -14
  39. package/dist/server/collect-css.js.map +2 -2
  40. package/dist/server/index.js +1 -132
  41. package/dist/server/index.js.map +2 -2
  42. package/dist/server/pages-router.js +1 -63
  43. package/dist/server/pages-router.js.map +2 -2
  44. package/dist/server/render.js +1 -305
  45. package/dist/server/render.js.map +2 -2
  46. package/dist/server/routes.js +1 -41
  47. package/dist/server/routes.js.map +2 -2
  48. package/dist/utils/async.js +1 -13
  49. package/dist/utils/async.js.map +2 -2
  50. package/dist/utils/banner.js +1 -33
  51. package/dist/utils/banner.js.map +2 -2
  52. package/dist/utils/cookies.js +1 -28
  53. package/dist/utils/cookies.js.map +2 -2
  54. package/dist/utils/duration.js +1 -21
  55. package/dist/utils/duration.js.map +2 -2
  56. package/dist/utils/env.js +1 -13
  57. package/dist/utils/env.js.map +2 -2
  58. package/dist/utils/html.js +1 -11
  59. package/dist/utils/html.js.map +2 -2
  60. package/dist/utils/patterns.js +1 -7
  61. package/dist/utils/patterns.js.map +2 -2
  62. package/dist/utils/response.d.ts +4 -1
  63. package/dist/utils/response.js +1 -9
  64. package/dist/utils/response.js.map +3 -3
  65. package/dist/vite/codegen/api.js +6 -12
  66. package/dist/vite/codegen/api.js.map +2 -2
  67. package/dist/vite/codegen/client-routes.js +6 -12
  68. package/dist/vite/codegen/client-routes.js.map +2 -2
  69. package/dist/vite/codegen/context.js +2 -8
  70. package/dist/vite/codegen/context.js.map +2 -2
  71. package/dist/vite/codegen/entry-client.js +4 -10
  72. package/dist/vite/codegen/entry-client.js.map +2 -2
  73. package/dist/vite/codegen/extract-methods.js +1 -15
  74. package/dist/vite/codegen/extract-methods.js.map +2 -2
  75. package/dist/vite/codegen/render.js +6 -12
  76. package/dist/vite/codegen/render.js.map +2 -2
  77. package/dist/vite/codegen/routes-dts.js +11 -49
  78. package/dist/vite/codegen/routes-dts.js.map +3 -3
  79. package/dist/vite/codegen/scan-api.js +1 -77
  80. package/dist/vite/codegen/scan-api.js.map +3 -3
  81. package/dist/vite/codegen/write-routes-dts.js +1 -16
  82. package/dist/vite/codegen/write-routes-dts.js.map +2 -2
  83. package/dist/vite/index.js +30 -247
  84. package/dist/vite/index.js.map +3 -3
  85. package/package.json +2 -2
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/runtime/router-provider.tsx", "../../src/runtime/head.tsx", "../../src/runtime/context.tsx", "../../src/runtime/error-boundary.tsx"],
4
4
  "sourcesContent": ["import {ComponentType, ReactNode, useCallback, useContext, useEffect, useRef, useState} from \"react\";\nimport {RouterContext} from 'virtual:devix/context'\nimport {ErrorProps, LayoutProps, PageProps} from \"../server/types\";\nimport {Metadata, Viewport} from \"../types\";\nimport {getDefaultErrorPage, loadErrorPage, matchClientRoute} from \"virtual:devix/client-routes\";\nimport {buildHeadNodes} from \"./head\";\nimport {PageMetaContext, RouteDataContext} from \"./context\";\nimport {DevixErrorBoundary} from \"./error-boundary\";\n\ninterface RouteState {\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 pendingError?: ErrorProps\n ErrorPage?: ComponentType<ErrorProps>\n}\n\nexport function useRouter() {\n return useContext(RouterContext)\n}\n\nexport function useNavigate() {\n const ctx = useContext(RouterContext)\n if (!ctx) throw new Error(\"useNavigate must be used within a RouterProvider\")\n return ctx.navigate\n}\n\nexport function useParams<T extends Record<string, string>>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useParams must be used within a route or layout\")\n return ctx.params as T\n}\n\ntype LoaderReturnType<T> = T extends (...args: any[]) => Promise<infer R>\n ? R\n : T extends (...args: any[]) => infer R\n ? R\n : T\n\nexport function useLoaderData<T>() {\n const ctx = useContext(RouteDataContext)\n if (!ctx) throw new Error(\"useLoaderData must be used within a route or layout\")\n return ctx.loaderData as LoaderReturnType<T>\n}\n\n\ninterface RouterProviderProps {\n initialData: unknown\n initialParams: Record<string, string>\n initialPage: ComponentType<PageProps>\n initialLayouts?: ComponentType<LayoutProps>[]\n initialLayoutsData?: unknown[]\n initialMeta?: Metadata | null\n initialViewport?: Viewport\n initialError?: ErrorProps\n initialErrorPage?: ComponentType<ErrorProps>\n clientEntry: string\n}\n\nexport function RouterProvider({\n initialData,\n initialParams,\n initialPage,\n initialLayouts = [],\n initialLayoutsData = [],\n initialMeta,\n initialViewport,\n initialError,\n initialErrorPage,\n clientEntry,\n }: RouterProviderProps) {\n\n const [state, setState] = useState<RouteState>({\n pathname: window.location.pathname,\n params: initialParams,\n loaderData: initialData,\n layoutsData: initialLayoutsData,\n Page: initialPage,\n layouts: initialLayouts,\n metadata: initialMeta ?? null,\n viewport: initialViewport,\n pendingError: initialError,\n ErrorPage: initialErrorPage,\n })\n\n const navigatingRef = useRef<AbortController | null>(null)\n const [isNavigating, setIsNavigating] = useState(false)\n\n const loadRoute = useCallback(async (to: string, controller: AbortController) => {\n const pathname = to.split('?')[0]\n const matched = matchClientRoute(pathname)\n if (!matched) {\n const ErrorPage = await loadErrorPage() ?? getDefaultErrorPage()\n setState(prev => ({\n ...prev,\n pathname: pathname,\n pendingError: {statusCode: 404, message: 'Not found'},\n ErrorPage: ErrorPage ?? undefined,\n }))\n return\n }\n\n const [pageMod, ...layoutMods] = await Promise.all([\n matched.load(),\n ...matched.loadLayouts.map(l => l()),\n ])\n\n if (controller.signal.aborted) return\n if (!pageMod.default) return\n\n const dataRes = await fetch(`/_data${to}`, {\n headers: {Accept: 'application/json'},\n signal: controller.signal,\n })\n\n if (controller.signal.aborted) return\n\n if (!dataRes.ok) {\n if (dataRes.status === 404) {\n window.location.href = to\n return\n }\n console.error(`/_data${to} returned ${dataRes.status}`)\n return\n }\n\n const data = await dataRes.json()\n\n window.scrollTo(0, 0)\n setState({\n pathname,\n params: data.params ?? {},\n loaderData: data.loaderData,\n layoutsData: (data.layouts ?? []).map((l: any) => l.loaderData),\n Page: pageMod.default,\n layouts: layoutMods.map(m => m.default),\n metadata: data.metadata ?? null,\n viewport: data.viewport,\n })\n }, [])\n\n const navigate = useCallback(async (to: string) => {\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n setIsNavigating(true)\n try {\n window.history.pushState(null, \"\", to)\n await loadRoute(to, controller)\n } finally {\n if (!controller.signal.aborted) setIsNavigating(false)\n }\n }, [loadRoute])\n\n useEffect(() => {\n const handlePop = () => {\n navigatingRef.current?.abort()\n const controller = new AbortController()\n navigatingRef.current = controller\n\n const to = window.location.pathname + window.location.search\n loadRoute(to, controller).catch(err => {\n if (err.name !== 'AbortError') console.error('[router] popstate error:', err)\n })\n }\n window.addEventListener(\"popstate\", handlePop)\n return () => window.removeEventListener(\"popstate\", handlePop)\n }, [loadRoute])\n\n let content: ReactNode\n\n if (state.pendingError) {\n content = state.ErrorPage\n ? <state.ErrorPage {...state.pendingError} />\n : <h1>{state.pendingError.statusCode}</h1>\n } else {\n let tree: ReactNode = (\n <RouteDataContext value={{loaderData: state.loaderData, params: state.params}}>\n <state.Page data={state.loaderData} params={state.params} url={state.pathname}/>\n </RouteDataContext>\n )\n\n for (let i = state.layouts.length - 1; i >= 0; i--) {\n const Layout = state.layouts[i]\n const layoutData = state.layoutsData[i]\n tree = (\n <RouteDataContext value={{loaderData: layoutData, params: state.params}}>\n <Layout data={layoutData} params={state.params}>{tree}</Layout>\n </RouteDataContext>\n )\n }\n\n content = (\n <DevixErrorBoundary key={state.pathname} ErrorPage={state.ErrorPage}>\n {tree}\n </DevixErrorBoundary>\n )\n }\n\n return (\n <PageMetaContext value={{\n metadata: state.metadata,\n viewport: state.viewport,\n clientEntry,\n }}>\n {state.metadata && buildHeadNodes(state.metadata, state.viewport)}\n <RouterContext value={{...state, isNavigating, navigate}}>\n {content}\n </RouterContext>\n </PageMetaContext>\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 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 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) => 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"],
5
- "mappings": "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",
6
- "names": ["RouterContext", "jsx", "jsx", "RouterContext"]
5
+ "mappings": "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",
6
+ "names": ["useCallback", "useContext", "useEffect", "useRef", "useState", "RouterContext", "getDefaultErrorPage", "loadErrorPage", "matchClientRoute", "Fragment", "jsx", "collectTags", "metadata", "viewport", "tags", "ogTitle", "ogDesc", "twTitle", "twDesc", "lang", "href", "parts", "buildHeadNodes", "t", "i", "createContext", "g", "RouterContext", "PageMetaContext", "RouteDataContext", "Component", "jsx", "DevixErrorBoundary", "err", "DevixError", "statusCode", "message", "jsx", "jsxs", "useRouter", "useContext", "RouterContext", "useNavigate", "ctx", "useParams", "RouteDataContext", "useLoaderData", "RouterProvider", "initialData", "initialParams", "initialPage", "initialLayouts", "initialLayoutsData", "initialMeta", "initialViewport", "initialError", "initialErrorPage", "clientEntry", "state", "setState", "useState", "navigatingRef", "useRef", "isNavigating", "setIsNavigating", "loadRoute", "useCallback", "to", "controller", "pathname", "matched", "matchClientRoute", "ErrorPage", "loadErrorPage", "getDefaultErrorPage", "prev", "pageMod", "layoutMods", "l", "dataRes", "data", "m", "navigate", "useEffect", "handlePop", "err", "content", "tree", "i", "Layout", "layoutData", "DevixErrorBoundary", "PageMetaContext", "buildHeadNodes"]
7
7
  }
@@ -1,65 +1,2 @@
1
- // src/utils/patterns.ts
2
- function routePattern(rel) {
3
- return rel.replace(/\.(tsx|ts|jsx|js)$/, "").replace(/\(.*?\)\//g, "").replace(/^index$|\/index$/, "").replace(/\[([^\]]+)]/g, ":$1") || "/";
4
- }
5
-
6
- // src/server/api-router.ts
7
- function keyToRoutePattern(key, apiDir) {
8
- const rel = key.slice(apiDir.length + 1).replace(/\\/g, "/");
9
- const pattern = routePattern(rel);
10
- return pattern === "/" ? "/api" : `/api/${pattern}`.replace("/api//", "/api/");
11
- }
12
- function keyToDir(key) {
13
- return key.slice(0, key.lastIndexOf("/"));
14
- }
15
- var cache = null;
16
- function invalidateApiCache() {
17
- cache = null;
18
- }
19
- function buildRoutes(routeKeys, middlewareKeys, apiDir) {
20
- if (cache) return cache;
21
- const routes = [];
22
- const middlewares = [];
23
- for (const key of middlewareKeys) {
24
- middlewares.push({ dir: keyToDir(key), key });
25
- }
26
- for (const key of routeKeys) {
27
- const pattern = keyToRoutePattern(key, apiDir);
28
- const params = [...pattern.matchAll(/:([^/]+)/g)].map((m) => m[1]);
29
- const regexStr = pattern.replace(/:[^/]+/g, "([^/]+)").replace(/\//g, "\\/");
30
- routes.push({ path: pattern, key, params, regex: new RegExp(`^${regexStr}$`) });
31
- }
32
- routes.sort((a, b) => {
33
- const aScore = (a.path.match(/:/g) || []).length;
34
- const bScore = (b.path.match(/:/g) || []).length;
35
- if (aScore !== bScore) return aScore - bScore;
36
- return b.path.length - a.path.length;
37
- });
38
- cache = { routes, middlewares };
39
- return cache;
40
- }
41
- function collectMiddlewareChain(routeKey, middlewares) {
42
- const routeDir = keyToDir(routeKey);
43
- return middlewares.filter((mw) => routeDir.startsWith(mw.dir)).sort((a, b) => a.dir.split("/").length - b.dir.split("/").length);
44
- }
45
- function matchRoute(pathname, routes) {
46
- for (const route of routes) {
47
- const match = pathname.match(route.regex);
48
- if (match) {
49
- const params = {};
50
- route.params.forEach((name, i) => {
51
- params[name] = decodeURIComponent(match[i + 1]);
52
- });
53
- return { route, params };
54
- }
55
- }
56
- return null;
57
- }
58
- export {
59
- buildRoutes,
60
- collectMiddlewareChain,
61
- invalidateApiCache,
62
- keyToRoutePattern,
63
- matchRoute
64
- };
1
+ function l(e){return e.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}function d(e,o){let n=e.slice(o.length+1).replace(/\\/g,"/"),t=l(n);return t==="/"?"/api":`/api/${t}`.replace("/api//","/api/")}function u(e){return e.slice(0,e.lastIndexOf("/"))}var a=null;function x(){a=null}function m(e,o,n){if(a)return a;let t=[],s=[];for(let r of o)s.push({dir:u(r),key:r});for(let r of e){let i=d(r,n),p=[...i.matchAll(/:([^/]+)/g)].map(g=>g[1]),c=i.replace(/:[^/]+/g,"([^/]+)").replace(/\//g,"\\/");t.push({path:i,key:r,params:p,regex:new RegExp(`^${c}$`)})}return t.sort((r,i)=>{let p=(r.path.match(/:/g)||[]).length,c=(i.path.match(/:/g)||[]).length;return p!==c?p-c:i.path.length-r.path.length}),a={routes:t,middlewares:s},a}function R(e,o){let n=u(e);return o.filter(t=>n.startsWith(t.dir)).sort((t,s)=>t.dir.split("/").length-s.dir.split("/").length)}function A(e,o){for(let n of o){let t=e.match(n.regex);if(t){let s={};return n.params.forEach((r,i)=>{s[r]=decodeURIComponent(t[i+1])}),{route:n,params:s}}}return null}export{m as buildRoutes,R as collectMiddlewareChain,x as invalidateApiCache,d as keyToRoutePattern,A as matchRoute};
65
2
  //# sourceMappingURL=api-router.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/patterns.ts", "../../src/server/api-router.ts"],
4
4
  "sourcesContent": ["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 ApiRoute {\n path: string\n key: string\n params: string[]\n regex: RegExp\n}\n\nexport interface ApiMiddleware {\n dir: string\n key: string\n}\n\nexport interface ApiResult {\n routes: ApiRoute[]\n middlewares: ApiMiddleware[]\n}\n\nexport function keyToRoutePattern(key: string, apiDir: string): string {\n const rel = key.slice(apiDir.length + 1).replace(/\\\\/g, '/')\n const pattern = routePattern(rel)\n return pattern === '/' ? '/api' : `/api/${pattern}`.replace('/api//', '/api/')\n}\n\nfunction keyToDir(key: string): string {\n return key.slice(0, key.lastIndexOf('/'))\n}\n\nlet cache: ApiResult | null = null\n\nexport function invalidateApiCache() {\n cache = null\n}\n\nexport function buildRoutes(routeKeys: string[], middlewareKeys: string[], apiDir: string): ApiResult {\n if (cache) return cache\n\n const routes: ApiRoute[] = []\n const middlewares: ApiMiddleware[] = []\n\n for (const key of middlewareKeys) {\n middlewares.push({dir: keyToDir(key), key})\n }\n\n for (const key of routeKeys) {\n const pattern = keyToRoutePattern(key, apiDir)\n const params = [...pattern.matchAll(/:([^/]+)/g)].map(m => m[1])\n const regexStr = pattern\n .replace(/:[^/]+/g, '([^/]+)')\n .replace(/\\//g, '\\\\/')\n routes.push({path: pattern, key, params, regex: new RegExp(`^${regexStr}$`)})\n }\n routes.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 = {routes, middlewares}\n return cache\n}\n\nexport function collectMiddlewareChain(routeKey: string, middlewares: ApiMiddleware[]): ApiMiddleware[] {\n const routeDir = keyToDir(routeKey)\n\n return middlewares\n .filter(mw => routeDir.startsWith(mw.dir))\n .sort((a, b) => a.dir.split('/').length - b.dir.split('/').length)\n}\n\nexport function matchRoute(\n pathname: string,\n routes: ApiRoute[]\n): {route: ApiRoute; params: Record<string, string>} | null {\n for (const route of routes) {\n const match = pathname.match(route.regex)\n if (match) {\n const params: Record<string, string> = {}\n route.params.forEach((name, i) => {\n params[name] = decodeURIComponent(match[i + 1])\n })\n return {route, params}\n }\n }\n return null\n}\n"],
5
- "mappings": ";AAAO,SAAS,aAAa,KAAqB;AAC9C,SAAO,IACE,QAAQ,sBAAsB,EAAE,EAChC,QAAQ,cAAc,EAAE,EACxB,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,gBAAgB,KAAK,KAC/B;AACX;;;ACYO,SAAS,kBAAkB,KAAa,QAAwB;AACnE,QAAM,MAAM,IAAI,MAAM,OAAO,SAAS,CAAC,EAAE,QAAQ,OAAO,GAAG;AAC3D,QAAM,UAAU,aAAa,GAAG;AAChC,SAAO,YAAY,MAAM,SAAS,QAAQ,OAAO,GAAG,QAAQ,UAAU,OAAO;AACjF;AAEA,SAAS,SAAS,KAAqB;AACnC,SAAO,IAAI,MAAM,GAAG,IAAI,YAAY,GAAG,CAAC;AAC5C;AAEA,IAAI,QAA0B;AAEvB,SAAS,qBAAqB;AACjC,UAAQ;AACZ;AAEO,SAAS,YAAY,WAAqB,gBAA0B,QAA2B;AAClG,MAAI,MAAO,QAAO;AAElB,QAAM,SAAqB,CAAC;AAC5B,QAAM,cAA+B,CAAC;AAEtC,aAAW,OAAO,gBAAgB;AAC9B,gBAAY,KAAK,EAAC,KAAK,SAAS,GAAG,GAAG,IAAG,CAAC;AAAA,EAC9C;AAEA,aAAW,OAAO,WAAW;AACzB,UAAM,UAAU,kBAAkB,KAAK,MAAM;AAC7C,UAAM,SAAS,CAAC,GAAG,QAAQ,SAAS,WAAW,CAAC,EAAE,IAAI,OAAK,EAAE,CAAC,CAAC;AAC/D,UAAM,WAAW,QACZ,QAAQ,WAAW,SAAS,EAC5B,QAAQ,OAAO,KAAK;AACzB,WAAO,KAAK,EAAC,MAAM,SAAS,KAAK,QAAQ,OAAO,IAAI,OAAO,IAAI,QAAQ,GAAG,EAAC,CAAC;AAAA,EAChF;AACA,SAAO,KAAK,CAAC,GAAG,MAAM;AAClB,UAAM,UAAU,EAAE,KAAK,MAAM,IAAI,KAAK,CAAC,GAAG;AAC1C,UAAM,UAAU,EAAE,KAAK,MAAM,IAAI,KAAK,CAAC,GAAG;AAC1C,QAAI,WAAW,OAAQ,QAAO,SAAS;AACvC,WAAO,EAAE,KAAK,SAAS,EAAE,KAAK;AAAA,EAClC,CAAC;AAED,UAAQ,EAAC,QAAQ,YAAW;AAC5B,SAAO;AACX;AAEO,SAAS,uBAAuB,UAAkB,aAA+C;AACpG,QAAM,WAAW,SAAS,QAAQ;AAElC,SAAO,YACF,OAAO,QAAM,SAAS,WAAW,GAAG,GAAG,CAAC,EACxC,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,MAAM,GAAG,EAAE,SAAS,EAAE,IAAI,MAAM,GAAG,EAAE,MAAM;AACzE;AAEO,SAAS,WACZ,UACA,QACwD;AACxD,aAAW,SAAS,QAAQ;AACxB,UAAM,QAAQ,SAAS,MAAM,MAAM,KAAK;AACxC,QAAI,OAAO;AACP,YAAM,SAAiC,CAAC;AACxC,YAAM,OAAO,QAAQ,CAAC,MAAM,MAAM;AAC9B,eAAO,IAAI,IAAI,mBAAmB,MAAM,IAAI,CAAC,CAAC;AAAA,MAClD,CAAC;AACD,aAAO,EAAC,OAAO,OAAM;AAAA,IACzB;AAAA,EACJ;AACA,SAAO;AACX;",
6
- "names": []
5
+ "mappings": "AAAO,SAASA,EAAaC,EAAqB,CAC9C,OAAOA,EACE,QAAQ,qBAAsB,EAAE,EAChC,QAAQ,aAAc,EAAE,EACxB,QAAQ,mBAAoB,EAAE,EAC9B,QAAQ,eAAgB,KAAK,GAC/B,GACX,CCYO,SAASC,EAAkBC,EAAaC,EAAwB,CACnE,IAAMC,EAAMF,EAAI,MAAMC,EAAO,OAAS,CAAC,EAAE,QAAQ,MAAO,GAAG,EACrDE,EAAUC,EAAaF,CAAG,EAChC,OAAOC,IAAY,IAAM,OAAS,QAAQA,CAAO,GAAG,QAAQ,SAAU,OAAO,CACjF,CAEA,SAASE,EAASL,EAAqB,CACnC,OAAOA,EAAI,MAAM,EAAGA,EAAI,YAAY,GAAG,CAAC,CAC5C,CAEA,IAAIM,EAA0B,KAEvB,SAASC,GAAqB,CACjCD,EAAQ,IACZ,CAEO,SAASE,EAAYC,EAAqBC,EAA0BT,EAA2B,CAClG,GAAIK,EAAO,OAAOA,EAElB,IAAMK,EAAqB,CAAC,EACtBC,EAA+B,CAAC,EAEtC,QAAWZ,KAAOU,EACdE,EAAY,KAAK,CAAC,IAAKP,EAASL,CAAG,EAAG,IAAAA,CAAG,CAAC,EAG9C,QAAWA,KAAOS,EAAW,CACzB,IAAMN,EAAUJ,EAAkBC,EAAKC,CAAM,EACvCY,EAAS,CAAC,GAAGV,EAAQ,SAAS,WAAW,CAAC,EAAE,IAAIW,GAAKA,EAAE,CAAC,CAAC,EACzDC,EAAWZ,EACZ,QAAQ,UAAW,SAAS,EAC5B,QAAQ,MAAO,KAAK,EACzBQ,EAAO,KAAK,CAAC,KAAMR,EAAS,IAAAH,EAAK,OAAAa,EAAQ,MAAO,IAAI,OAAO,IAAIE,CAAQ,GAAG,CAAC,CAAC,CAChF,CACA,OAAAJ,EAAO,KAAK,CAACK,EAAGC,IAAM,CAClB,IAAMC,GAAUF,EAAE,KAAK,MAAM,IAAI,GAAK,CAAC,GAAG,OACpCG,GAAUF,EAAE,KAAK,MAAM,IAAI,GAAK,CAAC,GAAG,OAC1C,OAAIC,IAAWC,EAAeD,EAASC,EAChCF,EAAE,KAAK,OAASD,EAAE,KAAK,MAClC,CAAC,EAEDV,EAAQ,CAAC,OAAAK,EAAQ,YAAAC,CAAW,EACrBN,CACX,CAEO,SAASc,EAAuBC,EAAkBT,EAA+C,CACpG,IAAMU,EAAWjB,EAASgB,CAAQ,EAElC,OAAOT,EACF,OAAOW,GAAMD,EAAS,WAAWC,EAAG,GAAG,CAAC,EACxC,KAAK,CAACP,EAAGC,IAAMD,EAAE,IAAI,MAAM,GAAG,EAAE,OAASC,EAAE,IAAI,MAAM,GAAG,EAAE,MAAM,CACzE,CAEO,SAASO,EACZC,EACAd,EACwD,CACxD,QAAWe,KAASf,EAAQ,CACxB,IAAMgB,EAAQF,EAAS,MAAMC,EAAM,KAAK,EACxC,GAAIC,EAAO,CACP,IAAMd,EAAiC,CAAC,EACxC,OAAAa,EAAM,OAAO,QAAQ,CAACE,EAAM,IAAM,CAC9Bf,EAAOe,CAAI,EAAI,mBAAmBD,EAAM,EAAI,CAAC,CAAC,CAClD,CAAC,EACM,CAAC,MAAAD,EAAO,OAAAb,CAAM,CACzB,CACJ,CACA,OAAO,IACX",
6
+ "names": ["routePattern", "rel", "keyToRoutePattern", "key", "apiDir", "rel", "pattern", "routePattern", "keyToDir", "cache", "invalidateApiCache", "buildRoutes", "routeKeys", "middlewareKeys", "routes", "middlewares", "params", "m", "regexStr", "a", "b", "aScore", "bScore", "collectMiddlewareChain", "routeKey", "routeDir", "mw", "matchRoute", "pathname", "route", "match", "name"]
7
7
  }
@@ -1,124 +1,2 @@
1
- // src/utils/patterns.ts
2
- function routePattern(rel) {
3
- return rel.replace(/\.(tsx|ts|jsx|js)$/, "").replace(/\(.*?\)\//g, "").replace(/^index$|\/index$/, "").replace(/\[([^\]]+)]/g, ":$1") || "/";
4
- }
5
-
6
- // src/server/api-router.ts
7
- function keyToRoutePattern(key, apiDir) {
8
- const rel = key.slice(apiDir.length + 1).replace(/\\/g, "/");
9
- const pattern = routePattern(rel);
10
- return pattern === "/" ? "/api" : `/api/${pattern}`.replace("/api//", "/api/");
11
- }
12
- function keyToDir(key) {
13
- return key.slice(0, key.lastIndexOf("/"));
14
- }
15
- var cache = null;
16
- function buildRoutes(routeKeys, middlewareKeys, apiDir) {
17
- if (cache) return cache;
18
- const routes = [];
19
- const middlewares = [];
20
- for (const key of middlewareKeys) {
21
- middlewares.push({ dir: keyToDir(key), key });
22
- }
23
- for (const key of routeKeys) {
24
- const pattern = keyToRoutePattern(key, apiDir);
25
- const params = [...pattern.matchAll(/:([^/]+)/g)].map((m) => m[1]);
26
- const regexStr = pattern.replace(/:[^/]+/g, "([^/]+)").replace(/\//g, "\\/");
27
- routes.push({ path: pattern, key, params, regex: new RegExp(`^${regexStr}$`) });
28
- }
29
- routes.sort((a, b) => {
30
- const aScore = (a.path.match(/:/g) || []).length;
31
- const bScore = (b.path.match(/:/g) || []).length;
32
- if (aScore !== bScore) return aScore - bScore;
33
- return b.path.length - a.path.length;
34
- });
35
- cache = { routes, middlewares };
36
- return cache;
37
- }
38
- function collectMiddlewareChain(routeKey, middlewares) {
39
- const routeDir = keyToDir(routeKey);
40
- return middlewares.filter((mw) => routeDir.startsWith(mw.dir)).sort((a, b) => a.dir.split("/").length - b.dir.split("/").length);
41
- }
42
- function matchRoute(pathname, routes) {
43
- for (const route of routes) {
44
- const match = pathname.match(route.regex);
45
- if (match) {
46
- const params = {};
47
- route.params.forEach((name, i) => {
48
- params[name] = decodeURIComponent(match[i + 1]);
49
- });
50
- return { route, params };
51
- }
52
- }
53
- return null;
54
- }
55
-
56
- // src/runtime/api-context.ts
57
- var RouteContext = class {
58
- params;
59
- _state = /* @__PURE__ */ new Map();
60
- constructor(params = {}) {
61
- this.params = params;
62
- }
63
- set(key, value) {
64
- this._state.set(key, value);
65
- }
66
- get(key) {
67
- return this._state.get(key);
68
- }
69
- };
70
-
71
- // src/runtime/error-boundary.tsx
72
- import { Component } from "react";
73
- import { jsx } from "react/jsx-runtime";
74
- var DevixError = class extends Error {
75
- statusCode;
76
- constructor(statusCode, message) {
77
- super(message);
78
- this.statusCode = statusCode;
79
- }
80
- };
81
-
82
- // src/server/api.ts
83
- async function handleApiRequest(url, request, glob) {
84
- try {
85
- const { pathname } = new URL(url, "http://localhost");
86
- const { routes, middlewares } = buildRoutes(
87
- Object.keys(glob.routes),
88
- Object.keys(glob.middlewares),
89
- glob.apiDir
90
- );
91
- const matched = matchRoute(pathname, routes);
92
- if (!matched) return new Response("Not Found", { status: 404 });
93
- const { route, params } = matched;
94
- const ctx = new RouteContext(params);
95
- const middlewareChain = collectMiddlewareChain(route.key, middlewares);
96
- for (const mw of middlewareChain) {
97
- const mod2 = await glob.middlewares[mw.key]();
98
- if (mod2.middleware) {
99
- const result2 = await mod2.middleware(ctx, request);
100
- if (result2 instanceof Response) return result2;
101
- }
102
- }
103
- const mod = await glob.routes[route.key]();
104
- const method = request.method.toUpperCase();
105
- const handler = mod[method];
106
- if (!handler) return new Response("Method Not Allowed", { status: 405 });
107
- const result = await handler(ctx, request);
108
- if (result instanceof Response) return result;
109
- if (result == null) return new Response(null, { status: 204 });
110
- return new Response(JSON.stringify(result), {
111
- headers: { "Content-Type": "application/json" }
112
- });
113
- } catch (err) {
114
- console.error("[devix] api error:", err);
115
- if (err instanceof DevixError) {
116
- return new Response(err.message, { status: err.statusCode });
117
- }
118
- return new Response("Internal Server Error", { status: 500 });
119
- }
120
- }
121
- export {
122
- handleApiRequest
123
- };
1
+ function h(o){return o.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}function k(o,t){let r=o.slice(t.length+1).replace(/\\/g,"/"),e=h(r);return e==="/"?"/api":`/api/${e}`.replace("/api//","/api/")}function w(o){return o.slice(0,o.lastIndexOf("/"))}var c=null;function x(o,t,r){if(c)return c;let e=[],i=[];for(let n of t)i.push({dir:w(n),key:n});for(let n of o){let s=k(n,r),a=[...s.matchAll(/:([^/]+)/g)].map(p=>p[1]),u=s.replace(/:[^/]+/g,"([^/]+)").replace(/\//g,"\\/");e.push({path:s,key:n,params:a,regex:new RegExp(`^${u}$`)})}return e.sort((n,s)=>{let a=(n.path.match(/:/g)||[]).length,u=(s.path.match(/:/g)||[]).length;return a!==u?a-u:s.path.length-n.path.length}),c={routes:e,middlewares:i},c}function y(o,t){let r=w(o);return t.filter(e=>r.startsWith(e.dir)).sort((e,i)=>e.dir.split("/").length-i.dir.split("/").length)}function A(o,t){for(let r of t){let e=o.match(r.regex);if(e){let i={};return r.params.forEach((n,s)=>{i[n]=decodeURIComponent(e[s+1])}),{route:r,params:i}}}return null}var d=class{params;_state=new Map;constructor(t={}){this.params=t}set(t,r){this._state.set(t,r)}get(t){return this._state.get(t)}};import{Component as v}from"react";import{jsx as b}from"react/jsx-runtime";var m=class extends Error{statusCode;constructor(t,r){super(r),this.statusCode=t}};async function _(o,t,r){try{let{pathname:e}=new URL(o,"http://localhost"),{routes:i,middlewares:n}=x(Object.keys(r.routes),Object.keys(r.middlewares),r.apiDir),s=A(e,i);if(!s)return new Response("Not Found",{status:404});let{route:a,params:u}=s,p=new d(u),C=y(a.key,n);for(let E of C){let R=await r.middlewares[E.key]();if(R.middleware){let f=await R.middleware(p,t);if(f instanceof Response)return f}}let M=await r.routes[a.key](),P=t.method.toUpperCase(),g=M[P];if(!g)return new Response("Method Not Allowed",{status:405});let l=await g(p,t);return l instanceof Response?l:l==null?new Response(null,{status:204}):new Response(JSON.stringify(l),{headers:{"Content-Type":"application/json"}})}catch(e){return console.error("[devix] api error:",e),e instanceof m?new Response(e.message,{status:e.statusCode}):new Response("Internal Server Error",{status:500})}}export{_ as handleApiRequest};
124
2
  //# sourceMappingURL=api.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/patterns.ts", "../../src/server/api-router.ts", "../../src/runtime/api-context.ts", "../../src/runtime/error-boundary.tsx", "../../src/server/api.ts"],
4
4
  "sourcesContent": ["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 ApiRoute {\n path: string\n key: string\n params: string[]\n regex: RegExp\n}\n\nexport interface ApiMiddleware {\n dir: string\n key: string\n}\n\nexport interface ApiResult {\n routes: ApiRoute[]\n middlewares: ApiMiddleware[]\n}\n\nexport function keyToRoutePattern(key: string, apiDir: string): string {\n const rel = key.slice(apiDir.length + 1).replace(/\\\\/g, '/')\n const pattern = routePattern(rel)\n return pattern === '/' ? '/api' : `/api/${pattern}`.replace('/api//', '/api/')\n}\n\nfunction keyToDir(key: string): string {\n return key.slice(0, key.lastIndexOf('/'))\n}\n\nlet cache: ApiResult | null = null\n\nexport function invalidateApiCache() {\n cache = null\n}\n\nexport function buildRoutes(routeKeys: string[], middlewareKeys: string[], apiDir: string): ApiResult {\n if (cache) return cache\n\n const routes: ApiRoute[] = []\n const middlewares: ApiMiddleware[] = []\n\n for (const key of middlewareKeys) {\n middlewares.push({dir: keyToDir(key), key})\n }\n\n for (const key of routeKeys) {\n const pattern = keyToRoutePattern(key, apiDir)\n const params = [...pattern.matchAll(/:([^/]+)/g)].map(m => m[1])\n const regexStr = pattern\n .replace(/:[^/]+/g, '([^/]+)')\n .replace(/\\//g, '\\\\/')\n routes.push({path: pattern, key, params, regex: new RegExp(`^${regexStr}$`)})\n }\n routes.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 = {routes, middlewares}\n return cache\n}\n\nexport function collectMiddlewareChain(routeKey: string, middlewares: ApiMiddleware[]): ApiMiddleware[] {\n const routeDir = keyToDir(routeKey)\n\n return middlewares\n .filter(mw => routeDir.startsWith(mw.dir))\n .sort((a, b) => a.dir.split('/').length - b.dir.split('/').length)\n}\n\nexport function matchRoute(\n pathname: string,\n routes: ApiRoute[]\n): {route: ApiRoute; params: Record<string, string>} | null {\n for (const route of routes) {\n const match = pathname.match(route.regex)\n if (match) {\n const params: Record<string, string> = {}\n route.params.forEach((name, i) => {\n params[name] = decodeURIComponent(match[i + 1])\n })\n return {route, params}\n }\n }\n return null\n}\n", "export class RouteContext {\n readonly params: Record<string, string>\n private _state = new Map<string, unknown>()\n\n constructor(params: Record<string, string> = {}) {\n this.params = params\n }\n\n set<T>(key: string, value: T): void {\n this._state.set(key, value)\n }\n\n get<T>(key: string): T | undefined {\n return this._state.get(key) as T\n }\n}\n\nexport type RouteResult = Response | Record<string, unknown> | unknown[] | null | void\n\nexport type RouteHandler = (ctx: RouteContext, req: Request) => Promise<RouteResult> | RouteResult\n\nexport interface MiddlewareModule {\n middleware: (ctx: RouteContext, req: Request) => Promise<Response | null> | Response | null\n}\n\nexport interface RouteModule {\n GET?: RouteHandler\n POST?: RouteHandler\n PUT?: RouteHandler\n PATCH?: RouteHandler\n DELETE?: RouteHandler\n HEAD?: RouteHandler\n OPTIONS?: RouteHandler\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 {buildRoutes, matchRoute, collectMiddlewareChain} from './api-router'\nimport {RouteContext} from '../runtime/api-context'\nimport type {RouteModule, MiddlewareModule} from '../runtime/api-context'\nimport type {ApiGlob} from './types'\nimport {DevixError} from '../runtime/error-boundary'\n\nexport async function handleApiRequest(\n url: string,\n request: Request,\n glob: ApiGlob,\n): Promise<Response> {\n try {\n const {pathname} = new URL(url, 'http://localhost')\n const {routes, middlewares} = buildRoutes(\n Object.keys(glob.routes),\n Object.keys(glob.middlewares),\n glob.apiDir,\n )\n const matched = matchRoute(pathname, routes)\n\n if (!matched) return new Response('Not Found', {status: 404})\n\n const {route, params} = matched\n const ctx = new RouteContext(params)\n\n const middlewareChain = collectMiddlewareChain(route.key, middlewares)\n for (const mw of middlewareChain) {\n const mod = await glob.middlewares[mw.key]() as MiddlewareModule\n if (mod.middleware) {\n const result = await mod.middleware(ctx, request)\n if (result instanceof Response) return result\n }\n }\n\n const mod = await glob.routes[route.key]() as RouteModule\n const method = request.method.toUpperCase() as keyof RouteModule\n const handler = mod[method]\n\n if (!handler) return new Response('Method Not Allowed', {status: 405})\n\n const result = await handler(ctx, request)\n if (result instanceof Response) return result\n if (result == null) return new Response(null, {status: 204})\n\n return new Response(JSON.stringify(result), {\n headers: {'Content-Type': 'application/json'},\n })\n } catch (err) {\n console.error('[devix] api error:', err)\n if (err instanceof DevixError) {\n return new Response(err.message, {status: err.statusCode})\n }\n return new Response('Internal Server Error', {status: 500})\n }\n}"],
5
- "mappings": "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",
6
- "names": ["mod", "result"]
5
+ "mappings": "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",
6
+ "names": ["routePattern", "rel", "keyToRoutePattern", "key", "apiDir", "rel", "pattern", "routePattern", "keyToDir", "cache", "buildRoutes", "routeKeys", "middlewareKeys", "apiDir", "cache", "routes", "middlewares", "key", "keyToDir", "pattern", "keyToRoutePattern", "params", "m", "regexStr", "a", "b", "aScore", "bScore", "collectMiddlewareChain", "routeKey", "routeDir", "mw", "matchRoute", "pathname", "route", "match", "name", "i", "RouteContext", "params", "key", "value", "Component", "jsx", "DevixError", "statusCode", "message", "handleApiRequest", "url", "request", "glob", "pathname", "routes", "middlewares", "buildRoutes", "matched", "matchRoute", "route", "params", "ctx", "RouteContext", "middlewareChain", "collectMiddlewareChain", "mw", "mod", "result", "method", "handler", "err", "DevixError"]
7
7
  }
@@ -1,15 +1,2 @@
1
- // src/server/collect-css.ts
2
- async function collectCss(vite) {
3
- const cssUrls = /* @__PURE__ */ new Set();
4
- for (const [, mod] of vite.moduleGraph.idToModuleMap) {
5
- if (!mod.id) continue;
6
- if (mod.id.endsWith(".css") || mod.id.includes(".css?")) {
7
- cssUrls.add(mod.url);
8
- }
9
- }
10
- return [...cssUrls];
11
- }
12
- export {
13
- collectCss
14
- };
1
+ async function r(s){let i=new Set;for(let[,e]of s.moduleGraph.idToModuleMap)e.id&&(e.id.endsWith(".css")||e.id.includes(".css?"))&&i.add(e.url);return[...i]}export{r as collectCss};
15
2
  //# sourceMappingURL=collect-css.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/server/collect-css.ts"],
4
4
  "sourcesContent": ["import type {ViteDevServer} from 'vite'\n\nexport async function collectCss(vite: ViteDevServer): Promise<string[]> {\n const cssUrls = new Set<string>()\n\n for (const [, mod] of vite.moduleGraph.idToModuleMap) {\n if (!mod.id) continue\n if (mod.id.endsWith('.css') || mod.id.includes('.css?')) {\n cssUrls.add(mod.url)\n }\n }\n\n return [...cssUrls]\n}"],
5
- "mappings": ";AAEA,eAAsB,WAAW,MAAwC;AACrE,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,CAAC,EAAE,GAAG,KAAK,KAAK,YAAY,eAAe;AAClD,QAAI,CAAC,IAAI,GAAI;AACb,QAAI,IAAI,GAAG,SAAS,MAAM,KAAK,IAAI,GAAG,SAAS,OAAO,GAAG;AACrD,cAAQ,IAAI,IAAI,GAAG;AAAA,IACvB;AAAA,EACJ;AAEA,SAAO,CAAC,GAAG,OAAO;AACtB;",
6
- "names": []
5
+ "mappings": "AAEA,eAAsBA,EAAWC,EAAwC,CACrE,IAAMC,EAAU,IAAI,IAEpB,OAAW,CAAC,CAAEC,CAAG,IAAKF,EAAK,YAAY,cAC9BE,EAAI,KACLA,EAAI,GAAG,SAAS,MAAM,GAAKA,EAAI,GAAG,SAAS,OAAO,IAClDD,EAAQ,IAAIC,EAAI,GAAG,EAI3B,MAAO,CAAC,GAAGD,CAAO,CACtB",
6
+ "names": ["collectCss", "vite", "cssUrls", "mod"]
7
7
  }
@@ -1,133 +1,2 @@
1
- // src/utils/patterns.ts
2
- function routePattern(rel) {
3
- return rel.replace(/\.(tsx|ts|jsx|js)$/, "").replace(/\(.*?\)\//g, "").replace(/^index$|\/index$/, "").replace(/\[([^\]]+)]/g, ":$1") || "/";
4
- }
5
-
6
- // src/server/pages-router.ts
7
- function keyToRoutePattern(key, pagesDir) {
8
- const rel = key.slice(pagesDir.length + 1).replace(/\\/g, "/");
9
- const pattern = routePattern(rel);
10
- return pattern === "/" ? "/" : `/${pattern}`;
11
- }
12
- function keyToDir(key) {
13
- return key.slice(0, key.lastIndexOf("/"));
14
- }
15
- var cache = null;
16
- function buildPages(pageKeys, layoutKeys, pagesDir) {
17
- if (cache) return cache;
18
- const pages = [];
19
- const layouts = [];
20
- for (const key of layoutKeys) {
21
- layouts.push({ dir: keyToDir(key), key });
22
- }
23
- for (const key of pageKeys) {
24
- const pattern = keyToRoutePattern(key, pagesDir);
25
- const params = [...pattern.matchAll(/:([^/]+)/g)].map((m) => m[1]);
26
- const regexStr = pattern.replace(/:[^/]+/g, "([^/]+)").replace(/\//g, "\\/");
27
- pages.push({ path: pattern, key, params, regex: new RegExp(`^${regexStr}$`) });
28
- }
29
- pages.sort((a, b) => {
30
- const aScore = (a.path.match(/:/g) || []).length;
31
- const bScore = (b.path.match(/:/g) || []).length;
32
- if (aScore !== bScore) return aScore - bScore;
33
- return b.path.length - a.path.length;
34
- });
35
- cache = { pages, layouts };
36
- return cache;
37
- }
38
- function collectLayoutChain(pageKey, layouts) {
39
- const pageDir = keyToDir(pageKey);
40
- return layouts.filter((layout) => pageDir.startsWith(layout.dir)).sort((a, b) => a.dir.split("/").length - b.dir.split("/").length);
41
- }
42
- function matchPage(pathname, pages) {
43
- for (const page of pages) {
44
- const match = pathname.match(page.regex);
45
- if (match) {
46
- const params = {};
47
- page.params.forEach((name, i) => {
48
- params[name] = decodeURIComponent(match[i + 1]);
49
- });
50
- return { page, params };
51
- }
52
- }
53
- return null;
54
- }
55
-
56
- // src/server/api-router.ts
57
- function keyToRoutePattern2(key, apiDir) {
58
- const rel = key.slice(apiDir.length + 1).replace(/\\/g, "/");
59
- const pattern = routePattern(rel);
60
- return pattern === "/" ? "/api" : `/api/${pattern}`.replace("/api//", "/api/");
61
- }
62
- function keyToDir2(key) {
63
- return key.slice(0, key.lastIndexOf("/"));
64
- }
65
- var cache2 = null;
66
- function buildRoutes(routeKeys, middlewareKeys, apiDir) {
67
- if (cache2) return cache2;
68
- const routes = [];
69
- const middlewares = [];
70
- for (const key of middlewareKeys) {
71
- middlewares.push({ dir: keyToDir2(key), key });
72
- }
73
- for (const key of routeKeys) {
74
- const pattern = keyToRoutePattern2(key, apiDir);
75
- const params = [...pattern.matchAll(/:([^/]+)/g)].map((m) => m[1]);
76
- const regexStr = pattern.replace(/:[^/]+/g, "([^/]+)").replace(/\//g, "\\/");
77
- routes.push({ path: pattern, key, params, regex: new RegExp(`^${regexStr}$`) });
78
- }
79
- routes.sort((a, b) => {
80
- const aScore = (a.path.match(/:/g) || []).length;
81
- const bScore = (b.path.match(/:/g) || []).length;
82
- if (aScore !== bScore) return aScore - bScore;
83
- return b.path.length - a.path.length;
84
- });
85
- cache2 = { routes, middlewares };
86
- return cache2;
87
- }
88
- function collectMiddlewareChain(routeKey, middlewares) {
89
- const routeDir = keyToDir2(routeKey);
90
- return middlewares.filter((mw) => routeDir.startsWith(mw.dir)).sort((a, b) => a.dir.split("/").length - b.dir.split("/").length);
91
- }
92
- function matchRoute(pathname, routes) {
93
- for (const route of routes) {
94
- const match = pathname.match(route.regex);
95
- if (match) {
96
- const params = {};
97
- route.params.forEach((name, i) => {
98
- params[name] = decodeURIComponent(match[i + 1]);
99
- });
100
- return { route, params };
101
- }
102
- }
103
- return null;
104
- }
105
-
106
- // src/runtime/metadata.ts
107
- async function resolveMetadata(module, ctx) {
108
- const metadata = module.generateMetadata ? await module.generateMetadata(ctx) : module.metadata ?? {};
109
- const viewport = module.generateViewport ? await module.generateViewport(ctx) : module.viewport;
110
- return { metadata, viewport };
111
- }
112
- function mergeMetadata(...sources) {
113
- const result = {};
114
- for (const source of sources) {
115
- if (!source) continue;
116
- const { og, twitter, ...rest } = source;
117
- Object.assign(result, rest);
118
- if (og) result.og = { ...result.og, ...og };
119
- if (twitter) result.twitter = { ...result.twitter, ...twitter };
120
- }
121
- return result;
122
- }
123
- export {
124
- buildPages,
125
- buildRoutes,
126
- collectLayoutChain,
127
- collectMiddlewareChain,
128
- matchPage,
129
- matchRoute,
130
- mergeMetadata,
131
- resolveMetadata
132
- };
1
+ function c(t){return t.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}function h(t,r){let a=t.slice(r.length+1).replace(/\\/g,"/"),e=c(a);return e==="/"?"/":`/${e}`}function d(t){return t.slice(0,t.lastIndexOf("/"))}var g=null;function m(t,r,a){if(g)return g;let e=[],o=[];for(let n of r)o.push({dir:d(n),key:n});for(let n of t){let i=h(n,a),s=[...i.matchAll(/:([^/]+)/g)].map(u=>u[1]),p=i.replace(/:[^/]+/g,"([^/]+)").replace(/\//g,"\\/");e.push({path:i,key:n,params:s,regex:new RegExp(`^${p}$`)})}return e.sort((n,i)=>{let s=(n.path.match(/:/g)||[]).length,p=(i.path.match(/:/g)||[]).length;return s!==p?s-p:i.path.length-n.path.length}),g={pages:e,layouts:o},g}function x(t,r){let a=d(t);return r.filter(e=>a.startsWith(e.dir)).sort((e,o)=>e.dir.split("/").length-o.dir.split("/").length)}function R(t,r){for(let a of r){let e=t.match(a.regex);if(e){let o={};return a.params.forEach((n,i)=>{o[n]=decodeURIComponent(e[i+1])}),{page:a,params:o}}}return null}function y(t,r){let a=t.slice(r.length+1).replace(/\\/g,"/"),e=c(a);return e==="/"?"/api":`/api/${e}`.replace("/api//","/api/")}function f(t){return t.slice(0,t.lastIndexOf("/"))}var l=null;function M(t,r,a){if(l)return l;let e=[],o=[];for(let n of r)o.push({dir:f(n),key:n});for(let n of t){let i=y(n,a),s=[...i.matchAll(/:([^/]+)/g)].map(u=>u[1]),p=i.replace(/:[^/]+/g,"([^/]+)").replace(/\//g,"\\/");e.push({path:i,key:n,params:s,regex:new RegExp(`^${p}$`)})}return e.sort((n,i)=>{let s=(n.path.match(/:/g)||[]).length,p=(i.path.match(/:/g)||[]).length;return s!==p?s-p:i.path.length-n.path.length}),l={routes:e,middlewares:o},l}function w(t,r){let a=f(t);return r.filter(e=>a.startsWith(e.dir)).sort((e,o)=>e.dir.split("/").length-o.dir.split("/").length)}function P(t,r){for(let a of r){let e=t.match(a.regex);if(e){let o={};return a.params.forEach((n,i)=>{o[n]=decodeURIComponent(e[i+1])}),{route:a,params:o}}}return null}async function A(t,r){let a=t.generateMetadata?await t.generateMetadata(r):t.metadata??{},e=t.generateViewport?await t.generateViewport(r):t.viewport;return{metadata:a,viewport:e}}function L(...t){let r={};for(let a of t){if(!a)continue;let{og:e,twitter:o,...n}=a;Object.assign(r,n),e&&(r.og={...r.og,...e}),o&&(r.twitter={...r.twitter,...o})}return r}export{m as buildPages,M as buildRoutes,x as collectLayoutChain,w as collectMiddlewareChain,R as matchPage,P as matchRoute,L as mergeMetadata,A as resolveMetadata};
133
2
  //# sourceMappingURL=index.js.map