phial 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,20 +8,116 @@
8
8
  pnpm add phial
9
9
  ```
10
10
 
11
- ## Use the plugin
11
+ ## Configuration
12
+
13
+ ### Vite Config (`vite.config.ts`)
12
14
 
13
15
  ```ts
14
- import { defineConfig, phialVitePlugin } from "phial/vite-plugin";
16
+ import { phialVitePlugin } from "phial/vite-plugin";
17
+ import { defineConfig } from "vite";
15
18
 
16
19
  export default defineConfig({
17
20
  plugins: [phialVitePlugin()],
18
21
  });
19
22
  ```
20
23
 
24
+ ### Phial Config (`phial.config.ts`)
25
+
26
+ ```ts
27
+ import { defineConfig } from "phial/vite-plugin";
28
+
29
+ // Static config
30
+ export default defineConfig({
31
+ app: {
32
+ middlewares: ["auth"],
33
+ },
34
+ server: {
35
+ middleware: ["logger"],
36
+ },
37
+ dev: {
38
+ port: 3000,
39
+ },
40
+ });
41
+
42
+ // Or function config based on command/mode
43
+ export default defineConfig(({ command, mode }) => ({
44
+ app: {
45
+ middlewares: mode === "production" ? ["auth", "compress"] : ["auth"],
46
+ },
47
+ dev: {
48
+ port: command === "serve" ? 3000 : 4000,
49
+ },
50
+ }));
51
+
52
+ // Or async function for dynamic config
53
+ export default defineConfig(async ({ mode }) => {
54
+ const dbConfig = await loadDbConfig();
55
+ return {
56
+ app: {
57
+ middlewares: ["auth"],
58
+ },
59
+ server: {
60
+ middleware: dbConfig.middlewares,
61
+ },
62
+ };
63
+ });
64
+ ```
65
+
21
66
  ## Public entry points
22
67
 
23
68
  - `phial`
24
69
  - `phial/vite-plugin`
70
+ - `phial/app`
71
+ - `phial/server`
72
+
73
+ `phial` exports the package version.
74
+ `phial/vite-plugin` provides the Vite plugin, config utilities, and build tools.
75
+ `phial/app` is for **app routes** — Vue pages, loaders, actions.
76
+ `phial/server` is for **server routes** — API handlers, middleware.
77
+
78
+ ### App Routes (`phial/app`)
79
+
80
+ For developing Vue page routes:
81
+
82
+ ```ts
83
+ // loader.ts
84
+ import type { LoaderContext } from "phial/app";
85
+
86
+ export const loader = async (ctx: LoaderContext) => {
87
+ return { data: await fetchData() };
88
+ };
89
+ ```
25
90
 
26
- The CLI ships as `phial` via the package `bin` field and also lives at `bin/phial.mjs`.
27
- `phial` re-exports the `vuepagelet` runtime surface.
91
+ ```ts
92
+ // page.vue
93
+ import { useLoaderData, RouterView } from "phial/app";
94
+ ```
95
+
96
+ ### Server Routes (`phial/server`)
97
+
98
+ For developing API routes:
99
+
100
+ ```ts
101
+ // route.ts
102
+ import type { ServerHandler } from "phial/server";
103
+
104
+ export const GET: ServerHandler = (ctx) => {
105
+ return Response.json({ hello: "world" });
106
+ };
107
+ ```
108
+
109
+ ## CLI
110
+
111
+ The CLI ships as `phial` via the package `bin` field:
112
+
113
+ ```bash
114
+ npx phial dev
115
+ npx phial build
116
+ npx phial start
117
+ ```
118
+
119
+ CLI entry: `phial/cli`
120
+
121
+ ```ts
122
+ import { runPhialCli } from "phial/cli";
123
+ ```
package/dist/app.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { RouterLink, RouterView, useActionData, useAppData, useAppError, useCurrentPageRoute, useDeferredData, useDeferredError, useFetcher, useFormAction, useLoaderData, useNavigation, usePageRoute, useRoute, useRouteLoaderData, useRouter, useState, useSubmit } from "vuepagelet";
2
+ import { ActionContext, ActionResult, DeferredDataRecord, LoaderContext, LoaderResult, MiddlewareContext, PageMiddleware, defer } from "vuepagelet/integration";
3
+
4
+ //#region src/app.d.ts
5
+ type MaybePromise<T> = T | Promise<T>;
6
+ type Maybe<T> = T | undefined;
7
+ //#endregion
8
+ export { type ActionContext, type ActionResult, type DeferredDataRecord, type LoaderContext, type LoaderResult, Maybe, MaybePromise, type MiddlewareContext, type PageMiddleware, RouterLink, RouterView, defer, useActionData, useAppData, useAppError, useCurrentPageRoute, useDeferredData, useDeferredError, useFetcher, useFormAction, useLoaderData, useNavigation, usePageRoute, useRoute, useRouteLoaderData, useRouter, useState, useSubmit };
9
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","names":[],"sources":["../src/app.ts"],"mappings":";;;;KAgEY,YAAA,MAAkB,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,KAC9B,KAAA,MAAW,CAAA"}
package/dist/app.js ADDED
@@ -0,0 +1,3 @@
1
+ import { RouterLink, RouterView, useActionData, useAppData, useAppError, useCurrentPageRoute, useDeferredData, useDeferredError, useFetcher, useFormAction, useLoaderData, useNavigation, usePageRoute, useRoute, useRouteLoaderData, useRouter, useState, useSubmit } from "vuepagelet";
2
+ import { defer } from "vuepagelet/integration";
3
+ export { RouterLink, RouterView, defer, useActionData, useAppData, useAppError, useCurrentPageRoute, useDeferredData, useDeferredError, useFetcher, useFormAction, useLoaderData, useNavigation, usePageRoute, useRoute, useRouteLoaderData, useRouter, useState, useSubmit };
package/dist/bin.d.ts ADDED
@@ -0,0 +1 @@
1
+ export { };
package/dist/bin.js ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { runPhialCli } from "./lib/cli/index.js";
3
+ import process from "node:process";
4
+ //#region src/bin.ts
5
+ process.exitCode = await runPhialCli(process.argv.slice(2));
6
+ //#endregion
7
+ export {};
8
+
9
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","names":[],"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport process from \"node:process\";\nimport { runPhialCli } from \"./lib/cli/index.js\";\n\nprocess.exitCode = await runPhialCli(process.argv.slice(2));\n"],"mappings":";;;;AAKA,QAAQ,WAAW,MAAM,YAAY,QAAQ,KAAK,MAAM,EAAE,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1 +1,2 @@
1
- export * from "vuepagelet";
1
+ import { name, version } from "./package.json.js";
2
+ export { name, version };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export * from "vuepagelet";
2
- export {};
1
+ import { name, version } from "./package.js";
2
+ export { name, version };
@@ -7,7 +7,7 @@ declare namespace PhialGeneratedTypes {
7
7
  type CreateRouteRuntimeIntegrationOptions =
8
8
  import("vuepagelet/integration").CreateRouteRuntimeIntegrationOptions;
9
9
  type RouteRuntimeIntegration = import("vuepagelet/integration").RouteRuntimeIntegration;
10
- type FestServerPlugin = unknown;
10
+ type SevokServerPlugin = import("sevok").ServerPlugin;
11
11
 
12
12
  interface DevConfig {
13
13
  host?: string;
@@ -53,23 +53,17 @@ declare namespace PhialGeneratedTypes {
53
53
  index?: boolean;
54
54
  }
55
55
 
56
- type ServerRouteHandler = (request: Request) => unknown | Promise<unknown>;
57
- type ServerMiddleware = (
58
- request: Request,
59
- next: (request: Request) => Promise<Response>,
60
- ) => Response | Promise<Response>;
56
+ // ServerRouteHandler now aligns with sevok's ServerHandler for full feature support
57
+ type ServerRouteHandler = import("sevok").ServerHandler;
58
+ type ServerMiddleware = import("sevok").ServerMiddleware;
59
+ type ServerMethodHandlers = import("sevok").ServerMethodHandlers;
61
60
 
62
- interface ServerRouteDefinition {
61
+ // Extend sevok's ServerMethodHandlers to add phial-specific fields
62
+ interface ServerRouteDefinition extends ServerMethodHandlers {
63
63
  middlewareNames?: readonly string[];
64
64
  meta?: Record<string, unknown>;
65
+ /** Fallback handler when no method-specific handler matches */
65
66
  handler?: ServerRouteHandler;
66
- GET?: ServerRouteHandler;
67
- POST?: ServerRouteHandler;
68
- PUT?: ServerRouteHandler;
69
- PATCH?: ServerRouteHandler;
70
- DELETE?: ServerRouteHandler;
71
- HEAD?: ServerRouteHandler;
72
- OPTIONS?: ServerRouteHandler;
73
67
  }
74
68
 
75
69
  interface ServerRouteRecord {
@@ -147,8 +141,8 @@ declare module "phial/generated-app-plugin" {
147
141
 
148
142
  export function createAppPlugin(
149
143
  options?: PhialCreateAppPluginOptions,
150
- ): PhialGeneratedTypes.FestServerPlugin;
151
- export const appPlugin: PhialGeneratedTypes.FestServerPlugin;
144
+ ): PhialGeneratedTypes.SevokServerPlugin;
145
+ export const appPlugin: PhialGeneratedTypes.SevokServerPlugin;
152
146
  export default createAppPlugin;
153
147
  }
154
148
 
@@ -164,8 +158,8 @@ declare module "phial/generated-server-middleware" {
164
158
  }
165
159
 
166
160
  declare module "phial/generated-server-plugin" {
167
- export function createServerPlugin(): PhialGeneratedTypes.FestServerPlugin;
168
- export const serverPlugin: PhialGeneratedTypes.FestServerPlugin;
161
+ export function createServerPlugin(): PhialGeneratedTypes.SevokServerPlugin;
162
+ export const serverPlugin: PhialGeneratedTypes.SevokServerPlugin;
169
163
  export default createServerPlugin;
170
164
  }
171
165
 
@@ -31,6 +31,19 @@ interface PhialConfig {
31
31
  vite?: InlineConfig;
32
32
  plugin?: PhialPluginOptions;
33
33
  }
34
+ /**
35
+ * Config environment passed to config functions
36
+ */
37
+ interface PhialConfigEnv {
38
+ command: "build" | "serve";
39
+ mode: string;
40
+ isSsrBuild: boolean;
41
+ isPreview: boolean;
42
+ }
43
+ /**
44
+ * Config can be a static object or a function that returns a config (or Promise)
45
+ */
46
+ type PhialConfigExport = PhialConfig | ((env: PhialConfigEnv) => PhialConfig | Promise<PhialConfig>);
34
47
  interface LoadPhialConfigOptions {
35
48
  root?: string;
36
49
  configFile?: string;
@@ -47,8 +60,13 @@ interface LoadedPhialConfig {
47
60
  config: PhialConfig;
48
61
  env: Required<Pick<LoadPhialConfigOptions, "command" | "mode" | "isSsrBuild" | "isPreview">>;
49
62
  }
50
- declare function defineConfig(config: PhialConfig): PhialConfig;
63
+ /**
64
+ * Define phial configuration
65
+ * Accepts a static config object or a function that receives config env
66
+ * Function can return config synchronously or asynchronously
67
+ */
68
+ declare function defineConfig(config: PhialConfigExport): PhialConfigExport;
51
69
  declare function loadPhialConfig(options?: LoadPhialConfigOptions): Promise<LoadedPhialConfig>;
52
70
  //#endregion
53
- export { LoadPhialConfigOptions, LoadedPhialConfig, PhialConfig, PhialDevConfig, PhialPluginOptions, PhialServerConfig, defineConfig, loadPhialConfig };
71
+ export { LoadPhialConfigOptions, LoadedPhialConfig, PhialConfig, PhialConfigEnv, PhialConfigExport, PhialDevConfig, PhialPluginOptions, PhialServerConfig, defineConfig, loadPhialConfig };
54
72
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","names":[],"sources":["../../../src/lib/vite-plugin/config.ts"],"mappings":";;;UAmBiB,cAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,iBAAA;EACf,UAAA;AAAA;AAAA,UAGe,kBAAA;EACf,IAAA;EACA,MAAA;EACA,UAAA;EACA,SAAA;EACA,eAAA;EACA,mBAAA;EACA,gBAAA;AAAA;AAAA,UAGe,cAAA;EACf,WAAA;EACA,cAAA;EACA,iBAAA;EACA,eAAA;AAAA;AAAA,UAGe,WAAA;EACf,IAAA;EACA,GAAA,GAAM,cAAA;EACN,MAAA,GAAS,iBAAA;EACT,GAAA,GAAM,cAAA;EACN,IAAA,GAAO,YAAA;EACP,MAAA,GAAS,kBAAA;AAAA;AAAA,UAGM,sBAAA;EACf,IAAA;EACA,UAAA;EACA,OAAA,GAAU,SAAA;EACV,IAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA,GAAW,QAAA;AAAA;AAAA,UAGI,iBAAA;EACf,IAAA;EACA,UAAA;EACA,UAAA;EACA,MAAA,EAAQ,WAAA;EACR,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,sBAAA;AAAA;AAAA,iBAGL,YAAA,CAAa,MAAA,EAAQ,WAAA,GAAc,WAAA;AAAA,iBAI7B,eAAA,CACpB,OAAA,GAAS,sBAAA,GACR,OAAA,CAAQ,iBAAA"}
1
+ {"version":3,"file":"config.d.ts","names":[],"sources":["../../../src/lib/vite-plugin/config.ts"],"mappings":";;;UAmBiB,cAAA;EACf,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,iBAAA;EACf,UAAA;AAAA;AAAA,UAGe,kBAAA;EACf,IAAA;EACA,MAAA;EACA,UAAA;EACA,SAAA;EACA,eAAA;EACA,mBAAA;EACA,gBAAA;AAAA;AAAA,UAGe,cAAA;EACf,WAAA;EACA,cAAA;EACA,iBAAA;EACA,eAAA;AAAA;AAAA,UAGe,WAAA;EACf,IAAA;EACA,GAAA,GAAM,cAAA;EACN,MAAA,GAAS,iBAAA;EACT,GAAA,GAAM,cAAA;EACN,IAAA,GAAO,YAAA;EACP,MAAA,GAAS,kBAAA;AAAA;;;;UAMM,cAAA;EACf,OAAA;EACA,IAAA;EACA,UAAA;EACA,SAAA;AAAA;;;;KAMU,iBAAA,GACR,WAAA,KACE,GAAA,EAAK,cAAA,KAAmB,WAAA,GAAc,OAAA,CAAQ,WAAA;AAAA,UAEnC,sBAAA;EACf,IAAA;EACA,UAAA;EACA,OAAA,GAAU,SAAA;EACV,IAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA,GAAW,QAAA;AAAA;AAAA,UAGI,iBAAA;EACf,IAAA;EACA,UAAA;EACA,UAAA;EACA,MAAA,EAAQ,WAAA;EACR,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,sBAAA;AAAA;;;;;;iBAQL,YAAA,CAAa,MAAA,EAAQ,iBAAA,GAAoB,iBAAA;AAAA,iBAInC,eAAA,CACpB,OAAA,GAAS,sBAAA,GACR,OAAA,CAAQ,iBAAA"}
@@ -1,6 +1,6 @@
1
- import { existsSync } from "node:fs";
2
1
  import { dirname, resolve } from "node:path";
3
2
  import { loadConfigFromFile, normalizePath } from "vite";
3
+ import { existsSync } from "node:fs";
4
4
  //#region src/lib/vite-plugin/config.ts
5
5
  const DEFAULT_PHIAL_CONFIG_FILES = [
6
6
  "phial.config.ts",
@@ -10,6 +10,11 @@ const DEFAULT_PHIAL_CONFIG_FILES = [
10
10
  "phial.config.cts",
11
11
  "phial.config.cjs"
12
12
  ];
13
+ /**
14
+ * Define phial configuration
15
+ * Accepts a static config object or a function that receives config env
16
+ * Function can return config synchronously or asynchronously
17
+ */
13
18
  function defineConfig(config) {
14
19
  return config;
15
20
  }
@@ -28,7 +33,8 @@ async function loadPhialConfig(options = {}) {
28
33
  config: {},
29
34
  env
30
35
  };
31
- const config = (await loadConfigFromFile(env, configFile, searchRoot, options.logLevel ?? "error"))?.config ?? {};
36
+ const rawConfig = (await loadConfigFromFile(env, configFile, searchRoot, options.logLevel ?? "error"))?.config ?? {};
37
+ const config = await (typeof rawConfig === "function" ? rawConfig(env) : rawConfig);
32
38
  return {
33
39
  file: configFile,
34
40
  searchRoot,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":[],"sources":["../../../src/lib/vite-plugin/config.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport {\n loadConfigFromFile,\n normalizePath,\n type ConfigEnv,\n type InlineConfig,\n type LogLevel,\n} from \"vite\";\n\nexport const DEFAULT_PHIAL_CONFIG_FILES = [\n \"phial.config.ts\",\n \"phial.config.mts\",\n \"phial.config.js\",\n \"phial.config.mjs\",\n \"phial.config.cts\",\n \"phial.config.cjs\",\n] as const;\n\nexport interface PhialDevConfig {\n host?: string;\n port?: number;\n}\n\nexport interface PhialServerConfig {\n middleware?: readonly string[];\n}\n\nexport interface PhialPluginOptions {\n root?: string;\n appDir?: string;\n extensions?: string[];\n routesDir?: string;\n serverRoutesDir?: string;\n serverMiddlewareDir?: string;\n moduleImportMode?: \"dynamic\" | \"eager\";\n}\n\nexport interface PhialAppConfig {\n middlewares?: readonly string[];\n dataQueryParam?: string;\n injectClientEntry?: boolean;\n clientEntryPath?: string;\n}\n\nexport interface PhialConfig {\n root?: string;\n app?: PhialAppConfig;\n server?: PhialServerConfig;\n dev?: PhialDevConfig;\n vite?: InlineConfig;\n plugin?: PhialPluginOptions;\n}\n\nexport interface LoadPhialConfigOptions {\n root?: string;\n configFile?: string;\n command?: ConfigEnv[\"command\"];\n mode?: string;\n isSsrBuild?: boolean;\n isPreview?: boolean;\n logLevel?: LogLevel;\n}\n\nexport interface LoadedPhialConfig {\n file?: string;\n searchRoot: string;\n configRoot: string;\n config: PhialConfig;\n env: Required<Pick<LoadPhialConfigOptions, \"command\" | \"mode\" | \"isSsrBuild\" | \"isPreview\">>;\n}\n\nexport function defineConfig(config: PhialConfig): PhialConfig {\n return config;\n}\n\nexport async function loadPhialConfig(\n options: LoadPhialConfigOptions = {},\n): Promise<LoadedPhialConfig> {\n const searchRoot = resolve(options.root ?? process.cwd());\n const env = {\n command: options.command ?? \"serve\",\n mode: options.mode ?? process.env.NODE_ENV ?? \"development\",\n isSsrBuild: options.isSsrBuild ?? false,\n isPreview: options.isPreview ?? false,\n };\n const configFile = resolveConfigFile(searchRoot, options.configFile);\n\n if (!configFile) {\n return {\n searchRoot,\n configRoot: searchRoot,\n config: {},\n env,\n };\n }\n\n const loaded = await loadConfigFromFile(env, configFile, searchRoot, options.logLevel ?? \"error\");\n const config = (loaded?.config ?? {}) as PhialConfig;\n\n return {\n file: configFile,\n searchRoot,\n configRoot: resolve(dirname(configFile), config.root ?? \".\"),\n config,\n env,\n };\n}\n\nexport function isPhialConfigFile(file: string): boolean {\n const normalized = normalizePath(file);\n return DEFAULT_PHIAL_CONFIG_FILES.some(\n (configFile) => normalized.endsWith(`/${configFile}`) || normalized === configFile,\n );\n}\n\nfunction resolveConfigFile(root: string, configFile?: string): string | undefined {\n if (configFile) {\n const resolved = resolve(root, configFile);\n return existsSync(resolved) ? resolved : undefined;\n }\n\n return DEFAULT_PHIAL_CONFIG_FILES.map((file) => resolve(root, file)).find((file) =>\n existsSync(file),\n );\n}\n"],"mappings":";;;;AAUA,MAAa,6BAA6B;CACxC;CACA;CACA;CACA;CACA;CACA;CACD;AAuDD,SAAgB,aAAa,QAAkC;AAC7D,QAAO;;AAGT,eAAsB,gBACpB,UAAkC,EAAE,EACR;CAC5B,MAAM,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,KAAK,CAAC;CACzD,MAAM,MAAM;EACV,SAAS,QAAQ,WAAW;EAC5B,MAAM,QAAQ,QAAQ,QAAQ,IAAI,YAAY;EAC9C,YAAY,QAAQ,cAAc;EAClC,WAAW,QAAQ,aAAa;EACjC;CACD,MAAM,aAAa,kBAAkB,YAAY,QAAQ,WAAW;AAEpE,KAAI,CAAC,WACH,QAAO;EACL;EACA,YAAY;EACZ,QAAQ,EAAE;EACV;EACD;CAIH,MAAM,UADS,MAAM,mBAAmB,KAAK,YAAY,YAAY,QAAQ,YAAY,QAAQ,GACzE,UAAU,EAAE;AAEpC,QAAO;EACL,MAAM;EACN;EACA,YAAY,QAAQ,QAAQ,WAAW,EAAE,OAAO,QAAQ,IAAI;EAC5D;EACA;EACD;;AAGH,SAAgB,kBAAkB,MAAuB;CACvD,MAAM,aAAa,cAAc,KAAK;AACtC,QAAO,2BAA2B,MAC/B,eAAe,WAAW,SAAS,IAAI,aAAa,IAAI,eAAe,WACzE;;AAGH,SAAS,kBAAkB,MAAc,YAAyC;AAChF,KAAI,YAAY;EACd,MAAM,WAAW,QAAQ,MAAM,WAAW;AAC1C,SAAO,WAAW,SAAS,GAAG,WAAW,KAAA;;AAG3C,QAAO,2BAA2B,KAAK,SAAS,QAAQ,MAAM,KAAK,CAAC,CAAC,MAAM,SACzE,WAAW,KAAK,CACjB"}
1
+ {"version":3,"file":"config.js","names":[],"sources":["../../../src/lib/vite-plugin/config.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport {\n loadConfigFromFile,\n normalizePath,\n type ConfigEnv,\n type InlineConfig,\n type LogLevel,\n} from \"vite\";\n\nexport const DEFAULT_PHIAL_CONFIG_FILES = [\n \"phial.config.ts\",\n \"phial.config.mts\",\n \"phial.config.js\",\n \"phial.config.mjs\",\n \"phial.config.cts\",\n \"phial.config.cjs\",\n] as const;\n\nexport interface PhialDevConfig {\n host?: string;\n port?: number;\n}\n\nexport interface PhialServerConfig {\n middleware?: readonly string[];\n}\n\nexport interface PhialPluginOptions {\n root?: string;\n appDir?: string;\n extensions?: string[];\n routesDir?: string;\n serverRoutesDir?: string;\n serverMiddlewareDir?: string;\n moduleImportMode?: \"dynamic\" | \"eager\";\n}\n\nexport interface PhialAppConfig {\n middlewares?: readonly string[];\n dataQueryParam?: string;\n injectClientEntry?: boolean;\n clientEntryPath?: string;\n}\n\nexport interface PhialConfig {\n root?: string;\n app?: PhialAppConfig;\n server?: PhialServerConfig;\n dev?: PhialDevConfig;\n vite?: InlineConfig;\n plugin?: PhialPluginOptions;\n}\n\n/**\n * Config environment passed to config functions\n */\nexport interface PhialConfigEnv {\n command: \"build\" | \"serve\";\n mode: string;\n isSsrBuild: boolean;\n isPreview: boolean;\n}\n\n/**\n * Config can be a static object or a function that returns a config (or Promise)\n */\nexport type PhialConfigExport =\n | PhialConfig\n | ((env: PhialConfigEnv) => PhialConfig | Promise<PhialConfig>);\n\nexport interface LoadPhialConfigOptions {\n root?: string;\n configFile?: string;\n command?: ConfigEnv[\"command\"];\n mode?: string;\n isSsrBuild?: boolean;\n isPreview?: boolean;\n logLevel?: LogLevel;\n}\n\nexport interface LoadedPhialConfig {\n file?: string;\n searchRoot: string;\n configRoot: string;\n config: PhialConfig;\n env: Required<Pick<LoadPhialConfigOptions, \"command\" | \"mode\" | \"isSsrBuild\" | \"isPreview\">>;\n}\n\n/**\n * Define phial configuration\n * Accepts a static config object or a function that receives config env\n * Function can return config synchronously or asynchronously\n */\nexport function defineConfig(config: PhialConfigExport): PhialConfigExport {\n return config;\n}\n\nexport async function loadPhialConfig(\n options: LoadPhialConfigOptions = {},\n): Promise<LoadedPhialConfig> {\n const searchRoot = resolve(options.root ?? process.cwd());\n const env = {\n command: options.command ?? \"serve\",\n mode: options.mode ?? process.env.NODE_ENV ?? \"development\",\n isSsrBuild: options.isSsrBuild ?? false,\n isPreview: options.isPreview ?? false,\n };\n const configFile = resolveConfigFile(searchRoot, options.configFile);\n\n if (!configFile) {\n return {\n searchRoot,\n configRoot: searchRoot,\n config: {},\n env,\n };\n }\n\n const loaded = await loadConfigFromFile(env, configFile, searchRoot, options.logLevel ?? \"error\");\n const rawConfig = (loaded?.config ?? {}) as PhialConfigExport;\n\n // Support function config (sync or async)\n const config = await (typeof rawConfig === \"function\"\n ? rawConfig(env)\n : rawConfig);\n\n return {\n file: configFile,\n searchRoot,\n configRoot: resolve(dirname(configFile), config.root ?? \".\"),\n config,\n env,\n };\n}\n\nexport function isPhialConfigFile(file: string): boolean {\n const normalized = normalizePath(file);\n return DEFAULT_PHIAL_CONFIG_FILES.some(\n (configFile) => normalized.endsWith(`/${configFile}`) || normalized === configFile,\n );\n}\n\nfunction resolveConfigFile(root: string, configFile?: string): string | undefined {\n if (configFile) {\n const resolved = resolve(root, configFile);\n return existsSync(resolved) ? resolved : undefined;\n }\n\n return DEFAULT_PHIAL_CONFIG_FILES.map((file) => resolve(root, file)).find((file) =>\n existsSync(file),\n );\n}\n"],"mappings":";;;;AAUA,MAAa,6BAA6B;CACxC;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;AA6ED,SAAgB,aAAa,QAA8C;AACzE,QAAO;;AAGT,eAAsB,gBACpB,UAAkC,EAAE,EACR;CAC5B,MAAM,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,KAAK,CAAC;CACzD,MAAM,MAAM;EACV,SAAS,QAAQ,WAAW;EAC5B,MAAM,QAAQ,QAAQ,QAAQ,IAAI,YAAY;EAC9C,YAAY,QAAQ,cAAc;EAClC,WAAW,QAAQ,aAAa;EACjC;CACD,MAAM,aAAa,kBAAkB,YAAY,QAAQ,WAAW;AAEpE,KAAI,CAAC,WACH,QAAO;EACL;EACA,YAAY;EACZ,QAAQ,EAAE;EACV;EACD;CAIH,MAAM,aADS,MAAM,mBAAmB,KAAK,YAAY,YAAY,QAAQ,YAAY,QAAQ,GACtE,UAAU,EAAE;CAGvC,MAAM,SAAS,OAAO,OAAO,cAAc,aACvC,UAAU,IAAI,GACd;AAEJ,QAAO;EACL,MAAM;EACN;EACA,YAAY,QAAQ,QAAQ,WAAW,EAAE,OAAO,QAAQ,IAAI;EAC5D;EACA;EACD;;AAGH,SAAgB,kBAAkB,MAAuB;CACvD,MAAM,aAAa,cAAc,KAAK;AACtC,QAAO,2BAA2B,MAC/B,eAAe,WAAW,SAAS,IAAI,aAAa,IAAI,eAAe,WACzE;;AAGH,SAAS,kBAAkB,MAAc,YAAyC;AAChF,KAAI,YAAY;EACd,MAAM,WAAW,QAAQ,MAAM,WAAW;AAC1C,SAAO,WAAW,SAAS,GAAG,WAAW,KAAA;;AAG3C,QAAO,2BAA2B,KAAK,SAAS,QAAQ,MAAM,KAAK,CAAC,CAAC,MAAM,SACzE,WAAW,KAAK,CACjB"}
@@ -450,14 +450,20 @@ function createVirtualAppPluginModule() {
450
450
  `import { createIntegration } from ${JSON.stringify(GENERATED_APP_RUNTIME_ID)}`,
451
451
  "",
452
452
  "function createAppRouteMiddleware(getIntegration) {",
453
- " return async (request, next) => {",
453
+ " return async (context, next) => {",
454
+ " const request = context.request",
454
455
  " const integration = await getIntegration()",
455
456
  " const routeMatch = integration.match(new URL(request.url).pathname)",
456
457
  " if (!routeMatch) {",
457
- " return next(request)",
458
+ " return next(context)",
458
459
  " }",
459
460
  "",
460
- " return integration.handleRequest(request)",
461
+ " try {",
462
+ " return await integration.handleRequest(request)",
463
+ " } catch (error) {",
464
+ " console.error('[app route error]', error)",
465
+ " throw error",
466
+ " }",
461
467
  " }",
462
468
  "}",
463
469
  "",
@@ -488,7 +494,7 @@ function createVirtualAppPluginModule() {
488
494
  }
489
495
  function createVirtualServerPluginModule() {
490
496
  return [
491
- "import { runMiddleware } from \"@hornjs/fest\"",
497
+ "import { runMiddleware } from \"sevok\"",
492
498
  `import { config } from ${JSON.stringify(GENERATED_CONFIG_ID)}`,
493
499
  `import { serverMiddlewareRegistry, serverRoutes } from ${JSON.stringify(GENERATED_SERVER_ROUTES_ID)}`,
494
500
  "",
@@ -499,10 +505,11 @@ function createVirtualServerPluginModule() {
499
505
  "}",
500
506
  "",
501
507
  "function createServerRoutesMiddleware(options) {",
502
- " return async (request, next) => {",
508
+ " return async (context, next) => {",
509
+ " const request = context.request",
503
510
  " const route = findServerRoute(options.routes, new URL(request.url).pathname)",
504
511
  " if (!route) {",
505
- " return next(request)",
512
+ " return next(context)",
506
513
  " }",
507
514
  "",
508
515
  " const handler = getRouteHandler(route, request.method)",
@@ -516,15 +523,19 @@ function createVirtualServerPluginModule() {
516
523
  " options.globalMiddlewareNames,",
517
524
  " )",
518
525
  " if (middleware.length === 0) {",
519
- " return handleRoute(request, handler)",
526
+ " return handleRoute(context, handler)",
520
527
  " }",
521
528
  "",
522
- " return runMiddleware(middleware, request, (nextRequest) => handleRoute(nextRequest, handler))",
529
+ " return runMiddleware({",
530
+ " context,",
531
+ " middleware,",
532
+ " terminal: (nextContext) => handleRoute(nextContext, handler),",
533
+ " })",
523
534
  " }",
524
535
  "}",
525
536
  "",
526
- "async function handleRoute(request, handler) {",
527
- " const result = await handler(request)",
537
+ "async function handleRoute(context, handler) {",
538
+ " const result = await handler(context)",
528
539
  " if (result instanceof Response) {",
529
540
  " return result",
530
541
  " }",
@@ -1 +1 @@
1
- {"version":3,"file":"virtual-modules.js","names":[],"sources":["../../../../src/lib/vite-plugin/generated/virtual-modules.ts"],"sourcesContent":["import type { ScannedRouteModule, ScannedRoutesResult } from \"../scanners/route-manifest\";\n\nexport const VIRTUAL_ROUTES_MANIFEST_ID = \"virtual:phial-routes-manifest\";\nexport const VIRTUAL_ROUTES_MODULES_ID = \"virtual:phial-routes-modules\";\nexport const VIRTUAL_APP_RUNTIME_ID = \"virtual:phial-app-runtime\";\nexport const GENERATED_ROUTES_MANIFEST_ID = \"phial/generated-routes-manifest\";\nexport const GENERATED_ROUTES_MODULES_ID = \"phial/generated-routes-modules\";\nexport const GENERATED_APP_RUNTIME_ID = \"phial/generated-app-runtime\";\nexport const GENERATED_APP_LOADER_ID = \"phial/generated-app-loader\";\nexport const GENERATED_APP_MIDDLEWARE_ID = \"phial/generated-app-middleware\";\nexport const GENERATED_APP_PLUGIN_ID = \"phial/generated-app-plugin\";\nexport const GENERATED_SERVER_ROUTES_ID = \"phial/generated-server-routes\";\nexport const GENERATED_SERVER_MIDDLEWARE_ID = \"phial/generated-server-middleware\";\nexport const GENERATED_SERVER_PLUGIN_ID = \"phial/generated-server-plugin\";\nexport const GENERATED_CONFIG_ID = \"phial/generated-config\";\nexport const RESOLVED_VIRTUAL_ROUTES_MANIFEST_ID = `\\0${VIRTUAL_ROUTES_MANIFEST_ID}`;\nexport const RESOLVED_VIRTUAL_ROUTES_MODULES_ID = `\\0${VIRTUAL_ROUTES_MODULES_ID}`;\nexport const RESOLVED_VIRTUAL_APP_RUNTIME_ID = `\\0${VIRTUAL_APP_RUNTIME_ID}`;\nexport const RESOLVED_GENERATED_ROUTES_MANIFEST_ID = `\\0${GENERATED_ROUTES_MANIFEST_ID}`;\nexport const RESOLVED_GENERATED_ROUTES_MODULES_ID = `\\0${GENERATED_ROUTES_MODULES_ID}`;\nexport const RESOLVED_GENERATED_APP_RUNTIME_ID = `\\0${GENERATED_APP_RUNTIME_ID}`;\nexport const RESOLVED_GENERATED_APP_LOADER_ID = `\\0${GENERATED_APP_LOADER_ID}`;\nexport const RESOLVED_GENERATED_APP_MIDDLEWARE_ID = `\\0${GENERATED_APP_MIDDLEWARE_ID}`;\nexport const RESOLVED_GENERATED_APP_PLUGIN_ID = `\\0${GENERATED_APP_PLUGIN_ID}`;\nexport const RESOLVED_GENERATED_SERVER_ROUTES_ID = `\\0${GENERATED_SERVER_ROUTES_ID}`;\nexport const RESOLVED_GENERATED_SERVER_MIDDLEWARE_ID = `\\0${GENERATED_SERVER_MIDDLEWARE_ID}`;\nexport const RESOLVED_GENERATED_SERVER_PLUGIN_ID = `\\0${GENERATED_SERVER_PLUGIN_ID}`;\nexport const RESOLVED_GENERATED_CONFIG_ID = `\\0${GENERATED_CONFIG_ID}`;\n\ntype RouteFileKey = keyof ScannedRouteModule[\"files\"];\n\nexport interface VirtualRoutesModuleOptions {\n moduleImportMode?: \"eager\" | \"lazy\";\n}\n\nexport function createVirtualRoutesManifestModule(result: ScannedRoutesResult): string {\n const manifest = JSON.stringify(result.manifest, null, 2);\n\n return [`export const manifest = ${manifest}`, \"\", \"export default manifest\"].join(\"\\n\");\n}\n\nexport function createVirtualRoutesModulesModule(\n result: ScannedRoutesResult,\n options: VirtualRoutesModuleOptions = {},\n): string {\n return options.moduleImportMode === \"eager\"\n ? createEagerRouteModulesModule(result)\n : createDynamicRouteModulesModule(result);\n}\n\nexport function createVirtualAppRuntimeModule(result: ScannedRoutesResult): string {\n const importEntries = [\n result.app.app\n ? {\n importedLocal: \"importedAppComponentModule\",\n local: \"appComponentModule\",\n exportName: \"appComponent\",\n specifier: createImportSpecifier(result.app.app),\n }\n : null,\n result.app.error\n ? {\n importedLocal: \"importedErrorComponentModule\",\n local: \"errorComponentModule\",\n exportName: \"errorComponent\",\n specifier: createImportSpecifier(result.app.error),\n }\n : null,\n result.app.loader\n ? {\n importedLocal: \"importedAppLoaderModule\",\n local: \"appLoaderModule\",\n exportName: \"appLoader\",\n specifier: createImportSpecifier(result.app.loader),\n }\n : null,\n result.app.config\n ? {\n importedLocal: \"importedAppConfigModule\",\n local: \"appConfigModule\",\n exportName: \"appConfig\",\n specifier: createImportSpecifier(result.app.config),\n }\n : null,\n ].filter(Boolean) as Array<{\n importedLocal: string;\n local: string;\n exportName: \"appComponent\" | \"errorComponent\" | \"appLoader\" | \"appConfig\";\n specifier: string;\n }>;\n const importLines = importEntries.map(\n ({ importedLocal, specifier }) =>\n `import * as ${importedLocal} from ${JSON.stringify(specifier)}`,\n );\n const mutableBindings = importEntries.map(\n ({ importedLocal, local }) => `let ${local} = ${importedLocal}`,\n );\n const exportInitializers = [\n 'let appComponent = resolveAppComponent(typeof appComponentModule !== \"undefined\" ? appComponentModule : undefined)',\n 'let errorComponent = resolveErrorComponent(typeof errorComponentModule !== \"undefined\" ? errorComponentModule : undefined)',\n 'export let appLoader = resolveAppLoader(typeof appLoaderModule !== \"undefined\" ? appLoaderModule : undefined)',\n 'let appConfig = resolveAppConfig(typeof appConfigModule !== \"undefined\" ? appConfigModule : undefined)',\n \"export let app = createAppModule(appComponent, errorComponent, appLoader)\",\n \"export let routes = createRouteRecords(manifest, routeModules)\",\n \"export function createIntegration(runtimeOptions = {}) {\",\n \" return createRouteRuntimeIntegration({\",\n \" app,\",\n \" routes,\",\n \" ...runtimeOptions\",\n \" })\",\n \"}\",\n \"export let integration = createIntegration()\",\n \"installRouteModuleHmrBridge()\",\n ];\n\n return [\n 'import { createRouteRuntimeIntegration } from \"vuepagelet/integration\"',\n `import { manifest } from ${JSON.stringify(GENERATED_ROUTES_MANIFEST_ID)}`,\n `import { routeModules } from ${JSON.stringify(GENERATED_ROUTES_MODULES_ID)}`,\n `import { appMiddlewareRegistry } from ${JSON.stringify(GENERATED_APP_MIDDLEWARE_ID)}`,\n \"\",\n ...importLines,\n ...(importLines.length > 0 ? [\"\"] : []),\n ...mutableBindings,\n ...(mutableBindings.length > 0 ? [\"\"] : []),\n ...exportInitializers,\n \"\",\n \"function resolveAppComponent(module) {\",\n \" return module?.default\",\n \"}\",\n \"\",\n \"function resolveErrorComponent(module) {\",\n \" return module?.default\",\n \"}\",\n \"\",\n \"function resolveAppLoader(module) {\",\n \" const loader = module?.loader ?? module?.default\",\n ' if (loader !== undefined && typeof loader !== \"function\") {',\n ' throw new Error(\"Invalid app loader module. Expected a default export or named \\\\\"loader\\\\\" export.\")',\n \" }\",\n \"\",\n \" return loader\",\n \"}\",\n \"\",\n \"function resolveAppConfig(module) {\",\n \" return module?.default ?? module?.appConfig ?? {}\",\n \"}\",\n \"\",\n \"function createAppModule(shell, error, loader) {\",\n \" return { shell, error, loader }\",\n \"}\",\n \"\",\n \"function createRouteRecords(routeManifest, loadedRouteModules) {\",\n \" const records = routeManifest.map((entry) => ({\",\n \" id: entry.id,\",\n \" path: entry.path,\",\n \" module: createRouteModule(entry, loadedRouteModules[entry.id]),\",\n \" children: []\",\n \" }))\",\n \" const recordMap = new Map(records.map((record) => [record.id, record]))\",\n \" const roots = []\",\n \"\",\n \" for (const entry of routeManifest) {\",\n \" const record = recordMap.get(entry.id)\",\n \" if (!record) {\",\n \" continue\",\n \" }\",\n \"\",\n \" if (entry.parentId) {\",\n \" const parent = recordMap.get(entry.parentId)\",\n \" if (parent) {\",\n \" parent.children.push(record)\",\n \" continue\",\n \" }\",\n \" }\",\n \"\",\n \" roots.push(record)\",\n \" }\",\n \"\",\n \" return attachAppMiddleware(roots, resolveGlobalMiddleware(appConfig, appMiddlewareRegistry))\",\n \"}\",\n \"\",\n \"function installRouteModuleHmrBridge() {\",\n ' if (typeof globalThis === \"undefined\") {',\n \" return\",\n \" }\",\n \"\",\n \" globalThis.__ROUTE_MODULE_HMR__ = async () => {\",\n \" const nextRoutes = createRouteRecords(manifest, routeModules)\",\n \" syncRouteRecords(routes, nextRoutes)\",\n \" integration = createIntegration()\",\n \" await notifyAppRuntimeHotUpdate({\",\n \" appComponent,\",\n \" errorComponent,\",\n \" config: appConfig,\",\n \" routes,\",\n \" })\",\n \" }\",\n \"}\",\n \"\",\n \"async function notifyAppRuntimeHotUpdate(payload) {\",\n ' if (typeof globalThis === \"undefined\") {',\n \" return false\",\n \" }\",\n \"\",\n \" const applyAppRuntimeHotUpdate = globalThis.__APP_RUNTIME_HMR__\",\n ' if (typeof applyAppRuntimeHotUpdate !== \"function\") {',\n \" return false\",\n \" }\",\n \"\",\n \" await applyAppRuntimeHotUpdate(payload)\",\n \" return true\",\n \"}\",\n \"\",\n \"function syncRouteRecords(targetRoutes, nextRoutes) {\",\n \" const targetRouteMap = new Map(flattenRoutes(targetRoutes).map((route) => [route.id, route]))\",\n \"\",\n \" for (const nextRoute of flattenRoutes(nextRoutes)) {\",\n \" const targetRoute = targetRouteMap.get(nextRoute.id)\",\n \" if (!targetRoute) {\",\n \" continue\",\n \" }\",\n \"\",\n \" targetRoute.path = nextRoute.path\",\n \" targetRoute.name = nextRoute.name\",\n \" targetRoute.module = nextRoute.module\",\n \" }\",\n \"}\",\n \"\",\n \"function flattenRoutes(routes) {\",\n \" return routes.flatMap((route) => [route, ...flattenRoutes(route.children ?? [])])\",\n \"}\",\n \"\",\n \"function createRouteModule(entry, module) {\",\n \" const resolvedModule = module ?? {}\",\n ' const routeModule = entry.kind === \"layout\"',\n \" ? { layout: resolveDefaultExport(resolvedModule) }\",\n \" : { component: resolveDefaultExport(resolvedModule) }\",\n \" const middleware = resolveMiddlewareReferences([\",\n \" ...(resolvedModule.directoryMiddleware ?? []),\",\n \" ...(resolvedModule.middleware ?? []),\",\n \" ], appMiddlewareRegistry)\",\n \"\",\n \" if (resolvedModule.Loading !== undefined) {\",\n \" routeModule.loading = resolvedModule.Loading\",\n \" }\",\n \"\",\n \" if (resolvedModule.ErrorBoundary !== undefined) {\",\n \" routeModule.error = resolvedModule.ErrorBoundary\",\n \" }\",\n \"\",\n \" if (resolvedModule.loader !== undefined) {\",\n \" routeModule.loader = resolvedModule.loader\",\n \" }\",\n \"\",\n \" if (resolvedModule.action !== undefined) {\",\n \" routeModule.action = resolvedModule.action\",\n \" }\",\n \"\",\n \" if (middleware.length > 0) {\",\n \" routeModule.middleware = middleware\",\n \" }\",\n \"\",\n \" if (resolvedModule.shouldRevalidate !== undefined) {\",\n \" routeModule.shouldRevalidate = resolvedModule.shouldRevalidate\",\n \" }\",\n \"\",\n \" return routeModule\",\n \"}\",\n \"\",\n \"function resolveDefaultExport(module) {\",\n \" return module?.default\",\n \"}\",\n \"\",\n \"function resolveGlobalMiddleware(config, registry) {\",\n \" return resolveMiddlewareReferences(config?.middleware ?? [], registry)\",\n \"}\",\n \"\",\n \"function resolveMiddlewareReferences(references, registry) {\",\n \" const entries = Array.isArray(references) ? references : [references]\",\n \" const middleware = []\",\n \"\",\n \" for (const reference of entries) {\",\n \" if (reference === undefined) {\",\n \" continue\",\n \" }\",\n \"\",\n ' if (typeof reference === \"function\") {',\n \" middleware.push(reference)\",\n \" continue\",\n \" }\",\n \"\",\n \" const handler = registry[reference]\",\n \" if (!handler) {\",\n ' throw new Error(`Unknown middleware reference \"${reference}\".`)',\n \" }\",\n \"\",\n \" middleware.push(handler)\",\n \" }\",\n \"\",\n \" return middleware\",\n \"}\",\n \"\",\n \"function attachAppMiddleware(routes, middleware) {\",\n \" if (!Array.isArray(middleware) || middleware.length === 0) {\",\n \" return routes\",\n \" }\",\n \"\",\n \" return routes.map((route) => ({\",\n \" ...route,\",\n \" module: {\",\n \" ...route.module,\",\n \" middleware: [...middleware, ...(route.module.middleware ?? [])],\",\n \" },\",\n \" }))\",\n \"}\",\n \"\",\n ...(importLines.length > 0 ? [\"\", ...createAppRuntimeHmrBlock(importEntries)] : []),\n \"\",\n \"export default integration\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualAppLoaderModule(result: ScannedRoutesResult): string {\n if (!result.app.loader) {\n return [\"export const appLoader = undefined\", \"\", \"export default appLoader\"].join(\"\\n\");\n }\n\n return [\n `import * as appLoaderModule from ${JSON.stringify(createImportSpecifier(result.app.loader))}`,\n \"\",\n \"export const appLoader = resolveAppLoader(appLoaderModule)\",\n \"\",\n \"function resolveAppLoader(module) {\",\n \" const loader = module?.loader ?? module?.default\",\n ' if (typeof loader !== \"function\") {',\n ' throw new Error(\"Invalid app loader module. Expected a default export or named \\\\\"loader\\\\\" export.\")',\n \" }\",\n \"\",\n \" return loader\",\n \"}\",\n \"\",\n \"export default appLoader\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualAppMiddlewareModule(result: ScannedRoutesResult): string {\n const middlewareEntries = Object.entries(result.app.middleware);\n const importLines = middlewareEntries.map(\n ([, file], index) =>\n `import * as middlewareModule${index} from ${JSON.stringify(createImportSpecifier(file))}`,\n );\n const registryEntries: Array<[string, string]> = middlewareEntries.map(([name], index) => [\n name,\n `resolveMiddleware(middlewareModule${index}, ${JSON.stringify(name)})`,\n ]);\n\n return [\n ...importLines,\n importLines.length > 0 ? \"\" : \"\",\n `export const appMiddlewareRegistry = ${serializeObject(registryEntries)}`,\n \"\",\n \"function resolveMiddleware(module, name) {\",\n \" const middleware = module?.middleware ?? module?.default\",\n ' if (typeof middleware !== \"function\") {',\n ' throw new Error(`Invalid middleware module \"${name}\". Expected a default export or named \"middleware\" export.`)',\n \" }\",\n \"\",\n \" return middleware\",\n \"}\",\n \"\",\n \"export default appMiddlewareRegistry\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualServerRoutesModule(result: ScannedRoutesResult): string {\n const routeEntries = result.server.routes;\n const uniqueFiles = Array.from(\n new Set(routeEntries.flatMap((route) => [route.file, ...route.directoryMiddleware])),\n );\n const importLines = uniqueFiles.map(\n (specifier, index) =>\n `import * as importedServerFile${index} from ${JSON.stringify(createImportSpecifier(specifier))}`,\n );\n const fileModuleBindings = uniqueFiles.map(\n (_specifier, index) => `const serverFileModule${index} = importedServerFile${index}`,\n );\n const fileIndexMap = serializeObject(\n uniqueFiles.map((specifier, index) => [specifier, String(index)]),\n );\n\n return [\n `export { serverMiddlewareRegistry } from ${JSON.stringify(GENERATED_SERVER_MIDDLEWARE_ID)}`,\n \"\",\n ...importLines,\n importLines.length > 0 ? \"\" : \"\",\n ...fileModuleBindings,\n fileModuleBindings.length > 0 ? \"\" : \"\",\n `export const serverRoutes = ${serializeArrayOfObjects(\n routeEntries.map((route) => [\n [\"id\", JSON.stringify(route.id)],\n [\"path\", JSON.stringify(route.path)],\n [\"file\", JSON.stringify(route.file)],\n [\n \"definition\",\n `resolveServerRoute(getLoadedServerModule(${JSON.stringify(route.file)}), ${JSON.stringify(route.file)})`,\n ],\n [\n \"directoryMiddlewareNames\",\n `resolveDirectoryMiddlewareNames(${serializeArray(route.directoryMiddleware)})`,\n ],\n ]),\n )}`,\n \"\",\n \"function resolveDirectoryMiddlewareNames(files) {\",\n \" return files.flatMap((file) => resolveMiddlewareNames(getLoadedServerModule(file), file))\",\n \"}\",\n \"\",\n \"function resolveServerRoute(module, file) {\",\n \" const route = module?.default ?? module?.route\",\n ' if (!route || typeof route !== \"object\") {',\n ' throw new Error(`Invalid server route module \"${file}\". Expected a default export or named \"route\" export.`)',\n \" }\",\n \"\",\n \" return {\",\n \" middlewareNames: normalizeMiddlewareNames(route?.middleware),\",\n ' meta: route?.meta && typeof route.meta === \"object\" ? route.meta : undefined,',\n \" handler: asHandler(route?.handler),\",\n \" GET: asHandler(route?.GET),\",\n \" POST: asHandler(route?.POST),\",\n \" PUT: asHandler(route?.PUT),\",\n \" PATCH: asHandler(route?.PATCH),\",\n \" DELETE: asHandler(route?.DELETE),\",\n \" HEAD: asHandler(route?.HEAD),\",\n \" OPTIONS: asHandler(route?.OPTIONS),\",\n \" }\",\n \"}\",\n \"\",\n \"function resolveMiddlewareNames(module, file) {\",\n \" if (!module) {\",\n \" return []\",\n \" }\",\n \"\",\n \" const middleware = module?.middleware ?? module?.default\",\n \" if (middleware === undefined) {\",\n \" return []\",\n \" }\",\n \"\",\n ' if (!Array.isArray(middleware) || middleware.some((name) => typeof name !== \"string\")) {',\n ' throw new Error(`Invalid server route directory middleware \"${file}\". Expected a default export or named \"middleware\" export with a string array.`)',\n \" }\",\n \"\",\n \" return middleware\",\n \"}\",\n \"\",\n \"function normalizeMiddlewareNames(value) {\",\n \" if (value === undefined) {\",\n \" return undefined\",\n \" }\",\n \"\",\n ' if (!Array.isArray(value) || value.some((name) => typeof name !== \"string\")) {',\n \" throw new Error('Server route \\\"middleware\\\" must be a string array.')\",\n \" }\",\n \"\",\n \" return value\",\n \"}\",\n \"\",\n \"function asHandler(value) {\",\n ' return typeof value === \"function\" ? value : undefined',\n \"}\",\n \"\",\n \"function getLoadedServerModule(file) {\",\n ` const fileIndex = ${fileIndexMap}[file]`,\n \" if (fileIndex === undefined) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" return [\",\n ...uniqueFiles.map(\n (_, index) => ` serverFileModule${index}${index < uniqueFiles.length - 1 ? \",\" : \"\"}`,\n ),\n \" ][fileIndex]\",\n \"}\",\n \"\",\n \"export default serverRoutes\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualServerMiddlewareModule(result: ScannedRoutesResult): string {\n const middlewareEntries = Object.entries(result.server.middleware);\n const importLines = middlewareEntries.map(\n ([, file], index) =>\n `import * as middlewareModule${index} from ${JSON.stringify(createImportSpecifier(file))}`,\n );\n const registryEntries: Array<[string, string]> = middlewareEntries.map(([name], index) => [\n name,\n `resolveMiddleware(middlewareModule${index}, ${JSON.stringify(name)})`,\n ]);\n\n return [\n ...importLines,\n importLines.length > 0 ? \"\" : \"\",\n `export const serverMiddlewareRegistry = ${serializeObject(registryEntries)}`,\n \"\",\n \"function resolveMiddleware(module, name) {\",\n \" const middleware = module?.middleware ?? module?.default\",\n ' if (typeof middleware !== \"function\") {',\n ' throw new Error(`Invalid server middleware module \"${name}\". Expected a default export or named \"middleware\" export.`)',\n \" }\",\n \"\",\n \" return middleware\",\n \"}\",\n \"\",\n \"export default serverMiddlewareRegistry\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualAppPluginModule(): string {\n return [\n `import { createIntegration } from ${JSON.stringify(GENERATED_APP_RUNTIME_ID)}`,\n \"\",\n \"function createAppRouteMiddleware(getIntegration) {\",\n \" return async (request, next) => {\",\n \" const integration = await getIntegration()\",\n \" const routeMatch = integration.match(new URL(request.url).pathname)\",\n \" if (!routeMatch) {\",\n \" return next(request)\",\n \" }\",\n \"\",\n \" return integration.handleRequest(request)\",\n \" }\",\n \"}\",\n \"\",\n \"function createAppRouteServerPlugin(options = {}) {\",\n \" let integrationPromise\",\n \"\",\n \" return (server) => {\",\n \" server.options.middleware.push(\",\n \" createAppRouteMiddleware(() => {\",\n \" if (!integrationPromise) {\",\n \" integrationPromise = Promise.resolve(createIntegration(options))\",\n \" }\",\n \"\",\n \" return integrationPromise\",\n \" }),\",\n \" )\",\n \" }\",\n \"}\",\n \"\",\n \"export function createAppPlugin(options = {}) {\",\n \" return createAppRouteServerPlugin(options)\",\n \"}\",\n \"\",\n \"export const appPlugin = createAppPlugin()\",\n \"\",\n \"export default createAppPlugin\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualServerPluginModule(): string {\n return [\n 'import { runMiddleware } from \"@hornjs/fest\"',\n `import { config } from ${JSON.stringify(GENERATED_CONFIG_ID)}`,\n `import { serverMiddlewareRegistry, serverRoutes } from ${JSON.stringify(GENERATED_SERVER_ROUTES_ID)}`,\n \"\",\n \"function createServerRoutesPlugin(options) {\",\n \" return (server) => {\",\n \" server.options.middleware.unshift(createServerRoutesMiddleware(options))\",\n \" }\",\n \"}\",\n \"\",\n \"function createServerRoutesMiddleware(options) {\",\n \" return async (request, next) => {\",\n \" const route = findServerRoute(options.routes, new URL(request.url).pathname)\",\n \" if (!route) {\",\n \" return next(request)\",\n \" }\",\n \"\",\n \" const handler = getRouteHandler(route, request.method)\",\n \" if (!handler) {\",\n ' return new Response(\"Method Not Allowed\", { status: 405 })',\n \" }\",\n \"\",\n \" const middleware = resolveMiddlewareChain(\",\n \" route,\",\n \" options.middlewareRegistry,\",\n \" options.globalMiddlewareNames,\",\n \" )\",\n \" if (middleware.length === 0) {\",\n \" return handleRoute(request, handler)\",\n \" }\",\n \"\",\n \" return runMiddleware(middleware, request, (nextRequest) => handleRoute(nextRequest, handler))\",\n \" }\",\n \"}\",\n \"\",\n \"async function handleRoute(request, handler) {\",\n \" const result = await handler(request)\",\n \" if (result instanceof Response) {\",\n \" return result\",\n \" }\",\n \"\",\n \" return Response.json(result)\",\n \"}\",\n \"\",\n \"function resolveMiddlewareChain(route, registry, globalMiddlewareNames = []) {\",\n \" const names = [\",\n \" ...globalMiddlewareNames,\",\n \" ...(route.directoryMiddlewareNames ?? []),\",\n \" ...(route.definition.middlewareNames ?? []),\",\n \" ]\",\n \"\",\n \" return names.map((name) => {\",\n \" const middleware = registry[name]\",\n \" if (!middleware) {\",\n ' throw new Error(`Unknown server middleware \"${name}\" referenced by route \"${route.id}\".`)',\n \" }\",\n \"\",\n \" return middleware\",\n \" })\",\n \"}\",\n \"\",\n \"function findServerRoute(routes, pathname) {\",\n \" const normalizedPathname = normalizePathname(pathname)\",\n \" return routes.find((route) => matchesServerRoutePath(route.path, normalizedPathname))\",\n \"}\",\n \"\",\n \"function matchesServerRoutePath(pattern, pathname) {\",\n \" const normalizedPattern = normalizePathname(pattern)\",\n \" if (normalizedPattern === pathname) {\",\n \" return true\",\n \" }\",\n \"\",\n \" const patternSegments = splitPathSegments(normalizedPattern)\",\n \" const pathnameSegments = splitPathSegments(pathname)\",\n \" if (patternSegments.length !== pathnameSegments.length) {\",\n \" return false\",\n \" }\",\n \"\",\n \" for (let index = 0; index < patternSegments.length; index += 1) {\",\n \" const patternSegment = patternSegments[index]\",\n \" const pathnameSegment = pathnameSegments[index]\",\n \"\",\n \" if (!patternSegment) {\",\n \" return false\",\n \" }\",\n \"\",\n ' if (patternSegment.startsWith(\":\")) {',\n \" continue\",\n \" }\",\n \"\",\n \" if (patternSegment !== pathnameSegment) {\",\n \" return false\",\n \" }\",\n \" }\",\n \"\",\n \" return true\",\n \"}\",\n \"\",\n \"function getRouteHandler(route, method) {\",\n \" const resolvedMethod = method.toUpperCase()\",\n \" const definition = route.definition\",\n \"\",\n \" switch (resolvedMethod) {\",\n ' case \"GET\":',\n \" return definition.GET ?? definition.handler\",\n ' case \"POST\":',\n \" return definition.POST ?? definition.handler\",\n ' case \"PUT\":',\n \" return definition.PUT ?? definition.handler\",\n ' case \"PATCH\":',\n \" return definition.PATCH ?? definition.handler\",\n ' case \"DELETE\":',\n \" return definition.DELETE ?? definition.handler\",\n ' case \"HEAD\":',\n \" return definition.HEAD ?? definition.handler\",\n ' case \"OPTIONS\":',\n \" return definition.OPTIONS ?? definition.handler\",\n \" default:\",\n \" return definition.handler\",\n \" }\",\n \"}\",\n \"\",\n \"function normalizePathname(pathname) {\",\n \" if (!pathname) {\",\n ' return \"/\"',\n \" }\",\n \"\",\n ' if (!pathname.startsWith(\"/\")) {',\n \" return `/${pathname}`\",\n \" }\",\n \"\",\n ' if (pathname.length > 1 && pathname.endsWith(\"/\")) {',\n ' return pathname.replace(/\\\\/+$/, \"\")',\n \" }\",\n \"\",\n \" return pathname\",\n \"}\",\n \"\",\n \"function splitPathSegments(pathname) {\",\n \" const normalized = normalizePathname(pathname)\",\n ' if (normalized === \"/\") {',\n \" return []\",\n \" }\",\n \"\",\n ' return normalized.replace(/^\\\\/+|\\\\/+$/g, \"\").split(\"/\")',\n \"}\",\n \"\",\n \"export function createServerPlugin() {\",\n \" return createServerRoutesPlugin({\",\n \" routes: serverRoutes,\",\n \" middlewareRegistry: serverMiddlewareRegistry,\",\n \" globalMiddlewareNames: config.server?.middleware ?? []\",\n \" })\",\n \"}\",\n \"\",\n \"export const serverPlugin = createServerPlugin()\",\n \"\",\n \"export default createServerPlugin\",\n ].join(\"\\n\");\n}\n\nexport function resolveVirtualModuleId(id: string): string | null {\n if (id === VIRTUAL_ROUTES_MANIFEST_ID || id === RESOLVED_VIRTUAL_ROUTES_MANIFEST_ID) {\n return RESOLVED_VIRTUAL_ROUTES_MANIFEST_ID;\n }\n\n if (id === VIRTUAL_ROUTES_MODULES_ID || id === RESOLVED_VIRTUAL_ROUTES_MODULES_ID) {\n return RESOLVED_VIRTUAL_ROUTES_MODULES_ID;\n }\n\n if (id === VIRTUAL_APP_RUNTIME_ID || id === RESOLVED_VIRTUAL_APP_RUNTIME_ID) {\n return RESOLVED_VIRTUAL_APP_RUNTIME_ID;\n }\n\n if (id === GENERATED_ROUTES_MANIFEST_ID || id === RESOLVED_GENERATED_ROUTES_MANIFEST_ID) {\n return RESOLVED_GENERATED_ROUTES_MANIFEST_ID;\n }\n\n if (id === GENERATED_ROUTES_MODULES_ID || id === RESOLVED_GENERATED_ROUTES_MODULES_ID) {\n return RESOLVED_GENERATED_ROUTES_MODULES_ID;\n }\n\n if (id === GENERATED_APP_RUNTIME_ID || id === RESOLVED_GENERATED_APP_RUNTIME_ID) {\n return RESOLVED_GENERATED_APP_RUNTIME_ID;\n }\n\n if (id === GENERATED_APP_LOADER_ID || id === RESOLVED_GENERATED_APP_LOADER_ID) {\n return RESOLVED_GENERATED_APP_LOADER_ID;\n }\n\n if (id === GENERATED_APP_MIDDLEWARE_ID || id === RESOLVED_GENERATED_APP_MIDDLEWARE_ID) {\n return RESOLVED_GENERATED_APP_MIDDLEWARE_ID;\n }\n\n if (id === GENERATED_APP_PLUGIN_ID || id === RESOLVED_GENERATED_APP_PLUGIN_ID) {\n return RESOLVED_GENERATED_APP_PLUGIN_ID;\n }\n\n if (id === GENERATED_SERVER_ROUTES_ID || id === RESOLVED_GENERATED_SERVER_ROUTES_ID) {\n return RESOLVED_GENERATED_SERVER_ROUTES_ID;\n }\n\n if (id === GENERATED_SERVER_MIDDLEWARE_ID || id === RESOLVED_GENERATED_SERVER_MIDDLEWARE_ID) {\n return RESOLVED_GENERATED_SERVER_MIDDLEWARE_ID;\n }\n\n if (id === GENERATED_SERVER_PLUGIN_ID || id === RESOLVED_GENERATED_SERVER_PLUGIN_ID) {\n return RESOLVED_GENERATED_SERVER_PLUGIN_ID;\n }\n\n if (id === GENERATED_CONFIG_ID || id === RESOLVED_GENERATED_CONFIG_ID) {\n return RESOLVED_GENERATED_CONFIG_ID;\n }\n\n return null;\n}\n\nexport function createVirtualConfigModule(options: {\n config: Record<string, unknown>;\n hasConfigFile: boolean;\n}): string {\n if (!options.hasConfigFile) {\n return [\n \"export const hasConfig = false\",\n \"export const config = {}\",\n \"\",\n \"export default config\",\n ].join(\"\\n\");\n }\n\n return [\n \"export const hasConfig = true\",\n `export const config = ${JSON.stringify(options.config, null, 2)}`,\n \"\",\n \"export default config\",\n ].join(\"\\n\");\n}\n\nfunction createDynamicRouteModulesModule(result: ScannedRoutesResult): string {\n const routeFiles = serializeObject(\n result.modules.map((module) => [module.id, serializeArray(resolveModuleSpecifiers(module))]),\n );\n const routeModules = serializeObject(\n result.modules.map((module) => [\n module.id,\n `() => loadResolvedRouteModule(${JSON.stringify(module.id)})`,\n ]),\n );\n const routeImportSpecifiers = Array.from(\n new Set(result.modules.flatMap((module) => resolveModuleSpecifiers(module))),\n );\n const hmrBlock = createRouteModulesHmrBlock(routeImportSpecifiers);\n\n return [\n `export const routeFiles = ${routeFiles}`,\n \"\",\n `export const routeModules = ${routeModules}`,\n \"\",\n \"export async function loadRouteModule(id) {\",\n \" const importer = routeModules[id]\",\n \" return importer ? importer() : undefined\",\n \"}\",\n \"\",\n \"async function loadResolvedRouteModule(id) {\",\n ` const routeDefinitions = ${serializeObject(result.modules.map((module) => [module.id, createRouteDefinition(module)]))}`,\n \" const definition = routeDefinitions[id]\",\n \" if (!definition) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" const loadedModules = await Promise.all(definition.files.map(file => import(file)))\",\n \" return createPhialRouteModule(definition, loadedModules)\",\n \"}\",\n \"\",\n ...createRouteModuleHelperLines(),\n ...(hmrBlock.length > 0 ? [\"\", ...hmrBlock] : []),\n \"\",\n \"export default routeModules\",\n ].join(\"\\n\");\n}\n\nfunction createEagerRouteModulesModule(result: ScannedRoutesResult): string {\n const uniqueFiles = Array.from(\n new Set(result.modules.flatMap((module) => resolveModuleSpecifiers(module))),\n );\n const importLines = uniqueFiles.map((specifier, index) => {\n return `import * as importedRouteFile${index} from ${JSON.stringify(specifier)}`;\n });\n const fileModuleInitializers = uniqueFiles.map((_specifier, index) => {\n return `let routeFileModule${index} = importedRouteFile${index}`;\n });\n const fileSetters = uniqueFiles.map((_specifier, index) => {\n return ` (nextModule) => { if (nextModule) routeFileModule${index} = nextModule }`;\n });\n const routeDefinitions = serializeObject(\n result.modules.map((module) => [module.id, createRouteDefinition(module)]),\n );\n const routeFiles = serializeObject(\n result.modules.map((module) => [module.id, serializeArray(resolveModuleSpecifiers(module))]),\n );\n const routeModules = serializeObject(\n result.modules.map((module) => [\n module.id,\n `createResolvedRouteModule(${JSON.stringify(module.id)})`,\n ]),\n );\n const hmrBlock = createRouteModulesHmrBlock(uniqueFiles, {\n applyUpdatedModules: [\n ` const applyFileModuleUpdates = [\\n${fileSetters.join(\",\\n\")}\\n ]`,\n \" nextModules.forEach((nextModule, index) => {\",\n \" const applyUpdate = applyFileModuleUpdates[index]\",\n \" if (applyUpdate) {\",\n \" applyUpdate(nextModule)\",\n \" }\",\n \" })\",\n \"\",\n ` const routeIds = ${JSON.stringify(result.modules.map((module) => module.id))}`,\n \" routeIds.forEach((routeId) => {\",\n \" routeModules[routeId] = createResolvedRouteModule(routeId)\",\n \" })\",\n \"\",\n ],\n });\n\n return [\n ...importLines,\n importLines.length > 0 ? \"\" : \"\",\n ...fileModuleInitializers,\n fileModuleInitializers.length > 0 ? \"\" : \"\",\n `const routeDefinitions = ${routeDefinitions}`,\n \"\",\n `export const routeFiles = ${routeFiles}`,\n \"\",\n `export const routeModules = ${routeModules}`,\n \"\",\n \"export function loadRouteModule(id) {\",\n \" return routeModules[id]\",\n \"}\",\n \"\",\n \"function createResolvedRouteModule(id) {\",\n \" const definition = routeDefinitions[id]\",\n \" if (!definition) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" const loadedModules = definition.files.map((file) => getLoadedRouteFileModule(file))\",\n \" return createPhialRouteModule(definition, loadedModules)\",\n \"}\",\n \"\",\n \"function getLoadedRouteFileModule(file) {\",\n ` const routeFileIndexMap = ${serializeObject(uniqueFiles.map((specifier, index) => [specifier, String(index)]))}`,\n \" const fileIndex = routeFileIndexMap[file]\",\n \" if (fileIndex === undefined) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" return [\",\n ...uniqueFiles.map(\n (_, index) => ` routeFileModule${index}${index < uniqueFiles.length - 1 ? \",\" : \"\"}`,\n ),\n \" ][fileIndex]\",\n \"}\",\n \"\",\n ...createRouteModuleHelperLines(),\n ...(hmrBlock.length > 0 ? [\"\", ...hmrBlock] : []),\n \"\",\n \"export default routeModules\",\n ].join(\"\\n\");\n}\n\nfunction createRouteModulesHmrBlock(\n routeImportSpecifiers: string[],\n options: {\n applyUpdatedModules?: string[];\n } = {},\n): string[] {\n if (routeImportSpecifiers.length === 0) {\n return [];\n }\n\n return [\n \"if (import.meta.hot) {\",\n ` import.meta.hot.accept(${JSON.stringify(routeImportSpecifiers)}, async (nextModules) => {`,\n ...(options.applyUpdatedModules ?? []),\n ' if (typeof window !== \"undefined\") {',\n \" const runtime = globalThis\",\n \" const applyRouteModuleHotUpdate = runtime.__ROUTE_MODULE_HMR__\",\n \"\",\n ' if (typeof applyRouteModuleHotUpdate === \"function\") {',\n \" await applyRouteModuleHotUpdate()\",\n \" return\",\n \" }\",\n \" }\",\n \"\",\n \" import.meta.hot.invalidate()\",\n \" })\",\n \"}\",\n ];\n}\n\nfunction createAppRuntimeHmrBlock(\n importEntries: Array<{\n local: string;\n exportName: \"appComponent\" | \"errorComponent\" | \"appLoader\" | \"appConfig\";\n specifier: string;\n }>,\n): string[] {\n const importSpecifiers = importEntries.map((entry) => entry.specifier);\n const updateBindings = importEntries.flatMap((entry, index) => {\n const resolveExpression =\n entry.exportName === \"appComponent\"\n ? `resolveAppComponent(${entry.local})`\n : entry.exportName === \"errorComponent\"\n ? `resolveErrorComponent(${entry.local})`\n : entry.exportName === \"appLoader\"\n ? `resolveAppLoader(${entry.local})`\n : `resolveAppConfig(${entry.local})`;\n\n return [\n ` if (nextModules[${index}]) {`,\n ` ${entry.local} = nextModules[${index}]`,\n \" }\",\n ` ${entry.exportName} = ${resolveExpression}`,\n ];\n });\n\n return [\n \"if (import.meta.hot) {\",\n ` import.meta.hot.accept(${JSON.stringify(importSpecifiers)}, async (nextModules) => {`,\n ...updateBindings,\n \" app = createAppModule(appComponent, errorComponent, appLoader)\",\n \" integration = createIntegration()\",\n \"\",\n \" if (await notifyAppRuntimeHotUpdate({\",\n \" appComponent,\",\n \" errorComponent,\",\n \" config: appConfig,\",\n \" routes,\",\n \" })) {\",\n \" return\",\n \" }\",\n \"\",\n \" import.meta.hot.invalidate()\",\n \" })\",\n \"}\",\n ];\n}\n\nfunction createRouteDefinition(module: ScannedRouteModule): string {\n const entries = Object.entries(module.files) as Array<[RouteFileKey, string]>;\n const fileEntries = entries.map(([key, file]) => [key, createImportSpecifier(file)] as const);\n const directoryMiddlewareFiles = module.directoryMiddleware.map((file) =>\n createImportSpecifier(file),\n );\n const files = Array.from(\n new Set([...fileEntries.map(([, specifier]) => specifier), ...directoryMiddlewareFiles]),\n );\n\n return `{\n id: ${JSON.stringify(module.id)},\n kind: ${JSON.stringify(module.kind)},\n files: ${serializeArray(files)},\n entryFiles: ${serializeObject(fileEntries.map(([key, specifier]) => [key, JSON.stringify(specifier)]))},\n directoryMiddlewareFiles: ${serializeArray(directoryMiddlewareFiles)}\n}`;\n}\n\nfunction createRouteModuleHelperLines(): string[] {\n return [\n \"function createPhialRouteModule(definition, loadedModules) {\",\n \" const modules = Object.fromEntries(definition.files.map((file, index) => [file, loadedModules[index]]))\",\n \" const primaryModule = resolvePrimaryModule(definition, modules)\",\n ' const errorModule = resolveEntryModule(definition, modules, \"error\")',\n ' const loadingModule = resolveEntryModule(definition, modules, \"loading\")',\n ' const loaderModule = resolveEntryModule(definition, modules, \"loader\")',\n ' const actionModule = resolveEntryModule(definition, modules, \"action\")',\n ' const middlewareModule = resolveEntryModule(definition, modules, \"middleware\")',\n \" const directoryMiddlewareModules = definition.directoryMiddlewareFiles.map((file) => modules[file])\",\n \"\",\n \" return {\",\n \" default: resolveDefaultExport(primaryModule),\",\n \" directoryMiddleware: directoryMiddlewareModules.flatMap((module) => resolveMiddlewareExport(module) ?? []),\",\n ' loader: resolveHandlerExport(loaderModule, \"loader\") ?? resolveNamedExport(primaryModule, \"loader\"),',\n ' action: resolveHandlerExport(actionModule, \"action\") ?? resolveNamedExport(primaryModule, \"action\"),',\n \" middleware: resolveMiddlewareExport(middlewareModule) ?? resolveMiddlewareExport(primaryModule, false),\",\n ' shouldRevalidate: resolveNamedExport(primaryModule, \"shouldRevalidate\"),',\n ' meta: resolveNamedExport(primaryModule, \"meta\"),',\n ' ErrorBoundary: resolveDefaultExport(errorModule) ?? resolveNamedExport(primaryModule, \"ErrorBoundary\"),',\n ' Loading: resolveDefaultExport(loadingModule) ?? resolveNamedExport(primaryModule, \"Loading\"),',\n ' onError: resolveHandlerExport(errorModule, \"onError\") ?? resolveNamedExport(primaryModule, \"onError\")',\n \" }\",\n \"}\",\n \"\",\n \"function resolvePrimaryModule(definition, modules) {\",\n \" const primaryFile = definition.entryFiles[definition.kind]\",\n \" return primaryFile ? modules[primaryFile] : undefined\",\n \"}\",\n \"\",\n \"function resolveEntryModule(definition, modules, key) {\",\n \" const file = definition.entryFiles[key]\",\n \" return file ? modules[file] : undefined\",\n \"}\",\n \"\",\n \"function resolveDefaultExport(module) {\",\n \" return module?.default\",\n \"}\",\n \"\",\n \"function resolveNamedExport(module, name) {\",\n \" return module?.[name]\",\n \"}\",\n \"\",\n \"function resolveHandlerExport(module, name) {\",\n \" if (!module) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" return module[name] ?? module.default\",\n \"}\",\n \"\",\n \"function resolveMiddlewareExport(module, allowDefault = true) {\",\n \" if (!module) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" const middleware = module.middleware ?? (allowDefault ? module.default : undefined)\",\n \" if (middleware === undefined) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" return Array.isArray(middleware) ? middleware : [middleware]\",\n \"}\",\n ];\n}\n\nfunction resolveModuleSpecifiers(module: ScannedRouteModule): string[] {\n return Array.from(\n new Set([\n ...Object.values(module.files).map((file) => createImportSpecifier(file)),\n ...module.directoryMiddleware.map((file) => createImportSpecifier(file)),\n ]),\n );\n}\n\nfunction serializeObject(entries: Array<[string, string]>): string {\n if (entries.length === 0) {\n return \"{}\";\n }\n\n return `{\\n${entries.map(([key, value]) => ` ${JSON.stringify(key)}: ${value}`).join(\",\\n\")}\\n}`;\n}\n\nfunction serializeArrayOfObjects(entries: Array<Array<[string, string]>>): string {\n if (entries.length === 0) {\n return \"[]\";\n }\n\n return `[\\n${entries.map((objectEntries) => ` ${serializeInlineObject(objectEntries)}`).join(\",\\n\")}\\n]`;\n}\n\nfunction serializeInlineObject(entries: Array<[string, string]>): string {\n if (entries.length === 0) {\n return \"{}\";\n }\n\n return `{ ${entries.map(([key, value]) => `${JSON.stringify(key)}: ${value}`).join(\", \")} }`;\n}\n\nfunction serializeArray(entries: string[]): string {\n if (entries.length === 0) {\n return \"[]\";\n }\n\n return `[\\n${entries.map((entry) => ` ${JSON.stringify(entry)}`).join(\",\\n\")}\\n]`;\n}\n\nfunction createImportSpecifier(file: string): string {\n return file.startsWith(\"/\") ? file : `/${file}`;\n}\n"],"mappings":";AAEA,MAAa,6BAA6B;AAC1C,MAAa,4BAA4B;AACzC,MAAa,yBAAyB;AACtC,MAAa,+BAA+B;AAC5C,MAAa,8BAA8B;AAC3C,MAAa,2BAA2B;AACxC,MAAa,0BAA0B;AACvC,MAAa,8BAA8B;AAC3C,MAAa,0BAA0B;AACvC,MAAa,6BAA6B;AAC1C,MAAa,iCAAiC;AAC9C,MAAa,6BAA6B;AAC1C,MAAa,sBAAsB;AACnC,MAAa,sCAAsC,KAAK;AACxD,MAAa,qCAAqC,KAAK;AACvD,MAAa,kCAAkC,KAAK;AACpD,MAAa,wCAAwC,KAAK;AAC1D,MAAa,uCAAuC,KAAK;AACzD,MAAa,oCAAoC,KAAK;AACtD,MAAa,mCAAmC,KAAK;AACrD,MAAa,uCAAuC,KAAK;AACzD,MAAa,mCAAmC,KAAK;AACrD,MAAa,sCAAsC,KAAK;AACxD,MAAa,0CAA0C,KAAK;AAC5D,MAAa,sCAAsC,KAAK;AACxD,MAAa,+BAA+B,KAAK;AAQjD,SAAgB,kCAAkC,QAAqC;AAGrF,QAAO;EAAC,2BAFS,KAAK,UAAU,OAAO,UAAU,MAAM,EAAE;EAEV;EAAI;EAA0B,CAAC,KAAK,KAAK;;AAG1F,SAAgB,iCACd,QACA,UAAsC,EAAE,EAChC;AACR,QAAO,QAAQ,qBAAqB,UAChC,8BAA8B,OAAO,GACrC,gCAAgC,OAAO;;AAG7C,SAAgB,8BAA8B,QAAqC;CACjF,MAAM,gBAAgB;EACpB,OAAO,IAAI,MACP;GACE,eAAe;GACf,OAAO;GACP,YAAY;GACZ,WAAW,sBAAsB,OAAO,IAAI,IAAI;GACjD,GACD;EACJ,OAAO,IAAI,QACP;GACE,eAAe;GACf,OAAO;GACP,YAAY;GACZ,WAAW,sBAAsB,OAAO,IAAI,MAAM;GACnD,GACD;EACJ,OAAO,IAAI,SACP;GACE,eAAe;GACf,OAAO;GACP,YAAY;GACZ,WAAW,sBAAsB,OAAO,IAAI,OAAO;GACpD,GACD;EACJ,OAAO,IAAI,SACP;GACE,eAAe;GACf,OAAO;GACP,YAAY;GACZ,WAAW,sBAAsB,OAAO,IAAI,OAAO;GACpD,GACD;EACL,CAAC,OAAO,QAAQ;CAMjB,MAAM,cAAc,cAAc,KAC/B,EAAE,eAAe,gBAChB,eAAe,cAAc,QAAQ,KAAK,UAAU,UAAU,GACjE;CACD,MAAM,kBAAkB,cAAc,KACnC,EAAE,eAAe,YAAY,OAAO,MAAM,KAAK,gBACjD;CACD,MAAM,qBAAqB;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;AAED,QAAO;EACL;EACA,4BAA4B,KAAK,UAAU,6BAA6B;EACxE,gCAAgC,KAAK,UAAU,4BAA4B;EAC3E,yCAAyC,KAAK,UAAU,4BAA4B;EACpF;EACA,GAAG;EACH,GAAI,YAAY,SAAS,IAAI,CAAC,GAAG,GAAG,EAAE;EACtC,GAAG;EACH,GAAI,gBAAgB,SAAS,IAAI,CAAC,GAAG,GAAG,EAAE;EAC1C,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;E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AAkB,KAAK,CAAC,OAAO,UAAU,CACxF,MACA,qCAAqC,MAAM,IAAI,KAAK,UAAU,KAAK,CAAC,GACrE,CAAC;AAEF,QAAO;EACL,GAAG;EACH,YAAY,SAAS,IAAI,KAAK;EAC9B,2CAA2C,gBAAgB,gBAAgB;EAC3E;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,+BAAuC;AACrD,QAAO;EACL,qCAAqC,KAAK,UAAU,yBAAyB;EAC7E;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,kCAA0C;AACxD,QAAO;EACL;EACA,0BAA0B,KAAK,UAAU,oBAAoB;EAC7D,0DAA0D,KAAK,UAAU,2BAA2B;EACpG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAC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"}
1
+ {"version":3,"file":"virtual-modules.js","names":[],"sources":["../../../../src/lib/vite-plugin/generated/virtual-modules.ts"],"sourcesContent":["import type { ScannedRouteModule, ScannedRoutesResult } from \"../scanners/route-manifest\";\n\nexport const VIRTUAL_ROUTES_MANIFEST_ID = \"virtual:phial-routes-manifest\";\nexport const VIRTUAL_ROUTES_MODULES_ID = \"virtual:phial-routes-modules\";\nexport const VIRTUAL_APP_RUNTIME_ID = \"virtual:phial-app-runtime\";\nexport const GENERATED_ROUTES_MANIFEST_ID = \"phial/generated-routes-manifest\";\nexport const GENERATED_ROUTES_MODULES_ID = \"phial/generated-routes-modules\";\nexport const GENERATED_APP_RUNTIME_ID = \"phial/generated-app-runtime\";\nexport const GENERATED_APP_LOADER_ID = \"phial/generated-app-loader\";\nexport const GENERATED_APP_MIDDLEWARE_ID = \"phial/generated-app-middleware\";\nexport const GENERATED_APP_PLUGIN_ID = \"phial/generated-app-plugin\";\nexport const GENERATED_SERVER_ROUTES_ID = \"phial/generated-server-routes\";\nexport const GENERATED_SERVER_MIDDLEWARE_ID = \"phial/generated-server-middleware\";\nexport const GENERATED_SERVER_PLUGIN_ID = \"phial/generated-server-plugin\";\nexport const GENERATED_CONFIG_ID = \"phial/generated-config\";\nexport const RESOLVED_VIRTUAL_ROUTES_MANIFEST_ID = `\\0${VIRTUAL_ROUTES_MANIFEST_ID}`;\nexport const RESOLVED_VIRTUAL_ROUTES_MODULES_ID = `\\0${VIRTUAL_ROUTES_MODULES_ID}`;\nexport const RESOLVED_VIRTUAL_APP_RUNTIME_ID = `\\0${VIRTUAL_APP_RUNTIME_ID}`;\nexport const RESOLVED_GENERATED_ROUTES_MANIFEST_ID = `\\0${GENERATED_ROUTES_MANIFEST_ID}`;\nexport const RESOLVED_GENERATED_ROUTES_MODULES_ID = `\\0${GENERATED_ROUTES_MODULES_ID}`;\nexport const RESOLVED_GENERATED_APP_RUNTIME_ID = `\\0${GENERATED_APP_RUNTIME_ID}`;\nexport const RESOLVED_GENERATED_APP_LOADER_ID = `\\0${GENERATED_APP_LOADER_ID}`;\nexport const RESOLVED_GENERATED_APP_MIDDLEWARE_ID = `\\0${GENERATED_APP_MIDDLEWARE_ID}`;\nexport const RESOLVED_GENERATED_APP_PLUGIN_ID = `\\0${GENERATED_APP_PLUGIN_ID}`;\nexport const RESOLVED_GENERATED_SERVER_ROUTES_ID = `\\0${GENERATED_SERVER_ROUTES_ID}`;\nexport const RESOLVED_GENERATED_SERVER_MIDDLEWARE_ID = `\\0${GENERATED_SERVER_MIDDLEWARE_ID}`;\nexport const RESOLVED_GENERATED_SERVER_PLUGIN_ID = `\\0${GENERATED_SERVER_PLUGIN_ID}`;\nexport const RESOLVED_GENERATED_CONFIG_ID = `\\0${GENERATED_CONFIG_ID}`;\n\ntype RouteFileKey = keyof ScannedRouteModule[\"files\"];\n\nexport interface VirtualRoutesModuleOptions {\n moduleImportMode?: \"eager\" | \"lazy\";\n}\n\nexport function createVirtualRoutesManifestModule(result: ScannedRoutesResult): string {\n const manifest = JSON.stringify(result.manifest, null, 2);\n\n return [`export const manifest = ${manifest}`, \"\", \"export default manifest\"].join(\"\\n\");\n}\n\nexport function createVirtualRoutesModulesModule(\n result: ScannedRoutesResult,\n options: VirtualRoutesModuleOptions = {},\n): string {\n return options.moduleImportMode === \"eager\"\n ? createEagerRouteModulesModule(result)\n : createDynamicRouteModulesModule(result);\n}\n\nexport function createVirtualAppRuntimeModule(result: ScannedRoutesResult): string {\n const importEntries = [\n result.app.app\n ? {\n importedLocal: \"importedAppComponentModule\",\n local: \"appComponentModule\",\n exportName: \"appComponent\",\n specifier: createImportSpecifier(result.app.app),\n }\n : null,\n result.app.error\n ? {\n importedLocal: \"importedErrorComponentModule\",\n local: \"errorComponentModule\",\n exportName: \"errorComponent\",\n specifier: createImportSpecifier(result.app.error),\n }\n : null,\n result.app.loader\n ? {\n importedLocal: \"importedAppLoaderModule\",\n local: \"appLoaderModule\",\n exportName: \"appLoader\",\n specifier: createImportSpecifier(result.app.loader),\n }\n : null,\n result.app.config\n ? {\n importedLocal: \"importedAppConfigModule\",\n local: \"appConfigModule\",\n exportName: \"appConfig\",\n specifier: createImportSpecifier(result.app.config),\n }\n : null,\n ].filter(Boolean) as Array<{\n importedLocal: string;\n local: string;\n exportName: \"appComponent\" | \"errorComponent\" | \"appLoader\" | \"appConfig\";\n specifier: string;\n }>;\n const importLines = importEntries.map(\n ({ importedLocal, specifier }) =>\n `import * as ${importedLocal} from ${JSON.stringify(specifier)}`,\n );\n const mutableBindings = importEntries.map(\n ({ importedLocal, local }) => `let ${local} = ${importedLocal}`,\n );\n const exportInitializers = [\n 'let appComponent = resolveAppComponent(typeof appComponentModule !== \"undefined\" ? appComponentModule : undefined)',\n 'let errorComponent = resolveErrorComponent(typeof errorComponentModule !== \"undefined\" ? errorComponentModule : undefined)',\n 'export let appLoader = resolveAppLoader(typeof appLoaderModule !== \"undefined\" ? appLoaderModule : undefined)',\n 'let appConfig = resolveAppConfig(typeof appConfigModule !== \"undefined\" ? appConfigModule : undefined)',\n \"export let app = createAppModule(appComponent, errorComponent, appLoader)\",\n \"export let routes = createRouteRecords(manifest, routeModules)\",\n \"export function createIntegration(runtimeOptions = {}) {\",\n \" return createRouteRuntimeIntegration({\",\n \" app,\",\n \" routes,\",\n \" ...runtimeOptions\",\n \" })\",\n \"}\",\n \"export let integration = createIntegration()\",\n \"installRouteModuleHmrBridge()\",\n ];\n\n return [\n 'import { createRouteRuntimeIntegration } from \"vuepagelet/integration\"',\n `import { manifest } from ${JSON.stringify(GENERATED_ROUTES_MANIFEST_ID)}`,\n `import { routeModules } from ${JSON.stringify(GENERATED_ROUTES_MODULES_ID)}`,\n `import { appMiddlewareRegistry } from ${JSON.stringify(GENERATED_APP_MIDDLEWARE_ID)}`,\n \"\",\n ...importLines,\n ...(importLines.length > 0 ? [\"\"] : []),\n ...mutableBindings,\n ...(mutableBindings.length > 0 ? [\"\"] : []),\n ...exportInitializers,\n \"\",\n \"function resolveAppComponent(module) {\",\n \" return module?.default\",\n \"}\",\n \"\",\n \"function resolveErrorComponent(module) {\",\n \" return module?.default\",\n \"}\",\n \"\",\n \"function resolveAppLoader(module) {\",\n \" const loader = module?.loader ?? module?.default\",\n ' if (loader !== undefined && typeof loader !== \"function\") {',\n ' throw new Error(\"Invalid app loader module. Expected a default export or named \\\\\"loader\\\\\" export.\")',\n \" }\",\n \"\",\n \" return loader\",\n \"}\",\n \"\",\n \"function resolveAppConfig(module) {\",\n \" return module?.default ?? module?.appConfig ?? {}\",\n \"}\",\n \"\",\n \"function createAppModule(shell, error, loader) {\",\n \" return { shell, error, loader }\",\n \"}\",\n \"\",\n \"function createRouteRecords(routeManifest, loadedRouteModules) {\",\n \" const records = routeManifest.map((entry) => ({\",\n \" id: entry.id,\",\n \" path: entry.path,\",\n \" module: createRouteModule(entry, loadedRouteModules[entry.id]),\",\n \" children: []\",\n \" }))\",\n \" const recordMap = new Map(records.map((record) => [record.id, record]))\",\n \" const roots = []\",\n \"\",\n \" for (const entry of routeManifest) {\",\n \" const record = recordMap.get(entry.id)\",\n \" if (!record) {\",\n \" continue\",\n \" }\",\n \"\",\n \" if (entry.parentId) {\",\n \" const parent = recordMap.get(entry.parentId)\",\n \" if (parent) {\",\n \" parent.children.push(record)\",\n \" continue\",\n \" }\",\n \" }\",\n \"\",\n \" roots.push(record)\",\n \" }\",\n \"\",\n \" return attachAppMiddleware(roots, resolveGlobalMiddleware(appConfig, appMiddlewareRegistry))\",\n \"}\",\n \"\",\n \"function installRouteModuleHmrBridge() {\",\n ' if (typeof globalThis === \"undefined\") {',\n \" return\",\n \" }\",\n \"\",\n \" globalThis.__ROUTE_MODULE_HMR__ = async () => {\",\n \" const nextRoutes = createRouteRecords(manifest, routeModules)\",\n \" syncRouteRecords(routes, nextRoutes)\",\n \" integration = createIntegration()\",\n \" await notifyAppRuntimeHotUpdate({\",\n \" appComponent,\",\n \" errorComponent,\",\n \" config: appConfig,\",\n \" routes,\",\n \" })\",\n \" }\",\n \"}\",\n \"\",\n \"async function notifyAppRuntimeHotUpdate(payload) {\",\n ' if (typeof globalThis === \"undefined\") {',\n \" return false\",\n \" }\",\n \"\",\n \" const applyAppRuntimeHotUpdate = globalThis.__APP_RUNTIME_HMR__\",\n ' if (typeof applyAppRuntimeHotUpdate !== \"function\") {',\n \" return false\",\n \" }\",\n \"\",\n \" await applyAppRuntimeHotUpdate(payload)\",\n \" return true\",\n \"}\",\n \"\",\n \"function syncRouteRecords(targetRoutes, nextRoutes) {\",\n \" const targetRouteMap = new Map(flattenRoutes(targetRoutes).map((route) => [route.id, route]))\",\n \"\",\n \" for (const nextRoute of flattenRoutes(nextRoutes)) {\",\n \" const targetRoute = targetRouteMap.get(nextRoute.id)\",\n \" if (!targetRoute) {\",\n \" continue\",\n \" }\",\n \"\",\n \" targetRoute.path = nextRoute.path\",\n \" targetRoute.name = nextRoute.name\",\n \" targetRoute.module = nextRoute.module\",\n \" }\",\n \"}\",\n \"\",\n \"function flattenRoutes(routes) {\",\n \" return routes.flatMap((route) => [route, ...flattenRoutes(route.children ?? [])])\",\n \"}\",\n \"\",\n \"function createRouteModule(entry, module) {\",\n \" const resolvedModule = module ?? {}\",\n ' const routeModule = entry.kind === \"layout\"',\n \" ? { layout: resolveDefaultExport(resolvedModule) }\",\n \" : { component: resolveDefaultExport(resolvedModule) }\",\n \" const middleware = resolveMiddlewareReferences([\",\n \" ...(resolvedModule.directoryMiddleware ?? []),\",\n \" ...(resolvedModule.middleware ?? []),\",\n \" ], appMiddlewareRegistry)\",\n \"\",\n \" if (resolvedModule.Loading !== undefined) {\",\n \" routeModule.loading = resolvedModule.Loading\",\n \" }\",\n \"\",\n \" if (resolvedModule.ErrorBoundary !== undefined) {\",\n \" routeModule.error = resolvedModule.ErrorBoundary\",\n \" }\",\n \"\",\n \" if (resolvedModule.loader !== undefined) {\",\n \" routeModule.loader = resolvedModule.loader\",\n \" }\",\n \"\",\n \" if (resolvedModule.action !== undefined) {\",\n \" routeModule.action = resolvedModule.action\",\n \" }\",\n \"\",\n \" if (middleware.length > 0) {\",\n \" routeModule.middleware = middleware\",\n \" }\",\n \"\",\n \" if (resolvedModule.shouldRevalidate !== undefined) {\",\n \" routeModule.shouldRevalidate = resolvedModule.shouldRevalidate\",\n \" }\",\n \"\",\n \" return routeModule\",\n \"}\",\n \"\",\n \"function resolveDefaultExport(module) {\",\n \" return module?.default\",\n \"}\",\n \"\",\n \"function resolveGlobalMiddleware(config, registry) {\",\n \" return resolveMiddlewareReferences(config?.middleware ?? [], registry)\",\n \"}\",\n \"\",\n \"function resolveMiddlewareReferences(references, registry) {\",\n \" const entries = Array.isArray(references) ? references : [references]\",\n \" const middleware = []\",\n \"\",\n \" for (const reference of entries) {\",\n \" if (reference === undefined) {\",\n \" continue\",\n \" }\",\n \"\",\n ' if (typeof reference === \"function\") {',\n \" middleware.push(reference)\",\n \" continue\",\n \" }\",\n \"\",\n \" const handler = registry[reference]\",\n \" if (!handler) {\",\n ' throw new Error(`Unknown middleware reference \"${reference}\".`)',\n \" }\",\n \"\",\n \" middleware.push(handler)\",\n \" }\",\n \"\",\n \" return middleware\",\n \"}\",\n \"\",\n \"function attachAppMiddleware(routes, middleware) {\",\n \" if (!Array.isArray(middleware) || middleware.length === 0) {\",\n \" return routes\",\n \" }\",\n \"\",\n \" return routes.map((route) => ({\",\n \" ...route,\",\n \" module: {\",\n \" ...route.module,\",\n \" middleware: [...middleware, ...(route.module.middleware ?? [])],\",\n \" },\",\n \" }))\",\n \"}\",\n \"\",\n ...(importLines.length > 0 ? [\"\", ...createAppRuntimeHmrBlock(importEntries)] : []),\n \"\",\n \"export default integration\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualAppLoaderModule(result: ScannedRoutesResult): string {\n if (!result.app.loader) {\n return [\"export const appLoader = undefined\", \"\", \"export default appLoader\"].join(\"\\n\");\n }\n\n return [\n `import * as appLoaderModule from ${JSON.stringify(createImportSpecifier(result.app.loader))}`,\n \"\",\n \"export const appLoader = resolveAppLoader(appLoaderModule)\",\n \"\",\n \"function resolveAppLoader(module) {\",\n \" const loader = module?.loader ?? module?.default\",\n ' if (typeof loader !== \"function\") {',\n ' throw new Error(\"Invalid app loader module. Expected a default export or named \\\\\"loader\\\\\" export.\")',\n \" }\",\n \"\",\n \" return loader\",\n \"}\",\n \"\",\n \"export default appLoader\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualAppMiddlewareModule(result: ScannedRoutesResult): string {\n const middlewareEntries = Object.entries(result.app.middleware);\n const importLines = middlewareEntries.map(\n ([, file], index) =>\n `import * as middlewareModule${index} from ${JSON.stringify(createImportSpecifier(file))}`,\n );\n const registryEntries: Array<[string, string]> = middlewareEntries.map(([name], index) => [\n name,\n `resolveMiddleware(middlewareModule${index}, ${JSON.stringify(name)})`,\n ]);\n\n return [\n ...importLines,\n importLines.length > 0 ? \"\" : \"\",\n `export const appMiddlewareRegistry = ${serializeObject(registryEntries)}`,\n \"\",\n \"function resolveMiddleware(module, name) {\",\n \" const middleware = module?.middleware ?? module?.default\",\n ' if (typeof middleware !== \"function\") {',\n ' throw new Error(`Invalid middleware module \"${name}\". Expected a default export or named \"middleware\" export.`)',\n \" }\",\n \"\",\n \" return middleware\",\n \"}\",\n \"\",\n \"export default appMiddlewareRegistry\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualServerRoutesModule(result: ScannedRoutesResult): string {\n const routeEntries = result.server.routes;\n const uniqueFiles = Array.from(\n new Set(routeEntries.flatMap((route) => [route.file, ...route.directoryMiddleware])),\n );\n const importLines = uniqueFiles.map(\n (specifier, index) =>\n `import * as importedServerFile${index} from ${JSON.stringify(createImportSpecifier(specifier))}`,\n );\n const fileModuleBindings = uniqueFiles.map(\n (_specifier, index) => `const serverFileModule${index} = importedServerFile${index}`,\n );\n const fileIndexMap = serializeObject(\n uniqueFiles.map((specifier, index) => [specifier, String(index)]),\n );\n\n return [\n `export { serverMiddlewareRegistry } from ${JSON.stringify(GENERATED_SERVER_MIDDLEWARE_ID)}`,\n \"\",\n ...importLines,\n importLines.length > 0 ? \"\" : \"\",\n ...fileModuleBindings,\n fileModuleBindings.length > 0 ? \"\" : \"\",\n `export const serverRoutes = ${serializeArrayOfObjects(\n routeEntries.map((route) => [\n [\"id\", JSON.stringify(route.id)],\n [\"path\", JSON.stringify(route.path)],\n [\"file\", JSON.stringify(route.file)],\n [\n \"definition\",\n `resolveServerRoute(getLoadedServerModule(${JSON.stringify(route.file)}), ${JSON.stringify(route.file)})`,\n ],\n [\n \"directoryMiddlewareNames\",\n `resolveDirectoryMiddlewareNames(${serializeArray(route.directoryMiddleware)})`,\n ],\n ]),\n )}`,\n \"\",\n \"function resolveDirectoryMiddlewareNames(files) {\",\n \" return files.flatMap((file) => resolveMiddlewareNames(getLoadedServerModule(file), file))\",\n \"}\",\n \"\",\n \"function resolveServerRoute(module, file) {\",\n \" const route = module?.default ?? module?.route\",\n ' if (!route || typeof route !== \"object\") {',\n ' throw new Error(`Invalid server route module \"${file}\". Expected a default export or named \"route\" export.`)',\n \" }\",\n \"\",\n \" return {\",\n \" middlewareNames: normalizeMiddlewareNames(route?.middleware),\",\n ' meta: route?.meta && typeof route.meta === \"object\" ? route.meta : undefined,',\n \" handler: asHandler(route?.handler),\",\n \" GET: asHandler(route?.GET),\",\n \" POST: asHandler(route?.POST),\",\n \" PUT: asHandler(route?.PUT),\",\n \" PATCH: asHandler(route?.PATCH),\",\n \" DELETE: asHandler(route?.DELETE),\",\n \" HEAD: asHandler(route?.HEAD),\",\n \" OPTIONS: asHandler(route?.OPTIONS),\",\n \" }\",\n \"}\",\n \"\",\n \"function resolveMiddlewareNames(module, file) {\",\n \" if (!module) {\",\n \" return []\",\n \" }\",\n \"\",\n \" const middleware = module?.middleware ?? module?.default\",\n \" if (middleware === undefined) {\",\n \" return []\",\n \" }\",\n \"\",\n ' if (!Array.isArray(middleware) || middleware.some((name) => typeof name !== \"string\")) {',\n ' throw new Error(`Invalid server route directory middleware \"${file}\". Expected a default export or named \"middleware\" export with a string array.`)',\n \" }\",\n \"\",\n \" return middleware\",\n \"}\",\n \"\",\n \"function normalizeMiddlewareNames(value) {\",\n \" if (value === undefined) {\",\n \" return undefined\",\n \" }\",\n \"\",\n ' if (!Array.isArray(value) || value.some((name) => typeof name !== \"string\")) {',\n \" throw new Error('Server route \\\"middleware\\\" must be a string array.')\",\n \" }\",\n \"\",\n \" return value\",\n \"}\",\n \"\",\n \"function asHandler(value) {\",\n ' return typeof value === \"function\" ? value : undefined',\n \"}\",\n \"\",\n \"function getLoadedServerModule(file) {\",\n ` const fileIndex = ${fileIndexMap}[file]`,\n \" if (fileIndex === undefined) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" return [\",\n ...uniqueFiles.map(\n (_, index) => ` serverFileModule${index}${index < uniqueFiles.length - 1 ? \",\" : \"\"}`,\n ),\n \" ][fileIndex]\",\n \"}\",\n \"\",\n \"export default serverRoutes\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualServerMiddlewareModule(result: ScannedRoutesResult): string {\n const middlewareEntries = Object.entries(result.server.middleware);\n const importLines = middlewareEntries.map(\n ([, file], index) =>\n `import * as middlewareModule${index} from ${JSON.stringify(createImportSpecifier(file))}`,\n );\n const registryEntries: Array<[string, string]> = middlewareEntries.map(([name], index) => [\n name,\n `resolveMiddleware(middlewareModule${index}, ${JSON.stringify(name)})`,\n ]);\n\n return [\n ...importLines,\n importLines.length > 0 ? \"\" : \"\",\n `export const serverMiddlewareRegistry = ${serializeObject(registryEntries)}`,\n \"\",\n \"function resolveMiddleware(module, name) {\",\n \" const middleware = module?.middleware ?? module?.default\",\n ' if (typeof middleware !== \"function\") {',\n ' throw new Error(`Invalid server middleware module \"${name}\". Expected a default export or named \"middleware\" export.`)',\n \" }\",\n \"\",\n \" return middleware\",\n \"}\",\n \"\",\n \"export default serverMiddlewareRegistry\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualAppPluginModule(): string {\n return [\n `import { createIntegration } from ${JSON.stringify(GENERATED_APP_RUNTIME_ID)}`,\n \"\",\n \"function createAppRouteMiddleware(getIntegration) {\",\n \" return async (context, next) => {\",\n \" const request = context.request\",\n \" const integration = await getIntegration()\",\n \" const routeMatch = integration.match(new URL(request.url).pathname)\",\n \" if (!routeMatch) {\",\n \" return next(context)\",\n \" }\",\n \"\",\n \" try {\",\n \" return await integration.handleRequest(request)\",\n \" } catch (error) {\",\n \" console.error('[app route error]', error)\",\n \" throw error\",\n \" }\",\n \" }\",\n \"}\",\n \"\",\n \"function createAppRouteServerPlugin(options = {}) {\",\n \" let integrationPromise\",\n \"\",\n \" return (server) => {\",\n \" server.options.middleware.push(\",\n \" createAppRouteMiddleware(() => {\",\n \" if (!integrationPromise) {\",\n \" integrationPromise = Promise.resolve(createIntegration(options))\",\n \" }\",\n \"\",\n \" return integrationPromise\",\n \" }),\",\n \" )\",\n \" }\",\n \"}\",\n \"\",\n \"export function createAppPlugin(options = {}) {\",\n \" return createAppRouteServerPlugin(options)\",\n \"}\",\n \"\",\n \"export const appPlugin = createAppPlugin()\",\n \"\",\n \"export default createAppPlugin\",\n ].join(\"\\n\");\n}\n\nexport function createVirtualServerPluginModule(): string {\n return [\n 'import { runMiddleware } from \"sevok\"',\n `import { config } from ${JSON.stringify(GENERATED_CONFIG_ID)}`,\n `import { serverMiddlewareRegistry, serverRoutes } from ${JSON.stringify(GENERATED_SERVER_ROUTES_ID)}`,\n \"\",\n \"function createServerRoutesPlugin(options) {\",\n \" return (server) => {\",\n \" server.options.middleware.unshift(createServerRoutesMiddleware(options))\",\n \" }\",\n \"}\",\n \"\",\n \"function createServerRoutesMiddleware(options) {\",\n \" return async (context, next) => {\",\n \" const request = context.request\",\n \" const route = findServerRoute(options.routes, new URL(request.url).pathname)\",\n \" if (!route) {\",\n \" return next(context)\",\n \" }\",\n \"\",\n \" const handler = getRouteHandler(route, request.method)\",\n \" if (!handler) {\",\n ' return new Response(\"Method Not Allowed\", { status: 405 })',\n \" }\",\n \"\",\n \" const middleware = resolveMiddlewareChain(\",\n \" route,\",\n \" options.middlewareRegistry,\",\n \" options.globalMiddlewareNames,\",\n \" )\",\n \" if (middleware.length === 0) {\",\n \" return handleRoute(context, handler)\",\n \" }\",\n \"\",\n \" return runMiddleware({\",\n \" context,\",\n \" middleware,\",\n \" terminal: (nextContext) => handleRoute(nextContext, handler),\",\n \" })\",\n \" }\",\n \"}\",\n \"\",\n \"async function handleRoute(context, handler) {\",\n \" const result = await handler(context)\",\n \" if (result instanceof Response) {\",\n \" return result\",\n \" }\",\n \"\",\n \" return Response.json(result)\",\n \"}\",\n \"\",\n \"function resolveMiddlewareChain(route, registry, globalMiddlewareNames = []) {\",\n \" const names = [\",\n \" ...globalMiddlewareNames,\",\n \" ...(route.directoryMiddlewareNames ?? []),\",\n \" ...(route.definition.middlewareNames ?? []),\",\n \" ]\",\n \"\",\n \" return names.map((name) => {\",\n \" const middleware = registry[name]\",\n \" if (!middleware) {\",\n ' throw new Error(`Unknown server middleware \"${name}\" referenced by route \"${route.id}\".`)',\n \" }\",\n \"\",\n \" return middleware\",\n \" })\",\n \"}\",\n \"\",\n \"function findServerRoute(routes, pathname) {\",\n \" const normalizedPathname = normalizePathname(pathname)\",\n \" return routes.find((route) => matchesServerRoutePath(route.path, normalizedPathname))\",\n \"}\",\n \"\",\n \"function matchesServerRoutePath(pattern, pathname) {\",\n \" const normalizedPattern = normalizePathname(pattern)\",\n \" if (normalizedPattern === pathname) {\",\n \" return true\",\n \" }\",\n \"\",\n \" const patternSegments = splitPathSegments(normalizedPattern)\",\n \" const pathnameSegments = splitPathSegments(pathname)\",\n \" if (patternSegments.length !== pathnameSegments.length) {\",\n \" return false\",\n \" }\",\n \"\",\n \" for (let index = 0; index < patternSegments.length; index += 1) {\",\n \" const patternSegment = patternSegments[index]\",\n \" const pathnameSegment = pathnameSegments[index]\",\n \"\",\n \" if (!patternSegment) {\",\n \" return false\",\n \" }\",\n \"\",\n ' if (patternSegment.startsWith(\":\")) {',\n \" continue\",\n \" }\",\n \"\",\n \" if (patternSegment !== pathnameSegment) {\",\n \" return false\",\n \" }\",\n \" }\",\n \"\",\n \" return true\",\n \"}\",\n \"\",\n \"function getRouteHandler(route, method) {\",\n \" const resolvedMethod = method.toUpperCase()\",\n \" const definition = route.definition\",\n \"\",\n \" switch (resolvedMethod) {\",\n ' case \"GET\":',\n \" return definition.GET ?? definition.handler\",\n ' case \"POST\":',\n \" return definition.POST ?? definition.handler\",\n ' case \"PUT\":',\n \" return definition.PUT ?? definition.handler\",\n ' case \"PATCH\":',\n \" return definition.PATCH ?? definition.handler\",\n ' case \"DELETE\":',\n \" return definition.DELETE ?? definition.handler\",\n ' case \"HEAD\":',\n \" return definition.HEAD ?? definition.handler\",\n ' case \"OPTIONS\":',\n \" return definition.OPTIONS ?? definition.handler\",\n \" default:\",\n \" return definition.handler\",\n \" }\",\n \"}\",\n \"\",\n \"function normalizePathname(pathname) {\",\n \" if (!pathname) {\",\n ' return \"/\"',\n \" }\",\n \"\",\n ' if (!pathname.startsWith(\"/\")) {',\n \" return `/${pathname}`\",\n \" }\",\n \"\",\n ' if (pathname.length > 1 && pathname.endsWith(\"/\")) {',\n ' return pathname.replace(/\\\\/+$/, \"\")',\n \" }\",\n \"\",\n \" return pathname\",\n \"}\",\n \"\",\n \"function splitPathSegments(pathname) {\",\n \" const normalized = normalizePathname(pathname)\",\n ' if (normalized === \"/\") {',\n \" return []\",\n \" }\",\n \"\",\n ' return normalized.replace(/^\\\\/+|\\\\/+$/g, \"\").split(\"/\")',\n \"}\",\n \"\",\n \"export function createServerPlugin() {\",\n \" return createServerRoutesPlugin({\",\n \" routes: serverRoutes,\",\n \" middlewareRegistry: serverMiddlewareRegistry,\",\n \" globalMiddlewareNames: config.server?.middleware ?? []\",\n \" })\",\n \"}\",\n \"\",\n \"export const serverPlugin = createServerPlugin()\",\n \"\",\n \"export default createServerPlugin\",\n ].join(\"\\n\");\n}\n\nexport function resolveVirtualModuleId(id: string): string | null {\n if (id === VIRTUAL_ROUTES_MANIFEST_ID || id === RESOLVED_VIRTUAL_ROUTES_MANIFEST_ID) {\n return RESOLVED_VIRTUAL_ROUTES_MANIFEST_ID;\n }\n\n if (id === VIRTUAL_ROUTES_MODULES_ID || id === RESOLVED_VIRTUAL_ROUTES_MODULES_ID) {\n return RESOLVED_VIRTUAL_ROUTES_MODULES_ID;\n }\n\n if (id === VIRTUAL_APP_RUNTIME_ID || id === RESOLVED_VIRTUAL_APP_RUNTIME_ID) {\n return RESOLVED_VIRTUAL_APP_RUNTIME_ID;\n }\n\n if (id === GENERATED_ROUTES_MANIFEST_ID || id === RESOLVED_GENERATED_ROUTES_MANIFEST_ID) {\n return RESOLVED_GENERATED_ROUTES_MANIFEST_ID;\n }\n\n if (id === GENERATED_ROUTES_MODULES_ID || id === RESOLVED_GENERATED_ROUTES_MODULES_ID) {\n return RESOLVED_GENERATED_ROUTES_MODULES_ID;\n }\n\n if (id === GENERATED_APP_RUNTIME_ID || id === RESOLVED_GENERATED_APP_RUNTIME_ID) {\n return RESOLVED_GENERATED_APP_RUNTIME_ID;\n }\n\n if (id === GENERATED_APP_LOADER_ID || id === RESOLVED_GENERATED_APP_LOADER_ID) {\n return RESOLVED_GENERATED_APP_LOADER_ID;\n }\n\n if (id === GENERATED_APP_MIDDLEWARE_ID || id === RESOLVED_GENERATED_APP_MIDDLEWARE_ID) {\n return RESOLVED_GENERATED_APP_MIDDLEWARE_ID;\n }\n\n if (id === GENERATED_APP_PLUGIN_ID || id === RESOLVED_GENERATED_APP_PLUGIN_ID) {\n return RESOLVED_GENERATED_APP_PLUGIN_ID;\n }\n\n if (id === GENERATED_SERVER_ROUTES_ID || id === RESOLVED_GENERATED_SERVER_ROUTES_ID) {\n return RESOLVED_GENERATED_SERVER_ROUTES_ID;\n }\n\n if (id === GENERATED_SERVER_MIDDLEWARE_ID || id === RESOLVED_GENERATED_SERVER_MIDDLEWARE_ID) {\n return RESOLVED_GENERATED_SERVER_MIDDLEWARE_ID;\n }\n\n if (id === GENERATED_SERVER_PLUGIN_ID || id === RESOLVED_GENERATED_SERVER_PLUGIN_ID) {\n return RESOLVED_GENERATED_SERVER_PLUGIN_ID;\n }\n\n if (id === GENERATED_CONFIG_ID || id === RESOLVED_GENERATED_CONFIG_ID) {\n return RESOLVED_GENERATED_CONFIG_ID;\n }\n\n return null;\n}\n\nexport function createVirtualConfigModule(options: {\n config: Record<string, unknown>;\n hasConfigFile: boolean;\n}): string {\n if (!options.hasConfigFile) {\n return [\n \"export const hasConfig = false\",\n \"export const config = {}\",\n \"\",\n \"export default config\",\n ].join(\"\\n\");\n }\n\n return [\n \"export const hasConfig = true\",\n `export const config = ${JSON.stringify(options.config, null, 2)}`,\n \"\",\n \"export default config\",\n ].join(\"\\n\");\n}\n\nfunction createDynamicRouteModulesModule(result: ScannedRoutesResult): string {\n const routeFiles = serializeObject(\n result.modules.map((module) => [module.id, serializeArray(resolveModuleSpecifiers(module))]),\n );\n const routeModules = serializeObject(\n result.modules.map((module) => [\n module.id,\n `() => loadResolvedRouteModule(${JSON.stringify(module.id)})`,\n ]),\n );\n const routeImportSpecifiers = Array.from(\n new Set(result.modules.flatMap((module) => resolveModuleSpecifiers(module))),\n );\n const hmrBlock = createRouteModulesHmrBlock(routeImportSpecifiers);\n\n return [\n `export const routeFiles = ${routeFiles}`,\n \"\",\n `export const routeModules = ${routeModules}`,\n \"\",\n \"export async function loadRouteModule(id) {\",\n \" const importer = routeModules[id]\",\n \" return importer ? importer() : undefined\",\n \"}\",\n \"\",\n \"async function loadResolvedRouteModule(id) {\",\n ` const routeDefinitions = ${serializeObject(result.modules.map((module) => [module.id, createRouteDefinition(module)]))}`,\n \" const definition = routeDefinitions[id]\",\n \" if (!definition) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" const loadedModules = await Promise.all(definition.files.map(file => import(file)))\",\n \" return createPhialRouteModule(definition, loadedModules)\",\n \"}\",\n \"\",\n ...createRouteModuleHelperLines(),\n ...(hmrBlock.length > 0 ? [\"\", ...hmrBlock] : []),\n \"\",\n \"export default routeModules\",\n ].join(\"\\n\");\n}\n\nfunction createEagerRouteModulesModule(result: ScannedRoutesResult): string {\n const uniqueFiles = Array.from(\n new Set(result.modules.flatMap((module) => resolveModuleSpecifiers(module))),\n );\n const importLines = uniqueFiles.map((specifier, index) => {\n return `import * as importedRouteFile${index} from ${JSON.stringify(specifier)}`;\n });\n const fileModuleInitializers = uniqueFiles.map((_specifier, index) => {\n return `let routeFileModule${index} = importedRouteFile${index}`;\n });\n const fileSetters = uniqueFiles.map((_specifier, index) => {\n return ` (nextModule) => { if (nextModule) routeFileModule${index} = nextModule }`;\n });\n const routeDefinitions = serializeObject(\n result.modules.map((module) => [module.id, createRouteDefinition(module)]),\n );\n const routeFiles = serializeObject(\n result.modules.map((module) => [module.id, serializeArray(resolveModuleSpecifiers(module))]),\n );\n const routeModules = serializeObject(\n result.modules.map((module) => [\n module.id,\n `createResolvedRouteModule(${JSON.stringify(module.id)})`,\n ]),\n );\n const hmrBlock = createRouteModulesHmrBlock(uniqueFiles, {\n applyUpdatedModules: [\n ` const applyFileModuleUpdates = [\\n${fileSetters.join(\",\\n\")}\\n ]`,\n \" nextModules.forEach((nextModule, index) => {\",\n \" const applyUpdate = applyFileModuleUpdates[index]\",\n \" if (applyUpdate) {\",\n \" applyUpdate(nextModule)\",\n \" }\",\n \" })\",\n \"\",\n ` const routeIds = ${JSON.stringify(result.modules.map((module) => module.id))}`,\n \" routeIds.forEach((routeId) => {\",\n \" routeModules[routeId] = createResolvedRouteModule(routeId)\",\n \" })\",\n \"\",\n ],\n });\n\n return [\n ...importLines,\n importLines.length > 0 ? \"\" : \"\",\n ...fileModuleInitializers,\n fileModuleInitializers.length > 0 ? \"\" : \"\",\n `const routeDefinitions = ${routeDefinitions}`,\n \"\",\n `export const routeFiles = ${routeFiles}`,\n \"\",\n `export const routeModules = ${routeModules}`,\n \"\",\n \"export function loadRouteModule(id) {\",\n \" return routeModules[id]\",\n \"}\",\n \"\",\n \"function createResolvedRouteModule(id) {\",\n \" const definition = routeDefinitions[id]\",\n \" if (!definition) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" const loadedModules = definition.files.map((file) => getLoadedRouteFileModule(file))\",\n \" return createPhialRouteModule(definition, loadedModules)\",\n \"}\",\n \"\",\n \"function getLoadedRouteFileModule(file) {\",\n ` const routeFileIndexMap = ${serializeObject(uniqueFiles.map((specifier, index) => [specifier, String(index)]))}`,\n \" const fileIndex = routeFileIndexMap[file]\",\n \" if (fileIndex === undefined) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" return [\",\n ...uniqueFiles.map(\n (_, index) => ` routeFileModule${index}${index < uniqueFiles.length - 1 ? \",\" : \"\"}`,\n ),\n \" ][fileIndex]\",\n \"}\",\n \"\",\n ...createRouteModuleHelperLines(),\n ...(hmrBlock.length > 0 ? [\"\", ...hmrBlock] : []),\n \"\",\n \"export default routeModules\",\n ].join(\"\\n\");\n}\n\nfunction createRouteModulesHmrBlock(\n routeImportSpecifiers: string[],\n options: {\n applyUpdatedModules?: string[];\n } = {},\n): string[] {\n if (routeImportSpecifiers.length === 0) {\n return [];\n }\n\n return [\n \"if (import.meta.hot) {\",\n ` import.meta.hot.accept(${JSON.stringify(routeImportSpecifiers)}, async (nextModules) => {`,\n ...(options.applyUpdatedModules ?? []),\n ' if (typeof window !== \"undefined\") {',\n \" const runtime = globalThis\",\n \" const applyRouteModuleHotUpdate = runtime.__ROUTE_MODULE_HMR__\",\n \"\",\n ' if (typeof applyRouteModuleHotUpdate === \"function\") {',\n \" await applyRouteModuleHotUpdate()\",\n \" return\",\n \" }\",\n \" }\",\n \"\",\n \" import.meta.hot.invalidate()\",\n \" })\",\n \"}\",\n ];\n}\n\nfunction createAppRuntimeHmrBlock(\n importEntries: Array<{\n local: string;\n exportName: \"appComponent\" | \"errorComponent\" | \"appLoader\" | \"appConfig\";\n specifier: string;\n }>,\n): string[] {\n const importSpecifiers = importEntries.map((entry) => entry.specifier);\n const updateBindings = importEntries.flatMap((entry, index) => {\n const resolveExpression =\n entry.exportName === \"appComponent\"\n ? `resolveAppComponent(${entry.local})`\n : entry.exportName === \"errorComponent\"\n ? `resolveErrorComponent(${entry.local})`\n : entry.exportName === \"appLoader\"\n ? `resolveAppLoader(${entry.local})`\n : `resolveAppConfig(${entry.local})`;\n\n return [\n ` if (nextModules[${index}]) {`,\n ` ${entry.local} = nextModules[${index}]`,\n \" }\",\n ` ${entry.exportName} = ${resolveExpression}`,\n ];\n });\n\n return [\n \"if (import.meta.hot) {\",\n ` import.meta.hot.accept(${JSON.stringify(importSpecifiers)}, async (nextModules) => {`,\n ...updateBindings,\n \" app = createAppModule(appComponent, errorComponent, appLoader)\",\n \" integration = createIntegration()\",\n \"\",\n \" if (await notifyAppRuntimeHotUpdate({\",\n \" appComponent,\",\n \" errorComponent,\",\n \" config: appConfig,\",\n \" routes,\",\n \" })) {\",\n \" return\",\n \" }\",\n \"\",\n \" import.meta.hot.invalidate()\",\n \" })\",\n \"}\",\n ];\n}\n\nfunction createRouteDefinition(module: ScannedRouteModule): string {\n const entries = Object.entries(module.files) as Array<[RouteFileKey, string]>;\n const fileEntries = entries.map(([key, file]) => [key, createImportSpecifier(file)] as const);\n const directoryMiddlewareFiles = module.directoryMiddleware.map((file) =>\n createImportSpecifier(file),\n );\n const files = Array.from(\n new Set([...fileEntries.map(([, specifier]) => specifier), ...directoryMiddlewareFiles]),\n );\n\n return `{\n id: ${JSON.stringify(module.id)},\n kind: ${JSON.stringify(module.kind)},\n files: ${serializeArray(files)},\n entryFiles: ${serializeObject(fileEntries.map(([key, specifier]) => [key, JSON.stringify(specifier)]))},\n directoryMiddlewareFiles: ${serializeArray(directoryMiddlewareFiles)}\n}`;\n}\n\nfunction createRouteModuleHelperLines(): string[] {\n return [\n \"function createPhialRouteModule(definition, loadedModules) {\",\n \" const modules = Object.fromEntries(definition.files.map((file, index) => [file, loadedModules[index]]))\",\n \" const primaryModule = resolvePrimaryModule(definition, modules)\",\n ' const errorModule = resolveEntryModule(definition, modules, \"error\")',\n ' const loadingModule = resolveEntryModule(definition, modules, \"loading\")',\n ' const loaderModule = resolveEntryModule(definition, modules, \"loader\")',\n ' const actionModule = resolveEntryModule(definition, modules, \"action\")',\n ' const middlewareModule = resolveEntryModule(definition, modules, \"middleware\")',\n \" const directoryMiddlewareModules = definition.directoryMiddlewareFiles.map((file) => modules[file])\",\n \"\",\n \" return {\",\n \" default: resolveDefaultExport(primaryModule),\",\n \" directoryMiddleware: directoryMiddlewareModules.flatMap((module) => resolveMiddlewareExport(module) ?? []),\",\n ' loader: resolveHandlerExport(loaderModule, \"loader\") ?? resolveNamedExport(primaryModule, \"loader\"),',\n ' action: resolveHandlerExport(actionModule, \"action\") ?? resolveNamedExport(primaryModule, \"action\"),',\n \" middleware: resolveMiddlewareExport(middlewareModule) ?? resolveMiddlewareExport(primaryModule, false),\",\n ' shouldRevalidate: resolveNamedExport(primaryModule, \"shouldRevalidate\"),',\n ' meta: resolveNamedExport(primaryModule, \"meta\"),',\n ' ErrorBoundary: resolveDefaultExport(errorModule) ?? resolveNamedExport(primaryModule, \"ErrorBoundary\"),',\n ' Loading: resolveDefaultExport(loadingModule) ?? resolveNamedExport(primaryModule, \"Loading\"),',\n ' onError: resolveHandlerExport(errorModule, \"onError\") ?? resolveNamedExport(primaryModule, \"onError\")',\n \" }\",\n \"}\",\n \"\",\n \"function resolvePrimaryModule(definition, modules) {\",\n \" const primaryFile = definition.entryFiles[definition.kind]\",\n \" return primaryFile ? modules[primaryFile] : undefined\",\n \"}\",\n \"\",\n \"function resolveEntryModule(definition, modules, key) {\",\n \" const file = definition.entryFiles[key]\",\n \" return file ? modules[file] : undefined\",\n \"}\",\n \"\",\n \"function resolveDefaultExport(module) {\",\n \" return module?.default\",\n \"}\",\n \"\",\n \"function resolveNamedExport(module, name) {\",\n \" return module?.[name]\",\n \"}\",\n \"\",\n \"function resolveHandlerExport(module, name) {\",\n \" if (!module) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" return module[name] ?? module.default\",\n \"}\",\n \"\",\n \"function resolveMiddlewareExport(module, allowDefault = true) {\",\n \" if (!module) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" const middleware = module.middleware ?? (allowDefault ? module.default : undefined)\",\n \" if (middleware === undefined) {\",\n \" return undefined\",\n \" }\",\n \"\",\n \" return Array.isArray(middleware) ? middleware : [middleware]\",\n \"}\",\n ];\n}\n\nfunction resolveModuleSpecifiers(module: ScannedRouteModule): string[] {\n return Array.from(\n new Set([\n ...Object.values(module.files).map((file) => createImportSpecifier(file)),\n ...module.directoryMiddleware.map((file) => createImportSpecifier(file)),\n ]),\n );\n}\n\nfunction serializeObject(entries: Array<[string, string]>): string {\n if (entries.length === 0) {\n return \"{}\";\n }\n\n return `{\\n${entries.map(([key, value]) => ` ${JSON.stringify(key)}: ${value}`).join(\",\\n\")}\\n}`;\n}\n\nfunction serializeArrayOfObjects(entries: Array<Array<[string, string]>>): string {\n if (entries.length === 0) {\n return \"[]\";\n }\n\n return `[\\n${entries.map((objectEntries) => ` ${serializeInlineObject(objectEntries)}`).join(\",\\n\")}\\n]`;\n}\n\nfunction serializeInlineObject(entries: Array<[string, string]>): string {\n if (entries.length === 0) {\n return \"{}\";\n }\n\n return `{ ${entries.map(([key, value]) => `${JSON.stringify(key)}: ${value}`).join(\", \")} }`;\n}\n\nfunction serializeArray(entries: string[]): string {\n if (entries.length === 0) {\n return \"[]\";\n }\n\n return `[\\n${entries.map((entry) => ` ${JSON.stringify(entry)}`).join(\",\\n\")}\\n]`;\n}\n\nfunction createImportSpecifier(file: string): string {\n return file.startsWith(\"/\") ? file : `/${file}`;\n}\n"],"mappings":";AAEA,MAAa,6BAA6B;AAC1C,MAAa,4BAA4B;AACzC,MAAa,yBAAyB;AACtC,MAAa,+BAA+B;AAC5C,MAAa,8BAA8B;AAC3C,MAAa,2BAA2B;AACxC,MAAa,0BAA0B;AACvC,MAAa,8BAA8B;AAC3C,MAAa,0BAA0B;AACvC,MAAa,6BAA6B;AAC1C,MAAa,iCAAiC;AAC9C,MAAa,6BAA6B;AAC1C,MAAa,sBAAsB;AACnC,MAAa,sCAAsC,KAAK;AACxD,MAAa,qCAAqC,KAAK;AACvD,MAAa,kCAAkC,KAAK;AACpD,MAAa,wCAAwC,KAAK;AAC1D,MAAa,uCAAuC,KAAK;AACzD,MAAa,oCAAoC,KAAK;AACtD,MAAa,mCAAmC,KAAK;AACrD,MAAa,uCAAuC,KAAK;AACzD,MAAa,mCAAmC,KAAK;AACrD,MAAa,sCAAsC,KAAK;AACxD,MAAa,0CAA0C,KAAK;AAC5D,MAAa,sCAAsC,KAAK;AACxD,MAAa,+BAA+B,KAAK;AAQjD,SAAgB,kCAAkC,QAAqC;AAGrF,QAAO;EAAC,2BAFS,KAAK,UAAU,OAAO,UAAU,MAAM,EAAE;EAEV;EAAI;EAA0B,CAAC,KAAK,KAAK;;AAG1F,SAAgB,iCACd,QACA,UAAsC,EAAE,EAChC;AACR,QAAO,QAAQ,qBAAqB,UAChC,8BAA8B,OAAO,GACrC,gCAAgC,OAAO;;AAG7C,SAAgB,8BAA8B,QAAqC;CACjF,MAAM,gBAAgB;EACpB,OAAO,IAAI,MACP;GACE,eAAe;GACf,OAAO;GACP,YAAY;GACZ,WAAW,sBAAsB,OAAO,IAAI,IAAI;GACjD,GACD;EACJ,OAAO,IAAI,QACP;GACE,eAAe;GACf,OAAO;GACP,YAAY;GACZ,WAAW,sBAAsB,OAAO,IAAI,MAAM;GACnD,GACD;EACJ,OAAO,IAAI,SACP;GACE,eAAe;GACf,OAAO;GACP,YAAY;GACZ,WAAW,sBAAsB,OAAO,IAAI,OAAO;GACpD,GACD;EACJ,OAAO,IAAI,SACP;GACE,eAAe;GACf,OAAO;GACP,YAAY;GACZ,WAAW,sBAAsB,OAAO,IAAI,OAAO;GACpD,GACD;EACL,CAAC,OAAO,QAAQ;CAMjB,MAAM,cAAc,cAAc,KAC/B,EAAE,eAAe,gBAChB,eAAe,cAAc,QAAQ,KAAK,UAAU,UAAU,GACjE;CACD,MAAM,kBAAkB,cAAc,KACnC,EAAE,eAAe,YAAY,OAAO,MAAM,KAAK,gBACjD;CACD,MAAM,qBAAqB;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;AAED,QAAO;EACL;EACA,4BAA4B,KAAK,UAAU,6BAA6B;EACxE,gCAAgC,KAAK,UAAU,4BAA4B;EAC3E,yCAAyC,KAAK,UAAU,4BAA4B;EACpF;EACA,GAAG;EACH,GAAI,YAAY,SAAS,IAAI,CAAC,GAAG,GAAG,EAAE;EACtC,GAAG;EACH,GAAI,gBAAgB,SAAS,IAAI,CAAC,GAAG,GAAG,EAAE;EAC1C,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;E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AAkB,KAAK,CAAC,OAAO,UAAU,CACxF,MACA,qCAAqC,MAAM,IAAI,KAAK,UAAU,KAAK,CAAC,GACrE,CAAC;AAEF,QAAO;EACL,GAAG;EACH,YAAY,SAAS,IAAI,KAAK;EAC9B,2CAA2C,gBAAgB,gBAAgB;EAC3E;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,+BAAuC;AACrD,QAAO;EACL,qCAAqC,KAAK,UAAU,yBAAyB;EAC7E;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,kCAA0C;AACxD,QAAO;EACL;EACA,0BAA0B,KAAK,UAAU,oBAAoB;EAC7D,0DAA0D,KAAK,UAAU,2BAA2B;EACpG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,uBAAuB,IAA2B;AAChE,KAAI,OAAA,mCAAqC,OAAO,oCAC9C,QAAO;AAGT,KAAI,OAAA,kCAAoC,OAAO,mCAC7C,QAAO;AAGT,KAAI,OAAA,+BAAiC,OAAO,gCAC1C,QAAO;AAGT,KAAI,OAAA,qCAAuC,OAAO,sCAChD,QAAO;AAGT,KAAI,OAAA,oCAAsC,OAAO,qCAC/C,QAAO;AAGT,KAAI,OAAA,iCAAmC,OAAO,kCAC5C,QAAO;AAGT,KAAI,OAAA,gCAAkC,OAAO,iCAC3C,QAAO;AAGT,KAAI,OAAA,oCAAsC,OAAO,qCAC/C,QAAO;AAGT,KAAI,OAAA,gCAAkC,OAAO,iCAC3C,QAAO;AAGT,KAAI,OAAA,mCAAqC,OAAO,oCAC9C,QAAO;AAGT,KAAI,OAAA,uCAAyC,OAAO,wCAClD,QAAO;AAGT,KAAI,OAAA,mCAAqC,OAAO,oCAC9C,QAAO;AAGT,KAAI,OAAA,4BAA8B,OAAO,6BACvC,QAAO;AAGT,QAAO;;AAGT,SAAgB,0BAA0B,SAG/B;AACT,KAAI,CAAC,QAAQ,cACX,QAAO;EACL;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;AAGd,QAAO;EACL;EACA,yBAAyB,KAAK,UAAU,QAAQ,QAAQ,MAAM,EAAE;EAChE;EACA;EACD,CAAC,KAAK,KAAK;;AAGd,SAAS,gCAAgC,QAAqC;CAC5E,MAAM,aAAa,gBACjB,OAAO,QAAQ,KAAK,WAAW,CAAC,OAAO,IAAI,eAAe,wBAAwB,OAAO,CAAC,CAAC,CAAC,CAC7F;CACD,MAAM,eAAe,gBACnB,OAAO,QAAQ,KAAK,WAAW,CAC7B,OAAO,IACP,iCAAiC,KAAK,UAAU,OAAO,GAAG,CAAC,GAC5D,CAAC,CACH;CAID,MAAM,WAAW,2BAHa,MAAM,KAClC,IAAI,IAAI,OAAO,QAAQ,SAAS,WAAW,wBAAwB,OAAO,CAAC,CAAC,CAC7E,CACiE;AAElE,QAAO;EACL,6BAA6B;EAC7B;EACA,+BAA+B;EAC/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA,8BAA8B,gBAAgB,OAAO,QAAQ,KAAK,WAAW,CAAC,OAAO,IAAI,sBAAsB,OAAO,CAAC,CAAC,CAAC;EACzH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG,8BAA8B;EACjC,GAAI,SAAS,SAAS,IAAI,CAAC,IAAI,GAAG,SAAS,GAAG,EAAE;EAChD;EACA;EACD,CAAC,KAAK,KAAK;;AAGd,SAAS,8BAA8B,QAAqC;CAC1E,MAAM,cAAc,MAAM,KACxB,IAAI,IAAI,OAAO,QAAQ,SAAS,WAAW,wBAAwB,OAAO,CAAC,CAAC,CAC7E;CACD,MAAM,cAAc,YAAY,KAAK,WAAW,UAAU;AACxD,SAAO,gCAAgC,MAAM,QAAQ,KAAK,UAAU,UAAU;GAC9E;CACF,MAAM,yBAAyB,YAAY,KAAK,YAAY,UAAU;AACpE,SAAO,sBAAsB,MAAM,sBAAsB;GACzD;CACF,MAAM,cAAc,YAAY,KAAK,YAAY,UAAU;AACzD,SAAO,sDAAsD,MAAM;GACnE;CACF,MAAM,mBAAmB,gBACvB,OAAO,QAAQ,KAAK,WAAW,CAAC,OAAO,IAAI,sBAAsB,OAAO,CAAC,CAAC,CAC3E;CACD,MAAM,aAAa,gBACjB,OAAO,QAAQ,KAAK,WAAW,CAAC,OAAO,IAAI,eAAe,wBAAwB,OAAO,CAAC,CAAC,CAAC,CAC7F;CACD,MAAM,eAAe,gBACnB,OAAO,QAAQ,KAAK,WAAW,CAC7B,OAAO,IACP,6BAA6B,KAAK,UAAU,OAAO,GAAG,CAAC,GACxD,CAAC,CACH;CACD,MAAM,WAAW,2BAA2B,aAAa,EACvD,qBAAqB;EACnB,yCAAyC,YAAY,KAAK,MAAM,CAAC;EACjE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,wBAAwB,KAAK,UAAU,OAAO,QAAQ,KAAK,WAAW,OAAO,GAAG,CAAC;EACjF;EACA;EACA;EACA;EACD,EACF,CAAC;AAEF,QAAO;EACL,GAAG;EACH,YAAY,SAAS,IAAI,KAAK;EAC9B,GAAG;EACH,uBAAuB,SAAS,IAAI,KAAK;EACzC,4BAA4B;EAC5B;EACA,6BAA6B;EAC7B;EACA,+BAA+B;EAC/B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,+BAA+B,gBAAgB,YAAY,KAAK,WAAW,UAAU,CAAC,WAAW,OAAO,MAAM,CAAC,CAAC,CAAC;EACjH;EACA;EACA;EACA;EACA;EACA;EACA,GAAG,YAAY,KACZ,GAAG,UAAU,sBAAsB,QAAQ,QAAQ,YAAY,SAAS,IAAI,MAAM,KACpF;EACD;EACA;EACA;EACA,GAAG,8BAA8B;EACjC,GAAI,SAAS,SAAS,IAAI,CAAC,IAAI,GAAG,SAAS,GAAG,EAAE;EAChD;EACA;EACD,CAAC,KAAK,KAAK;;AAGd,SAAS,2BACP,uBACA,UAEI,EAAE,EACI;AACV,KAAI,sBAAsB,WAAW,EACnC,QAAO,EAAE;AAGX,QAAO;EACL;EACA,4BAA4B,KAAK,UAAU,sBAAsB,CAAC;EAClE,GAAI,QAAQ,uBAAuB,EAAE;EACrC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAS,yBACP,eAKU;CACV,MAAM,mBAAmB,cAAc,KAAK,UAAU,MAAM,UAAU;CACtE,MAAM,iBAAiB,cAAc,SAAS,OAAO,UAAU;EAC7D,MAAM,oBACJ,MAAM,eAAe,iBACjB,uBAAuB,MAAM,MAAM,KACnC,MAAM,eAAe,mBACnB,yBAAyB,MAAM,MAAM,KACrC,MAAM,eAAe,cACnB,oBAAoB,MAAM,MAAM,KAChC,oBAAoB,MAAM,MAAM;AAE1C,SAAO;GACL,uBAAuB,MAAM;GAC7B,SAAS,MAAM,MAAM,iBAAiB,MAAM;GAC5C;GACA,OAAO,MAAM,WAAW,KAAK;GAC9B;GACD;AAEF,QAAO;EACL;EACA,4BAA4B,KAAK,UAAU,iBAAiB,CAAC;EAC7D,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAS,sBAAsB,QAAoC;CAEjE,MAAM,cADU,OAAO,QAAQ,OAAO,MAAM,CAChB,KAAK,CAAC,KAAK,UAAU,CAAC,KAAK,sBAAsB,KAAK,CAAC,CAAU;CAC7F,MAAM,2BAA2B,OAAO,oBAAoB,KAAK,SAC/D,sBAAsB,KAAK,CAC5B;CACD,MAAM,QAAQ,MAAM,KAClB,IAAI,IAAI,CAAC,GAAG,YAAY,KAAK,GAAG,eAAe,UAAU,EAAE,GAAG,yBAAyB,CAAC,CACzF;AAED,QAAO;QACD,KAAK,UAAU,OAAO,GAAG,CAAC;UACxB,KAAK,UAAU,OAAO,KAAK,CAAC;WAC3B,eAAe,MAAM,CAAC;gBACjB,gBAAgB,YAAY,KAAK,CAAC,KAAK,eAAe,CAAC,KAAK,KAAK,UAAU,UAAU,CAAC,CAAC,CAAC,CAAC;8BAC3E,eAAe,yBAAyB,CAAC;;;AAIvE,SAAS,+BAAyC;AAChD,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,SAAS,wBAAwB,QAAsC;AACrE,QAAO,MAAM,KACX,IAAI,IAAI,CACN,GAAG,OAAO,OAAO,OAAO,MAAM,CAAC,KAAK,SAAS,sBAAsB,KAAK,CAAC,EACzE,GAAG,OAAO,oBAAoB,KAAK,SAAS,sBAAsB,KAAK,CAAC,CACzE,CAAC,CACH;;AAGH,SAAS,gBAAgB,SAA0C;AACjE,KAAI,QAAQ,WAAW,EACrB,QAAO;AAGT,QAAO,MAAM,QAAQ,KAAK,CAAC,KAAK,WAAW,KAAK,KAAK,UAAU,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,MAAM,CAAC;;AAG/F,SAAS,wBAAwB,SAAiD;AAChF,KAAI,QAAQ,WAAW,EACrB,QAAO;AAGT,QAAO,MAAM,QAAQ,KAAK,kBAAkB,KAAK,sBAAsB,cAAc,GAAG,CAAC,KAAK,MAAM,CAAC;;AAGvG,SAAS,sBAAsB,SAA0C;AACvE,KAAI,QAAQ,WAAW,EACrB,QAAO;AAGT,QAAO,KAAK,QAAQ,KAAK,CAAC,KAAK,WAAW,GAAG,KAAK,UAAU,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,KAAK,CAAC;;AAG3F,SAAS,eAAe,SAA2B;AACjD,KAAI,QAAQ,WAAW,EACrB,QAAO;AAGT,QAAO,MAAM,QAAQ,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,GAAG,CAAC,KAAK,MAAM,CAAC;;AAGhF,SAAS,sBAAsB,MAAsB;AACnD,QAAO,KAAK,WAAW,IAAI,GAAG,OAAO,IAAI"}
@@ -2,10 +2,10 @@ import { loadPhialConfig } from "../config.js";
2
2
  import { createClientEntryModule } from "../generated/client-entry.js";
3
3
  import { phialVitePlugin } from "../index.js";
4
4
  import { resolve } from "node:path";
5
- import { build, mergeConfig } from "vite";
6
5
  import { mkdir } from "node:fs/promises";
7
6
  import vue from "@vitejs/plugin-vue";
8
7
  import vueJsx from "@vitejs/plugin-vue-jsx";
8
+ import { build, mergeConfig } from "vite";
9
9
  //#region src/lib/vite-plugin/host/plugin-build.ts
10
10
  const PHIAL_BUILD_CLIENT_ENTRY_ID = "virtual:phial-client-entry";
11
11
  const RESOLVED_PHIAL_BUILD_CLIENT_ENTRY_ID = "\0virtual:phial-client-entry";
@@ -15,9 +15,9 @@ const DEFAULT_CLIENT_BUILD_OUT_DIR = ".output/public";
15
15
  const DEFAULT_SERVER_BUILD_OUT_DIR = ".output/server";
16
16
  function createPhialBuildServerEntryModule() {
17
17
  return [
18
- "import { Server } from \"@hornjs/fest\"",
19
- "import { NodeRuntimeAdapter } from \"@hornjs/fest/node\"",
20
- "import { serveStatic } from \"@hornjs/fest/static\"",
18
+ "import { Server } from \"sevok\"",
19
+ "import { NodeRuntimeAdapter } from \"sevok/node\"",
20
+ "import { serveStatic } from \"sevok/static\"",
21
21
  "import createAppPlugin from \"phial/generated-app-plugin\"",
22
22
  "import createServerPlugin from \"phial/generated-server-plugin\"",
23
23
  "",
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-build.js","names":["viteBuild"],"sources":["../../../../src/lib/vite-plugin/host/plugin-build.ts"],"sourcesContent":["import { mkdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport vue from \"@vitejs/plugin-vue\";\nimport vueJsx from \"@vitejs/plugin-vue-jsx\";\nimport {\n build as viteBuild,\n mergeConfig,\n type InlineConfig,\n type Plugin,\n type PluginOption,\n} from \"vite\";\nimport { loadPhialConfig, type PhialConfig, type LoadPhialConfigOptions } from \"../config\";\nimport { createClientEntryModule } from \"../generated/client-entry\";\nimport { phialVitePlugin } from \"../index\";\n\nconst PHIAL_BUILD_CLIENT_ENTRY_ID = \"virtual:phial-client-entry\";\nconst RESOLVED_PHIAL_BUILD_CLIENT_ENTRY_ID = \"\\0virtual:phial-client-entry\";\nconst PHIAL_BUILD_SERVER_ENTRY_ID = \"virtual:phial-server-entry\";\nconst RESOLVED_PHIAL_BUILD_SERVER_ENTRY_ID = \"\\0virtual:phial-server-entry\";\n\nexport const DEFAULT_CLIENT_BUILD_OUT_DIR = \".output/public\";\nexport const DEFAULT_SERVER_BUILD_OUT_DIR = \".output/server\";\n\nexport interface PhialBuildOptions extends LoadPhialConfigOptions {\n watch?: boolean;\n}\n\nexport interface PhialBuildResult {\n client: Awaited<ReturnType<typeof viteBuild>>;\n server: Awaited<ReturnType<typeof viteBuild>>;\n}\n\nexport function createPhialBuildServerEntryModule(): string {\n return [\n 'import { Server } from \"@hornjs/fest\"',\n 'import { NodeRuntimeAdapter } from \"@hornjs/fest/node\"',\n 'import { serveStatic } from \"@hornjs/fest/static\"',\n 'import createAppPlugin from \"phial/generated-app-plugin\"',\n 'import createServerPlugin from \"phial/generated-server-plugin\"',\n \"\",\n 'export const generatedAppPluginId = \"phial/generated-app-plugin\"',\n 'export const generatedServerPluginId = \"phial/generated-server-plugin\"',\n \"\",\n \"export function createServerApp(options = {}) {\",\n \" const {\",\n \" manual = false,\",\n \" clientEntryPath,\",\n \" publicDir,\",\n \" fetch = createNotFoundResponse,\",\n \" middleware = [],\",\n \" plugins = [],\",\n \" adapter = new NodeRuntimeAdapter(),\",\n \" ...serverOptions\",\n \" } = options\",\n \" return new Server({\",\n \" manual,\",\n \" adapter,\",\n \" ...serverOptions,\",\n \" middleware: [\",\n \" ...(publicDir ? [serveStatic({ dir: publicDir })] : []),\",\n \" ...middleware,\",\n \" ],\",\n \" plugins: [\",\n \" createServerPlugin(),\",\n \" createAppPlugin({ clientEntryPath }),\",\n \" ...plugins,\",\n \" ],\",\n \" fetch,\",\n \" })\",\n \"}\",\n \"\",\n \"function createNotFoundResponse() {\",\n ' return new Response(\"Not Found\", { status: 404 })',\n \"}\",\n \"\",\n \"export default createServerApp\",\n ].join(\"\\n\");\n}\n\nexport async function buildPhialApp(options: PhialBuildOptions = {}): Promise<PhialBuildResult> {\n const loadedConfig = await loadPhialConfig({\n root: options.root,\n configFile: options.configFile,\n command: \"build\",\n mode: options.mode ?? \"production\",\n isSsrBuild: false,\n isPreview: false,\n logLevel: options.logLevel,\n });\n const root = loadedConfig.configRoot;\n const client = await viteBuild(createPhialClientBuildConfig(loadedConfig.config, root, options));\n const server = await viteBuild(\n await createPhialServerBuildConfig(loadedConfig.config, root, options),\n );\n\n return {\n client,\n server,\n };\n}\n\nfunction createPhialClientBuildConfig(\n config: PhialConfig,\n root: string,\n options: Pick<PhialBuildOptions, \"watch\" | \"logLevel\">,\n): InlineConfig {\n const vueFeatureFlags = {\n __VUE_OPTIONS_API__: true,\n __VUE_PROD_DEVTOOLS__: false,\n __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true,\n };\n const routesPlugin = phialVitePlugin({\n ...config.plugin,\n root: config.plugin?.root ?? root,\n });\n const clientEntryPlugin = createPhialBuildClientEntryPlugin();\n const userViteConfig = config.vite ?? {};\n const userPlugins = normalizePlugins(userViteConfig.plugins);\n const defaultBuildConfig = createDefaultClientBuildConfig(userViteConfig, options.watch);\n const baseConfig: InlineConfig = {\n configFile: false,\n root,\n appType: \"custom\",\n mode: \"production\",\n logLevel: options.logLevel ?? \"info\",\n define: vueFeatureFlags,\n optimizeDeps: {\n rolldownOptions: {\n transform: {\n define: Object.fromEntries(\n Object.entries(vueFeatureFlags).map(([key, value]) => [key, JSON.stringify(value)]),\n ),\n },\n },\n },\n plugins: createBuildPlugins({\n entryPlugin: clientEntryPlugin,\n routesPlugin,\n userPlugins,\n }),\n build: defaultBuildConfig,\n };\n\n return mergeConfig(baseConfig, userViteConfig);\n}\n\nasync function createPhialServerBuildConfig(\n config: PhialConfig,\n root: string,\n options: Pick<PhialBuildOptions, \"watch\" | \"logLevel\">,\n): Promise<InlineConfig> {\n const routesPlugin = phialVitePlugin({\n ...config.plugin,\n root: config.plugin?.root ?? root,\n });\n const serverEntryPlugin = createPhialBuildServerEntryPlugin();\n const userViteConfig = config.vite ?? {};\n const userPlugins = normalizePlugins(userViteConfig.plugins);\n const serverOutDir = resolve(root, DEFAULT_SERVER_BUILD_OUT_DIR);\n\n await mkdir(serverOutDir, {\n recursive: true,\n });\n const baseConfig: InlineConfig = {\n configFile: false,\n root,\n appType: \"custom\",\n mode: \"production\",\n logLevel: options.logLevel ?? \"info\",\n plugins: createBuildPlugins({\n entryPlugin: serverEntryPlugin,\n routesPlugin,\n userPlugins,\n }),\n build: {\n ssr: true,\n outDir: serverOutDir,\n emptyOutDir: true,\n copyPublicDir: false,\n minify: false,\n watch: options.watch ? {} : null,\n manifest: false,\n ssrManifest: false,\n rollupOptions: {\n input: PHIAL_BUILD_SERVER_ENTRY_ID,\n output: {\n format: \"es\",\n entryFileNames: \"index.js\",\n },\n },\n },\n };\n\n return mergeConfig(baseConfig, {\n ...userViteConfig,\n build: {\n ...userViteConfig.build,\n ssr: true,\n outDir: serverOutDir,\n emptyOutDir: true,\n copyPublicDir: false,\n minify: false,\n watch: options.watch ? (userViteConfig.build?.watch ?? {}) : null,\n manifest: false,\n ssrManifest: false,\n rollupOptions: mergeConfig(\n {\n input: PHIAL_BUILD_SERVER_ENTRY_ID,\n output: {\n format: \"es\",\n entryFileNames: \"index.js\",\n },\n },\n userViteConfig.build?.rollupOptions ?? {},\n ),\n },\n });\n}\n\nfunction createDefaultClientBuildConfig(\n userViteConfig: InlineConfig,\n watch: boolean | undefined,\n): NonNullable<InlineConfig[\"build\"]> {\n const userBuild = userViteConfig.build ?? {};\n const hasCustomInput = Boolean(userBuild.lib || userBuild.rollupOptions?.input);\n\n return {\n outDir: userBuild.outDir ?? DEFAULT_CLIENT_BUILD_OUT_DIR,\n manifest: userBuild.manifest ?? true,\n ...(watch ? { watch: userBuild.watch ?? {} } : {}),\n ...(!hasCustomInput\n ? {\n rollupOptions: mergeConfig(\n {\n input: {\n \"client-entry\": PHIAL_BUILD_CLIENT_ENTRY_ID,\n },\n },\n userBuild.rollupOptions ?? {},\n ),\n }\n : {}),\n };\n}\n\nfunction createPhialBuildClientEntryPlugin(): Plugin {\n return {\n name: \"phial:build-client-entry\",\n enforce: \"pre\",\n resolveId(id) {\n if (id === PHIAL_BUILD_CLIENT_ENTRY_ID) {\n return RESOLVED_PHIAL_BUILD_CLIENT_ENTRY_ID;\n }\n\n return null;\n },\n load(id) {\n if (id === RESOLVED_PHIAL_BUILD_CLIENT_ENTRY_ID) {\n return createClientEntryModule({\n idPrefix: \"\",\n });\n }\n\n return null;\n },\n };\n}\n\nfunction createPhialBuildServerEntryPlugin(): Plugin {\n return {\n name: \"phial:build-server-entry\",\n enforce: \"pre\",\n resolveId(id) {\n if (id === PHIAL_BUILD_SERVER_ENTRY_ID) {\n return RESOLVED_PHIAL_BUILD_SERVER_ENTRY_ID;\n }\n\n return null;\n },\n load(id) {\n if (id === RESOLVED_PHIAL_BUILD_SERVER_ENTRY_ID) {\n return createPhialBuildServerEntryModule();\n }\n\n return null;\n },\n };\n}\n\nfunction createBuildPlugins(options: {\n entryPlugin: Plugin;\n routesPlugin: Plugin;\n userPlugins: PluginOption[];\n}): PluginOption[] {\n return [\n options.entryPlugin,\n ...(hasVuePlugin(options.userPlugins) ? [] : [vue() as PluginOption]),\n ...(hasVueJsxPlugin(options.userPlugins) ? [] : [vueJsx() as PluginOption]),\n ...(hasPhialPlugin(options.userPlugins) ? [] : [options.routesPlugin]),\n ...options.userPlugins,\n ];\n}\n\nfunction hasPhialPlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"phial:routes\",\n );\n}\n\nfunction hasVuePlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"vite:vue\",\n );\n}\n\nfunction hasVueJsxPlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"vite:vue-jsx\",\n );\n}\n\nfunction normalizePlugins(plugins: InlineConfig[\"plugins\"]): PluginOption[] {\n if (!plugins) {\n return [];\n }\n\n return flattenPlugins(Array.isArray(plugins) ? plugins : [plugins]);\n}\n\nfunction flattenPlugins(plugins: readonly PluginOption[]): PluginOption[] {\n const flattened: PluginOption[] = [];\n\n for (const plugin of plugins) {\n if (Array.isArray(plugin)) {\n flattened.push(...flattenPlugins(plugin));\n continue;\n }\n\n flattened.push(plugin);\n }\n\n return flattened;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-build.js","names":["viteBuild"],"sources":["../../../../src/lib/vite-plugin/host/plugin-build.ts"],"sourcesContent":["import { mkdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport vue from \"@vitejs/plugin-vue\";\nimport vueJsx from \"@vitejs/plugin-vue-jsx\";\nimport {\n build as viteBuild,\n mergeConfig,\n type InlineConfig,\n type Plugin,\n type PluginOption,\n} from \"vite\";\nimport { loadPhialConfig, type PhialConfig, type LoadPhialConfigOptions } from \"../config\";\nimport { createClientEntryModule } from \"../generated/client-entry\";\nimport { phialVitePlugin } from \"../index\";\n\nconst PHIAL_BUILD_CLIENT_ENTRY_ID = \"virtual:phial-client-entry\";\nconst RESOLVED_PHIAL_BUILD_CLIENT_ENTRY_ID = \"\\0virtual:phial-client-entry\";\nconst PHIAL_BUILD_SERVER_ENTRY_ID = \"virtual:phial-server-entry\";\nconst RESOLVED_PHIAL_BUILD_SERVER_ENTRY_ID = \"\\0virtual:phial-server-entry\";\n\nexport const DEFAULT_CLIENT_BUILD_OUT_DIR = \".output/public\";\nexport const DEFAULT_SERVER_BUILD_OUT_DIR = \".output/server\";\n\nexport interface PhialBuildOptions extends LoadPhialConfigOptions {\n watch?: boolean;\n}\n\nexport interface PhialBuildResult {\n client: Awaited<ReturnType<typeof viteBuild>>;\n server: Awaited<ReturnType<typeof viteBuild>>;\n}\n\nexport function createPhialBuildServerEntryModule(): string {\n return [\n 'import { Server } from \"sevok\"',\n 'import { NodeRuntimeAdapter } from \"sevok/node\"',\n 'import { serveStatic } from \"sevok/static\"',\n 'import createAppPlugin from \"phial/generated-app-plugin\"',\n 'import createServerPlugin from \"phial/generated-server-plugin\"',\n \"\",\n 'export const generatedAppPluginId = \"phial/generated-app-plugin\"',\n 'export const generatedServerPluginId = \"phial/generated-server-plugin\"',\n \"\",\n \"export function createServerApp(options = {}) {\",\n \" const {\",\n \" manual = false,\",\n \" clientEntryPath,\",\n \" publicDir,\",\n \" fetch = createNotFoundResponse,\",\n \" middleware = [],\",\n \" plugins = [],\",\n \" adapter = new NodeRuntimeAdapter(),\",\n \" ...serverOptions\",\n \" } = options\",\n \" return new Server({\",\n \" manual,\",\n \" adapter,\",\n \" ...serverOptions,\",\n \" middleware: [\",\n \" ...(publicDir ? [serveStatic({ dir: publicDir })] : []),\",\n \" ...middleware,\",\n \" ],\",\n \" plugins: [\",\n \" createServerPlugin(),\",\n \" createAppPlugin({ clientEntryPath }),\",\n \" ...plugins,\",\n \" ],\",\n \" fetch,\",\n \" })\",\n \"}\",\n \"\",\n \"function createNotFoundResponse() {\",\n ' return new Response(\"Not Found\", { status: 404 })',\n \"}\",\n \"\",\n \"export default createServerApp\",\n ].join(\"\\n\");\n}\n\nexport async function buildPhialApp(options: PhialBuildOptions = {}): Promise<PhialBuildResult> {\n const loadedConfig = await loadPhialConfig({\n root: options.root,\n configFile: options.configFile,\n command: \"build\",\n mode: options.mode ?? \"production\",\n isSsrBuild: false,\n isPreview: false,\n logLevel: options.logLevel,\n });\n const root = loadedConfig.configRoot;\n const client = await viteBuild(createPhialClientBuildConfig(loadedConfig.config, root, options));\n const server = await viteBuild(\n await createPhialServerBuildConfig(loadedConfig.config, root, options),\n );\n\n return {\n client,\n server,\n };\n}\n\nfunction createPhialClientBuildConfig(\n config: PhialConfig,\n root: string,\n options: Pick<PhialBuildOptions, \"watch\" | \"logLevel\">,\n): InlineConfig {\n const vueFeatureFlags = {\n __VUE_OPTIONS_API__: true,\n __VUE_PROD_DEVTOOLS__: false,\n __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true,\n };\n const routesPlugin = phialVitePlugin({\n ...config.plugin,\n root: config.plugin?.root ?? root,\n });\n const clientEntryPlugin = createPhialBuildClientEntryPlugin();\n const userViteConfig = config.vite ?? {};\n const userPlugins = normalizePlugins(userViteConfig.plugins);\n const defaultBuildConfig = createDefaultClientBuildConfig(userViteConfig, options.watch);\n const baseConfig: InlineConfig = {\n configFile: false,\n root,\n appType: \"custom\",\n mode: \"production\",\n logLevel: options.logLevel ?? \"info\",\n define: vueFeatureFlags,\n optimizeDeps: {\n rolldownOptions: {\n transform: {\n define: Object.fromEntries(\n Object.entries(vueFeatureFlags).map(([key, value]) => [key, JSON.stringify(value)]),\n ),\n },\n },\n },\n plugins: createBuildPlugins({\n entryPlugin: clientEntryPlugin,\n routesPlugin,\n userPlugins,\n }),\n build: defaultBuildConfig,\n };\n\n return mergeConfig(baseConfig, userViteConfig);\n}\n\nasync function createPhialServerBuildConfig(\n config: PhialConfig,\n root: string,\n options: Pick<PhialBuildOptions, \"watch\" | \"logLevel\">,\n): Promise<InlineConfig> {\n const routesPlugin = phialVitePlugin({\n ...config.plugin,\n root: config.plugin?.root ?? root,\n });\n const serverEntryPlugin = createPhialBuildServerEntryPlugin();\n const userViteConfig = config.vite ?? {};\n const userPlugins = normalizePlugins(userViteConfig.plugins);\n const serverOutDir = resolve(root, DEFAULT_SERVER_BUILD_OUT_DIR);\n\n await mkdir(serverOutDir, {\n recursive: true,\n });\n const baseConfig: InlineConfig = {\n configFile: false,\n root,\n appType: \"custom\",\n mode: \"production\",\n logLevel: options.logLevel ?? \"info\",\n plugins: createBuildPlugins({\n entryPlugin: serverEntryPlugin,\n routesPlugin,\n userPlugins,\n }),\n build: {\n ssr: true,\n outDir: serverOutDir,\n emptyOutDir: true,\n copyPublicDir: false,\n minify: false,\n watch: options.watch ? {} : null,\n manifest: false,\n ssrManifest: false,\n rollupOptions: {\n input: PHIAL_BUILD_SERVER_ENTRY_ID,\n output: {\n format: \"es\",\n entryFileNames: \"index.js\",\n },\n },\n },\n };\n\n return mergeConfig(baseConfig, {\n ...userViteConfig,\n build: {\n ...userViteConfig.build,\n ssr: true,\n outDir: serverOutDir,\n emptyOutDir: true,\n copyPublicDir: false,\n minify: false,\n watch: options.watch ? (userViteConfig.build?.watch ?? {}) : null,\n manifest: false,\n ssrManifest: false,\n rollupOptions: mergeConfig(\n {\n input: PHIAL_BUILD_SERVER_ENTRY_ID,\n output: {\n format: \"es\",\n entryFileNames: \"index.js\",\n },\n },\n userViteConfig.build?.rollupOptions ?? {},\n ),\n },\n });\n}\n\nfunction createDefaultClientBuildConfig(\n userViteConfig: InlineConfig,\n watch: boolean | undefined,\n): NonNullable<InlineConfig[\"build\"]> {\n const userBuild = userViteConfig.build ?? {};\n const hasCustomInput = Boolean(userBuild.lib || userBuild.rollupOptions?.input);\n\n return {\n outDir: userBuild.outDir ?? DEFAULT_CLIENT_BUILD_OUT_DIR,\n manifest: userBuild.manifest ?? true,\n ...(watch ? { watch: userBuild.watch ?? {} } : {}),\n ...(!hasCustomInput\n ? {\n rollupOptions: mergeConfig(\n {\n input: {\n \"client-entry\": PHIAL_BUILD_CLIENT_ENTRY_ID,\n },\n },\n userBuild.rollupOptions ?? {},\n ),\n }\n : {}),\n };\n}\n\nfunction createPhialBuildClientEntryPlugin(): Plugin {\n return {\n name: \"phial:build-client-entry\",\n enforce: \"pre\",\n resolveId(id) {\n if (id === PHIAL_BUILD_CLIENT_ENTRY_ID) {\n return RESOLVED_PHIAL_BUILD_CLIENT_ENTRY_ID;\n }\n\n return null;\n },\n load(id) {\n if (id === RESOLVED_PHIAL_BUILD_CLIENT_ENTRY_ID) {\n return createClientEntryModule({\n idPrefix: \"\",\n });\n }\n\n return null;\n },\n };\n}\n\nfunction createPhialBuildServerEntryPlugin(): Plugin {\n return {\n name: \"phial:build-server-entry\",\n enforce: \"pre\",\n resolveId(id) {\n if (id === PHIAL_BUILD_SERVER_ENTRY_ID) {\n return RESOLVED_PHIAL_BUILD_SERVER_ENTRY_ID;\n }\n\n return null;\n },\n load(id) {\n if (id === RESOLVED_PHIAL_BUILD_SERVER_ENTRY_ID) {\n return createPhialBuildServerEntryModule();\n }\n\n return null;\n },\n };\n}\n\nfunction createBuildPlugins(options: {\n entryPlugin: Plugin;\n routesPlugin: Plugin;\n userPlugins: PluginOption[];\n}): PluginOption[] {\n return [\n options.entryPlugin,\n ...(hasVuePlugin(options.userPlugins) ? [] : [vue() as PluginOption]),\n ...(hasVueJsxPlugin(options.userPlugins) ? [] : [vueJsx() as PluginOption]),\n ...(hasPhialPlugin(options.userPlugins) ? [] : [options.routesPlugin]),\n ...options.userPlugins,\n ];\n}\n\nfunction hasPhialPlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"phial:routes\",\n );\n}\n\nfunction hasVuePlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"vite:vue\",\n );\n}\n\nfunction hasVueJsxPlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"vite:vue-jsx\",\n );\n}\n\nfunction normalizePlugins(plugins: InlineConfig[\"plugins\"]): PluginOption[] {\n if (!plugins) {\n return [];\n }\n\n return flattenPlugins(Array.isArray(plugins) ? plugins : [plugins]);\n}\n\nfunction flattenPlugins(plugins: readonly PluginOption[]): PluginOption[] {\n const flattened: PluginOption[] = [];\n\n for (const plugin of plugins) {\n if (Array.isArray(plugin)) {\n flattened.push(...flattenPlugins(plugin));\n continue;\n }\n\n flattened.push(plugin);\n }\n\n return flattened;\n}\n"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  import { loadPhialConfig } from "../config.js";
2
2
  import { DEFAULT_CLIENT_ENTRY_PUBLIC_PATH, phialVitePlugin } from "../index.js";
3
- import { existsSync } from "node:fs";
4
3
  import { dirname, resolve } from "node:path";
5
- import { createServer, mergeConfig } from "vite";
6
4
  import vue from "@vitejs/plugin-vue";
7
5
  import vueJsx from "@vitejs/plugin-vue-jsx";
6
+ import { createServer, mergeConfig } from "vite";
7
+ import { existsSync } from "node:fs";
8
8
  import { createServer as createServer$1 } from "node:http";
9
9
  import { Readable } from "node:stream";
10
10
  import { fileURLToPath } from "node:url";
11
- import { serve } from "@hornjs/fest";
11
+ import { serve } from "sevok";
12
12
  //#region src/lib/vite-plugin/host/plugin-dev-server.ts
13
13
  const PHIAL_PACKAGE_ID = "phial";
14
14
  const PHIAL_RUNTIME_PACKAGE_ID = "phial";
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-dev-server.js","names":["createNodeServer","createViteServer","createFestServer"],"sources":["../../../../src/lib/vite-plugin/host/plugin-dev-server.ts"],"sourcesContent":["import {\n createServer as createNodeServer,\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\nimport { existsSync } from \"node:fs\";\nimport type { AddressInfo } from \"node:net\";\nimport { dirname, resolve } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { fileURLToPath } from \"node:url\";\nimport { serve as createFestServer } from \"@hornjs/fest\";\nimport vue from \"@vitejs/plugin-vue\";\nimport vueJsx from \"@vitejs/plugin-vue-jsx\";\nimport {\n createServer as createViteServer,\n mergeConfig,\n type InlineConfig,\n type Plugin,\n type PluginOption,\n type ViteDevServer,\n} from \"vite\";\nimport { loadPhialConfig, type PhialConfig, type LoadPhialConfigOptions } from \"../config\";\nimport { DEFAULT_CLIENT_ENTRY_PUBLIC_PATH, phialVitePlugin } from \"../index\";\n\nexport interface PhialDevServerOptions extends LoadPhialConfigOptions {\n host?: string;\n port?: number;\n root?: string;\n}\n\nexport interface PhialDevServerHandle {\n vite: ViteDevServer;\n server: Server;\n url: string;\n close(): Promise<void>;\n}\n\ninterface PhialSourceEntryPoints {\n root?: string;\n plugin?: string;\n}\n\nconst PHIAL_PACKAGE_ID = \"phial\";\nconst PHIAL_RUNTIME_PACKAGE_ID = \"phial\";\nconst INTERNAL_OPTIMIZE_DEPS_EXCLUDE = [PHIAL_PACKAGE_ID] as const;\nconst PHIAL_PACKAGE_ROOT = resolvePhialPackageRoot();\nconst PHIAL_SOURCE_ENTRY_POINTS = createPhialSourceEntryPoints();\n\nexport async function startPhialDevServer(\n options: PhialDevServerOptions = {},\n): Promise<PhialDevServerHandle> {\n const loadedConfig = await loadPhialConfig({\n root: options.root,\n configFile: options.configFile,\n command: \"serve\",\n mode: options.mode,\n logLevel: options.logLevel,\n });\n const config = loadedConfig.config;\n const root = resolve(options.root ?? loadedConfig.configRoot);\n const host = options.host ?? config.dev?.host;\n const port = options.port ?? config.dev?.port ?? 3000;\n const server = createNodeServer();\n const vite = await createViteServer(\n createPhialViteInlineConfig(config, root, PHIAL_SOURCE_ENTRY_POINTS, server),\n );\n\n server.on(\"request\", (req, res) => {\n void handleRequest(vite, req, res);\n });\n\n await new Promise<void>((resolveListen) => {\n server.listen(port, host, resolveListen);\n });\n\n return {\n vite,\n server,\n url: resolveDevServerUrl(server, host, port),\n async close() {\n await Promise.all([\n new Promise<void>((resolveClose, rejectClose) => {\n server.close((error) => {\n if (error) {\n rejectClose(error);\n return;\n }\n\n resolveClose();\n });\n }),\n vite.close(),\n ]);\n },\n };\n}\n\nexport function createPhialViteInlineConfig(\n config: PhialConfig,\n root: string,\n sourceEntryPoints?: PhialSourceEntryPoints,\n hmrServer?: Server,\n): InlineConfig {\n const vueFeatureFlags = {\n __VUE_OPTIONS_API__: true,\n __VUE_PROD_DEVTOOLS__: false,\n __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true,\n };\n const routesPlugin = phialVitePlugin({\n ...config.plugin,\n root: config.plugin?.root ?? root,\n });\n const sourceRuntimePlugin = createPhialSourceRuntimePlugin(sourceEntryPoints);\n const userViteConfig = config.vite ?? {};\n const userOptimizeDeps = userViteConfig.optimizeDeps ?? {};\n const userPlugins = normalizePlugins(userViteConfig.plugins);\n const optimizeDepsExclude = mergeUniqueStrings(\n INTERNAL_OPTIMIZE_DEPS_EXCLUDE,\n userOptimizeDeps.exclude ?? [],\n );\n const mergedViteConfig = {\n ...userViteConfig,\n optimizeDeps: {\n ...userOptimizeDeps,\n exclude: optimizeDepsExclude,\n rolldownOptions: {\n ...userOptimizeDeps.rolldownOptions,\n transform: {\n ...userOptimizeDeps.rolldownOptions?.transform,\n define: {\n ...userOptimizeDeps.rolldownOptions?.transform?.define,\n ...Object.fromEntries(\n Object.entries(vueFeatureFlags).map(([key, value]) => [key, JSON.stringify(value)]),\n ),\n },\n },\n },\n },\n } satisfies InlineConfig;\n const baseConfig: InlineConfig = {\n root,\n appType: \"custom\",\n logLevel: \"info\",\n define: vueFeatureFlags,\n optimizeDeps: mergedViteConfig.optimizeDeps,\n server: {\n middlewareMode: true,\n hmr: hmrServer\n ? {\n server: hmrServer,\n }\n : undefined,\n },\n plugins: createDevServerPlugins({\n sourceRuntimePlugin,\n routesPlugin,\n userPlugins,\n }),\n };\n\n return mergeConfig(baseConfig, mergedViteConfig);\n}\n\nasync function handleRequest(\n vite: ViteDevServer,\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n try {\n await new Promise<void>((resolveMiddleware, rejectMiddleware) => {\n vite.middlewares(req, res, (error?: Error) => {\n if (error) {\n rejectMiddleware(error);\n return;\n }\n\n resolveMiddleware();\n });\n });\n\n if (res.writableEnded) {\n return;\n }\n const handler = await createDevRequestHandler(vite, {\n clientEntryPath: DEFAULT_CLIENT_ENTRY_PUBLIC_PATH,\n });\n const request = createNodeRequest(req);\n const response = await handler.fetch(request);\n\n await writeNodeResponse(res, response, req.method);\n } catch (error) {\n vite.ssrFixStacktrace(error as Error);\n res.statusCode = 500;\n res.end(error instanceof Error ? error.message : String(error));\n }\n}\n\ninterface DevAppPluginModule {\n default?: (options?: { clientEntryPath?: string }) => (server: unknown) => void;\n}\n\ninterface DevServerPluginModule {\n default?: () => (server: unknown) => void;\n}\n\nexport async function createDevRequestHandler(\n vite: Pick<ViteDevServer, \"ssrLoadModule\">,\n options: {\n clientEntryPath?: string;\n } = {},\n) {\n const appPluginModule = (await vite.ssrLoadModule(\n `${PHIAL_RUNTIME_PACKAGE_ID}/generated-app-plugin`,\n )) as DevAppPluginModule | undefined;\n const serverPluginModule = (await vite.ssrLoadModule(\n `${PHIAL_RUNTIME_PACKAGE_ID}/generated-server-plugin`,\n )) as DevServerPluginModule | undefined;\n\n return createFestServer({\n manual: true,\n plugins: [\n serverPluginModule?.default?.() ?? (() => {}),\n appPluginModule?.default?.({\n clientEntryPath: options.clientEntryPath,\n }) ?? (() => {}),\n ],\n fetch: createNotFoundResponse,\n });\n}\n\nfunction createNotFoundResponse(): Response {\n return new Response(\"Not Found\", {\n status: 404,\n });\n}\n\nexport function resolveDevServerUrl(\n server: Pick<Server, \"address\">,\n host: string | undefined,\n fallbackPort: number,\n): string {\n const address = server.address();\n const publicHost =\n host && host !== \"0.0.0.0\" && host !== \"::\" && host !== \"::1\" ? host : \"localhost\";\n const resolvedPort =\n address && typeof address !== \"string\" ? (address as AddressInfo).port : fallbackPort;\n\n return `http://${publicHost}:${resolvedPort}`;\n}\n\nfunction createNodeRequest(req: IncomingMessage): Request {\n const origin = resolveRequestOrigin(req);\n const url = new URL(req.url ?? \"/\", origin);\n const headers = new Headers();\n\n for (const [name, value] of Object.entries(req.headers)) {\n if (Array.isArray(value)) {\n for (const entry of value) {\n headers.append(name, entry);\n }\n continue;\n }\n\n if (value !== undefined) {\n headers.set(name, value);\n }\n }\n\n const method = req.method ?? \"GET\";\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\") {\n init.body = Readable.toWeb(req) as never;\n init.duplex = \"half\";\n }\n\n return new Request(url, init);\n}\n\nasync function writeNodeResponse(\n res: ServerResponse,\n response: Response,\n requestMethod?: string,\n): Promise<void> {\n res.statusCode = response.status;\n res.statusMessage = response.statusText;\n\n response.headers.forEach((value, name) => {\n res.setHeader(name, value);\n });\n\n if (requestMethod === \"HEAD\" || response.body === null) {\n res.end();\n return;\n }\n\n const reader = response.body.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n res.write(Buffer.from(value));\n }\n } finally {\n reader.releaseLock();\n }\n\n res.end();\n}\n\nfunction resolveRequestOrigin(req: IncomingMessage): string {\n const host = req.headers.host ?? \"localhost\";\n const protocol = isEncryptedRequest(req) ? \"https\" : \"http\";\n\n return `${protocol}://${host}`;\n}\n\nfunction isEncryptedRequest(req: IncomingMessage): boolean {\n return \"encrypted\" in req.socket && Boolean((req.socket as { encrypted?: boolean }).encrypted);\n}\n\nfunction createPhialSourceEntryPoints(): PhialSourceEntryPoints {\n const entries = {\n root: resolve(PHIAL_PACKAGE_ROOT, \"src/index.ts\"),\n plugin: resolve(PHIAL_PACKAGE_ROOT, \"src/vite-plugin.ts\"),\n };\n\n return Object.fromEntries(Object.entries(entries).filter(([, file]) => existsSync(file)));\n}\n\nfunction createPhialSourceRuntimePlugin(\n sourceEntryPoints?: PhialSourceEntryPoints,\n): Plugin | undefined {\n if (!sourceEntryPoints?.root) {\n return undefined;\n }\n\n return {\n name: \"phial:source-runtime\",\n enforce: \"pre\",\n resolveId(id, _importer, _options) {\n if (id === PHIAL_PACKAGE_ID) {\n return sourceEntryPoints?.root ?? null;\n }\n\n if (id === `${PHIAL_PACKAGE_ID}/vite-plugin`) {\n return sourceEntryPoints?.plugin ?? null;\n }\n\n return null;\n },\n };\n}\n\nfunction resolvePhialPackageRoot(): string {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n const packageRoot = resolve(currentDir, \"../../../..\");\n\n if (\n existsSync(resolve(packageRoot, \"package.json\")) &&\n existsSync(resolve(packageRoot, \"src/index.ts\")) &&\n existsSync(resolve(packageRoot, \"src/vite-plugin.ts\"))\n ) {\n return packageRoot;\n }\n\n return resolve(currentDir, \"../../../..\");\n}\n\nfunction hasPhialPlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"phial:routes\",\n );\n}\n\nfunction hasVuePlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"vite:vue\",\n );\n}\n\nfunction hasVueJsxPlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"vite:vue-jsx\",\n );\n}\n\nfunction normalizePlugins(plugins: InlineConfig[\"plugins\"]): PluginOption[] {\n if (!plugins) {\n return [];\n }\n\n return flattenPlugins(Array.isArray(plugins) ? plugins : [plugins]);\n}\n\nfunction createDevServerPlugins(options: {\n sourceRuntimePlugin?: Plugin;\n routesPlugin: Plugin;\n userPlugins: PluginOption[];\n}): PluginOption[] {\n return [\n ...(options.sourceRuntimePlugin ? [options.sourceRuntimePlugin] : []),\n ...(hasVuePlugin(options.userPlugins) ? [] : [vue() as PluginOption]),\n ...(hasVueJsxPlugin(options.userPlugins) ? [] : [vueJsx() as PluginOption]),\n ...(hasPhialPlugin(options.userPlugins) ? [] : [options.routesPlugin]),\n ...options.userPlugins,\n ];\n}\n\nfunction flattenPlugins(plugins: readonly PluginOption[]): PluginOption[] {\n const flattened: PluginOption[] = [];\n\n for (const plugin of plugins) {\n if (Array.isArray(plugin)) {\n flattened.push(...flattenPlugins(plugin));\n continue;\n }\n\n flattened.push(plugin);\n }\n\n return flattened;\n}\n\nfunction mergeUniqueStrings(left: readonly string[], right: readonly string[]): string[] {\n return [...new Set([...left, ...right])];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-dev-server.js","names":["createNodeServer","createViteServer","createSevokServer"],"sources":["../../../../src/lib/vite-plugin/host/plugin-dev-server.ts"],"sourcesContent":["import {\n createServer as createNodeServer,\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\nimport { existsSync } from \"node:fs\";\nimport type { AddressInfo } from \"node:net\";\nimport { dirname, resolve } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { fileURLToPath } from \"node:url\";\nimport { serve as createSevokServer } from \"sevok\";\nimport vue from \"@vitejs/plugin-vue\";\nimport vueJsx from \"@vitejs/plugin-vue-jsx\";\nimport {\n createServer as createViteServer,\n mergeConfig,\n type InlineConfig,\n type Plugin,\n type PluginOption,\n type ViteDevServer,\n} from \"vite\";\nimport { loadPhialConfig, type PhialConfig, type LoadPhialConfigOptions } from \"../config\";\nimport { DEFAULT_CLIENT_ENTRY_PUBLIC_PATH, phialVitePlugin } from \"../index\";\n\nexport interface PhialDevServerOptions extends LoadPhialConfigOptions {\n host?: string;\n port?: number;\n root?: string;\n}\n\nexport interface PhialDevServerHandle {\n vite: ViteDevServer;\n server: Server;\n url: string;\n close(): Promise<void>;\n}\n\ninterface PhialSourceEntryPoints {\n root?: string;\n plugin?: string;\n}\n\nconst PHIAL_PACKAGE_ID = \"phial\";\nconst PHIAL_RUNTIME_PACKAGE_ID = \"phial\";\nconst INTERNAL_OPTIMIZE_DEPS_EXCLUDE = [PHIAL_PACKAGE_ID] as const;\nconst PHIAL_PACKAGE_ROOT = resolvePhialPackageRoot();\nconst PHIAL_SOURCE_ENTRY_POINTS = createPhialSourceEntryPoints();\n\nexport async function startPhialDevServer(\n options: PhialDevServerOptions = {},\n): Promise<PhialDevServerHandle> {\n const loadedConfig = await loadPhialConfig({\n root: options.root,\n configFile: options.configFile,\n command: \"serve\",\n mode: options.mode,\n logLevel: options.logLevel,\n });\n const config = loadedConfig.config;\n const root = resolve(options.root ?? loadedConfig.configRoot);\n const host = options.host ?? config.dev?.host;\n const port = options.port ?? config.dev?.port ?? 3000;\n const server = createNodeServer();\n const vite = await createViteServer(\n createPhialViteInlineConfig(config, root, PHIAL_SOURCE_ENTRY_POINTS, server),\n );\n\n server.on(\"request\", (req, res) => {\n void handleRequest(vite, req, res);\n });\n\n await new Promise<void>((resolveListen) => {\n server.listen(port, host, resolveListen);\n });\n\n return {\n vite,\n server,\n url: resolveDevServerUrl(server, host, port),\n async close() {\n await Promise.all([\n new Promise<void>((resolveClose, rejectClose) => {\n server.close((error) => {\n if (error) {\n rejectClose(error);\n return;\n }\n\n resolveClose();\n });\n }),\n vite.close(),\n ]);\n },\n };\n}\n\nexport function createPhialViteInlineConfig(\n config: PhialConfig,\n root: string,\n sourceEntryPoints?: PhialSourceEntryPoints,\n hmrServer?: Server,\n): InlineConfig {\n const vueFeatureFlags = {\n __VUE_OPTIONS_API__: true,\n __VUE_PROD_DEVTOOLS__: false,\n __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true,\n };\n const routesPlugin = phialVitePlugin({\n ...config.plugin,\n root: config.plugin?.root ?? root,\n });\n const sourceRuntimePlugin = createPhialSourceRuntimePlugin(sourceEntryPoints);\n const userViteConfig = config.vite ?? {};\n const userOptimizeDeps = userViteConfig.optimizeDeps ?? {};\n const userPlugins = normalizePlugins(userViteConfig.plugins);\n const optimizeDepsExclude = mergeUniqueStrings(\n INTERNAL_OPTIMIZE_DEPS_EXCLUDE,\n userOptimizeDeps.exclude ?? [],\n );\n const mergedViteConfig = {\n ...userViteConfig,\n optimizeDeps: {\n ...userOptimizeDeps,\n exclude: optimizeDepsExclude,\n rolldownOptions: {\n ...userOptimizeDeps.rolldownOptions,\n transform: {\n ...userOptimizeDeps.rolldownOptions?.transform,\n define: {\n ...userOptimizeDeps.rolldownOptions?.transform?.define,\n ...Object.fromEntries(\n Object.entries(vueFeatureFlags).map(([key, value]) => [key, JSON.stringify(value)]),\n ),\n },\n },\n },\n },\n } satisfies InlineConfig;\n const baseConfig: InlineConfig = {\n root,\n appType: \"custom\",\n logLevel: \"info\",\n define: vueFeatureFlags,\n optimizeDeps: mergedViteConfig.optimizeDeps,\n server: {\n middlewareMode: true,\n hmr: hmrServer\n ? {\n server: hmrServer,\n }\n : undefined,\n },\n plugins: createDevServerPlugins({\n sourceRuntimePlugin,\n routesPlugin,\n userPlugins,\n }),\n };\n\n return mergeConfig(baseConfig, mergedViteConfig);\n}\n\nasync function handleRequest(\n vite: ViteDevServer,\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n try {\n await new Promise<void>((resolveMiddleware, rejectMiddleware) => {\n vite.middlewares(req, res, (error?: Error) => {\n if (error) {\n rejectMiddleware(error);\n return;\n }\n\n resolveMiddleware();\n });\n });\n\n if (res.writableEnded) {\n return;\n }\n const handler = await createDevRequestHandler(vite, {\n clientEntryPath: DEFAULT_CLIENT_ENTRY_PUBLIC_PATH,\n });\n const request = createNodeRequest(req);\n const response = await handler.fetch(request);\n\n await writeNodeResponse(res, response, req.method);\n } catch (error) {\n vite.ssrFixStacktrace(error as Error);\n res.statusCode = 500;\n res.end(error instanceof Error ? error.message : String(error));\n }\n}\n\ninterface DevAppPluginModule {\n default?: (options?: { clientEntryPath?: string }) => (server: unknown) => void;\n}\n\ninterface DevServerPluginModule {\n default?: () => (server: unknown) => void;\n}\n\nexport async function createDevRequestHandler(\n vite: Pick<ViteDevServer, \"ssrLoadModule\">,\n options: {\n clientEntryPath?: string;\n } = {},\n) {\n const appPluginModule = (await vite.ssrLoadModule(\n `${PHIAL_RUNTIME_PACKAGE_ID}/generated-app-plugin`,\n )) as DevAppPluginModule | undefined;\n const serverPluginModule = (await vite.ssrLoadModule(\n `${PHIAL_RUNTIME_PACKAGE_ID}/generated-server-plugin`,\n )) as DevServerPluginModule | undefined;\n\n return createSevokServer({\n manual: true,\n plugins: [\n serverPluginModule?.default?.() ?? (() => {}),\n appPluginModule?.default?.({\n clientEntryPath: options.clientEntryPath,\n }) ?? (() => {}),\n ],\n fetch: createNotFoundResponse,\n });\n}\n\nfunction createNotFoundResponse(): Response {\n return new Response(\"Not Found\", {\n status: 404,\n });\n}\n\nexport function resolveDevServerUrl(\n server: Pick<Server, \"address\">,\n host: string | undefined,\n fallbackPort: number,\n): string {\n const address = server.address();\n const publicHost =\n host && host !== \"0.0.0.0\" && host !== \"::\" && host !== \"::1\" ? host : \"localhost\";\n const resolvedPort =\n address && typeof address !== \"string\" ? (address as AddressInfo).port : fallbackPort;\n\n return `http://${publicHost}:${resolvedPort}`;\n}\n\nfunction createNodeRequest(req: IncomingMessage): Request {\n const origin = resolveRequestOrigin(req);\n const url = new URL(req.url ?? \"/\", origin);\n const headers = new Headers();\n\n for (const [name, value] of Object.entries(req.headers)) {\n if (Array.isArray(value)) {\n for (const entry of value) {\n headers.append(name, entry);\n }\n continue;\n }\n\n if (value !== undefined) {\n headers.set(name, value);\n }\n }\n\n const method = req.method ?? \"GET\";\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\") {\n init.body = Readable.toWeb(req) as never;\n init.duplex = \"half\";\n }\n\n return new Request(url, init);\n}\n\nasync function writeNodeResponse(\n res: ServerResponse,\n response: Response,\n requestMethod?: string,\n): Promise<void> {\n res.statusCode = response.status;\n res.statusMessage = response.statusText;\n\n response.headers.forEach((value, name) => {\n res.setHeader(name, value);\n });\n\n if (requestMethod === \"HEAD\" || response.body === null) {\n res.end();\n return;\n }\n\n const reader = response.body.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n res.write(Buffer.from(value));\n }\n } finally {\n reader.releaseLock();\n }\n\n res.end();\n}\n\nfunction resolveRequestOrigin(req: IncomingMessage): string {\n const host = req.headers.host ?? \"localhost\";\n const protocol = isEncryptedRequest(req) ? \"https\" : \"http\";\n\n return `${protocol}://${host}`;\n}\n\nfunction isEncryptedRequest(req: IncomingMessage): boolean {\n return \"encrypted\" in req.socket && Boolean((req.socket as { encrypted?: boolean }).encrypted);\n}\n\nfunction createPhialSourceEntryPoints(): PhialSourceEntryPoints {\n const entries = {\n root: resolve(PHIAL_PACKAGE_ROOT, \"src/index.ts\"),\n plugin: resolve(PHIAL_PACKAGE_ROOT, \"src/vite-plugin.ts\"),\n };\n\n return Object.fromEntries(Object.entries(entries).filter(([, file]) => existsSync(file)));\n}\n\nfunction createPhialSourceRuntimePlugin(\n sourceEntryPoints?: PhialSourceEntryPoints,\n): Plugin | undefined {\n if (!sourceEntryPoints?.root) {\n return undefined;\n }\n\n return {\n name: \"phial:source-runtime\",\n enforce: \"pre\",\n resolveId(id, _importer, _options) {\n if (id === PHIAL_PACKAGE_ID) {\n return sourceEntryPoints?.root ?? null;\n }\n\n if (id === `${PHIAL_PACKAGE_ID}/vite-plugin`) {\n return sourceEntryPoints?.plugin ?? null;\n }\n\n return null;\n },\n };\n}\n\nfunction resolvePhialPackageRoot(): string {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n const packageRoot = resolve(currentDir, \"../../../..\");\n\n if (\n existsSync(resolve(packageRoot, \"package.json\")) &&\n existsSync(resolve(packageRoot, \"src/index.ts\")) &&\n existsSync(resolve(packageRoot, \"src/vite-plugin.ts\"))\n ) {\n return packageRoot;\n }\n\n return resolve(currentDir, \"../../../..\");\n}\n\nfunction hasPhialPlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"phial:routes\",\n );\n}\n\nfunction hasVuePlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"vite:vue\",\n );\n}\n\nfunction hasVueJsxPlugin(plugins: PluginOption[]): boolean {\n return plugins.some(\n (plugin) =>\n plugin && typeof plugin === \"object\" && \"name\" in plugin && plugin.name === \"vite:vue-jsx\",\n );\n}\n\nfunction normalizePlugins(plugins: InlineConfig[\"plugins\"]): PluginOption[] {\n if (!plugins) {\n return [];\n }\n\n return flattenPlugins(Array.isArray(plugins) ? plugins : [plugins]);\n}\n\nfunction createDevServerPlugins(options: {\n sourceRuntimePlugin?: Plugin;\n routesPlugin: Plugin;\n userPlugins: PluginOption[];\n}): PluginOption[] {\n return [\n ...(options.sourceRuntimePlugin ? [options.sourceRuntimePlugin] : []),\n ...(hasVuePlugin(options.userPlugins) ? [] : [vue() as PluginOption]),\n ...(hasVueJsxPlugin(options.userPlugins) ? [] : [vueJsx() as PluginOption]),\n ...(hasPhialPlugin(options.userPlugins) ? [] : [options.routesPlugin]),\n ...options.userPlugins,\n ];\n}\n\nfunction flattenPlugins(plugins: readonly PluginOption[]): PluginOption[] {\n const flattened: PluginOption[] = [];\n\n for (const plugin of plugins) {\n if (Array.isArray(plugin)) {\n flattened.push(...flattenPlugins(plugin));\n continue;\n }\n\n flattened.push(plugin);\n }\n\n return flattened;\n}\n\nfunction mergeUniqueStrings(left: readonly string[], right: readonly string[]): string[] {\n return [...new Set([...left, ...right])];\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { LoadPhialConfigOptions } from "../config.js";
2
- import { RuntimeAdapter, Server } from "@hornjs/fest";
2
+ import { RuntimeAdapter, Server } from "sevok";
3
3
 
4
4
  //#region src/lib/vite-plugin/host/plugin-server.d.ts
5
5
  interface PhialStartServerOptions extends LoadPhialConfigOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-server.js","names":[],"sources":["../../../../src/lib/vite-plugin/host/plugin-server.ts"],"sourcesContent":["import { type RuntimeAdapter, type Server } from \"@hornjs/fest\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { DEFAULT_CLIENT_BUILD_OUT_DIR, DEFAULT_SERVER_BUILD_OUT_DIR } from \"./plugin-build\";\nimport { loadPhialConfig, type LoadPhialConfigOptions } from \"../config\";\n\nexport interface PhialStartServerOptions extends LoadPhialConfigOptions {\n host?: string;\n port?: number;\n root?: string;\n adapter?: RuntimeAdapter;\n}\n\nexport interface PhialStartServerHandle {\n server: Server;\n url: string;\n close(): Promise<void>;\n}\n\nexport async function startPhialServer(\n options: PhialStartServerOptions = {},\n): Promise<PhialStartServerHandle> {\n const loadedConfig = await loadPhialConfig({\n root: options.root,\n configFile: options.configFile,\n command: \"serve\",\n mode: options.mode ?? \"production\",\n isSsrBuild: false,\n isPreview: false,\n logLevel: \"info\",\n });\n const root = resolve(options.root ?? loadedConfig.configRoot);\n const host = options.host ?? loadedConfig.config.dev?.host;\n const port = options.port ?? loadedConfig.config.dev?.port ?? 3000;\n const clientOutDir = resolve(\n root,\n loadedConfig.config.vite?.build?.outDir ?? DEFAULT_CLIENT_BUILD_OUT_DIR,\n );\n const serverEntry = resolve(root, DEFAULT_SERVER_BUILD_OUT_DIR, \"index.js\");\n const clientEntryPath = await resolveBuiltClientEntryPath(clientOutDir);\n const serverModule = await import(/* @vite-ignore */ pathToFileURL(serverEntry).href);\n const createServerApp = resolveCreateServerApp(serverModule);\n const app = await createServerApp({\n adapter: options.adapter,\n clientEntryPath,\n publicDir: clientOutDir,\n hostname: host,\n port,\n });\n await app.ready();\n\n const publicHost = host && host !== \"0.0.0.0\" ? host : \"localhost\";\n\n return {\n server: app,\n url: app.url ?? `http://${publicHost}:${port}`,\n async close() {\n await app.close();\n },\n };\n}\n\ntype CreateServerApp = (options?: {\n adapter?: RuntimeAdapter;\n clientEntryPath?: string;\n publicDir?: string;\n hostname?: string;\n port?: number;\n manual?: boolean;\n}) => Server | Promise<Server>;\n\nasync function resolveBuiltClientEntryPath(clientOutDir: string): Promise<string> {\n const manifestFile = resolve(clientOutDir, \".vite/manifest.json\");\n const manifestSource = await readFile(manifestFile, \"utf8\").catch(() => null);\n\n if (!manifestSource) {\n throw new Error(`Missing Phial build manifest: ${manifestFile}. Run \"phial build\" first.`);\n }\n\n const manifest = JSON.parse(manifestSource) as Record<\n string,\n {\n file?: string;\n isEntry?: boolean;\n name?: string;\n src?: string;\n }\n >;\n const clientEntry = Object.values(manifest).find(\n (entry) =>\n entry.isEntry &&\n (entry.name === \"client-entry\" || entry.src?.includes(\"virtual:phial-client-entry\")),\n );\n\n if (!clientEntry?.file) {\n throw new Error(`Unable to resolve Phial client entry from manifest: ${manifestFile}`);\n }\n\n return `/${clientEntry.file}`;\n}\n\nfunction resolveCreateServerApp(serverModule: Record<string, unknown>): CreateServerApp {\n const candidate = serverModule.createServerApp ?? serverModule.default;\n\n if (typeof candidate !== \"function\") {\n throw new Error(\n `Invalid Phial server bundle. Expected a createServerApp export in ${DEFAULT_SERVER_BUILD_OUT_DIR}/index.js.`,\n );\n }\n\n return candidate as CreateServerApp;\n}\n"],"mappings":";;;;;;AAoBA,eAAsB,iBACpB,UAAmC,EAAE,EACJ;CACjC,MAAM,eAAe,MAAM,gBAAgB;EACzC,MAAM,QAAQ;EACd,YAAY,QAAQ;EACpB,SAAS;EACT,MAAM,QAAQ,QAAQ;EACtB,YAAY;EACZ,WAAW;EACX,UAAU;EACX,CAAC;CACF,MAAM,OAAO,QAAQ,QAAQ,QAAQ,aAAa,WAAW;CAC7D,MAAM,OAAO,QAAQ,QAAQ,aAAa,OAAO,KAAK;CACtD,MAAM,OAAO,QAAQ,QAAQ,aAAa,OAAO,KAAK,QAAQ;CAC9D,MAAM,eAAe,QACnB,MACA,aAAa,OAAO,MAAM,OAAO,UAAA,iBAClC;CACD,MAAM,cAAc,QAAQ,MAAM,8BAA8B,WAAW;CAC3E,MAAM,kBAAkB,MAAM,4BAA4B,aAAa;CAGvE,MAAM,MAAM,MADY,uBADH,MAAM;;EAA0B,cAAc,YAAY,CAAC;EACpB,CAC1B;EAChC,SAAS,QAAQ;EACjB;EACA,WAAW;EACX,UAAU;EACV;EACD,CAAC;AACF,OAAM,IAAI,OAAO;CAEjB,MAAM,aAAa,QAAQ,SAAS,YAAY,OAAO;AAEvD,QAAO;EACL,QAAQ;EACR,KAAK,IAAI,OAAO,UAAU,WAAW,GAAG;EACxC,MAAM,QAAQ;AACZ,SAAM,IAAI,OAAO;;EAEpB;;AAYH,eAAe,4BAA4B,cAAuC;CAChF,MAAM,eAAe,QAAQ,cAAc,sBAAsB;CACjE,MAAM,iBAAiB,MAAM,SAAS,cAAc,OAAO,CAAC,YAAY,KAAK;AAE7E,KAAI,CAAC,eACH,OAAM,IAAI,MAAM,iCAAiC,aAAa,4BAA4B;CAG5F,MAAM,WAAW,KAAK,MAAM,eAAe;CAS3C,MAAM,cAAc,OAAO,OAAO,SAAS,CAAC,MACzC,UACC,MAAM,YACL,MAAM,SAAS,kBAAkB,MAAM,KAAK,SAAS,6BAA6B,EACtF;AAED,KAAI,CAAC,aAAa,KAChB,OAAM,IAAI,MAAM,uDAAuD,eAAe;AAGxF,QAAO,IAAI,YAAY;;AAGzB,SAAS,uBAAuB,cAAwD;CACtF,MAAM,YAAY,aAAa,mBAAmB,aAAa;AAE/D,KAAI,OAAO,cAAc,WACvB,OAAM,IAAI,MACR,qEAAqE,6BAA6B,YACnG;AAGH,QAAO"}
1
+ {"version":3,"file":"plugin-server.js","names":[],"sources":["../../../../src/lib/vite-plugin/host/plugin-server.ts"],"sourcesContent":["import { type RuntimeAdapter, type Server } from \"sevok\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { DEFAULT_CLIENT_BUILD_OUT_DIR, DEFAULT_SERVER_BUILD_OUT_DIR } from \"./plugin-build\";\nimport { loadPhialConfig, type LoadPhialConfigOptions } from \"../config\";\n\nexport interface PhialStartServerOptions extends LoadPhialConfigOptions {\n host?: string;\n port?: number;\n root?: string;\n adapter?: RuntimeAdapter;\n}\n\nexport interface PhialStartServerHandle {\n server: Server;\n url: string;\n close(): Promise<void>;\n}\n\nexport async function startPhialServer(\n options: PhialStartServerOptions = {},\n): Promise<PhialStartServerHandle> {\n const loadedConfig = await loadPhialConfig({\n root: options.root,\n configFile: options.configFile,\n command: \"serve\",\n mode: options.mode ?? \"production\",\n isSsrBuild: false,\n isPreview: false,\n logLevel: \"info\",\n });\n const root = resolve(options.root ?? loadedConfig.configRoot);\n const host = options.host ?? loadedConfig.config.dev?.host;\n const port = options.port ?? loadedConfig.config.dev?.port ?? 3000;\n const clientOutDir = resolve(\n root,\n loadedConfig.config.vite?.build?.outDir ?? DEFAULT_CLIENT_BUILD_OUT_DIR,\n );\n const serverEntry = resolve(root, DEFAULT_SERVER_BUILD_OUT_DIR, \"index.js\");\n const clientEntryPath = await resolveBuiltClientEntryPath(clientOutDir);\n const serverModule = await import(/* @vite-ignore */ pathToFileURL(serverEntry).href);\n const createServerApp = resolveCreateServerApp(serverModule);\n const app = await createServerApp({\n adapter: options.adapter,\n clientEntryPath,\n publicDir: clientOutDir,\n hostname: host,\n port,\n });\n await app.ready();\n\n const publicHost = host && host !== \"0.0.0.0\" ? host : \"localhost\";\n\n return {\n server: app,\n url: app.url ?? `http://${publicHost}:${port}`,\n async close() {\n await app.close();\n },\n };\n}\n\ntype CreateServerApp = (options?: {\n adapter?: RuntimeAdapter;\n clientEntryPath?: string;\n publicDir?: string;\n hostname?: string;\n port?: number;\n manual?: boolean;\n}) => Server | Promise<Server>;\n\nasync function resolveBuiltClientEntryPath(clientOutDir: string): Promise<string> {\n const manifestFile = resolve(clientOutDir, \".vite/manifest.json\");\n const manifestSource = await readFile(manifestFile, \"utf8\").catch(() => null);\n\n if (!manifestSource) {\n throw new Error(`Missing Phial build manifest: ${manifestFile}. Run \"phial build\" first.`);\n }\n\n const manifest = JSON.parse(manifestSource) as Record<\n string,\n {\n file?: string;\n isEntry?: boolean;\n name?: string;\n src?: string;\n }\n >;\n const clientEntry = Object.values(manifest).find(\n (entry) =>\n entry.isEntry &&\n (entry.name === \"client-entry\" || entry.src?.includes(\"virtual:phial-client-entry\")),\n );\n\n if (!clientEntry?.file) {\n throw new Error(`Unable to resolve Phial client entry from manifest: ${manifestFile}`);\n }\n\n return `/${clientEntry.file}`;\n}\n\nfunction resolveCreateServerApp(serverModule: Record<string, unknown>): CreateServerApp {\n const candidate = serverModule.createServerApp ?? serverModule.default;\n\n if (typeof candidate !== \"function\") {\n throw new Error(\n `Invalid Phial server bundle. Expected a createServerApp export in ${DEFAULT_SERVER_BUILD_OUT_DIR}/index.js.`,\n );\n }\n\n return candidate as CreateServerApp;\n}\n"],"mappings":";;;;;;AAoBA,eAAsB,iBACpB,UAAmC,EAAE,EACJ;CACjC,MAAM,eAAe,MAAM,gBAAgB;EACzC,MAAM,QAAQ;EACd,YAAY,QAAQ;EACpB,SAAS;EACT,MAAM,QAAQ,QAAQ;EACtB,YAAY;EACZ,WAAW;EACX,UAAU;EACX,CAAC;CACF,MAAM,OAAO,QAAQ,QAAQ,QAAQ,aAAa,WAAW;CAC7D,MAAM,OAAO,QAAQ,QAAQ,aAAa,OAAO,KAAK;CACtD,MAAM,OAAO,QAAQ,QAAQ,aAAa,OAAO,KAAK,QAAQ;CAC9D,MAAM,eAAe,QACnB,MACA,aAAa,OAAO,MAAM,OAAO,UAAA,iBAClC;CACD,MAAM,cAAc,QAAQ,MAAM,8BAA8B,WAAW;CAC3E,MAAM,kBAAkB,MAAM,4BAA4B,aAAa;CAGvE,MAAM,MAAM,MADY,uBADH,MAAM;;EAA0B,cAAc,YAAY,CAAC;EACpB,CAC1B;EAChC,SAAS,QAAQ;EACjB;EACA,WAAW;EACX,UAAU;EACV;EACD,CAAC;AACF,OAAM,IAAI,OAAO;CAEjB,MAAM,aAAa,QAAQ,SAAS,YAAY,OAAO;AAEvD,QAAO;EACL,QAAQ;EACR,KAAK,IAAI,OAAO,UAAU,WAAW,GAAG;EACxC,MAAM,QAAQ;AACZ,SAAM,IAAI,OAAO;;EAEpB;;AAYH,eAAe,4BAA4B,cAAuC;CAChF,MAAM,eAAe,QAAQ,cAAc,sBAAsB;CACjE,MAAM,iBAAiB,MAAM,SAAS,cAAc,OAAO,CAAC,YAAY,KAAK;AAE7E,KAAI,CAAC,eACH,OAAM,IAAI,MAAM,iCAAiC,aAAa,4BAA4B;CAG5F,MAAM,WAAW,KAAK,MAAM,eAAe;CAS3C,MAAM,cAAc,OAAO,OAAO,SAAS,CAAC,MACzC,UACC,MAAM,YACL,MAAM,SAAS,kBAAkB,MAAM,KAAK,SAAS,6BAA6B,EACtF;AAED,KAAI,CAAC,aAAa,KAChB,OAAM,IAAI,MAAM,uDAAuD,eAAe;AAGxF,QAAO,IAAI,YAAY;;AAGzB,SAAS,uBAAuB,cAAwD;CACtF,MAAM,YAAY,aAAa,mBAAmB,aAAa;AAE/D,KAAI,OAAO,cAAc,WACvB,OAAM,IAAI,MACR,qEAAqE,6BAA6B,YACnG;AAGH,QAAO"}
@@ -0,0 +1,7 @@
1
+ //#region package.json
2
+ var name = "phial";
3
+ var version = "0.0.2";
4
+ //#endregion
5
+ export { name, version };
6
+
7
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -0,0 +1,6 @@
1
+ //#region package.json.d.ts
2
+ declare let name: string;
3
+ declare let version: string;
4
+ //#endregion
5
+ export { name, version };
6
+ //# sourceMappingURL=package.json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.json.d.ts","names":["name","version","type","description","author","license","homepage","repository","type_1","url","bugs","url_1","bin","phial","files","exports","publishConfig","access","directories","src","scripts","preinstall","build","dev","test","typecheck","release","prepublishOnly","dependencies","sevok","vuepagelet","devDependencies","bumpp","playwright","tsdown","tsx","typescript","vite","vitest","vue","peerDependencies","__json_default_export","default"],"sources":["../package.json.d.ts"],"mappings":";YAAWA,IAAAA;AAAAA,YACAC,OAAAA"}
@@ -0,0 +1,8 @@
1
+ import { HTTPMethod, InvocationContext, InvocationContextInit, InvocationContextKey, ServerHandler, ServerHandlerFunction, ServerHandlerObject, ServerMethodHandlers, ServerMiddleware, ServerMiddlewareFunction, ServerMiddlewareName, ServerMiddlewareResolver, createContextKey, isServerHandlerObject, raceRequestAbort, runMiddleware, toServerHandlerObject } from "sevok";
2
+
3
+ //#region src/server.d.ts
4
+ type MaybePromise<T> = T | Promise<T>;
5
+ type Maybe<T> = T | undefined;
6
+ //#endregion
7
+ export { type HTTPMethod, InvocationContext, type InvocationContextInit, type InvocationContextKey, Maybe, MaybePromise, type ServerHandler, type ServerHandlerFunction, type ServerHandlerObject, type ServerMethodHandlers, type ServerMiddleware, type ServerMiddlewareFunction, type ServerMiddlewareName, type ServerMiddlewareResolver, createContextKey, isServerHandlerObject, raceRequestAbort, runMiddleware, toServerHandlerObject };
8
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","names":[],"sources":["../src/server.ts"],"mappings":";;;KA2CY,YAAA,MAAkB,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,KAC9B,KAAA,MAAW,CAAA"}
package/dist/server.js ADDED
@@ -0,0 +1,2 @@
1
+ import { InvocationContext, createContextKey, isServerHandlerObject, raceRequestAbort, runMiddleware, toServerHandlerObject } from "sevok";
2
+ export { InvocationContext, createContextKey, isServerHandlerObject, raceRequestAbort, runMiddleware, toServerHandlerObject };
@@ -1,7 +1,7 @@
1
- import { LoadPhialConfigOptions, LoadedPhialConfig, PhialConfig, PhialDevConfig, PhialPluginOptions, PhialServerConfig, defineConfig, loadPhialConfig } from "./lib/vite-plugin/config.js";
1
+ import { LoadPhialConfigOptions, LoadedPhialConfig, PhialConfig, PhialConfigEnv, PhialConfigExport, PhialDevConfig, PhialPluginOptions, PhialServerConfig, defineConfig, loadPhialConfig } from "./lib/vite-plugin/config.js";
2
2
  import { PhialBuildOptions, PhialBuildResult, buildPhialApp } from "./lib/vite-plugin/host/plugin-build.js";
3
3
  import { PhialDevServerHandle, PhialDevServerOptions, startPhialDevServer } from "./lib/vite-plugin/host/plugin-dev-server.js";
4
4
  import { PhialPrepareOptions, preparePhialApp } from "./lib/vite-plugin/host/plugin-prepare.js";
5
5
  import { PhialStartServerHandle, PhialStartServerOptions, startPhialServer } from "./lib/vite-plugin/host/plugin-server.js";
6
6
  import { PhialVitePluginOptions, phialVitePlugin } from "./lib/vite-plugin/index.js";
7
- export { type LoadPhialConfigOptions, type LoadedPhialConfig, type PhialBuildOptions, type PhialBuildResult, type PhialConfig, type PhialDevConfig, type PhialDevServerHandle, type PhialDevServerOptions, type PhialPluginOptions, type PhialPrepareOptions, type PhialServerConfig, type PhialStartServerHandle, type PhialStartServerOptions, type PhialVitePluginOptions, buildPhialApp, defineConfig, loadPhialConfig, phialVitePlugin, preparePhialApp, startPhialDevServer, startPhialServer };
7
+ export { type LoadPhialConfigOptions, type LoadedPhialConfig, type PhialBuildOptions, type PhialBuildResult, type PhialConfig, type PhialConfigEnv, type PhialConfigExport, type PhialDevConfig, type PhialDevServerHandle, type PhialDevServerOptions, type PhialPluginOptions, type PhialPrepareOptions, type PhialServerConfig, type PhialStartServerHandle, type PhialStartServerOptions, type PhialVitePluginOptions, buildPhialApp, defineConfig, loadPhialConfig, phialVitePlugin, preparePhialApp, startPhialDevServer, startPhialServer };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phial",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "type": "module",
5
5
  "description": "",
6
6
  "author": "Maofeng <hornjs@qq.com>",
@@ -16,7 +16,6 @@
16
16
  "files": [
17
17
  "LICENSE",
18
18
  "README.md",
19
- "bin/phial.mjs",
20
19
  "dist"
21
20
  ],
22
21
  "exports": {
@@ -25,16 +24,26 @@
25
24
  "require": "./dist/index.js",
26
25
  "default": "./dist/index.js"
27
26
  },
28
- "./vite-plugin": {
29
- "types": "./dist/vite-plugin.d.ts",
30
- "require": "./dist/vite-plugin.js",
31
- "default": "./dist/vite-plugin.js"
27
+ "./app": {
28
+ "types": "./dist/app.d.ts",
29
+ "require": "./dist/app.js",
30
+ "default": "./dist/app.js"
32
31
  },
33
32
  "./cli": {
34
33
  "types": "./dist/cli.d.ts",
35
34
  "require": "./dist/cli.js",
36
35
  "default": "./dist/cli.js"
37
36
  },
37
+ "./server": {
38
+ "types": "./dist/server.d.ts",
39
+ "require": "./dist/server.js",
40
+ "default": "./dist/server.js"
41
+ },
42
+ "./vite-plugin": {
43
+ "types": "./dist/vite-plugin.d.ts",
44
+ "require": "./dist/vite-plugin.js",
45
+ "default": "./dist/vite-plugin.js"
46
+ },
38
47
  "./generated-routes-manifest": {
39
48
  "types": "./dist/lib/generated-routes.d.ts"
40
49
  },
@@ -68,10 +77,10 @@
68
77
  "./package.json": "./package.json"
69
78
  },
70
79
  "dependencies": {
71
- "@hornjs/fest": "latest",
72
80
  "@vitejs/plugin-vue": "^6.0.5",
73
81
  "@vitejs/plugin-vue-jsx": "^5.1.5",
74
82
  "fs-route-ir": "latest",
83
+ "sevok": "latest",
75
84
  "vuepagelet": "latest"
76
85
  },
77
86
  "peerDependencies": {
@@ -80,7 +89,7 @@
80
89
  "vue-router": "^4.6.4"
81
90
  },
82
91
  "bin": {
83
- "phial": "./bin/phial.mjs"
92
+ "phial": "./dist/bin.js"
84
93
  },
85
94
  "types": "./dist/index.d.ts",
86
95
  "publishConfig": {
package/bin/phial.mjs DELETED
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import process from "node:process";
4
- import { runPhialCli } from "../dist/cli.js";
5
-
6
- process.exitCode = await runPhialCli(process.argv.slice(2));