phial 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +27 -0
- package/bin/phial.mjs +6 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/lib/cli/index.d.ts +5 -0
- package/dist/lib/cli/index.d.ts.map +1 -0
- package/dist/lib/cli/index.js +101 -0
- package/dist/lib/cli/index.js.map +1 -0
- package/dist/lib/generated-routes.d.ts +176 -0
- package/dist/lib/server-routes/errors.js +16 -0
- package/dist/lib/server-routes/errors.js.map +1 -0
- package/dist/lib/vite-plugin/config.d.ts +54 -0
- package/dist/lib/vite-plugin/config.d.ts.map +1 -0
- package/dist/lib/vite-plugin/config.js +54 -0
- package/dist/lib/vite-plugin/config.js.map +1 -0
- package/dist/lib/vite-plugin/generated/client-entry.js +36 -0
- package/dist/lib/vite-plugin/generated/client-entry.js.map +1 -0
- package/dist/lib/vite-plugin/generated/virtual-modules.js +940 -0
- package/dist/lib/vite-plugin/generated/virtual-modules.js.map +1 -0
- package/dist/lib/vite-plugin/host/index.d.ts +4 -0
- package/dist/lib/vite-plugin/host/index.js +5 -0
- package/dist/lib/vite-plugin/host/plugin-build.d.ts +15 -0
- package/dist/lib/vite-plugin/host/plugin-build.d.ts.map +1 -0
- package/dist/lib/vite-plugin/host/plugin-build.js +242 -0
- package/dist/lib/vite-plugin/host/plugin-build.js.map +1 -0
- package/dist/lib/vite-plugin/host/plugin-dev-server.d.ts +19 -0
- package/dist/lib/vite-plugin/host/plugin-dev-server.d.ts.map +1 -0
- package/dist/lib/vite-plugin/host/plugin-dev-server.js +255 -0
- package/dist/lib/vite-plugin/host/plugin-dev-server.js.map +1 -0
- package/dist/lib/vite-plugin/host/plugin-prepare.d.ts +12 -0
- package/dist/lib/vite-plugin/host/plugin-prepare.d.ts.map +1 -0
- package/dist/lib/vite-plugin/host/plugin-prepare.js +29 -0
- package/dist/lib/vite-plugin/host/plugin-prepare.js.map +1 -0
- package/dist/lib/vite-plugin/host/plugin-server.d.ts +19 -0
- package/dist/lib/vite-plugin/host/plugin-server.d.ts.map +1 -0
- package/dist/lib/vite-plugin/host/plugin-server.js +60 -0
- package/dist/lib/vite-plugin/host/plugin-server.js.map +1 -0
- package/dist/lib/vite-plugin/index.d.ts +9 -0
- package/dist/lib/vite-plugin/index.d.ts.map +1 -0
- package/dist/lib/vite-plugin/index.js +261 -0
- package/dist/lib/vite-plugin/index.js.map +1 -0
- package/dist/lib/vite-plugin/scanners/app-pages-scanner.js +162 -0
- package/dist/lib/vite-plugin/scanners/app-pages-scanner.js.map +1 -0
- package/dist/lib/vite-plugin/scanners/app-runtime-scanner.js +39 -0
- package/dist/lib/vite-plugin/scanners/app-runtime-scanner.js.map +1 -0
- package/dist/lib/vite-plugin/scanners/route-manifest.js +60 -0
- package/dist/lib/vite-plugin/scanners/route-manifest.js.map +1 -0
- package/dist/lib/vite-plugin/scanners/routes-scanner.js +72 -0
- package/dist/lib/vite-plugin/scanners/routes-scanner.js.map +1 -0
- package/dist/lib/vite-plugin/scanners/scanner-utils.js +129 -0
- package/dist/lib/vite-plugin/scanners/scanner-utils.js.map +1 -0
- package/dist/lib/vite-plugin/scanners/server-routes-scanner.js +83 -0
- package/dist/lib/vite-plugin/scanners/server-routes-scanner.js.map +1 -0
- package/dist/lib/vite-plugin/scanners/types-generator.d.ts +9 -0
- package/dist/lib/vite-plugin/scanners/types-generator.d.ts.map +1 -0
- package/dist/lib/vite-plugin/scanners/types-generator.js +190 -0
- package/dist/lib/vite-plugin/scanners/types-generator.js.map +1 -0
- package/dist/vite-plugin.d.ts +7 -0
- package/dist/vite-plugin.js +8 -0
- package/package.json +89 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { loadPhialConfig } from "../config.js";
|
|
2
|
+
import { DEFAULT_CLIENT_ENTRY_PUBLIC_PATH, phialVitePlugin } from "../index.js";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { dirname, resolve } from "node:path";
|
|
5
|
+
import { createServer, mergeConfig } from "vite";
|
|
6
|
+
import vue from "@vitejs/plugin-vue";
|
|
7
|
+
import vueJsx from "@vitejs/plugin-vue-jsx";
|
|
8
|
+
import { createServer as createServer$1 } from "node:http";
|
|
9
|
+
import { Readable } from "node:stream";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { serve } from "@hornjs/fest";
|
|
12
|
+
//#region src/lib/vite-plugin/host/plugin-dev-server.ts
|
|
13
|
+
const PHIAL_PACKAGE_ID = "phial";
|
|
14
|
+
const PHIAL_RUNTIME_PACKAGE_ID = "phial";
|
|
15
|
+
const INTERNAL_OPTIMIZE_DEPS_EXCLUDE = [PHIAL_PACKAGE_ID];
|
|
16
|
+
const PHIAL_PACKAGE_ROOT = resolvePhialPackageRoot();
|
|
17
|
+
const PHIAL_SOURCE_ENTRY_POINTS = createPhialSourceEntryPoints();
|
|
18
|
+
async function startPhialDevServer(options = {}) {
|
|
19
|
+
const loadedConfig = await loadPhialConfig({
|
|
20
|
+
root: options.root,
|
|
21
|
+
configFile: options.configFile,
|
|
22
|
+
command: "serve",
|
|
23
|
+
mode: options.mode,
|
|
24
|
+
logLevel: options.logLevel
|
|
25
|
+
});
|
|
26
|
+
const config = loadedConfig.config;
|
|
27
|
+
const root = resolve(options.root ?? loadedConfig.configRoot);
|
|
28
|
+
const host = options.host ?? config.dev?.host;
|
|
29
|
+
const port = options.port ?? config.dev?.port ?? 3e3;
|
|
30
|
+
const server = createServer$1();
|
|
31
|
+
const vite = await createServer(createPhialViteInlineConfig(config, root, PHIAL_SOURCE_ENTRY_POINTS, server));
|
|
32
|
+
server.on("request", (req, res) => {
|
|
33
|
+
handleRequest(vite, req, res);
|
|
34
|
+
});
|
|
35
|
+
await new Promise((resolveListen) => {
|
|
36
|
+
server.listen(port, host, resolveListen);
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
vite,
|
|
40
|
+
server,
|
|
41
|
+
url: resolveDevServerUrl(server, host, port),
|
|
42
|
+
async close() {
|
|
43
|
+
await Promise.all([new Promise((resolveClose, rejectClose) => {
|
|
44
|
+
server.close((error) => {
|
|
45
|
+
if (error) {
|
|
46
|
+
rejectClose(error);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
resolveClose();
|
|
50
|
+
});
|
|
51
|
+
}), vite.close()]);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function createPhialViteInlineConfig(config, root, sourceEntryPoints, hmrServer) {
|
|
56
|
+
const vueFeatureFlags = {
|
|
57
|
+
__VUE_OPTIONS_API__: true,
|
|
58
|
+
__VUE_PROD_DEVTOOLS__: false,
|
|
59
|
+
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true
|
|
60
|
+
};
|
|
61
|
+
const routesPlugin = phialVitePlugin({
|
|
62
|
+
...config.plugin,
|
|
63
|
+
root: config.plugin?.root ?? root
|
|
64
|
+
});
|
|
65
|
+
const sourceRuntimePlugin = createPhialSourceRuntimePlugin(sourceEntryPoints);
|
|
66
|
+
const userViteConfig = config.vite ?? {};
|
|
67
|
+
const userOptimizeDeps = userViteConfig.optimizeDeps ?? {};
|
|
68
|
+
const userPlugins = normalizePlugins(userViteConfig.plugins);
|
|
69
|
+
const optimizeDepsExclude = mergeUniqueStrings(INTERNAL_OPTIMIZE_DEPS_EXCLUDE, userOptimizeDeps.exclude ?? []);
|
|
70
|
+
const mergedViteConfig = {
|
|
71
|
+
...userViteConfig,
|
|
72
|
+
optimizeDeps: {
|
|
73
|
+
...userOptimizeDeps,
|
|
74
|
+
exclude: optimizeDepsExclude,
|
|
75
|
+
rolldownOptions: {
|
|
76
|
+
...userOptimizeDeps.rolldownOptions,
|
|
77
|
+
transform: {
|
|
78
|
+
...userOptimizeDeps.rolldownOptions?.transform,
|
|
79
|
+
define: {
|
|
80
|
+
...userOptimizeDeps.rolldownOptions?.transform?.define,
|
|
81
|
+
...Object.fromEntries(Object.entries(vueFeatureFlags).map(([key, value]) => [key, JSON.stringify(value)]))
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
return mergeConfig({
|
|
88
|
+
root,
|
|
89
|
+
appType: "custom",
|
|
90
|
+
logLevel: "info",
|
|
91
|
+
define: vueFeatureFlags,
|
|
92
|
+
optimizeDeps: mergedViteConfig.optimizeDeps,
|
|
93
|
+
server: {
|
|
94
|
+
middlewareMode: true,
|
|
95
|
+
hmr: hmrServer ? { server: hmrServer } : void 0
|
|
96
|
+
},
|
|
97
|
+
plugins: createDevServerPlugins({
|
|
98
|
+
sourceRuntimePlugin,
|
|
99
|
+
routesPlugin,
|
|
100
|
+
userPlugins
|
|
101
|
+
})
|
|
102
|
+
}, mergedViteConfig);
|
|
103
|
+
}
|
|
104
|
+
async function handleRequest(vite, req, res) {
|
|
105
|
+
try {
|
|
106
|
+
await new Promise((resolveMiddleware, rejectMiddleware) => {
|
|
107
|
+
vite.middlewares(req, res, (error) => {
|
|
108
|
+
if (error) {
|
|
109
|
+
rejectMiddleware(error);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
resolveMiddleware();
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
if (res.writableEnded) return;
|
|
116
|
+
const handler = await createDevRequestHandler(vite, { clientEntryPath: DEFAULT_CLIENT_ENTRY_PUBLIC_PATH });
|
|
117
|
+
const request = createNodeRequest(req);
|
|
118
|
+
await writeNodeResponse(res, await handler.fetch(request), req.method);
|
|
119
|
+
} catch (error) {
|
|
120
|
+
vite.ssrFixStacktrace(error);
|
|
121
|
+
res.statusCode = 500;
|
|
122
|
+
res.end(error instanceof Error ? error.message : String(error));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function createDevRequestHandler(vite, options = {}) {
|
|
126
|
+
const appPluginModule = await vite.ssrLoadModule(`${PHIAL_RUNTIME_PACKAGE_ID}/generated-app-plugin`);
|
|
127
|
+
return serve({
|
|
128
|
+
manual: true,
|
|
129
|
+
plugins: [(await vite.ssrLoadModule(`${PHIAL_RUNTIME_PACKAGE_ID}/generated-server-plugin`))?.default?.() ?? (() => {}), appPluginModule?.default?.({ clientEntryPath: options.clientEntryPath }) ?? (() => {})],
|
|
130
|
+
fetch: createNotFoundResponse
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function createNotFoundResponse() {
|
|
134
|
+
return new Response("Not Found", { status: 404 });
|
|
135
|
+
}
|
|
136
|
+
function resolveDevServerUrl(server, host, fallbackPort) {
|
|
137
|
+
const address = server.address();
|
|
138
|
+
return `http://${host && host !== "0.0.0.0" && host !== "::" && host !== "::1" ? host : "localhost"}:${address && typeof address !== "string" ? address.port : fallbackPort}`;
|
|
139
|
+
}
|
|
140
|
+
function createNodeRequest(req) {
|
|
141
|
+
const origin = resolveRequestOrigin(req);
|
|
142
|
+
const url = new URL(req.url ?? "/", origin);
|
|
143
|
+
const headers = new Headers();
|
|
144
|
+
for (const [name, value] of Object.entries(req.headers)) {
|
|
145
|
+
if (Array.isArray(value)) {
|
|
146
|
+
for (const entry of value) headers.append(name, entry);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (value !== void 0) headers.set(name, value);
|
|
150
|
+
}
|
|
151
|
+
const method = req.method ?? "GET";
|
|
152
|
+
const init = {
|
|
153
|
+
method,
|
|
154
|
+
headers
|
|
155
|
+
};
|
|
156
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
157
|
+
init.body = Readable.toWeb(req);
|
|
158
|
+
init.duplex = "half";
|
|
159
|
+
}
|
|
160
|
+
return new Request(url, init);
|
|
161
|
+
}
|
|
162
|
+
async function writeNodeResponse(res, response, requestMethod) {
|
|
163
|
+
res.statusCode = response.status;
|
|
164
|
+
res.statusMessage = response.statusText;
|
|
165
|
+
response.headers.forEach((value, name) => {
|
|
166
|
+
res.setHeader(name, value);
|
|
167
|
+
});
|
|
168
|
+
if (requestMethod === "HEAD" || response.body === null) {
|
|
169
|
+
res.end();
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const reader = response.body.getReader();
|
|
173
|
+
try {
|
|
174
|
+
while (true) {
|
|
175
|
+
const { done, value } = await reader.read();
|
|
176
|
+
if (done) break;
|
|
177
|
+
res.write(Buffer.from(value));
|
|
178
|
+
}
|
|
179
|
+
} finally {
|
|
180
|
+
reader.releaseLock();
|
|
181
|
+
}
|
|
182
|
+
res.end();
|
|
183
|
+
}
|
|
184
|
+
function resolveRequestOrigin(req) {
|
|
185
|
+
const host = req.headers.host ?? "localhost";
|
|
186
|
+
return `${isEncryptedRequest(req) ? "https" : "http"}://${host}`;
|
|
187
|
+
}
|
|
188
|
+
function isEncryptedRequest(req) {
|
|
189
|
+
return "encrypted" in req.socket && Boolean(req.socket.encrypted);
|
|
190
|
+
}
|
|
191
|
+
function createPhialSourceEntryPoints() {
|
|
192
|
+
const entries = {
|
|
193
|
+
root: resolve(PHIAL_PACKAGE_ROOT, "src/index.ts"),
|
|
194
|
+
plugin: resolve(PHIAL_PACKAGE_ROOT, "src/vite-plugin.ts")
|
|
195
|
+
};
|
|
196
|
+
return Object.fromEntries(Object.entries(entries).filter(([, file]) => existsSync(file)));
|
|
197
|
+
}
|
|
198
|
+
function createPhialSourceRuntimePlugin(sourceEntryPoints) {
|
|
199
|
+
if (!sourceEntryPoints?.root) return;
|
|
200
|
+
return {
|
|
201
|
+
name: "phial:source-runtime",
|
|
202
|
+
enforce: "pre",
|
|
203
|
+
resolveId(id, _importer, _options) {
|
|
204
|
+
if (id === PHIAL_PACKAGE_ID) return sourceEntryPoints?.root ?? null;
|
|
205
|
+
if (id === `${PHIAL_PACKAGE_ID}/vite-plugin`) return sourceEntryPoints?.plugin ?? null;
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function resolvePhialPackageRoot() {
|
|
211
|
+
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
212
|
+
const packageRoot = resolve(currentDir, "../../../..");
|
|
213
|
+
if (existsSync(resolve(packageRoot, "package.json")) && existsSync(resolve(packageRoot, "src/index.ts")) && existsSync(resolve(packageRoot, "src/vite-plugin.ts"))) return packageRoot;
|
|
214
|
+
return resolve(currentDir, "../../../..");
|
|
215
|
+
}
|
|
216
|
+
function hasPhialPlugin(plugins) {
|
|
217
|
+
return plugins.some((plugin) => plugin && typeof plugin === "object" && "name" in plugin && plugin.name === "phial:routes");
|
|
218
|
+
}
|
|
219
|
+
function hasVuePlugin(plugins) {
|
|
220
|
+
return plugins.some((plugin) => plugin && typeof plugin === "object" && "name" in plugin && plugin.name === "vite:vue");
|
|
221
|
+
}
|
|
222
|
+
function hasVueJsxPlugin(plugins) {
|
|
223
|
+
return plugins.some((plugin) => plugin && typeof plugin === "object" && "name" in plugin && plugin.name === "vite:vue-jsx");
|
|
224
|
+
}
|
|
225
|
+
function normalizePlugins(plugins) {
|
|
226
|
+
if (!plugins) return [];
|
|
227
|
+
return flattenPlugins(Array.isArray(plugins) ? plugins : [plugins]);
|
|
228
|
+
}
|
|
229
|
+
function createDevServerPlugins(options) {
|
|
230
|
+
return [
|
|
231
|
+
...options.sourceRuntimePlugin ? [options.sourceRuntimePlugin] : [],
|
|
232
|
+
...hasVuePlugin(options.userPlugins) ? [] : [vue()],
|
|
233
|
+
...hasVueJsxPlugin(options.userPlugins) ? [] : [vueJsx()],
|
|
234
|
+
...hasPhialPlugin(options.userPlugins) ? [] : [options.routesPlugin],
|
|
235
|
+
...options.userPlugins
|
|
236
|
+
];
|
|
237
|
+
}
|
|
238
|
+
function flattenPlugins(plugins) {
|
|
239
|
+
const flattened = [];
|
|
240
|
+
for (const plugin of plugins) {
|
|
241
|
+
if (Array.isArray(plugin)) {
|
|
242
|
+
flattened.push(...flattenPlugins(plugin));
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
flattened.push(plugin);
|
|
246
|
+
}
|
|
247
|
+
return flattened;
|
|
248
|
+
}
|
|
249
|
+
function mergeUniqueStrings(left, right) {
|
|
250
|
+
return [...new Set([...left, ...right])];
|
|
251
|
+
}
|
|
252
|
+
//#endregion
|
|
253
|
+
export { createDevRequestHandler, createPhialViteInlineConfig, resolveDevServerUrl, startPhialDevServer };
|
|
254
|
+
|
|
255
|
+
//# sourceMappingURL=plugin-dev-server.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { GeneratedPhialTypesResult } from "../scanners/types-generator.js";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/vite-plugin/host/plugin-prepare.d.ts
|
|
4
|
+
interface PhialPrepareOptions {
|
|
5
|
+
root?: string;
|
|
6
|
+
configFile?: string;
|
|
7
|
+
mode?: string;
|
|
8
|
+
}
|
|
9
|
+
declare function preparePhialApp(options?: PhialPrepareOptions): Promise<GeneratedPhialTypesResult>;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { PhialPrepareOptions, preparePhialApp };
|
|
12
|
+
//# sourceMappingURL=plugin-prepare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-prepare.d.ts","names":[],"sources":["../../../../src/lib/vite-plugin/host/plugin-prepare.ts"],"mappings":";;;UAIiB,mBAAA;EACf,IAAA;EACA,UAAA;EACA,IAAA;AAAA;AAAA,iBAGoB,eAAA,CACpB,OAAA,GAAS,mBAAA,GACR,OAAA,CAAQ,yBAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { loadPhialConfig } from "../config.js";
|
|
2
|
+
import { scanRoutes } from "../scanners/routes-scanner.js";
|
|
3
|
+
import { writePhialProjectTypes } from "../scanners/types-generator.js";
|
|
4
|
+
//#region src/lib/vite-plugin/host/plugin-prepare.ts
|
|
5
|
+
async function preparePhialApp(options = {}) {
|
|
6
|
+
const loadedConfig = await loadPhialConfig({
|
|
7
|
+
root: options.root,
|
|
8
|
+
configFile: options.configFile,
|
|
9
|
+
command: "serve",
|
|
10
|
+
mode: options.mode ?? "development",
|
|
11
|
+
isSsrBuild: false,
|
|
12
|
+
isPreview: false,
|
|
13
|
+
logLevel: "info"
|
|
14
|
+
});
|
|
15
|
+
const configuredOptions = loadedConfig.config.plugin ?? {};
|
|
16
|
+
const appDir = configuredOptions.appDir ?? "app";
|
|
17
|
+
return writePhialProjectTypes(await scanRoutes({
|
|
18
|
+
root: configuredOptions.root ?? loadedConfig.configRoot,
|
|
19
|
+
appDir,
|
|
20
|
+
routesDir: configuredOptions.routesDir ?? `${appDir}/pages`,
|
|
21
|
+
serverRoutesDir: configuredOptions.serverRoutesDir ?? "server/routes",
|
|
22
|
+
serverMiddlewareDir: configuredOptions.serverMiddlewareDir ?? "server/middleware",
|
|
23
|
+
extensions: configuredOptions.extensions
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { preparePhialApp };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=plugin-prepare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-prepare.js","names":[],"sources":["../../../../src/lib/vite-plugin/host/plugin-prepare.ts"],"sourcesContent":["import { loadPhialConfig } from \"../config\";\nimport { scanRoutes } from \"../scanners/routes-scanner\";\nimport { writePhialProjectTypes, type GeneratedPhialTypesResult } from \"../scanners/types-generator\";\n\nexport interface PhialPrepareOptions {\n root?: string;\n configFile?: string;\n mode?: string;\n}\n\nexport async function preparePhialApp(\n options: PhialPrepareOptions = {},\n): Promise<GeneratedPhialTypesResult> {\n const loadedConfig = await loadPhialConfig({\n root: options.root,\n configFile: options.configFile,\n command: \"serve\",\n mode: options.mode ?? \"development\",\n isSsrBuild: false,\n isPreview: false,\n logLevel: \"info\",\n });\n const configuredOptions = loadedConfig.config.plugin ?? {};\n const appDir = configuredOptions.appDir ?? \"app\";\n const scannedRoutes = await scanRoutes({\n root: configuredOptions.root ?? loadedConfig.configRoot,\n appDir,\n routesDir: configuredOptions.routesDir ?? `${appDir}/pages`,\n serverRoutesDir: configuredOptions.serverRoutesDir ?? \"server/routes\",\n serverMiddlewareDir: configuredOptions.serverMiddlewareDir ?? \"server/middleware\",\n extensions: configuredOptions.extensions,\n });\n\n return writePhialProjectTypes(scannedRoutes);\n}\n"],"mappings":";;;;AAUA,eAAsB,gBACpB,UAA+B,EAAE,EACG;CACpC,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,oBAAoB,aAAa,OAAO,UAAU,EAAE;CAC1D,MAAM,SAAS,kBAAkB,UAAU;AAU3C,QAAO,uBATe,MAAM,WAAW;EACrC,MAAM,kBAAkB,QAAQ,aAAa;EAC7C;EACA,WAAW,kBAAkB,aAAa,GAAG,OAAO;EACpD,iBAAiB,kBAAkB,mBAAmB;EACtD,qBAAqB,kBAAkB,uBAAuB;EAC9D,YAAY,kBAAkB;EAC/B,CAAC,CAE0C"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { LoadPhialConfigOptions } from "../config.js";
|
|
2
|
+
import { RuntimeAdapter, Server } from "@hornjs/fest";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/vite-plugin/host/plugin-server.d.ts
|
|
5
|
+
interface PhialStartServerOptions extends LoadPhialConfigOptions {
|
|
6
|
+
host?: string;
|
|
7
|
+
port?: number;
|
|
8
|
+
root?: string;
|
|
9
|
+
adapter?: RuntimeAdapter;
|
|
10
|
+
}
|
|
11
|
+
interface PhialStartServerHandle {
|
|
12
|
+
server: Server;
|
|
13
|
+
url: string;
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
declare function startPhialServer(options?: PhialStartServerOptions): Promise<PhialStartServerHandle>;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { PhialStartServerHandle, PhialStartServerOptions, startPhialServer };
|
|
19
|
+
//# sourceMappingURL=plugin-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-server.d.ts","names":[],"sources":["../../../../src/lib/vite-plugin/host/plugin-server.ts"],"mappings":";;;;UAOiB,uBAAA,SAAgC,sBAAA;EAC/C,IAAA;EACA,IAAA;EACA,IAAA;EACA,OAAA,GAAU,cAAA;AAAA;AAAA,UAGK,sBAAA;EACf,MAAA,EAAQ,MAAA;EACR,GAAA;EACA,KAAA,IAAS,OAAA;AAAA;AAAA,iBAGW,gBAAA,CACpB,OAAA,GAAS,uBAAA,GACR,OAAA,CAAQ,sBAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { loadPhialConfig } from "../config.js";
|
|
2
|
+
import { DEFAULT_SERVER_BUILD_OUT_DIR } from "./plugin-build.js";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
//#region src/lib/vite-plugin/host/plugin-server.ts
|
|
7
|
+
async function startPhialServer(options = {}) {
|
|
8
|
+
const loadedConfig = await loadPhialConfig({
|
|
9
|
+
root: options.root,
|
|
10
|
+
configFile: options.configFile,
|
|
11
|
+
command: "serve",
|
|
12
|
+
mode: options.mode ?? "production",
|
|
13
|
+
isSsrBuild: false,
|
|
14
|
+
isPreview: false,
|
|
15
|
+
logLevel: "info"
|
|
16
|
+
});
|
|
17
|
+
const root = resolve(options.root ?? loadedConfig.configRoot);
|
|
18
|
+
const host = options.host ?? loadedConfig.config.dev?.host;
|
|
19
|
+
const port = options.port ?? loadedConfig.config.dev?.port ?? 3e3;
|
|
20
|
+
const clientOutDir = resolve(root, loadedConfig.config.vite?.build?.outDir ?? ".output/public");
|
|
21
|
+
const serverEntry = resolve(root, DEFAULT_SERVER_BUILD_OUT_DIR, "index.js");
|
|
22
|
+
const clientEntryPath = await resolveBuiltClientEntryPath(clientOutDir);
|
|
23
|
+
const app = await resolveCreateServerApp(await import(
|
|
24
|
+
/* @vite-ignore */
|
|
25
|
+
pathToFileURL(serverEntry).href
|
|
26
|
+
))({
|
|
27
|
+
adapter: options.adapter,
|
|
28
|
+
clientEntryPath,
|
|
29
|
+
publicDir: clientOutDir,
|
|
30
|
+
hostname: host,
|
|
31
|
+
port
|
|
32
|
+
});
|
|
33
|
+
await app.ready();
|
|
34
|
+
const publicHost = host && host !== "0.0.0.0" ? host : "localhost";
|
|
35
|
+
return {
|
|
36
|
+
server: app,
|
|
37
|
+
url: app.url ?? `http://${publicHost}:${port}`,
|
|
38
|
+
async close() {
|
|
39
|
+
await app.close();
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async function resolveBuiltClientEntryPath(clientOutDir) {
|
|
44
|
+
const manifestFile = resolve(clientOutDir, ".vite/manifest.json");
|
|
45
|
+
const manifestSource = await readFile(manifestFile, "utf8").catch(() => null);
|
|
46
|
+
if (!manifestSource) throw new Error(`Missing Phial build manifest: ${manifestFile}. Run "phial build" first.`);
|
|
47
|
+
const manifest = JSON.parse(manifestSource);
|
|
48
|
+
const clientEntry = Object.values(manifest).find((entry) => entry.isEntry && (entry.name === "client-entry" || entry.src?.includes("virtual:phial-client-entry")));
|
|
49
|
+
if (!clientEntry?.file) throw new Error(`Unable to resolve Phial client entry from manifest: ${manifestFile}`);
|
|
50
|
+
return `/${clientEntry.file}`;
|
|
51
|
+
}
|
|
52
|
+
function resolveCreateServerApp(serverModule) {
|
|
53
|
+
const candidate = serverModule.createServerApp ?? serverModule.default;
|
|
54
|
+
if (typeof candidate !== "function") throw new Error(`Invalid Phial server bundle. Expected a createServerApp export in ${DEFAULT_SERVER_BUILD_OUT_DIR}/index.js.`);
|
|
55
|
+
return candidate;
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
export { startPhialServer };
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=plugin-server.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { PhialPluginOptions } from "./config.js";
|
|
2
|
+
import { Plugin } from "vite";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/vite-plugin/index.d.ts
|
|
5
|
+
interface PhialVitePluginOptions extends PhialPluginOptions {}
|
|
6
|
+
declare function phialVitePlugin(options?: PhialVitePluginOptions): Plugin;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { PhialVitePluginOptions, phialVitePlugin };
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/lib/vite-plugin/index.ts"],"mappings":";;;;UAmCiB,sBAAA,SAA+B,kBAAA;AAAA,iBAGhC,eAAA,CAAgB,OAAA,GAAS,sBAAA,GAA8B,MAAA"}
|