treesap 0.1.13 → 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 (147) hide show
  1. package/README.md +31 -192
  2. package/dist/app.d.ts +28 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +184 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/context.d.ts +36 -0
  7. package/dist/context.d.ts.map +1 -0
  8. package/dist/context.js +95 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/index.d.ts +5 -7
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +5 -9
  13. package/dist/index.js.map +1 -1
  14. package/dist/middleware/cors.d.ts +11 -0
  15. package/dist/middleware/cors.d.ts.map +1 -0
  16. package/dist/middleware/cors.js +34 -0
  17. package/dist/middleware/cors.js.map +1 -0
  18. package/dist/middleware/serve-static.d.ts +6 -0
  19. package/dist/middleware/serve-static.d.ts.map +1 -0
  20. package/dist/middleware/serve-static.js +68 -0
  21. package/dist/middleware/serve-static.js.map +1 -0
  22. package/dist/node.d.ts +8 -0
  23. package/dist/node.d.ts.map +1 -0
  24. package/dist/node.js +52 -0
  25. package/dist/node.js.map +1 -0
  26. package/dist/path.d.ts +10 -0
  27. package/dist/path.d.ts.map +1 -0
  28. package/dist/path.js +45 -0
  29. package/dist/path.js.map +1 -0
  30. package/dist/vite.d.ts +31 -0
  31. package/dist/vite.d.ts.map +1 -0
  32. package/dist/vite.js +278 -0
  33. package/dist/vite.js.map +1 -0
  34. package/package.json +33 -40
  35. package/dist/cli.d.ts +0 -3
  36. package/dist/cli.d.ts.map +0 -1
  37. package/dist/cli.js +0 -137
  38. package/dist/cli.js.map +0 -1
  39. package/dist/components/BaseHead.d.ts +0 -5
  40. package/dist/components/BaseHead.d.ts.map +0 -1
  41. package/dist/components/BaseHead.js +0 -161
  42. package/dist/components/BaseHead.js.map +0 -1
  43. package/dist/components/ChatInput.d.ts +0 -7
  44. package/dist/components/ChatInput.d.ts.map +0 -1
  45. package/dist/components/ChatInput.js +0 -11
  46. package/dist/components/ChatInput.js.map +0 -1
  47. package/dist/components/Sidebar.d.ts +0 -8
  48. package/dist/components/Sidebar.d.ts.map +0 -1
  49. package/dist/components/Sidebar.js +0 -7
  50. package/dist/components/Sidebar.js.map +0 -1
  51. package/dist/components/SimpleLivePreview.d.ts +0 -7
  52. package/dist/components/SimpleLivePreview.d.ts.map +0 -1
  53. package/dist/components/SimpleLivePreview.js +0 -7
  54. package/dist/components/SimpleLivePreview.js.map +0 -1
  55. package/dist/components/Terminal.d.ts +0 -7
  56. package/dist/components/Terminal.d.ts.map +0 -1
  57. package/dist/components/Terminal.js +0 -14
  58. package/dist/components/Terminal.js.map +0 -1
  59. package/dist/components/VoiceRecorder.d.ts +0 -4
  60. package/dist/components/VoiceRecorder.d.ts.map +0 -1
  61. package/dist/components/VoiceRecorder.js +0 -5
  62. package/dist/components/VoiceRecorder.js.map +0 -1
  63. package/dist/components/icons/GeminiLogo.d.ts +0 -7
  64. package/dist/components/icons/GeminiLogo.d.ts.map +0 -1
  65. package/dist/components/icons/GeminiLogo.js +0 -5
  66. package/dist/components/icons/GeminiLogo.js.map +0 -1
  67. package/dist/components/icons/OllamaLogo.d.ts +0 -2
  68. package/dist/components/icons/OllamaLogo.d.ts.map +0 -1
  69. package/dist/components/icons/OllamaLogo.js +0 -5
  70. package/dist/components/icons/OllamaLogo.js.map +0 -1
  71. package/dist/layouts/Layout.d.ts +0 -9
  72. package/dist/layouts/Layout.d.ts.map +0 -1
  73. package/dist/layouts/Layout.js +0 -9
  74. package/dist/layouts/Layout.js.map +0 -1
  75. package/dist/layouts/NotFoundLayout.d.ts +0 -2
  76. package/dist/layouts/NotFoundLayout.d.ts.map +0 -1
  77. package/dist/layouts/NotFoundLayout.js +0 -6
  78. package/dist/layouts/NotFoundLayout.js.map +0 -1
  79. package/dist/pages/Code.d.ts +0 -7
  80. package/dist/pages/Code.d.ts.map +0 -1
  81. package/dist/pages/Code.js +0 -8
  82. package/dist/pages/Code.js.map +0 -1
  83. package/dist/pages/Home.d.ts +0 -7
  84. package/dist/pages/Home.d.ts.map +0 -1
  85. package/dist/pages/Home.js +0 -8
  86. package/dist/pages/Home.js.map +0 -1
  87. package/dist/pages/Welcome.d.ts +0 -2
  88. package/dist/pages/Welcome.d.ts.map +0 -1
  89. package/dist/pages/Welcome.js +0 -6
  90. package/dist/pages/Welcome.js.map +0 -1
  91. package/dist/server.d.ts +0 -11
  92. package/dist/server.d.ts.map +0 -1
  93. package/dist/server.js +0 -434
  94. package/dist/server.js.map +0 -1
  95. package/dist/services/dev-server.d.ts +0 -29
  96. package/dist/services/dev-server.d.ts.map +0 -1
  97. package/dist/services/dev-server.js +0 -201
  98. package/dist/services/dev-server.js.map +0 -1
  99. package/dist/services/terminal.d.ts +0 -46
  100. package/dist/services/terminal.d.ts.map +0 -1
  101. package/dist/services/terminal.js +0 -264
  102. package/dist/services/terminal.js.map +0 -1
  103. package/dist/services/websocket.d.ts +0 -48
  104. package/dist/services/websocket.d.ts.map +0 -1
  105. package/dist/services/websocket.js +0 -332
  106. package/dist/services/websocket.js.map +0 -1
  107. package/dist/static/components/ChatInput.js +0 -237
  108. package/dist/static/components/Sidebar.js +0 -225
  109. package/dist/static/components/SimpleLivePreview.js +0 -305
  110. package/dist/static/components/Terminal.js +0 -461
  111. package/dist/static/components/TerminalTabs.js +0 -383
  112. package/dist/static/favicon.svg +0 -14
  113. package/dist/static/signals/LivePreviewSignal.js +0 -71
  114. package/dist/static/signals/SidebarSignal.js +0 -123
  115. package/dist/static/signals/TerminalSignal.js +0 -273
  116. package/dist/static/styles/main.css +0 -1761
  117. package/src/cli.ts +0 -155
  118. package/src/components/BaseHead.ts +0 -164
  119. package/src/components/ChatInput.tsx +0 -56
  120. package/src/components/Sidebar.tsx +0 -99
  121. package/src/components/SimpleLivePreview.tsx +0 -40
  122. package/src/components/Terminal.tsx +0 -40
  123. package/src/components/VoiceRecorder.tsx +0 -33
  124. package/src/components/icons/GeminiLogo.tsx +0 -10
  125. package/src/components/icons/OllamaLogo.tsx +0 -5
  126. package/src/index.tsx +0 -12
  127. package/src/layouts/Layout.tsx +0 -41
  128. package/src/layouts/NotFoundLayout.tsx +0 -15
  129. package/src/pages/Code.tsx +0 -34
  130. package/src/pages/Welcome.tsx +0 -56
  131. package/src/server.tsx +0 -519
  132. package/src/services/dev-server.ts +0 -234
  133. package/src/services/terminal.ts +0 -325
  134. package/src/services/websocket.ts +0 -405
  135. package/src/static/components/ChatInput.js +0 -237
  136. package/src/static/components/Sidebar.js +0 -225
  137. package/src/static/components/SimpleLivePreview.js +0 -305
  138. package/src/static/components/Terminal.js +0 -461
  139. package/src/static/components/TerminalTabs.js +0 -383
  140. package/src/static/favicon.svg +0 -14
  141. package/src/static/signals/LivePreviewSignal.js +0 -71
  142. package/src/static/signals/SidebarSignal.js +0 -123
  143. package/src/static/signals/TerminalSignal.js +0 -273
  144. package/src/static/styles/main.css +0 -1761
  145. package/src/styles/input.css +0 -3
  146. package/tailwind.config.ts +0 -22
  147. package/tsconfig.json +0 -37
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAC;AAE9D,yDAAyD;AACzD,OAAO,EAAE,WAAW,EAAsB,CAAC;AAE3C,kDAAkD;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmB,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,SAAS,EACT,YAAY,EAKZ,SAAS,GACV,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Handler } from "../app.ts";
2
+ import type { Context } from "../context.ts";
3
+ interface CorsOptions {
4
+ origin?: string | ((origin: string | undefined, ctx: Context) => string | undefined | Promise<string | undefined>);
5
+ allowHeaders?: string[];
6
+ allowMethods?: string[];
7
+ credentials?: boolean;
8
+ }
9
+ export declare function cors(options?: CorsOptions): Handler;
10
+ export {};
11
+ //# sourceMappingURL=cors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,UAAU,WAAW;IACnB,MAAM,CAAC,EACH,MAAM,GACN,CAAC,CACC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,EAAE,OAAO,KACT,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAyCvD"}
@@ -0,0 +1,34 @@
1
+ export function cors(options = {}) {
2
+ return async (ctx, next) => {
3
+ const requestOrigin = ctx.req.header("origin");
4
+ const resolvedOrigin = typeof options.origin === "function"
5
+ ? await options.origin(requestOrigin, ctx)
6
+ : options.origin ?? requestOrigin;
7
+ const headers = new Headers();
8
+ if (resolvedOrigin) {
9
+ headers.set("Access-Control-Allow-Origin", resolvedOrigin);
10
+ headers.append("Vary", "Origin");
11
+ }
12
+ if (options.credentials) {
13
+ headers.set("Access-Control-Allow-Credentials", "true");
14
+ }
15
+ if (options.allowHeaders?.length) {
16
+ headers.set("Access-Control-Allow-Headers", options.allowHeaders.join(", "));
17
+ }
18
+ if (options.allowMethods?.length) {
19
+ headers.set("Access-Control-Allow-Methods", options.allowMethods.join(", "));
20
+ }
21
+ if (ctx.request.method === "OPTIONS") {
22
+ return new Response(null, {
23
+ status: 204,
24
+ headers,
25
+ });
26
+ }
27
+ const response = await next();
28
+ headers.forEach((value, key) => {
29
+ response.headers.set(key, value);
30
+ });
31
+ return response;
32
+ };
33
+ }
34
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,IAAI,CAAC,UAAuB,EAAE;IAC5C,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,cAAc,GAClB,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU;YAClC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC;YAC1C,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;QAEtC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAE9B,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,cAAc,CAAC,CAAC;YAC3D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;gBACxB,MAAM,EAAE,GAAG;gBACX,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7B,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Handler } from "../app.ts";
2
+ export declare function serveStatic(options: {
3
+ root: string;
4
+ cacheControl?: string | false | ((filePath: string, pathname: string) => string | undefined);
5
+ }): Handler;
6
+ //# sourceMappingURL=serve-static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-static.d.ts","sourceRoot":"","sources":["../../src/middleware/serve-static.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyCzC,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EACT,MAAM,GACN,KAAK,GACL,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC;CAClE,GAAG,OAAO,CAsCV"}
@@ -0,0 +1,68 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ const MIME_TYPES = {
4
+ ".avif": "image/avif",
5
+ ".css": "text/css; charset=UTF-8",
6
+ ".ico": "image/x-icon",
7
+ ".jpeg": "image/jpeg",
8
+ ".jpg": "image/jpeg",
9
+ ".js": "text/javascript; charset=UTF-8",
10
+ ".json": "application/json; charset=UTF-8",
11
+ ".md": "text/markdown; charset=UTF-8",
12
+ ".png": "image/png",
13
+ ".svg": "image/svg+xml",
14
+ ".txt": "text/plain; charset=UTF-8",
15
+ ".woff": "font/woff",
16
+ ".woff2": "font/woff2",
17
+ ".xml": "application/xml; charset=UTF-8",
18
+ };
19
+ function getContentType(filePath) {
20
+ return MIME_TYPES[path.extname(filePath).toLowerCase()] ?? "application/octet-stream";
21
+ }
22
+ function hasBuildHash(filePath) {
23
+ const extension = path.extname(filePath);
24
+ const basename = path.basename(filePath, extension);
25
+ return /(?:^|[.-])[A-Za-z0-9_-]{8,}$/.test(basename);
26
+ }
27
+ function getCacheControl(filePath, pathname) {
28
+ if (path.extname(filePath).toLowerCase() === ".html") {
29
+ return "public, max-age=0, must-revalidate";
30
+ }
31
+ if (pathname.includes("/assets/") && hasBuildHash(filePath)) {
32
+ return "public, max-age=31536000, immutable";
33
+ }
34
+ return "public, max-age=604800, stale-while-revalidate=86400";
35
+ }
36
+ export function serveStatic(options) {
37
+ const basePath = path.resolve(options.root);
38
+ return async (ctx, next) => {
39
+ if (ctx.req.raw.method !== "GET" && ctx.req.raw.method !== "HEAD") {
40
+ return next();
41
+ }
42
+ const pathname = decodeURIComponent(ctx.url.pathname);
43
+ const relativePath = pathname.startsWith("/") ? pathname.slice(1) : pathname;
44
+ const filePath = path.resolve(basePath, relativePath);
45
+ if (filePath !== basePath && !filePath.startsWith(`${basePath}${path.sep}`)) {
46
+ return next();
47
+ }
48
+ try {
49
+ const file = await readFile(filePath);
50
+ const cacheControl = typeof options.cacheControl === "function"
51
+ ? options.cacheControl(filePath, pathname)
52
+ : options.cacheControl;
53
+ const headers = {
54
+ "Content-Type": getContentType(filePath),
55
+ };
56
+ if (cacheControl !== false) {
57
+ headers["Cache-Control"] = cacheControl ?? getCacheControl(filePath, pathname);
58
+ }
59
+ return new Response(file, {
60
+ headers,
61
+ });
62
+ }
63
+ catch {
64
+ return next();
65
+ }
66
+ };
67
+ }
68
+ //# sourceMappingURL=serve-static.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-static.js","sourceRoot":"","sources":["../../src/middleware/serve-static.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,UAAU,GAA2B;IACzC,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,yBAAyB;IACjC,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,gCAAgC;IACvC,OAAO,EAAE,iCAAiC;IAC1C,KAAK,EAAE,8BAA8B;IACrC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,2BAA2B;IACnC,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,gCAAgC;CACzC,CAAC;AAEF,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,0BAA0B,CAAC;AACxF,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpD,OAAO,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,QAAgB;IACzD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;QACrD,OAAO,oCAAoC,CAAC;IAC9C,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,OAAO,qCAAqC,CAAC;IAC/C,CAAC;IAED,OAAO,sDAAsD,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAM3B;IACC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAClE,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEtD,IAAI,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAC5E,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,YAAY,GAChB,OAAO,OAAO,CAAC,YAAY,KAAK,UAAU;gBACxC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAC1C,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;YAE3B,MAAM,OAAO,GAA2B;gBACtC,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC;aACzC,CAAC;YAEF,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,eAAe,CAAC,GAAG,YAAY,IAAI,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACjF,CAAC;YAED,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;gBACxB,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
package/dist/node.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { type IncomingMessage, type ServerResponse } from "node:http";
2
+ export declare function toWebRequest(req: IncomingMessage): Promise<Request>;
3
+ export declare function sendNodeResponse(res: ServerResponse, response: Response): Promise<void>;
4
+ export declare function serve(options: {
5
+ fetch: (request: Request) => Response | Promise<Response>;
6
+ port: number;
7
+ }): import("node:http").Server<typeof IncomingMessage, typeof ServerResponse>;
8
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAGpF,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,oBAoBtD;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,iBAgB7E;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE;IAC7B,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1D,IAAI,EAAE,MAAM,CAAC;CACd,6EAgBA"}
package/dist/node.js ADDED
@@ -0,0 +1,52 @@
1
+ import { createServer } from "node:http";
2
+ import { Readable } from "node:stream";
3
+ export async function toWebRequest(req) {
4
+ const protocol = req.headers["x-forwarded-proto"] ?? "http";
5
+ const host = req.headers.host ?? "localhost:8080";
6
+ const url = new URL(req.url ?? "/", `${protocol}://${host}`);
7
+ const body = req.method === "GET" || req.method === "HEAD"
8
+ ? undefined
9
+ : Readable.toWeb(req);
10
+ const init = {
11
+ method: req.method,
12
+ headers: req.headers,
13
+ body,
14
+ };
15
+ if (body) {
16
+ init.duplex = "half";
17
+ }
18
+ return new Request(url, init);
19
+ }
20
+ export async function sendNodeResponse(res, response) {
21
+ res.statusCode = response.status;
22
+ response.headers.forEach((value, key) => {
23
+ res.setHeader(key, value);
24
+ });
25
+ if (!response.body) {
26
+ res.end();
27
+ return;
28
+ }
29
+ const stream = Readable.fromWeb(response.body);
30
+ stream.on("error", (error) => {
31
+ res.destroy(error);
32
+ });
33
+ stream.pipe(res);
34
+ }
35
+ export function serve(options) {
36
+ const server = createServer(async (req, res) => {
37
+ try {
38
+ const request = await toWebRequest(req);
39
+ const response = await options.fetch(request);
40
+ await sendNodeResponse(res, response);
41
+ }
42
+ catch (error) {
43
+ console.error(error);
44
+ res.statusCode = 500;
45
+ res.setHeader("Content-Type", "text/plain; charset=UTF-8");
46
+ res.end("Internal Server Error");
47
+ }
48
+ });
49
+ server.listen(options.port);
50
+ return server;
51
+ }
52
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAoB;IACrD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC;IAC5D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,QAAQ,MAAM,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAI,GACR,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAC3C,CAAC,CAAC,SAAS;QACX,CAAC,CAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAgC,CAAC;IAE1D,MAAM,IAAI,GAAsC;QAC9C,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAsB;QACnC,IAAI;KACL,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAmB,EAAE,QAAkB;IAC5E,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAW,CAAC,CAAC;IACtD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAGrB;IACC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/path.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export interface PathMatchResult {
2
+ params: Record<string, string>;
3
+ }
4
+ export interface CompiledPath {
5
+ pattern: string;
6
+ test(pathname: string): PathMatchResult | null;
7
+ }
8
+ export declare function compilePath(pattern: string): CompiledPath;
9
+ export declare function joinPaths(prefix: string, pathName: string): string;
10
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;CAChD;AAsBD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAsBzD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAazD"}
package/dist/path.js ADDED
@@ -0,0 +1,45 @@
1
+ function normalizePattern(pattern) {
2
+ if (!pattern || pattern === "*") {
3
+ return "/*";
4
+ }
5
+ if (!pattern.startsWith("/")) {
6
+ return `/${pattern}`;
7
+ }
8
+ return pattern;
9
+ }
10
+ function normalizePathname(pathname) {
11
+ if (!pathname || pathname === "/") {
12
+ return "/";
13
+ }
14
+ return pathname.endsWith("/") ? pathname.slice(0, -1) : pathname;
15
+ }
16
+ export function compilePath(pattern) {
17
+ const normalizedPattern = normalizePattern(pattern);
18
+ const matcher = new URLPattern({ pathname: normalizedPattern });
19
+ return {
20
+ pattern: normalizedPattern,
21
+ test(pathname) {
22
+ const normalizedPathname = normalizePathname(pathname);
23
+ const match = matcher.exec({ pathname: normalizedPathname });
24
+ if (!match) {
25
+ return null;
26
+ }
27
+ const params = Object.fromEntries(Object.entries(match.pathname.groups).filter(([name, value]) => {
28
+ return !/^\d+$/.test(name) && typeof value === "string";
29
+ }));
30
+ return { params };
31
+ },
32
+ };
33
+ }
34
+ export function joinPaths(prefix, pathName) {
35
+ if (!prefix || prefix === "/") {
36
+ return pathName || "/";
37
+ }
38
+ if (!pathName || pathName === "/") {
39
+ return prefix;
40
+ }
41
+ const normalizedPrefix = prefix.endsWith("/") ? prefix.slice(0, -1) : prefix;
42
+ const normalizedPath = pathName.startsWith("/") ? pathName : `/${pathName}`;
43
+ return `${normalizedPrefix}${normalizedPath}`;
44
+ }
45
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AASA,SAAS,gBAAgB,CAAC,OAAe;IACvC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,OAAO,EAAE,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QAClC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAEhE,OAAO;QACL,OAAO,EAAE,iBAAiB;QAC1B,IAAI,CAAC,QAAgB;YACnB,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;gBAC7D,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;YAC1D,CAAC,CAAC,CACH,CAAC;YAEF,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,QAAgB;IACxD,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QAC9B,OAAO,QAAQ,IAAI,GAAG,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7E,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;IAE5E,OAAO,GAAG,gBAAgB,GAAG,cAAc,EAAE,CAAC;AAChD,CAAC"}
package/dist/vite.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ import { type Plugin, type PluginOption, type UserConfig } from "vite";
2
+ export interface TreesapVitePluginOptions {
3
+ appEntry: string;
4
+ appFactoryExport?: string;
5
+ spaBase?: string;
6
+ spaIndexHtml?: string;
7
+ spaEntryModule?: string;
8
+ }
9
+ export interface DefineTreesapConfigOptions {
10
+ appEntry: string;
11
+ appFactoryExport?: string;
12
+ serverEntry?: string;
13
+ browserEntry?: string;
14
+ plugins?: PluginOption[];
15
+ vite?: UserConfig;
16
+ }
17
+ export declare function isViteRequest(pathname: string): boolean;
18
+ export declare function treesap(options: TreesapVitePluginOptions): Plugin;
19
+ export declare function defineTreesapConfig(options: DefineTreesapConfigOptions): import("vite").UserConfigFnObject;
20
+ export declare function getViteEntryAssets(options: {
21
+ entry: string;
22
+ mode?: string;
23
+ devScripts?: string[];
24
+ devStyles?: string[];
25
+ manifestPath?: string;
26
+ base?: string;
27
+ }): {
28
+ scripts: string[];
29
+ styles: string[];
30
+ };
31
+ //# sourceMappingURL=vite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,UAAU,EAEhB,MAAM,MAAM,CAAC;AASd,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAqDD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,WAS7C;AA+JD,wBAAgB,OAAO,CAAC,OAAO,EAAE,wBAAwB,GAAG,MAAM,CAgDjE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,qCA6BtE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;;;EA6CA"}
package/dist/vite.js ADDED
@@ -0,0 +1,278 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { build, defineConfig, mergeConfig, } from "vite";
5
+ import { sendNodeResponse, toWebRequest } from "./node.js";
6
+ function resolveRuntimeMode() {
7
+ const viteEnv = import.meta.env;
8
+ if (viteEnv?.PROD === true || process.env.NODE_ENV === "production") {
9
+ return "production";
10
+ }
11
+ return "development";
12
+ }
13
+ function normalizePublicPath(href, base) {
14
+ if (href.startsWith("/")) {
15
+ return href;
16
+ }
17
+ return `${base.replace(/\/$/, "")}/${href}`;
18
+ }
19
+ function resolveDefaultManifestPath() {
20
+ const candidates = [
21
+ path.resolve(process.cwd(), "dist/client/.vite/manifest.json"),
22
+ path.resolve(process.cwd(), "static/.vite/manifest.json"),
23
+ path.resolve(process.cwd(), "static/app/.vite/manifest.json"),
24
+ ];
25
+ return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];
26
+ }
27
+ function normalizeManifestLookupPath(entry) {
28
+ const normalized = path.posix.normalize(entry.replaceAll("\\", "/"));
29
+ return normalized
30
+ .replace(/^\/+/, "")
31
+ .replace(/^(\.\.\/)+/, "")
32
+ .replace(/^\.\//, "");
33
+ }
34
+ function normalizeSpaBase(base) {
35
+ if (!base.startsWith("/")) {
36
+ return `/${base}`;
37
+ }
38
+ return base.endsWith("/") ? base.slice(0, -1) : base;
39
+ }
40
+ function isFileRequest(pathname) {
41
+ const lastSegment = pathname.split("/").at(-1) ?? "";
42
+ return lastSegment.includes(".");
43
+ }
44
+ export function isViteRequest(pathname) {
45
+ return (pathname === "/@vite/client" ||
46
+ pathname.startsWith("/@fs/") ||
47
+ pathname.startsWith("/@id/") ||
48
+ pathname.startsWith("/@vite/") ||
49
+ pathname.startsWith("/node_modules/") ||
50
+ pathname.startsWith("/src/"));
51
+ }
52
+ function maybeRewriteSpaAssetRequest(url, spaBase) {
53
+ const currentUrl = new URL(url, "http://treesap.local");
54
+ if (!currentUrl.pathname.startsWith(`${spaBase}/`)) {
55
+ return null;
56
+ }
57
+ const strippedPathname = currentUrl.pathname.slice(spaBase.length) || "/";
58
+ if (!isViteRequest(strippedPathname) && !isFileRequest(strippedPathname)) {
59
+ return null;
60
+ }
61
+ currentUrl.pathname = strippedPathname;
62
+ return `${currentUrl.pathname}${currentUrl.search}`;
63
+ }
64
+ function isSpaShellRequest(pathname, spaBase) {
65
+ if (pathname === spaBase || pathname === `${spaBase}/`) {
66
+ return true;
67
+ }
68
+ if (!pathname.startsWith(`${spaBase}/`)) {
69
+ return false;
70
+ }
71
+ const suffix = pathname.slice(spaBase.length + 1);
72
+ return suffix.length > 0 && !suffix.split("/").at(-1)?.includes(".");
73
+ }
74
+ async function renderSpaShell(server, pathname, options) {
75
+ const templatePath = path.resolve(server.config.root, options.spaIndexHtml);
76
+ const template = (await readFile(templatePath, "utf-8")).replace("./main.tsx", options.spaEntryModule);
77
+ return server.transformIndexHtml(pathname, template);
78
+ }
79
+ async function loadTreesapApp(server, entry, exportName) {
80
+ const module = await server.ssrLoadModule(entry);
81
+ const createApp = module[exportName];
82
+ if (typeof createApp !== "function") {
83
+ throw new Error(`Treesap could not find exported app factory "${exportName}" in ${entry}.`);
84
+ }
85
+ const app = await createApp();
86
+ if (!app || typeof app.fetch !== "function") {
87
+ throw new Error(`Treesap app factory "${exportName}" in ${entry} did not return an object with fetch().`);
88
+ }
89
+ return app;
90
+ }
91
+ function resolveConfigRoot(viteConfig) {
92
+ return path.resolve(viteConfig?.root ?? process.cwd());
93
+ }
94
+ function createTreesapSharedConfig(options) {
95
+ const root = resolveConfigRoot(options.vite);
96
+ return mergeConfig({
97
+ appType: "custom",
98
+ root,
99
+ ssr: {
100
+ noExternal: ["hono"],
101
+ },
102
+ }, {
103
+ ...(options.vite ?? {}),
104
+ plugins: undefined,
105
+ });
106
+ }
107
+ function createTreesapDevConfig(options) {
108
+ return mergeConfig(createTreesapSharedConfig(options), {
109
+ base: "/",
110
+ plugins: [
111
+ treesap({
112
+ appEntry: options.appEntry,
113
+ appFactoryExport: options.appFactoryExport,
114
+ }),
115
+ ...(options.plugins ?? []),
116
+ ],
117
+ });
118
+ }
119
+ function createTreesapClientBuildConfig(options) {
120
+ const root = resolveConfigRoot(options.vite);
121
+ const browserEntry = options.browserEntry ?? "src/www/entry-style.ts";
122
+ return mergeConfig(createTreesapSharedConfig(options), {
123
+ base: "/",
124
+ publicDir: path.resolve(root, "public"),
125
+ plugins: [...(options.plugins ?? [])],
126
+ build: {
127
+ manifest: true,
128
+ outDir: "dist/client",
129
+ emptyOutDir: true,
130
+ rolldownOptions: {
131
+ input: {
132
+ browser: path.resolve(root, browserEntry),
133
+ },
134
+ },
135
+ },
136
+ });
137
+ }
138
+ function createTreesapServerBuildConfig(options) {
139
+ return mergeConfig(createTreesapSharedConfig(options), {
140
+ base: "/",
141
+ publicDir: false,
142
+ plugins: [...(options.plugins ?? [])],
143
+ build: {
144
+ ssr: options.serverEntry ?? "src/main.tsx",
145
+ target: "node22",
146
+ outDir: "dist/server",
147
+ sourcemap: true,
148
+ emptyOutDir: false,
149
+ rolldownOptions: {
150
+ external: [
151
+ "fs",
152
+ "path",
153
+ "url",
154
+ "module",
155
+ "crypto",
156
+ "stream",
157
+ /^node:/,
158
+ ],
159
+ output: {
160
+ format: "esm",
161
+ },
162
+ },
163
+ },
164
+ oxc: {
165
+ jsx: {
166
+ runtime: "automatic",
167
+ importSource: "hono/jsx",
168
+ },
169
+ },
170
+ });
171
+ }
172
+ export function treesap(options) {
173
+ const spaBase = normalizeSpaBase(options.spaBase ?? "/app");
174
+ const appFactoryExport = options.appFactoryExport ?? "createServerApp";
175
+ const spaIndexHtml = options.spaIndexHtml ?? "src/app/index.html";
176
+ const spaEntryModule = options.spaEntryModule ?? "/src/app/main.tsx";
177
+ return {
178
+ name: "treesap",
179
+ configureServer(server) {
180
+ server.middlewares.use(async (req, res, next) => {
181
+ const rewrittenUrl = maybeRewriteSpaAssetRequest(req.url ?? "/", spaBase);
182
+ if (rewrittenUrl) {
183
+ req.url = rewrittenUrl;
184
+ }
185
+ const pathname = new URL(req.url ?? "/", "http://treesap.local").pathname;
186
+ try {
187
+ if (isViteRequest(pathname)) {
188
+ next();
189
+ return;
190
+ }
191
+ if (isSpaShellRequest(pathname, spaBase)) {
192
+ const html = await renderSpaShell(server, pathname, {
193
+ spaIndexHtml,
194
+ spaEntryModule,
195
+ });
196
+ res.statusCode = 200;
197
+ res.setHeader("Content-Type", "text/html; charset=UTF-8");
198
+ res.end(html);
199
+ return;
200
+ }
201
+ const app = await loadTreesapApp(server, options.appEntry, appFactoryExport);
202
+ const request = await toWebRequest(req);
203
+ const response = await app.fetch(request);
204
+ await sendNodeResponse(res, response);
205
+ }
206
+ catch (error) {
207
+ server.ssrFixStacktrace(error);
208
+ console.error(error);
209
+ res.statusCode = 500;
210
+ res.setHeader("Content-Type", "text/plain; charset=UTF-8");
211
+ res.end("Internal Server Error");
212
+ }
213
+ });
214
+ },
215
+ };
216
+ }
217
+ export function defineTreesapConfig(options) {
218
+ return defineConfig(({ command }) => {
219
+ if (command === "serve") {
220
+ return createTreesapDevConfig(options);
221
+ }
222
+ return {
223
+ ...createTreesapSharedConfig(options),
224
+ base: "/",
225
+ publicDir: false,
226
+ builder: {
227
+ async buildApp(builder) {
228
+ await build({
229
+ ...createTreesapClientBuildConfig(options),
230
+ configFile: false,
231
+ });
232
+ await build({
233
+ ...createTreesapServerBuildConfig(options),
234
+ configFile: false,
235
+ });
236
+ Object.values(builder.environments).forEach((environment) => {
237
+ environment.isBuilt = true;
238
+ });
239
+ },
240
+ },
241
+ };
242
+ });
243
+ }
244
+ export function getViteEntryAssets(options) {
245
+ const mode = options.mode ?? resolveRuntimeMode();
246
+ if (mode !== "production") {
247
+ return {
248
+ scripts: options.devScripts ?? [],
249
+ styles: options.devStyles ?? [],
250
+ };
251
+ }
252
+ const manifestPath = options.manifestPath ?? resolveDefaultManifestPath();
253
+ const base = options.base ?? "/";
254
+ if (!existsSync(manifestPath)) {
255
+ return {
256
+ scripts: [],
257
+ styles: [],
258
+ };
259
+ }
260
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
261
+ const lookupEntry = normalizeManifestLookupPath(options.entry);
262
+ const entry = manifest[options.entry] ??
263
+ Object.entries(manifest).find(([key, value]) => {
264
+ const normalizedKey = normalizeManifestLookupPath(key);
265
+ const normalizedSrc = value.src
266
+ ? normalizeManifestLookupPath(value.src)
267
+ : undefined;
268
+ return (normalizedKey === lookupEntry ||
269
+ normalizedKey.endsWith(lookupEntry) ||
270
+ normalizedSrc === lookupEntry ||
271
+ normalizedSrc?.endsWith(lookupEntry) === true);
272
+ })?.[1];
273
+ return {
274
+ scripts: entry?.file ? [normalizePublicPath(entry.file, base)] : [],
275
+ styles: (entry?.css ?? []).map((href) => normalizePublicPath(href, base)),
276
+ };
277
+ }
278
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,KAAK,EACL,YAAY,EACZ,WAAW,GAKZ,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAyB3D,SAAS,kBAAkB;IACzB,MAAM,OAAO,GAAI,MAAM,CAAC,IAEtB,CAAC,GAAG,CAAC;IAEP,IAAI,OAAO,EAAE,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACpE,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,IAAY;IACrD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,0BAA0B;IACjC,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iCAAiC,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,4BAA4B,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gCAAgC,CAAC;KAC9D,CAAC;IAEF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAa;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACrE,OAAO,UAAU;SACd,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,OAAO,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,CACL,QAAQ,KAAK,eAAe;QAC5B,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QAC5B,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QAC5B,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAC9B,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC;QACrC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAC7B,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,GAAW,EAAE,OAAe;IAC/D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;IAE1E,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU,CAAC,QAAQ,GAAG,gBAAgB,CAAC;IACvC,OAAO,GAAG,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,OAAe;IAC1D,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,GAAG,OAAO,GAAG,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;AACvE,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,MAAqB,EACrB,QAAgB,EAChB,OAAoF;IAEpF,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAC9D,YAAY,EACZ,OAAO,CAAC,cAAc,CACvB,CAAC;IACF,OAAO,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAqB,EAAE,KAAa,EAAE,UAAkB;IACpF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAErC,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,gDAAgD,UAAU,QAAQ,KAAK,GAAG,CAC3E,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,wBAAwB,UAAU,QAAQ,KAAK,yCAAyC,CACzF,CAAC;IACJ,CAAC;IAED,OAAO,GAAgE,CAAC;AAC1E,CAAC;AAED,SAAS,iBAAiB,CAAC,UAAuB;IAChD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAmC;IACpE,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,OAAO,WAAW,CAChB;QACE,OAAO,EAAE,QAAQ;QACjB,IAAI;QACJ,GAAG,EAAE;YACH,UAAU,EAAE,CAAC,MAAM,CAAC;SACrB;KACF,EACD;QACE,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,EAAE,SAAS;KACnB,CACF,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAmC;IACjE,OAAO,WAAW,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE;QACrD,IAAI,EAAE,GAAG;QACT,OAAO,EAAE;YACP,OAAO,CAAC;gBACN,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;aAC3C,CAAC;YACF,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SAC3B;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,8BAA8B,CACrC,OAAmC;IAEnC,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,wBAAwB,CAAC;IAEtE,OAAO,WAAW,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE;QACrD,IAAI,EAAE,GAAG;QACT,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;QACvC,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACrC,KAAK,EAAE;YACL,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,aAAa;YACrB,WAAW,EAAE,IAAI;YACjB,eAAe,EAAE;gBACf,KAAK,EAAE;oBACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC;iBAC1C;aACF;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,8BAA8B,CACrC,OAAmC;IAEnC,OAAO,WAAW,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE;QACrD,IAAI,EAAE,GAAG;QACT,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACrC,KAAK,EAAE;YACL,GAAG,EAAE,OAAO,CAAC,WAAW,IAAI,cAAc;YAC1C,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,aAAa;YACrB,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE;gBACf,QAAQ,EAAE;oBACR,IAAI;oBACJ,MAAM;oBACN,KAAK;oBACL,QAAQ;oBACR,QAAQ;oBACR,QAAQ;oBACR,QAAQ;iBACT;gBACD,MAAM,EAAE;oBACN,MAAM,EAAE,KAAK;iBACd;aACF;SACF;QACD,GAAG,EAAE;YACH,GAAG,EAAE;gBACH,OAAO,EAAE,WAAW;gBACpB,YAAY,EAAE,UAAU;aACzB;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAiC;IACvD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,iBAAiB,CAAC;IACvE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,oBAAoB,CAAC;IAClE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,mBAAmB,CAAC;IAErE,OAAO;QACL,IAAI,EAAE,SAAS;QACf,eAAe,CAAC,MAAM;YACpB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBAC9C,MAAM,YAAY,GAAG,2BAA2B,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC;gBAC1E,IAAI,YAAY,EAAE,CAAC;oBACjB,GAAG,CAAC,GAAG,GAAG,YAAY,CAAC;gBACzB,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC;gBAE1E,IAAI,CAAC;oBACH,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC5B,IAAI,EAAE,CAAC;wBACP,OAAO;oBACT,CAAC;oBAED,IAAI,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;wBACzC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE;4BAClD,YAAY;4BACZ,cAAc;yBACf,CAAC,CAAC;wBACH,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;wBACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;wBAC1D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBACd,OAAO;oBACT,CAAC;oBAED,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;oBAC7E,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;oBACxC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC1C,MAAM,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACxC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,gBAAgB,CAAC,KAAc,CAAC,CAAC;oBACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACrB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAmC;IACrE,OAAO,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;QAClC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAED,OAAO;YACL,GAAG,yBAAyB,CAAC,OAAO,CAAC;YACrC,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE;gBACP,KAAK,CAAC,QAAQ,CAAC,OAAO;oBACpB,MAAM,KAAK,CAAC;wBACV,GAAG,8BAA8B,CAAC,OAAO,CAAC;wBAC1C,UAAU,EAAE,KAAK;qBAClB,CAAC,CAAC;oBAEH,MAAM,KAAK,CAAC;wBACV,GAAG,8BAA8B,CAAC,OAAO,CAAC;wBAC1C,UAAU,EAAE,KAAK;qBAClB,CAAC,CAAC;oBAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;wBAC1D,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC7B,CAAC,CAAC,CAAC;gBACL,CAAC;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAOlC;IACC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,kBAAkB,EAAE,CAAC;IAClD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;YACjC,MAAM,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;SAChC,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,0BAA0B,EAAE,CAAC;IAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC;IAEjC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,EAAc;YACvB,MAAM,EAAE,EAAc;SACvB,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAG9D,CAAC;IACF,MAAM,WAAW,GAAG,2BAA2B,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAE/D,MAAM,KAAK,GACT,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC7C,MAAM,aAAa,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC;YACvD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG;gBAC7B,CAAC,CAAC,2BAA2B,CAAC,KAAK,CAAC,GAAG,CAAC;gBACxC,CAAC,CAAC,SAAS,CAAC;YAEd,OAAO,CACL,aAAa,KAAK,WAAW;gBAC7B,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACnC,aAAa,KAAK,WAAW;gBAC7B,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,IAAI,CAC9C,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEV,OAAO;QACL,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;QACnE,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KAC1E,CAAC;AACJ,CAAC"}