@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/utils/patterns.ts", "../../src/server/pages-router.ts", "../../src/server/api-router.ts", "../../src/runtime/metadata.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 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 {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", "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}"],
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;;;ACYA,SAAS,kBAAkB,KAAa,UAA0B;AAC9D,QAAM,MAAM,IAAI,MAAM,SAAS,SAAS,CAAC,EAAE,QAAQ,OAAO,GAAG;AAC7D,QAAM,UAAU,aAAa,GAAG;AAChC,SAAO,YAAY,MAAM,MAAM,IAAI,OAAO;AAC9C;AAEA,SAAS,SAAS,KAAqB;AACnC,SAAO,IAAI,MAAM,GAAG,IAAI,YAAY,GAAG,CAAC;AAC5C;AAEA,IAAI,QAA4B;AAMzB,SAAS,WAAW,UAAoB,YAAsB,UAA+B;AAChG,MAAI,MAAO,QAAO;AAElB,QAAM,QAAgB,CAAC;AACvB,QAAM,UAAoB,CAAC;AAE3B,aAAW,OAAO,YAAY;AAC1B,YAAQ,KAAK,EAAC,KAAK,SAAS,GAAG,GAAG,IAAG,CAAC;AAAA,EAC1C;AAEA,aAAW,OAAO,UAAU;AACxB,UAAM,UAAU,kBAAkB,KAAK,QAAQ;AAC/C,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,UAAM,KAAK,EAAC,MAAM,SAAS,KAAK,QAAQ,OAAO,IAAI,OAAO,IAAI,QAAQ,GAAG,EAAC,CAAC;AAAA,EAC/E;AAEA,QAAM,KAAK,CAAC,GAAG,MAAM;AACjB,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,OAAO,QAAO;AACvB,SAAO;AACX;AAEO,SAAS,mBAAmB,SAAiB,SAA6B;AAC7E,QAAM,UAAU,SAAS,OAAO;AAEhC,SAAO,QACF,OAAO,YAAU,QAAQ,WAAW,OAAO,GAAG,CAAC,EAC/C,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,MAAM,GAAG,EAAE,SAAS,EAAE,IAAI,MAAM,GAAG,EAAE,MAAM;AACzE;AAEO,SAAS,UAAU,UAAkB,OAGnC;AACL,aAAW,QAAQ,OAAO;AACtB,UAAM,QAAQ,SAAS,MAAM,KAAK,KAAK;AACvC,QAAI,OAAO;AACP,YAAM,SAAiC,CAAC;AACxC,WAAK,OAAO,QAAQ,CAAC,MAAM,MAAM;AAC7B,eAAO,IAAI,IAAI,mBAAmB,MAAM,IAAI,CAAC,CAAC;AAAA,MAClD,CAAC;AACD,aAAO,EAAC,MAAM,OAAM;AAAA,IACxB;AAAA,EACJ;AACA,SAAO;AACX;;;ACrEO,SAASA,mBAAkB,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,SAASC,UAAS,KAAqB;AACnC,SAAO,IAAI,MAAM,GAAG,IAAI,YAAY,GAAG,CAAC;AAC5C;AAEA,IAAIC,SAA0B;AAMvB,SAAS,YAAY,WAAqB,gBAA0B,QAA2B;AAClG,MAAIC,OAAO,QAAOA;AAElB,QAAM,SAAqB,CAAC;AAC5B,QAAM,cAA+B,CAAC;AAEtC,aAAW,OAAO,gBAAgB;AAC9B,gBAAY,KAAK,EAAC,KAAKC,UAAS,GAAG,GAAG,IAAG,CAAC;AAAA,EAC9C;AAEA,aAAW,OAAO,WAAW;AACzB,UAAM,UAAUC,mBAAkB,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,EAAAF,SAAQ,EAAC,QAAQ,YAAW;AAC5B,SAAOA;AACX;AAEO,SAAS,uBAAuB,UAAkB,aAA+C;AACpG,QAAM,WAAWC,UAAS,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;;;AC/EA,eAAsB,gBAAgB,QAAmC,KAE/C;AACtB,QAAM,WAAW,OAAO,mBAClB,MAAM,OAAO,iBAAiB,GAAG,IACjC,OAAO,YAAY,CAAC;AAE1B,QAAM,WAAW,OAAO,mBAClB,MAAM,OAAO,iBAAiB,GAAG,IACjC,OAAO;AAEb,SAAO,EAAC,UAAU,SAAQ;AAC9B;AAEO,SAAS,iBAAiB,SAAoD;AACjF,QAAM,SAAmB,CAAC;AAE1B,aAAW,UAAU,SAAS;AAC1B,QAAI,CAAC,OAAQ;AACb,UAAM,EAAE,IAAI,SAAS,GAAG,KAAK,IAAI;AACjC,WAAO,OAAO,QAAQ,IAAI;AAC1B,QAAI,GAAI,QAAO,KAAK,EAAE,GAAG,OAAO,IAAI,GAAG,GAAG;AAC1C,QAAI,QAAS,QAAO,UAAU,EAAE,GAAG,OAAO,SAAS,GAAG,QAAQ;AAAA,EAClE;AAEA,SAAO;AACX;",
6
- "names": ["keyToRoutePattern", "keyToDir", "cache", "cache", "keyToDir", "keyToRoutePattern"]
5
+ "mappings": "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",
6
+ "names": ["routePattern", "rel", "keyToRoutePattern", "key", "pagesDir", "rel", "pattern", "routePattern", "keyToDir", "cache", "buildPages", "pageKeys", "layoutKeys", "pagesDir", "cache", "pages", "layouts", "key", "keyToDir", "pattern", "keyToRoutePattern", "params", "m", "regexStr", "a", "b", "aScore", "bScore", "collectLayoutChain", "pageKey", "pageDir", "layout", "matchPage", "pathname", "page", "match", "name", "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", "resolveMetadata", "module", "ctx", "metadata", "viewport", "mergeMetadata", "sources", "result", "source", "og", "twitter", "rest"]
7
7
  }
@@ -1,64 +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 invalidatePagesCache() {
17
- cache = null;
18
- }
19
- function buildPages(pageKeys, layoutKeys, pagesDir) {
20
- if (cache) return cache;
21
- const pages = [];
22
- const layouts = [];
23
- for (const key of layoutKeys) {
24
- layouts.push({ dir: keyToDir(key), key });
25
- }
26
- for (const key of pageKeys) {
27
- const pattern = keyToRoutePattern(key, pagesDir);
28
- const params = [...pattern.matchAll(/:([^/]+)/g)].map((m) => m[1]);
29
- const regexStr = pattern.replace(/:[^/]+/g, "([^/]+)").replace(/\//g, "\\/");
30
- pages.push({ path: pattern, key, params, regex: new RegExp(`^${regexStr}$`) });
31
- }
32
- pages.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 = { pages, layouts };
39
- return cache;
40
- }
41
- function collectLayoutChain(pageKey, layouts) {
42
- const pageDir = keyToDir(pageKey);
43
- return layouts.filter((layout) => pageDir.startsWith(layout.dir)).sort((a, b) => a.dir.split("/").length - b.dir.split("/").length);
44
- }
45
- function matchPage(pathname, pages) {
46
- for (const page of pages) {
47
- const match = pathname.match(page.regex);
48
- if (match) {
49
- const params = {};
50
- page.params.forEach((name, i) => {
51
- params[name] = decodeURIComponent(match[i + 1]);
52
- });
53
- return { page, params };
54
- }
55
- }
56
- return null;
57
- }
58
- export {
59
- buildPages,
60
- collectLayoutChain,
61
- invalidatePagesCache,
62
- matchPage
63
- };
1
+ function l(e){return e.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}function h(e,s){let n=e.slice(s.length+1).replace(/\\/g,"/"),t=l(n);return t==="/"?"/":`/${t}`}function p(e){return e.slice(0,e.lastIndexOf("/"))}var g=null;function m(){g=null}function d(e,s,n){if(g)return g;let t=[],o=[];for(let r of s)o.push({dir:p(r),key:r});for(let r of e){let a=h(r,n),i=[...a.matchAll(/:([^/]+)/g)].map(u=>u[1]),c=a.replace(/:[^/]+/g,"([^/]+)").replace(/\//g,"\\/");t.push({path:a,key:r,params:i,regex:new RegExp(`^${c}$`)})}return t.sort((r,a)=>{let i=(r.path.match(/:/g)||[]).length,c=(a.path.match(/:/g)||[]).length;return i!==c?i-c:a.path.length-r.path.length}),g={pages:t,layouts:o},g}function P(e,s){let n=p(e);return s.filter(t=>n.startsWith(t.dir)).sort((t,o)=>t.dir.split("/").length-o.dir.split("/").length)}function y(e,s){for(let n of s){let t=e.match(n.regex);if(t){let o={};return n.params.forEach((r,a)=>{o[r]=decodeURIComponent(t[a+1])}),{page:n,params:o}}}return null}export{d as buildPages,P as collectLayoutChain,m as invalidatePagesCache,y as matchPage};
64
2
  //# sourceMappingURL=pages-router.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/patterns.ts", "../../src/server/pages-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 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"],
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;;;ACYA,SAAS,kBAAkB,KAAa,UAA0B;AAC9D,QAAM,MAAM,IAAI,MAAM,SAAS,SAAS,CAAC,EAAE,QAAQ,OAAO,GAAG;AAC7D,QAAM,UAAU,aAAa,GAAG;AAChC,SAAO,YAAY,MAAM,MAAM,IAAI,OAAO;AAC9C;AAEA,SAAS,SAAS,KAAqB;AACnC,SAAO,IAAI,MAAM,GAAG,IAAI,YAAY,GAAG,CAAC;AAC5C;AAEA,IAAI,QAA4B;AAEzB,SAAS,uBAAuB;AACnC,UAAQ;AACZ;AAEO,SAAS,WAAW,UAAoB,YAAsB,UAA+B;AAChG,MAAI,MAAO,QAAO;AAElB,QAAM,QAAgB,CAAC;AACvB,QAAM,UAAoB,CAAC;AAE3B,aAAW,OAAO,YAAY;AAC1B,YAAQ,KAAK,EAAC,KAAK,SAAS,GAAG,GAAG,IAAG,CAAC;AAAA,EAC1C;AAEA,aAAW,OAAO,UAAU;AACxB,UAAM,UAAU,kBAAkB,KAAK,QAAQ;AAC/C,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,UAAM,KAAK,EAAC,MAAM,SAAS,KAAK,QAAQ,OAAO,IAAI,OAAO,IAAI,QAAQ,GAAG,EAAC,CAAC;AAAA,EAC/E;AAEA,QAAM,KAAK,CAAC,GAAG,MAAM;AACjB,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,OAAO,QAAO;AACvB,SAAO;AACX;AAEO,SAAS,mBAAmB,SAAiB,SAA6B;AAC7E,QAAM,UAAU,SAAS,OAAO;AAEhC,SAAO,QACF,OAAO,YAAU,QAAQ,WAAW,OAAO,GAAG,CAAC,EAC/C,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,MAAM,GAAG,EAAE,SAAS,EAAE,IAAI,MAAM,GAAG,EAAE,MAAM;AACzE;AAEO,SAAS,UAAU,UAAkB,OAGnC;AACL,aAAW,QAAQ,OAAO;AACtB,UAAM,QAAQ,SAAS,MAAM,KAAK,KAAK;AACvC,QAAI,OAAO;AACP,YAAM,SAAiC,CAAC;AACxC,WAAK,OAAO,QAAQ,CAAC,MAAM,MAAM;AAC7B,eAAO,IAAI,IAAI,mBAAmB,MAAM,IAAI,CAAC,CAAC;AAAA,MAClD,CAAC;AACD,aAAO,EAAC,MAAM,OAAM;AAAA,IACxB;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,CCYA,SAASC,EAAkBC,EAAaC,EAA0B,CAC9D,IAAMC,EAAMF,EAAI,MAAMC,EAAS,OAAS,CAAC,EAAE,QAAQ,MAAO,GAAG,EACvDE,EAAUC,EAAaF,CAAG,EAChC,OAAOC,IAAY,IAAM,IAAM,IAAIA,CAAO,EAC9C,CAEA,SAASE,EAASL,EAAqB,CACnC,OAAOA,EAAI,MAAM,EAAGA,EAAI,YAAY,GAAG,CAAC,CAC5C,CAEA,IAAIM,EAA4B,KAEzB,SAASC,GAAuB,CACnCD,EAAQ,IACZ,CAEO,SAASE,EAAWC,EAAoBC,EAAsBT,EAA+B,CAChG,GAAIK,EAAO,OAAOA,EAElB,IAAMK,EAAgB,CAAC,EACjBC,EAAoB,CAAC,EAE3B,QAAWZ,KAAOU,EACdE,EAAQ,KAAK,CAAC,IAAKP,EAASL,CAAG,EAAG,IAAAA,CAAG,CAAC,EAG1C,QAAWA,KAAOS,EAAU,CACxB,IAAMN,EAAUJ,EAAkBC,EAAKC,CAAQ,EACzCY,EAAS,CAAC,GAAGV,EAAQ,SAAS,WAAW,CAAC,EAAE,IAAIW,GAAKA,EAAE,CAAC,CAAC,EACzDC,EAAWZ,EACZ,QAAQ,UAAW,SAAS,EAC5B,QAAQ,MAAO,KAAK,EACzBQ,EAAM,KAAK,CAAC,KAAMR,EAAS,IAAAH,EAAK,OAAAa,EAAQ,MAAO,IAAI,OAAO,IAAIE,CAAQ,GAAG,CAAC,CAAC,CAC/E,CAEA,OAAAJ,EAAM,KAAK,CAACK,EAAGC,IAAM,CACjB,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,MAAAK,EAAO,QAAAC,CAAO,EAChBN,CACX,CAEO,SAASc,EAAmBC,EAAiBT,EAA6B,CAC7E,IAAMU,EAAUjB,EAASgB,CAAO,EAEhC,OAAOT,EACF,OAAOW,GAAUD,EAAQ,WAAWC,EAAO,GAAG,CAAC,EAC/C,KAAK,CAACP,EAAGC,IAAMD,EAAE,IAAI,MAAM,GAAG,EAAE,OAASC,EAAE,IAAI,MAAM,GAAG,EAAE,MAAM,CACzE,CAEO,SAASO,EAAUC,EAAkBd,EAGnC,CACL,QAAWe,KAAQf,EAAO,CACtB,IAAMgB,EAAQF,EAAS,MAAMC,EAAK,KAAK,EACvC,GAAIC,EAAO,CACP,IAAMd,EAAiC,CAAC,EACxC,OAAAa,EAAK,OAAO,QAAQ,CAACE,EAAMC,IAAM,CAC7BhB,EAAOe,CAAI,EAAI,mBAAmBD,EAAME,EAAI,CAAC,CAAC,CAClD,CAAC,EACM,CAAC,KAAAH,EAAM,OAAAb,CAAM,CACxB,CACJ,CACA,OAAO,IACX",
6
+ "names": ["routePattern", "rel", "keyToRoutePattern", "key", "pagesDir", "rel", "pattern", "routePattern", "keyToDir", "cache", "invalidatePagesCache", "buildPages", "pageKeys", "layoutKeys", "pages", "layouts", "params", "m", "regexStr", "a", "b", "aScore", "bScore", "collectLayoutChain", "pageKey", "pageDir", "layout", "matchPage", "pathname", "page", "match", "name", "i"]
7
7
  }
@@ -1,306 +1,2 @@
1
- // src/server/render.tsx
2
- import { createElement } from "react";
3
- import { renderToString, renderToStaticMarkup } from "react-dom/server";
4
-
5
- // src/runtime/head.tsx
6
- import { Fragment, jsx } from "react/jsx-runtime";
7
- function collectTags(metadata, viewport) {
8
- const tags = [];
9
- if (metadata.title)
10
- tags.push({ tag: "title", children: metadata.title });
11
- if (metadata.description)
12
- tags.push({ tag: "meta", name: "description", content: metadata.description });
13
- if (metadata.keywords?.length)
14
- tags.push({ tag: "meta", name: "keywords", content: metadata.keywords.join(", ") });
15
- const ogTitle = metadata.og?.title ?? metadata.title;
16
- if (ogTitle) tags.push({ tag: "meta", property: "og:title", content: ogTitle });
17
- const ogDesc = metadata.og?.description ?? metadata.description;
18
- if (ogDesc) tags.push({ tag: "meta", property: "og:description", content: ogDesc });
19
- if (metadata.og?.image) tags.push({ tag: "meta", property: "og:image", content: metadata.og.image });
20
- if (metadata.og?.type) tags.push({ tag: "meta", property: "og:type", content: metadata.og.type });
21
- if (metadata.og?.url) tags.push({ tag: "meta", property: "og:url", content: metadata.og.url });
22
- const twTitle = metadata.twitter?.title ?? metadata.title;
23
- if (twTitle) tags.push({ tag: "meta", name: "twitter:title", content: twTitle });
24
- const twDesc = metadata.twitter?.description ?? metadata.description;
25
- if (twDesc) tags.push({ tag: "meta", name: "twitter:description", content: twDesc });
26
- if (metadata.twitter?.card) tags.push({
27
- tag: "meta",
28
- name: "twitter:card",
29
- content: metadata.twitter.card
30
- });
31
- if (metadata.twitter?.image) tags.push({
32
- tag: "meta",
33
- name: "twitter:image",
34
- content: metadata.twitter.image
35
- });
36
- if (metadata.twitter?.creator) tags.push({
37
- tag: "meta",
38
- name: "twitter:creator",
39
- content: metadata.twitter.creator
40
- });
41
- if (metadata.canonical) tags.push({ tag: "link", rel: "canonical", href: metadata.canonical });
42
- if (metadata.robots) tags.push({ tag: "meta", name: "robots", content: metadata.robots });
43
- if (metadata.alternates) {
44
- for (const [lang, href] of Object.entries(metadata.alternates))
45
- tags.push({ tag: "link", rel: "alternate", href, hrefLang: lang });
46
- }
47
- if (viewport) {
48
- const parts = [];
49
- if (viewport.width !== void 0) parts.push(`width=${viewport.width}`);
50
- if (viewport.initialScale !== void 0) parts.push(`initial-scale=${viewport.initialScale}`);
51
- if (viewport.maximumScale !== void 0) parts.push(`maximum-scale=${viewport.maximumScale}`);
52
- if (viewport.userScalable !== void 0) parts.push(`user-scalable=${viewport.userScalable ? "yes" : "no"}`);
53
- if (parts.length) tags.push({ tag: "meta", name: "viewport", content: parts.join(", ") });
54
- if (viewport.themeColor) tags.push({
55
- tag: "meta",
56
- name: "theme-color",
57
- content: viewport.themeColor
58
- });
59
- }
60
- return tags;
61
- }
62
- function buildHeadNodes(metadata, viewport) {
63
- const tags = collectTags(metadata, viewport);
64
- return /* @__PURE__ */ jsx(Fragment, { children: tags.map((t, i) => {
65
- if (t.tag === "title") return /* @__PURE__ */ jsx("title", { children: t.children }, i);
66
- if (t.tag === "link") return /* @__PURE__ */ jsx("link", { rel: t.rel, href: t.href, hrefLang: t.hrefLang }, i);
67
- return /* @__PURE__ */ jsx("meta", { name: t.name, property: t.property, content: t.content }, i);
68
- }) });
69
- }
70
-
71
- // src/utils/patterns.ts
72
- function routePattern(rel) {
73
- return rel.replace(/\.(tsx|ts|jsx|js)$/, "").replace(/\(.*?\)\//g, "").replace(/^index$|\/index$/, "").replace(/\[([^\]]+)]/g, ":$1") || "/";
74
- }
75
-
76
- // src/server/pages-router.ts
77
- function keyToRoutePattern(key, pagesDir) {
78
- const rel = key.slice(pagesDir.length + 1).replace(/\\/g, "/");
79
- const pattern = routePattern(rel);
80
- return pattern === "/" ? "/" : `/${pattern}`;
81
- }
82
- function keyToDir(key) {
83
- return key.slice(0, key.lastIndexOf("/"));
84
- }
85
- var cache = null;
86
- function buildPages(pageKeys, layoutKeys, pagesDir) {
87
- if (cache) return cache;
88
- const pages = [];
89
- const layouts = [];
90
- for (const key of layoutKeys) {
91
- layouts.push({ dir: keyToDir(key), key });
92
- }
93
- for (const key of pageKeys) {
94
- const pattern = keyToRoutePattern(key, pagesDir);
95
- const params = [...pattern.matchAll(/:([^/]+)/g)].map((m) => m[1]);
96
- const regexStr = pattern.replace(/:[^/]+/g, "([^/]+)").replace(/\//g, "\\/");
97
- pages.push({ path: pattern, key, params, regex: new RegExp(`^${regexStr}$`) });
98
- }
99
- pages.sort((a, b) => {
100
- const aScore = (a.path.match(/:/g) || []).length;
101
- const bScore = (b.path.match(/:/g) || []).length;
102
- if (aScore !== bScore) return aScore - bScore;
103
- return b.path.length - a.path.length;
104
- });
105
- cache = { pages, layouts };
106
- return cache;
107
- }
108
- function collectLayoutChain(pageKey, layouts) {
109
- const pageDir = keyToDir(pageKey);
110
- return layouts.filter((layout) => pageDir.startsWith(layout.dir)).sort((a, b) => a.dir.split("/").length - b.dir.split("/").length);
111
- }
112
- function matchPage(pathname, pages) {
113
- for (const page of pages) {
114
- const match = pathname.match(page.regex);
115
- if (match) {
116
- const params = {};
117
- page.params.forEach((name, i) => {
118
- params[name] = decodeURIComponent(match[i + 1]);
119
- });
120
- return { page, params };
121
- }
122
- }
123
- return null;
124
- }
125
-
126
- // src/runtime/metadata.ts
127
- async function resolveMetadata(module, ctx) {
128
- const metadata = module.generateMetadata ? await module.generateMetadata(ctx) : module.metadata ?? {};
129
- const viewport = module.generateViewport ? await module.generateViewport(ctx) : module.viewport;
130
- return { metadata, viewport };
131
- }
132
- function mergeMetadata(...sources) {
133
- const result = {};
134
- for (const source of sources) {
135
- if (!source) continue;
136
- const { og, twitter, ...rest } = source;
137
- Object.assign(result, rest);
138
- if (og) result.og = { ...result.og, ...og };
139
- if (twitter) result.twitter = { ...result.twitter, ...twitter };
140
- }
141
- return result;
142
- }
143
-
144
- // src/runtime/context.tsx
145
- import { createContext } from "react";
146
- var g = globalThis;
147
- g.__devix_RouterContext__ ??= createContext(null);
148
- var RouterContext = g.__devix_RouterContext__;
149
- g.__devix_PageMetaContext__ ??= createContext(null);
150
- g.__devix_RouteDataContext__ ??= createContext(null);
151
- var PageMetaContext = g.__devix_PageMetaContext__;
152
- var RouteDataContext = g.__devix_RouteDataContext__;
153
-
154
- // src/utils/html.ts
155
- function safeJsonStringify(value) {
156
- return JSON.stringify(value).replace(/<\/script>/gi, "<\\/script>");
157
- }
158
- function escapeAttr(value) {
159
- return value.replace(/"/g, "&quot;");
160
- }
161
-
162
- // src/utils/async.ts
163
- function withTimeout(promise, ms) {
164
- let timer;
165
- return Promise.race([
166
- promise.finally(() => clearTimeout(timer)),
167
- new Promise((_, reject) => {
168
- timer = setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms);
169
- })
170
- ]);
171
- }
172
-
173
- // src/server/render.tsx
174
- var DEV_CLIENT_ENTRY = "/@id/virtual:devix/entry-client";
175
- async function resolvePageData(pathname, request, glob, timeout) {
176
- const { pages, layouts } = buildPages(Object.keys(glob.pages), Object.keys(glob.layouts), glob.pagesDir);
177
- const matched = matchPage(pathname, pages);
178
- if (!matched) return null;
179
- const { page, params } = matched;
180
- const layoutChain = collectLayoutChain(page.key, layouts);
181
- const ctx = { params, request };
182
- const pageMod = await glob.pages[page.key]();
183
- if (pageMod.guard) {
184
- const redirect = await pageMod.guard(ctx);
185
- if (redirect) return { redirect };
186
- }
187
- const loaderData = pageMod.loader ? await withTimeout(pageMod.loader(ctx), timeout) : null;
188
- const layoutMods = await Promise.all(
189
- layoutChain.map((l) => glob.layouts[l.key]())
190
- );
191
- const layoutsData = await withTimeout(
192
- Promise.all(layoutMods.map((mod) => mod.loader ? mod.loader(ctx) : null)),
193
- timeout
194
- );
195
- const pageMeta = await resolveMetadata(pageMod, { ...ctx, loaderData });
196
- const layoutsMeta = await Promise.all(
197
- layoutMods.map((mod, i) => resolveMetadata(mod, { ...ctx, loaderData: layoutsData[i] }))
198
- );
199
- const metadata = mergeMetadata(...layoutsMeta.map((m) => m.metadata), pageMeta.metadata);
200
- const viewport = pageMeta.viewport ?? layoutsMeta.findLast((m) => m.viewport)?.viewport;
201
- const rootLayoutMod = layoutMods[0];
202
- const lang = rootLayoutMod?.generateLang ? await rootLayoutMod.generateLang({ ...ctx, loaderData }) : rootLayoutMod?.lang ?? "en";
203
- return { pageMod, layoutMods, params, loaderData, layoutsData, metadata, viewport, lang };
204
- }
205
- async function runLoader(url, request, glob, options) {
206
- const { pathname } = new URL(url, "http://localhost");
207
- let result;
208
- try {
209
- const timeout = options?.loaderTimeout ?? 1e4;
210
- result = await resolvePageData(pathname, request, glob, timeout);
211
- } catch (err) {
212
- console.error("[devix] render error:", err);
213
- return { loaderData: null, params: {}, layouts: [], metadata: null, viewport: void 0 };
214
- }
215
- if (!result || "redirect" in result) {
216
- return { loaderData: null, params: {}, layouts: [], metadata: null, viewport: void 0 };
217
- }
218
- const { loaderData, params, layoutsData, metadata, viewport } = result;
219
- return {
220
- loaderData,
221
- params,
222
- layouts: layoutsData.map((loaderData2) => ({ loaderData: loaderData2 })),
223
- metadata,
224
- viewport
225
- };
226
- }
227
- async function render(url, request, glob, options) {
228
- const clientEntry = options?.manifest ? `/${Object.values(options.manifest).find((chunk) => chunk.isEntry)?.file}` : DEV_CLIENT_ENTRY;
229
- const cssFiles = options?.manifest ? Object.values(options.manifest).find((chunk) => chunk.isEntry)?.css ?? [] : [];
230
- const cssLinks = cssFiles.map((f) => `<link rel="stylesheet" href="/${f}">`).join("");
231
- const { pathname } = new URL(url, "http://localhost");
232
- let result;
233
- try {
234
- const timeout = options?.loaderTimeout ?? 1e4;
235
- result = await resolvePageData(pathname, request, glob, timeout);
236
- } catch (err) {
237
- console.error("[devix] render error:", err);
238
- const html2 = `<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>`;
239
- return { html: html2, statusCode: 500, headers: {} };
240
- }
241
- if (!result) {
242
- const dataScript2 = `<script>window.__DEVIX__=${safeJsonStringify({
243
- metadata: null,
244
- viewport: void 0,
245
- clientEntry
246
- })};window.__LOADER_DATA__=null;window.__LAYOUTS_DATA__=[];</script>`;
247
- const clientScript2 = `<script type="module" src="${clientEntry}"></script>`;
248
- const html2 = `<html lang="en"><head><meta charset="utf-8">${cssLinks}${dataScript2}</head><body><div id="devix-root"></div>${clientScript2}</body></html>`;
249
- return { html: html2, statusCode: 404, headers: {} };
250
- }
251
- if ("redirect" in result) {
252
- return { html: "", statusCode: 302, headers: { Location: result.redirect } };
253
- }
254
- const { pageMod, layoutMods, params, loaderData, layoutsData, metadata, viewport, lang } = result;
255
- let tree = createElement(
256
- RouteDataContext,
257
- { value: { loaderData, params } },
258
- createElement(pageMod.default, { data: loaderData, params, url: pathname })
259
- );
260
- for (let i = layoutMods.length - 1; i >= 0; i--) {
261
- const layoutData = layoutsData[i];
262
- tree = createElement(
263
- RouteDataContext,
264
- { value: { loaderData: layoutData, params } },
265
- createElement(layoutMods[i].default, { data: layoutData, params }, tree)
266
- );
267
- }
268
- const content = renderToString(tree);
269
- const headTags = metadata ? renderToStaticMarkup(buildHeadNodes(metadata, viewport)) : "";
270
- const dataScript = `<script>window.__DEVIX__=${safeJsonStringify({
271
- metadata,
272
- viewport,
273
- clientEntry
274
- })};window.__LOADER_DATA__=${safeJsonStringify(loaderData)};window.__LAYOUTS_DATA__=${safeJsonStringify(layoutsData)};</script>`;
275
- const clientScript = `<script type="module" src="${clientEntry}"></script>`;
276
- const customHeaders = pageMod.headers ?? {};
277
- 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>`;
278
- return { html, statusCode: 200, headers: customHeaders };
279
- }
280
- async function getStaticRoutes(glob) {
281
- const { pages } = buildPages(Object.keys(glob.pages), Object.keys(glob.layouts), glob.pagesDir);
282
- const urls = [];
283
- for (const page of pages) {
284
- if (page.params.length === 0) {
285
- urls.push(page.path);
286
- } else {
287
- const mod = await glob.pages[page.key]();
288
- if (!mod.generateStaticParams) continue;
289
- const paramSets = await mod.generateStaticParams();
290
- for (const params of paramSets) {
291
- let url = page.path;
292
- for (const [key, value] of Object.entries(params)) {
293
- url = url.replace(`:${key}`, encodeURIComponent(value));
294
- }
295
- urls.push(url);
296
- }
297
- }
298
- }
299
- return urls;
300
- }
301
- export {
302
- getStaticRoutes,
303
- render,
304
- runLoader
305
- };
1
+ import{createElement as T}from"react";import{renderToString as X,renderToStaticMarkup as F}from"react-dom/server";import{Fragment as H,jsx as C}from"react/jsx-runtime";function Y(t,r){let e=[];t.title&&e.push({tag:"title",children:t.title}),t.description&&e.push({tag:"meta",name:"description",content:t.description}),t.keywords?.length&&e.push({tag:"meta",name:"keywords",content:t.keywords.join(", ")});let a=t.og?.title??t.title;a&&e.push({tag:"meta",property:"og:title",content:a});let n=t.og?.description??t.description;n&&e.push({tag:"meta",property:"og:description",content:n}),t.og?.image&&e.push({tag:"meta",property:"og:image",content:t.og.image}),t.og?.type&&e.push({tag:"meta",property:"og:type",content:t.og.type}),t.og?.url&&e.push({tag:"meta",property:"og:url",content:t.og.url});let o=t.twitter?.title??t.title;o&&e.push({tag:"meta",name:"twitter:title",content:o});let s=t.twitter?.description??t.description;if(s&&e.push({tag:"meta",name:"twitter:description",content:s}),t.twitter?.card&&e.push({tag:"meta",name:"twitter:card",content:t.twitter.card}),t.twitter?.image&&e.push({tag:"meta",name:"twitter:image",content:t.twitter.image}),t.twitter?.creator&&e.push({tag:"meta",name:"twitter:creator",content:t.twitter.creator}),t.canonical&&e.push({tag:"link",rel:"canonical",href:t.canonical}),t.robots&&e.push({tag:"meta",name:"robots",content:t.robots}),t.alternates)for(let[i,l]of Object.entries(t.alternates))e.push({tag:"link",rel:"alternate",href:l,hrefLang:i});if(r){let i=[];r.width!==void 0&&i.push(`width=${r.width}`),r.initialScale!==void 0&&i.push(`initial-scale=${r.initialScale}`),r.maximumScale!==void 0&&i.push(`maximum-scale=${r.maximumScale}`),r.userScalable!==void 0&&i.push(`user-scalable=${r.userScalable?"yes":"no"}`),i.length&&e.push({tag:"meta",name:"viewport",content:i.join(", ")}),r.themeColor&&e.push({tag:"meta",name:"theme-color",content:r.themeColor})}return e}function E(t,r){let e=Y(t,r);return C(H,{children:e.map((a,n)=>a.tag==="title"?C("title",{children:a.children},n):a.tag==="link"?C("link",{rel:a.rel,href:a.href,hrefLang:a.hrefLang},n):C("meta",{name:a.name,property:a.property,content:a.content},n))})}function O(t){return t.replace(/\.(tsx|ts|jsx|js)$/,"").replace(/\(.*?\)\//g,"").replace(/^index$|\/index$/,"").replace(/\[([^\]]+)]/g,":$1")||"/"}function J(t,r){let e=t.slice(r.length+1).replace(/\\/g,"/"),a=O(e);return a==="/"?"/":`/${a}`}function j(t){return t.slice(0,t.lastIndexOf("/"))}var D=null;function $(t,r,e){if(D)return D;let a=[],n=[];for(let o of r)n.push({dir:j(o),key:o});for(let o of t){let s=J(o,e),i=[...s.matchAll(/:([^/]+)/g)].map(d=>d[1]),l=s.replace(/:[^/]+/g,"([^/]+)").replace(/\//g,"\\/");a.push({path:s,key:o,params:i,regex:new RegExp(`^${l}$`)})}return a.sort((o,s)=>{let i=(o.path.match(/:/g)||[]).length,l=(s.path.match(/:/g)||[]).length;return i!==l?i-l:s.path.length-o.path.length}),D={pages:a,layouts:n},D}function N(t,r){let e=j(t);return r.filter(a=>e.startsWith(a.dir)).sort((a,n)=>a.dir.split("/").length-n.dir.split("/").length)}function I(t,r){for(let e of r){let a=t.match(e.regex);if(a){let n={};return e.params.forEach((o,s)=>{n[o]=decodeURIComponent(a[s+1])}),{page:e,params:n}}}return null}async function b(t,r){let e=t.generateMetadata?await t.generateMetadata(r):t.metadata??{},a=t.generateViewport?await t.generateViewport(r):t.viewport;return{metadata:e,viewport:a}}function U(...t){let r={};for(let e of t){if(!e)continue;let{og:a,twitter:n,...o}=e;Object.assign(r,o),a&&(r.og={...r.og,...a}),n&&(r.twitter={...r.twitter,...n})}return r}import{createContext as S}from"react";var y=globalThis;y.__devix_RouterContext__??=S(null);var it=y.__devix_RouterContext__;y.__devix_PageMetaContext__??=S(null);y.__devix_RouteDataContext__??=S(null);var st=y.__devix_PageMetaContext__,A=y.__devix_RouteDataContext__;function M(t){return JSON.stringify(t).replace(/<\/script>/gi,"<\\/script>")}function G(t){return t.replace(/"/g,"&quot;")}function V(t,r){let e;return Promise.race([t.finally(()=>clearTimeout(e)),new Promise((a,n)=>{e=setTimeout(()=>n(new Error(`timed out after ${r}ms`)),r)})])}var W="/@id/virtual:devix/entry-client";async function q(t,r,e,a){let{pages:n,layouts:o}=$(Object.keys(e.pages),Object.keys(e.layouts),e.pagesDir),s=I(t,n);if(!s)return null;let{page:i,params:l}=s,d=N(i.key,o),g={params:l,request:r},c=await e.pages[i.key]();if(c.guard){let p=await c.guard(g);if(p)return{redirect:p}}let m=c.loader?await V(c.loader(g),a):null,f=await Promise.all(d.map(p=>e.layouts[p.key]())),h=await V(Promise.all(f.map(p=>p.loader?p.loader(g):null)),a),w=await b(c,{...g,loaderData:m}),R=await Promise.all(f.map((p,k)=>b(p,{...g,loaderData:h[k]}))),_=U(...R.map(p=>p.metadata),w.metadata),v=w.viewport??R.findLast(p=>p.viewport)?.viewport,x=f[0],L=x?.generateLang?await x.generateLang({...g,loaderData:m}):x?.lang??"en";return{pageMod:c,layoutMods:f,params:l,loaderData:m,layoutsData:h,metadata:_,viewport:v,lang:L}}async function Pt(t,r,e,a){let{pathname:n}=new URL(t,"http://localhost"),o;try{let c=a?.loaderTimeout??1e4;o=await q(n,r,e,c)}catch(c){return console.error("[devix] render error:",c),{loaderData:null,params:{},layouts:[],metadata:null,viewport:void 0}}if(!o||"redirect"in o)return{loaderData:null,params:{},layouts:[],metadata:null,viewport:void 0};let{loaderData:s,params:i,layoutsData:l,metadata:d,viewport:g}=o;return{loaderData:s,params:i,layouts:l.map(c=>({loaderData:c})),metadata:d,viewport:g}}async function Mt(t,r,e,a){let n=a?.manifest?`/${Object.values(a.manifest).find(u=>u.isEntry)?.file}`:W,s=(a?.manifest?Object.values(a.manifest).find(u=>u.isEntry)?.css??[]:[]).map(u=>`<link rel="stylesheet" href="/${u}">`).join(""),{pathname:i}=new URL(t,"http://localhost"),l;try{let u=a?.loaderTimeout??1e4;l=await q(i,r,e,u)}catch(u){return console.error("[devix] render error:",u),{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(!l){let u=`<script>window.__DEVIX__=${M({metadata:null,viewport:void 0,clientEntry:n})};window.__LOADER_DATA__=null;window.__LAYOUTS_DATA__=[];</script>`,P=`<script type="module" src="${n}"></script>`;return{html:`<html lang="en"><head><meta charset="utf-8">${s}${u}</head><body><div id="devix-root"></div>${P}</body></html>`,statusCode:404,headers:{}}}if("redirect"in l)return{html:"",statusCode:302,headers:{Location:l.redirect}};let{pageMod:d,layoutMods:g,params:c,loaderData:m,layoutsData:f,metadata:h,viewport:w,lang:R}=l,_=T(A,{value:{loaderData:m,params:c}},T(d.default,{data:m,params:c,url:i}));for(let u=g.length-1;u>=0;u--){let P=f[u];_=T(A,{value:{loaderData:P,params:c}},T(g[u].default,{data:P,params:c},_))}let v=X(_),x=h?F(E(h,w)):"",L=`<script>window.__DEVIX__=${M({metadata:h,viewport:w,clientEntry:n})};window.__LOADER_DATA__=${M(m)};window.__LAYOUTS_DATA__=${M(f)};</script>`,p=`<script type="module" src="${n}"></script>`,k=d.headers??{};return{html:`<html lang="${G(R)}"><head><meta charset="utf-8">${x}${s}${L}</head><body><div id="devix-root">${v}</div>${p}</body></html>`,statusCode:200,headers:k}}async function Rt(t){let{pages:r}=$(Object.keys(t.pages),Object.keys(t.layouts),t.pagesDir),e=[];for(let a of r)if(a.params.length===0)e.push(a.path);else{let n=await t.pages[a.key]();if(!n.generateStaticParams)continue;let o=await n.generateStaticParams();for(let s of o){let i=a.path;for(let[l,d]of Object.entries(s))i=i.replace(`:${l}`,encodeURIComponent(d));e.push(i)}}return e}export{Rt as getStaticRoutes,Mt as render,Pt as runLoader};
306
2
  //# sourceMappingURL=render.js.map