@evjs/bundler-utoopack 0.0.23

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 ADDED
@@ -0,0 +1,48 @@
1
+ # @evjs/bundler-utoopack
2
+
3
+ The default utoopack (`@utoo/pack`) bundler adapter for the evjs framework.
4
+
5
+ This package provides the internal `utoopackAdapter` that implements the `BundlerAdapter` interface for `ev build` and `ev dev`.
6
+
7
+ Unlike webpack, utoopack natively supports `"use server"` directives through its unified module graph without needing a custom child compiler. This adapter directly integrates with utoopack's programmatic API to emit client and server manifests.
8
+
9
+ ## Usage
10
+
11
+ This adapter is enabled by default in evjs. You do not need to configure it manually unless you are overriding another bundler.
12
+
13
+ If you need to explicitly configure it:
14
+
15
+ ```ts
16
+ import { defineConfig } from "@evjs/ev";
17
+ import { utoopackAdapter } from "@evjs/bundler-utoopack";
18
+
19
+ export default defineConfig({
20
+ bundler: utoopackAdapter,
21
+ });
22
+ ```
23
+
24
+ ## Plugin Helper
25
+
26
+ The `utoopack()` helper wraps your plugin hooks for type-safe configuration mutation:
27
+
28
+ ```ts
29
+ import { defineConfig } from "@evjs/ev";
30
+ import { utoopack } from "@evjs/bundler-utoopack";
31
+
32
+ export default defineConfig({
33
+ plugins: [
34
+ {
35
+ name: "my-utoopack-plugin",
36
+ setup() {
37
+ return {
38
+ bundlerConfig: utoopack((config) => {
39
+ // config is typed as ConfigComplete from @utoo/pack
40
+ config.env ??= {};
41
+ config.env.__MY_VAR__ = JSON.stringify("value");
42
+ }),
43
+ };
44
+ },
45
+ },
46
+ ],
47
+ });
48
+ ```
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Map ResolvedEvConfig to a utoopack configuration object.
3
+ *
4
+ * Utoopack uses a JSON-based config with `build()` / `dev()` programmatic API.
5
+ * Unlike webpack, it handles "use server" directives natively via the
6
+ * `server.functions.callServerModule` config field.
7
+ */
8
+ import type { EvPluginHooks, ResolvedEvConfig } from "@evjs/ev";
9
+ import type { ConfigComplete } from "@utoo/pack";
10
+ /**
11
+ * Create a utoopack configuration object from EvConfig.
12
+ *
13
+ * @param config - Resolved evjs config
14
+ * @param cwd - Project root directory
15
+ * @param hooks - Plugin lifecycle hooks
16
+ * @returns A config object suitable for `@utoo/pack`'s `build()` / `dev()` API
17
+ */
18
+ export declare function createUtoopackConfig(config: ResolvedEvConfig<ConfigComplete>, cwd: string, hooks: EvPluginHooks<ConfigComplete>[]): ConfigComplete;
19
+ //# sourceMappingURL=create-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-config.d.ts","sourceRoot":"","sources":["../../src/adapter/create-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAgB,aAAa,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,CAAC,cAAc,CAAC,EACxC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,aAAa,CAAC,cAAc,CAAC,EAAE,GACrC,cAAc,CA+EhB"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Map ResolvedEvConfig to a utoopack configuration object.
3
+ *
4
+ * Utoopack uses a JSON-based config with `build()` / `dev()` programmatic API.
5
+ * Unlike webpack, it handles "use server" directives natively via the
6
+ * `server.functions.callServerModule` config field.
7
+ */
8
+ import { createRequire } from "node:module";
9
+ import path from "node:path";
10
+ const _require = createRequire(import.meta.url);
11
+ /**
12
+ * Create a utoopack configuration object from EvConfig.
13
+ *
14
+ * @param config - Resolved evjs config
15
+ * @param cwd - Project root directory
16
+ * @param hooks - Plugin lifecycle hooks
17
+ * @returns A config object suitable for `@utoo/pack`'s `build()` / `dev()` API
18
+ */
19
+ export function createUtoopackConfig(config, cwd, hooks) {
20
+ const isProduction = process.env.NODE_ENV === "production";
21
+ const serverEnabled = config.serverEnabled;
22
+ const utoopackConfig = {
23
+ mode: isProduction ? "production" : "development",
24
+ entry: [
25
+ {
26
+ import: config.entry,
27
+ },
28
+ ],
29
+ output: {
30
+ path: path.resolve(cwd, serverEnabled ? "dist/client" : "dist"),
31
+ filename: isProduction ? "[name].[contenthash:8].js" : "[name].js",
32
+ chunkFilename: isProduction ? "[name].[contenthash:8].js" : "[name].js",
33
+ publicPath: isProduction ? config.assetPrefix : "/",
34
+ clean: true,
35
+ },
36
+ resolve: {
37
+ extensions: [".tsx", ".ts", ".jsx", ".js", ".mjs", ".cjs"],
38
+ },
39
+ sourceMaps: !isProduction,
40
+ stats: true,
41
+ react: {
42
+ runtime: "automatic",
43
+ },
44
+ // Server functions config — utoopack handles "use server" natively
45
+ ...(serverEnabled
46
+ ? {
47
+ server: {
48
+ entry: config.server.entry ?? _require.resolve("@evjs/server"),
49
+ output: {
50
+ path: path.resolve(cwd, "dist/server"),
51
+ filename: isProduction
52
+ ? "[name].[contenthash:8].js"
53
+ : "[name].js",
54
+ chunkFilename: isProduction
55
+ ? "[name].[contenthash:8].js"
56
+ : "[name].js",
57
+ },
58
+ function: {
59
+ clientProxy: "@evjs/client/transport",
60
+ serverRegister: "@evjs/server/register",
61
+ },
62
+ },
63
+ }
64
+ : {}),
65
+ // Dev server configuration
66
+ devServer: {
67
+ hot: true,
68
+ ...(serverEnabled
69
+ ? {
70
+ proxy: [
71
+ {
72
+ context: [config.server.endpoint],
73
+ target: `${config.server.dev.https ? "https" : "http"}://localhost:${config.server.dev.port}`,
74
+ changeOrigin: true,
75
+ secure: false,
76
+ },
77
+ ],
78
+ }
79
+ : {}),
80
+ },
81
+ };
82
+ // Run plugin bundler hooks
83
+ const ctx = {
84
+ mode: isProduction ? "production" : "development",
85
+ config,
86
+ };
87
+ for (const h of hooks) {
88
+ if (h.bundlerConfig) {
89
+ h.bundlerConfig(utoopackConfig, ctx);
90
+ }
91
+ }
92
+ return utoopackConfig;
93
+ }
94
+ //# sourceMappingURL=create-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-config.js","sourceRoot":"","sources":["../../src/adapter/create-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Utoopack bundler adapter.
3
+ *
4
+ * Implements the BundlerAdapter interface using @utoo/pack's
5
+ * programmatic `build()` and `dev()` APIs. Unlike the webpack adapter,
6
+ * utoopack handles "use server" directives natively — no custom loader
7
+ * or child compiler is needed.
8
+ */
9
+ import type { BundlerAdapter } from "@evjs/ev";
10
+ import type { ConfigComplete } from "@utoo/pack";
11
+ export declare const utoopackAdapter: BundlerAdapter<ConfigComplete>;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapter/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAmC,MAAM,UAAU,CAAC;AAEhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA0DjD,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,cAAc,CA0F1D,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Utoopack bundler adapter.
3
+ *
4
+ * Implements the BundlerAdapter interface using @utoo/pack's
5
+ * programmatic `build()` and `dev()` APIs. Unlike the webpack adapter,
6
+ * utoopack handles "use server" directives natively — no custom loader
7
+ * or child compiler is needed.
8
+ */
9
+ import fs from "node:fs";
10
+ import path from "node:path";
11
+ import { getLogger } from "@logtape/logtape";
12
+ import { UtoopackManifestGenerator } from "../manifest-generator.js";
13
+ const logger = getLogger(["evjs", "bundler-utoopack"]);
14
+ async function generateAndEmitHtml(config, cwd, hooks) {
15
+ const isServerEnabled = config.serverEnabled;
16
+ const clientManifestPath = path.resolve(cwd, isServerEnabled ? "dist/client/manifest.json" : "dist/manifest.json");
17
+ if (!fs.existsSync(clientManifestPath))
18
+ return;
19
+ const clientManifest = JSON.parse(await fs.promises.readFile(clientManifestPath, "utf-8"));
20
+ // biome-ignore lint/suspicious/noExplicitAny: match @evjs/manifest type
21
+ let serverManifest;
22
+ if (isServerEnabled) {
23
+ const serverManifestPath = path.resolve(cwd, "dist/server/manifest.json");
24
+ if (fs.existsSync(serverManifestPath)) {
25
+ serverManifest = JSON.parse(await fs.promises.readFile(serverManifestPath, "utf-8"));
26
+ }
27
+ }
28
+ const { generateHtml } = await import("@evjs/build-tools");
29
+ const doc = generateHtml({
30
+ template: path.resolve(cwd, config.html),
31
+ js: clientManifest.assets.js,
32
+ css: clientManifest.assets.css,
33
+ assetPrefix: config.assetPrefix,
34
+ });
35
+ const { buildHtml } = await import("@evjs/ev");
36
+ const finalHtml = await buildHtml({
37
+ // biome-ignore lint/suspicious/noExplicitAny: DOM interfaces
38
+ doc: doc,
39
+ assetPrefix: config.assetPrefix,
40
+ // biome-ignore lint/suspicious/noExplicitAny: Bundler-agnostic hook generic
41
+ hooks: hooks,
42
+ clientManifest,
43
+ serverManifest,
44
+ });
45
+ const outPath = path.resolve(cwd, isServerEnabled ? "dist/client/index.html" : "dist/index.html");
46
+ await fs.promises.mkdir(path.dirname(outPath), { recursive: true });
47
+ await fs.promises.writeFile(outPath, finalHtml, "utf-8");
48
+ }
49
+ export const utoopackAdapter = {
50
+ name: "utoopack",
51
+ async build(config, cwd, hooks) {
52
+ const { createUtoopackConfig } = await import("./create-config.js");
53
+ const utoopackConfig = createUtoopackConfig(config, cwd, hooks);
54
+ logger.info `Building for production with utoopack...`;
55
+ const { build } = await import("@utoo/pack");
56
+ await build({ config: utoopackConfig });
57
+ logger.info `Extracting routes and generating client manifest...`;
58
+ const generator = new UtoopackManifestGenerator(cwd, config.serverEnabled, config.assetPrefix);
59
+ await generator.build();
60
+ logger.info `Generating and emitting HTML...`;
61
+ await generateAndEmitHtml(config, cwd, hooks);
62
+ logger.info `Build complete!`;
63
+ },
64
+ async dev(config, cwd, callbacks, hooks) {
65
+ const { createUtoopackConfig } = await import("./create-config.js");
66
+ const utoopackConfig = createUtoopackConfig(config, cwd, hooks);
67
+ logger.info `Starting development server with utoopack...`;
68
+ const { serve } = await import("@utoo/pack");
69
+ await serve({ config: utoopackConfig });
70
+ logger.info `Starting route watcher for dev manifest...`;
71
+ const generator = new UtoopackManifestGenerator(cwd, config.serverEnabled, config.assetPrefix);
72
+ await generator.watch(async () => {
73
+ await generateAndEmitHtml(config, cwd, hooks);
74
+ });
75
+ // Watch for server bundle readiness (utoopack emits server output
76
+ // to dist/server/ when "use server" modules are discovered)
77
+ if (config.serverEnabled) {
78
+ const outDir = path.resolve(cwd, "dist/server");
79
+ if (!fs.existsSync(outDir)) {
80
+ fs.mkdirSync(outDir, { recursive: true });
81
+ }
82
+ let ready = false;
83
+ const checkReady = async (filename) => {
84
+ if (ready)
85
+ return;
86
+ const hasBundle = filename
87
+ ? filename === "stats.json" || filename.endsWith(".js")
88
+ : (await fs.promises.readdir(outDir).catch(() => [])).some((f) => f === "stats.json" || f.endsWith(".js"));
89
+ if (hasBundle) {
90
+ ready = true;
91
+ // Re-generate manifests now that server stats are available
92
+ await generator.loadServerStats();
93
+ await generator.emit();
94
+ await generateAndEmitHtml(config, cwd, hooks);
95
+ callbacks.onServerBundleReady();
96
+ watcher?.close();
97
+ }
98
+ };
99
+ const watcher = fs.watch(outDir, (_eventType, filename) => {
100
+ if (filename)
101
+ checkReady(filename);
102
+ });
103
+ // Initial check in case it was written before the watcher attached
104
+ checkReady();
105
+ }
106
+ },
107
+ };
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapter/index.ts"],"names":[],"mappings":"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"}
package/esm/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Utoopack bundler adapter for the evjs framework.
3
+ *
4
+ * Leverages @utoo/pack's native "use server" directive support
5
+ * for zero-config server function handling.
6
+ */
7
+ export { utoopackAdapter } from "./adapter/index.js";
8
+ export { utoopack } from "./plugin-helper.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC"}
package/esm/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Utoopack bundler adapter for the evjs framework.
3
+ *
4
+ * Leverages @utoo/pack's native "use server" directive support
5
+ * for zero-config server function handling.
6
+ */
7
+ export { utoopackAdapter } from "./adapter/index.js";
8
+ export { utoopack } from "./plugin-helper.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,39 @@
1
+ export declare class UtoopackManifestGenerator {
2
+ private collector;
3
+ private cwd;
4
+ private assetPrefix?;
5
+ private serverEnabled;
6
+ private watcher;
7
+ private currentRoutes;
8
+ constructor(cwd: string, serverEnabled: boolean, assetPrefix?: string);
9
+ /**
10
+ * Load client assets from the client `stats.json` emitted by Utoopack.
11
+ * In development, this file may not exist, which is expected since
12
+ * Utoopack handles HTML client injection natively.
13
+ */
14
+ loadClientStats(): Promise<void>;
15
+ /**
16
+ * Load server entry and function registrations from the server `stats.json`.
17
+ *
18
+ * When Utoopack doesn't emit a server stats.json (e.g. older versions),
19
+ * falls back to scanning dist/server/ for a JS entry and creating a
20
+ * synthetic manifest.
21
+ */
22
+ loadServerStats(): Promise<void>;
23
+ processFile(filepath: string): Promise<void>;
24
+ private rebuildRoutes;
25
+ /**
26
+ * Emit the client manifest (and server manifest if server is enabled).
27
+ */
28
+ emit(): Promise<void>;
29
+ /**
30
+ * Run a full post-build manifest generation pass.
31
+ */
32
+ build(): Promise<void>;
33
+ /**
34
+ * Run manifest generation continually by watching the filesystem in development.
35
+ */
36
+ watch(onUpdate?: () => void | Promise<void>): Promise<void>;
37
+ close(): Promise<void>;
38
+ }
39
+ //# sourceMappingURL=manifest-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-generator.d.ts","sourceRoot":"","sources":["../src/manifest-generator.ts"],"names":[],"mappings":"AAqFA,qBAAa,yBAAyB;IACpC,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,aAAa,CAAuC;gBAEhD,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM;IAMrE;;;;OAIG;IACG,eAAe;IAoBrB;;;;;;OAMG;IACG,eAAe;IA8Bf,WAAW,CAAC,QAAQ,EAAE,MAAM;IAclC,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACG,IAAI;IAoCV;;OAEG;IACG,KAAK;IAWX;;OAEG;IACG,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC3C,KAAK;CAKZ"}
@@ -0,0 +1,232 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { extractRoutes } from "@evjs/build-tools";
4
+ import { ManifestCollector, } from "@evjs/manifest";
5
+ import { getLogger } from "@logtape/logtape";
6
+ import chokidar from "chokidar";
7
+ import fastGlob from "fast-glob";
8
+ const logger = getLogger(["evjs", "bundler-utoopack", "manifest"]);
9
+ /**
10
+ * Parse a Utoopack stats.json file and extract asset filenames.
11
+ *
12
+ * @returns lists of JS and CSS asset filenames from the main entrypoint.
13
+ */
14
+ function parseClientStats(stats) {
15
+ const jsFiles = [];
16
+ const cssFiles = [];
17
+ // Use first entrypoint — utoopack may name it by the output file rather than "main"
18
+ const entrypoints = stats.entrypoints;
19
+ const firstEntry = entrypoints ? Object.values(entrypoints)[0] : undefined;
20
+ if (firstEntry && Array.isArray(firstEntry.assets)) {
21
+ for (const asset of firstEntry.assets) {
22
+ const name = asset.name?.replace(/^\.\//, "");
23
+ if (name?.endsWith(".js")) {
24
+ jsFiles.push(name);
25
+ }
26
+ else if (name?.endsWith(".css")) {
27
+ cssFiles.push(name);
28
+ }
29
+ }
30
+ }
31
+ return { js: jsFiles, css: cssFiles };
32
+ }
33
+ /**
34
+ * Parse a Utoopack server stats.json and extract entry filename and
35
+ * server function registrations.
36
+ *
37
+ * The server stats.json shape (emitted by @utoo/pack when server
38
+ * references are enabled):
39
+ *
40
+ * ```json
41
+ * {
42
+ * "entrypoints": {
43
+ * "main": { "assets": [{ "name": "index.js" }] }
44
+ * },
45
+ * "serverFunctions": {
46
+ * "<fnId>": { "moduleId": "<hash>", "export": "functionName" }
47
+ * }
48
+ * }
49
+ * ```
50
+ */
51
+ function parseServerStats(stats) {
52
+ let entry;
53
+ // Use first entrypoint — utoopack may name it by the output file rather than "main"
54
+ const entrypoints = stats.entrypoints;
55
+ const firstEntry = entrypoints ? Object.values(entrypoints)[0] : undefined;
56
+ if (firstEntry && Array.isArray(firstEntry.assets)) {
57
+ const jsAsset = firstEntry.assets.find((a) => a.name?.endsWith(".js"));
58
+ entry = jsAsset?.name?.replace(/^\.\//, "");
59
+ }
60
+ return {
61
+ entry,
62
+ fns: stats.serverFunctions ?? {},
63
+ };
64
+ }
65
+ export class UtoopackManifestGenerator {
66
+ collector = new ManifestCollector();
67
+ cwd;
68
+ assetPrefix;
69
+ serverEnabled;
70
+ watcher = null;
71
+ currentRoutes = new Map();
72
+ constructor(cwd, serverEnabled, assetPrefix) {
73
+ this.cwd = cwd;
74
+ this.serverEnabled = serverEnabled;
75
+ this.assetPrefix = assetPrefix;
76
+ }
77
+ /**
78
+ * Load client assets from the client `stats.json` emitted by Utoopack.
79
+ * In development, this file may not exist, which is expected since
80
+ * Utoopack handles HTML client injection natively.
81
+ */
82
+ async loadClientStats() {
83
+ const statsPath = path.resolve(this.cwd, this.serverEnabled ? "dist/client/stats.json" : "dist/stats.json");
84
+ if (!fs.existsSync(statsPath)) {
85
+ this.collector.setAssets([], []);
86
+ return;
87
+ }
88
+ try {
89
+ const statsStr = await fs.promises.readFile(statsPath, "utf-8");
90
+ const stats = JSON.parse(statsStr);
91
+ const { js, css } = parseClientStats(stats);
92
+ this.collector.setAssets(js, css);
93
+ }
94
+ catch (err) {
95
+ logger.warn `Failed to parse client stats.json: ${err}`;
96
+ this.collector.setAssets([], []);
97
+ }
98
+ }
99
+ /**
100
+ * Load server entry and function registrations from the server `stats.json`.
101
+ *
102
+ * When Utoopack doesn't emit a server stats.json (e.g. older versions),
103
+ * falls back to scanning dist/server/ for a JS entry and creating a
104
+ * synthetic manifest.
105
+ */
106
+ async loadServerStats() {
107
+ if (!this.serverEnabled)
108
+ return;
109
+ const statsPath = path.resolve(this.cwd, "dist/server/stats.json");
110
+ if (fs.existsSync(statsPath)) {
111
+ try {
112
+ const statsStr = await fs.promises.readFile(statsPath, "utf-8");
113
+ const stats = JSON.parse(statsStr);
114
+ const { entry, fns } = parseServerStats(stats);
115
+ this.collector.entry = entry;
116
+ for (const [id, meta] of Object.entries(fns)) {
117
+ this.collector.addServerFn(id, meta);
118
+ }
119
+ return;
120
+ }
121
+ catch (err) {
122
+ logger.warn `Failed to parse server stats.json: ${err}`;
123
+ }
124
+ }
125
+ // Fallback: scan for JS entry in dist/server/
126
+ const serverDir = path.resolve(this.cwd, "dist/server");
127
+ if (fs.existsSync(serverDir)) {
128
+ const files = await fs.promises.readdir(serverDir);
129
+ const jsEntry = files.find((f) => f.endsWith(".js"));
130
+ if (jsEntry) {
131
+ this.collector.entry = jsEntry;
132
+ }
133
+ }
134
+ }
135
+ async processFile(filepath) {
136
+ try {
137
+ const content = await fs.promises.readFile(filepath, "utf-8");
138
+ const routes = extractRoutes(content);
139
+ if (routes.length > 0) {
140
+ this.currentRoutes.set(filepath, routes);
141
+ }
142
+ else {
143
+ this.currentRoutes.delete(filepath);
144
+ }
145
+ }
146
+ catch (_err) {
147
+ this.currentRoutes.delete(filepath);
148
+ }
149
+ }
150
+ rebuildRoutes() {
151
+ this.collector.routes = [];
152
+ for (const routes of this.currentRoutes.values()) {
153
+ this.collector.addRoutes(routes);
154
+ }
155
+ }
156
+ /**
157
+ * Emit the client manifest (and server manifest if server is enabled).
158
+ */
159
+ async emit() {
160
+ this.rebuildRoutes();
161
+ // Client manifest — matches ClientManifest from @evjs/manifest
162
+ const clientManifest = this.collector.getClientManifest(this.assetPrefix);
163
+ const clientOutPath = path.resolve(this.cwd, this.serverEnabled ? "dist/client/manifest.json" : "dist/manifest.json");
164
+ const clientOutDir = path.dirname(clientOutPath);
165
+ if (!fs.existsSync(clientOutDir)) {
166
+ await fs.promises.mkdir(clientOutDir, { recursive: true });
167
+ }
168
+ await fs.promises.writeFile(clientOutPath, JSON.stringify(clientManifest, null, 2));
169
+ // Server manifest
170
+ if (this.serverEnabled) {
171
+ // Server manifest — matches ServerManifest from @evjs/manifest
172
+ const serverManifest = this.collector.getServerManifest();
173
+ const serverOutDir = path.resolve(this.cwd, "dist/server");
174
+ if (!fs.existsSync(serverOutDir)) {
175
+ await fs.promises.mkdir(serverOutDir, { recursive: true });
176
+ }
177
+ await fs.promises.writeFile(path.join(serverOutDir, "manifest.json"), JSON.stringify(serverManifest, null, 2));
178
+ }
179
+ }
180
+ /**
181
+ * Run a full post-build manifest generation pass.
182
+ */
183
+ async build() {
184
+ await this.loadClientStats();
185
+ await this.loadServerStats();
186
+ const files = await fastGlob("src/**/*.{ts,tsx,js,jsx}", {
187
+ cwd: this.cwd,
188
+ absolute: true,
189
+ });
190
+ await Promise.all(files.map((f) => this.processFile(f)));
191
+ await this.emit();
192
+ }
193
+ /**
194
+ * Run manifest generation continually by watching the filesystem in development.
195
+ */
196
+ async watch(onUpdate) {
197
+ await this.loadClientStats();
198
+ await this.loadServerStats();
199
+ const files = await fastGlob("src/**/*.{ts,tsx,js,jsx}", {
200
+ cwd: this.cwd,
201
+ absolute: true,
202
+ });
203
+ await Promise.all(files.map((f) => this.processFile(f)));
204
+ await this.emit();
205
+ await onUpdate?.();
206
+ this.watcher = chokidar.watch("src/**/*.{ts,tsx,js,jsx}", {
207
+ cwd: this.cwd,
208
+ ignoreInitial: true,
209
+ });
210
+ const handleChange = async (filepath) => {
211
+ const fullPath = path.resolve(this.cwd, filepath);
212
+ await this.processFile(fullPath);
213
+ await this.emit();
214
+ await onUpdate?.();
215
+ };
216
+ const handleUnlink = async (filepath) => {
217
+ const fullPath = path.resolve(this.cwd, filepath);
218
+ this.currentRoutes.delete(fullPath);
219
+ await this.emit();
220
+ await onUpdate?.();
221
+ };
222
+ this.watcher.on("add", handleChange);
223
+ this.watcher.on("change", handleChange);
224
+ this.watcher.on("unlink", handleUnlink);
225
+ }
226
+ async close() {
227
+ if (this.watcher) {
228
+ await this.watcher.close();
229
+ }
230
+ }
231
+ }
232
+ //# sourceMappingURL=manifest-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-generator.js","sourceRoot":"","sources":["../src/manifest-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { EvBundlerCtx } from "@evjs/ev";
2
+ import type { ConfigComplete } from "@utoo/pack";
3
+ /**
4
+ * Typed wrapper for utoopack configuration in plugin bundler hooks.
5
+ *
6
+ * Use this in your plugin's `bundlerConfig` hook to get full `ConfigComplete`
7
+ * type safety instead of `unknown`.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { utoopack } from "@evjs/bundler-utoopack";
12
+ *
13
+ * const myPlugin: EvPlugin = {
14
+ * name: "my-plugin",
15
+ * setup(ctx) {
16
+ * return {
17
+ * bundlerConfig: utoopack((config) => {
18
+ * // config is typed as ConfigComplete from @utoo/pack
19
+ * }),
20
+ * };
21
+ * },
22
+ * };
23
+ * ```
24
+ */
25
+ export declare function utoopack<T = unknown>(fn: (config: ConfigComplete, ctx: EvBundlerCtx<ConfigComplete>) => void): (config: T, ctx: EvBundlerCtx<T>) => void;
26
+ //# sourceMappingURL=plugin-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-helper.d.ts","sourceRoot":"","sources":["../src/plugin-helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,GAAG,OAAO,EAClC,EAAE,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,CAAC,cAAc,CAAC,KAAK,IAAI,GACtE,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,CAS3C"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Typed wrapper for utoopack configuration in plugin bundler hooks.
3
+ *
4
+ * Use this in your plugin's `bundlerConfig` hook to get full `ConfigComplete`
5
+ * type safety instead of `unknown`.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { utoopack } from "@evjs/bundler-utoopack";
10
+ *
11
+ * const myPlugin: EvPlugin = {
12
+ * name: "my-plugin",
13
+ * setup(ctx) {
14
+ * return {
15
+ * bundlerConfig: utoopack((config) => {
16
+ * // config is typed as ConfigComplete from @utoo/pack
17
+ * }),
18
+ * };
19
+ * },
20
+ * };
21
+ * ```
22
+ */
23
+ export function utoopack(fn) {
24
+ return (config, ctx) => {
25
+ if (ctx.config.bundler?.name === "utoopack") {
26
+ fn(config, ctx);
27
+ }
28
+ };
29
+ }
30
+ //# sourceMappingURL=plugin-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-helper.js","sourceRoot":"","sources":["../src/plugin-helper.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,QAAQ,CACtB,EAAuE;IAEvE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACrB,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;YAC5C,EAAE,CACA,MAAmC,EACnC,GAA8C,CAC/C,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@evjs/bundler-utoopack",
3
+ "version": "0.0.23",
4
+ "description": "Utoopack bundler adapter for the evjs framework",
5
+ "type": "module",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "main": "./esm/index.js",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./esm/index.d.ts",
13
+ "import": "./esm/index.js",
14
+ "default": "./esm/index.js"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "check-types": "tsc --noEmit"
20
+ },
21
+ "files": [
22
+ "esm"
23
+ ],
24
+ "keywords": [
25
+ "evjs",
26
+ "utoopack",
27
+ "turbopack",
28
+ "bundler"
29
+ ],
30
+ "author": "xusd320",
31
+ "license": "MIT",
32
+ "dependencies": {
33
+ "@evjs/build-tools": "*",
34
+ "@evjs/ev": "*",
35
+ "@evjs/manifest": "*",
36
+ "@logtape/logtape": "^2.0.4",
37
+ "@utoo/pack": "^1.4.0",
38
+ "chokidar": "^3.6.0",
39
+ "fast-glob": "^3.3.3"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^22.19.15",
43
+ "typescript": "^6.0.2"
44
+ },
45
+ "homepage": "https://github.com/evaijs/evjs#readme",
46
+ "bugs": {
47
+ "url": "https://github.com/evaijs/evjs/issues"
48
+ },
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "git+https://github.com/evaijs/evjs.git"
52
+ }
53
+ }