@chuckcchen/vite-plugin 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/dist/core.js ADDED
@@ -0,0 +1,384 @@
1
+ /**
2
+ * EdgeOne Vite Plugin Adapter - 核心插件模块
3
+ *
4
+ * 本模块是整个适配器系统的核心,负责:
5
+ * - 构建产物检测:自动识别客户端和服务端的构建输出
6
+ * - 静态资源复制:将客户端构建产物复制到部署目录
7
+ * - 服务端代码打包:将服务端代码打包成单文件
8
+ * - 路由配置生成:根据框架特性生成路由信息
9
+ * - Meta.json 生成:生成 EdgeOne 部署所需的配置文件
10
+ */
11
+ import path from "path";
12
+ import { createLogger, pathExists, copyDirectory, ensureDirectory, writeFile, } from "./utils.js";
13
+ import { bundleServerCode, createServerWrapper, cleanupWrapper, } from "./bundler.js";
14
+ import fs from "fs/promises";
15
+ /**
16
+ * 创建 EdgeOne 核心适配器插件
17
+ *
18
+ * 这是创建适配器的主要入口函数,返回一个 Vite 插件实例。
19
+ * 该插件会在 Vite 构建完成后执行,处理构建产物并生成部署配置。
20
+ *
21
+ * @param options - 适配器配置选项
22
+ * @returns Vite 插件实例
23
+ *
24
+ * @example
25
+ * // 基本用法
26
+ * createCoreAdapter({ verbose: true })
27
+ *
28
+ * @example
29
+ * // 使用框架适配器
30
+ * createCoreAdapter({
31
+ * adapter: myFrameworkAdapter,
32
+ * outputDir: '.edgeone'
33
+ * })
34
+ */
35
+ export function createCoreAdapter(options = {}) {
36
+ // 解构配置选项,设置默认值
37
+ const { verbose = false, // 是否启用详细日志
38
+ outputDir = ".edgeone", // 输出目录
39
+ cleanOutput = true, // 是否在构建前清理输出目录
40
+ adapter, // 框架适配器实例
41
+ hooks = {}, // 自定义钩子函数
42
+ ssr: ssrOption, // SSR 模式配置
43
+ } = options;
44
+ // 创建日志记录器
45
+ const logger = createLogger(verbose);
46
+ // 插件状态变量
47
+ let projectRoot; // 项目根目录
48
+ let viteConfig; // Vite 解析后的配置
49
+ let isSSR = false; // 是否为 SSR 模式
50
+ let isBuildingForSSR = false; // 当前是否正在构建 SSR
51
+ return {
52
+ // 插件名称,用于调试和日志
53
+ name: "vite-plugin-edgeone-adapter",
54
+ // 仅在构建时应用此插件
55
+ apply: "build",
56
+ // 在其他插件之后执行(post 阶段)
57
+ enforce: "post",
58
+ /**
59
+ * Vite 配置解析完成后的钩子
60
+ * 在这里获取项目配置并检测 SSR 模式
61
+ */
62
+ configResolved(config) {
63
+ projectRoot = config.root;
64
+ viteConfig = config;
65
+ // 检测当前构建是否为 SSR 构建
66
+ // Vite 在 SSR 模式下会设置 build.ssr
67
+ isBuildingForSSR =
68
+ config.build.ssr !== false && config.build.ssr !== undefined;
69
+ // 确定最终的 SSR 状态
70
+ // 优先使用显式配置,否则从 Vite 配置自动检测
71
+ if (ssrOption !== undefined) {
72
+ isSSR = ssrOption;
73
+ }
74
+ else {
75
+ isSSR = isBuildingForSSR;
76
+ }
77
+ // 输出调试信息
78
+ logger.verbose("项目根目录:", projectRoot);
79
+ logger.verbose("构建类型:", isBuildingForSSR ? "SSR" : "客户端");
80
+ logger.verbose("SSR 模式:", isSSR);
81
+ },
82
+ /**
83
+ * 构建产物写入完成后的钩子
84
+ * 这是适配器的主要处理逻辑所在
85
+ */
86
+ async writeBundle() {
87
+ // 如果是 SSR 模式但当前正在构建客户端,则跳过
88
+ // 等待 SSR 构建完成后再处理
89
+ // 这是因为 Vite SSR 构建会先构建客户端,再构建服务端
90
+ if (isSSR && !isBuildingForSSR) {
91
+ logger.verbose("跳过处理(等待 SSR 构建完成)");
92
+ return;
93
+ }
94
+ // 短暂延迟,确保所有文件都已写入磁盘
95
+ await new Promise((resolve) => setTimeout(resolve, 100));
96
+ try {
97
+ // 创建构建上下文对象
98
+ // 该对象会传递给所有钩子函数和适配器方法
99
+ const context = {
100
+ projectRoot,
101
+ outputDir,
102
+ isSSR,
103
+ viteConfig,
104
+ logger,
105
+ };
106
+ // 调用构建前钩子
107
+ if (hooks.beforeBuild) {
108
+ await hooks.beforeBuild(context);
109
+ }
110
+ // 检测构建产物
111
+ let artifacts;
112
+ if (adapter) {
113
+ // 使用框架适配器检测
114
+ const shouldUse = await adapter.detect(context);
115
+ if (!shouldUse) {
116
+ logger.warn(`适配器 ${adapter.name} 检测失败,使用默认配置`);
117
+ }
118
+ artifacts = await adapter.getBuildArtifacts(context);
119
+ }
120
+ else {
121
+ // 使用默认检测逻辑
122
+ artifacts = await detectBuildArtifacts(context);
123
+ }
124
+ // 调用构建后钩子
125
+ if (hooks.afterBuild) {
126
+ await hooks.afterBuild(context, artifacts);
127
+ }
128
+ // 清理输出目录
129
+ if (cleanOutput) {
130
+ await cleanOutputDir(context);
131
+ }
132
+ // 复制静态资源
133
+ if (artifacts.clientDir) {
134
+ await copyStaticAssets(context, artifacts.clientDir);
135
+ }
136
+ // 打包服务端代码(仅 SSR 模式)
137
+ if (isSSR && artifacts.serverEntry) {
138
+ await bundleServer(context, artifacts, adapter);
139
+ }
140
+ // 生成 meta.json 配置文件
141
+ await generateMetaJson(context, adapter);
142
+ logger.verbose("EdgeOne 适配器处理完成");
143
+ }
144
+ catch (error) {
145
+ logger.error("EdgeOne 适配器处理失败:", error);
146
+ throw error;
147
+ }
148
+ },
149
+ };
150
+ }
151
+ /**
152
+ * 使用默认路径检测构建产物
153
+ *
154
+ * 当没有提供框架适配器时,使用此函数自动检测常见的构建输出路径。
155
+ * 支持检测 dist、build 等常见目录结构。
156
+ *
157
+ * @param context - 构建上下文
158
+ * @returns 检测到的构建产物信息
159
+ */
160
+ async function detectBuildArtifacts(context) {
161
+ const { projectRoot, logger } = context;
162
+ // 常见的客户端构建输出路径(按优先级排序)
163
+ const clientPaths = [
164
+ path.join(projectRoot, "dist"), // Vite 默认
165
+ path.join(projectRoot, "build/client"), // React Router 等框架
166
+ path.join(projectRoot, "build"), // Create React App 等
167
+ ];
168
+ // 常见的服务端构建输出路径
169
+ const serverPaths = [
170
+ path.join(projectRoot, "dist/server"),
171
+ path.join(projectRoot, "build/server"),
172
+ ];
173
+ // 常见的服务端入口文件路径
174
+ const serverEntryPaths = [
175
+ path.join(projectRoot, "dist/server/index.js"),
176
+ path.join(projectRoot, "build/server/index.js"),
177
+ ];
178
+ let clientDir = null;
179
+ let serverDir = null;
180
+ let serverEntry = null;
181
+ // 查找客户端构建目录
182
+ for (const p of clientPaths) {
183
+ if (await pathExists(p)) {
184
+ clientDir = p;
185
+ logger.verbose(`找到客户端构建目录: ${p}`);
186
+ break;
187
+ }
188
+ }
189
+ // 查找服务端构建目录
190
+ for (const p of serverPaths) {
191
+ if (await pathExists(p)) {
192
+ serverDir = p;
193
+ logger.verbose(`找到服务端构建目录: ${p}`);
194
+ break;
195
+ }
196
+ }
197
+ // 查找服务端入口文件
198
+ for (const p of serverEntryPaths) {
199
+ if (await pathExists(p)) {
200
+ serverEntry = p;
201
+ logger.verbose(`找到服务端入口文件: ${p}`);
202
+ break;
203
+ }
204
+ }
205
+ return {
206
+ clientDir,
207
+ serverDir,
208
+ serverEntry,
209
+ assetsDir: clientDir, // 静态资源目录通常与客户端目录相同
210
+ };
211
+ }
212
+ /**
213
+ * 清理输出目录
214
+ *
215
+ * 在每次构建前清理之前的输出,确保输出目录是干净的。
216
+ * 只清理特定的子目录,不会删除整个输出目录。
217
+ *
218
+ * @param context - 构建上下文
219
+ */
220
+ async function cleanOutputDir(context) {
221
+ const { projectRoot, outputDir, logger } = context;
222
+ const outputPath = path.join(projectRoot, outputDir);
223
+ // 需要清理的路径列表
224
+ const pathsToClean = [
225
+ path.join(outputPath, "assets"), // 静态资源目录
226
+ path.join(outputPath, "server-handler"), // 服务端处理器目录
227
+ path.join(outputPath, "meta.json"), // 元数据配置文件
228
+ ];
229
+ // 逐个删除
230
+ for (const p of pathsToClean) {
231
+ try {
232
+ await fs.rm(p, { recursive: true, force: true });
233
+ }
234
+ catch {
235
+ // 忽略删除错误(如路径不存在)
236
+ }
237
+ }
238
+ // 确保输出目录存在
239
+ await ensureDirectory(outputPath);
240
+ logger.verbose("已清理输出目录");
241
+ }
242
+ /**
243
+ * 复制静态资源到输出目录
244
+ *
245
+ * 将客户端构建产物(HTML、CSS、JS、图片等)复制到部署目录。
246
+ * 这些资源将由 EdgeOne CDN 直接提供服务。
247
+ *
248
+ * @param context - 构建上下文
249
+ * @param clientDir - 客户端构建目录路径
250
+ */
251
+ async function copyStaticAssets(context, clientDir) {
252
+ const { projectRoot, outputDir, logger } = context;
253
+ // 目标路径:.edgeone/assets
254
+ const targetPath = path.join(projectRoot, outputDir, "assets");
255
+ await copyDirectory(clientDir, targetPath);
256
+ logger.verbose(`已复制静态资源到 ${outputDir}/assets`);
257
+ }
258
+ /**
259
+ * 打包服务端代码
260
+ *
261
+ * 将框架的服务端构建产物打包成单个 JavaScript 文件,
262
+ * 以便在 EdgeOne 边缘函数环境中运行。
263
+ *
264
+ * 处理流程:
265
+ * 1. 创建服务端包装器(处理请求转换)
266
+ * 2. 使用 esbuild 打包
267
+ * 3. 清理临时文件
268
+ *
269
+ * @param context - 构建上下文
270
+ * @param artifacts - 构建产物信息
271
+ * @param adapter - 框架适配器(可选)
272
+ */
273
+ async function bundleServer(context, artifacts, adapter) {
274
+ const { projectRoot, outputDir, logger } = context;
275
+ // 检查服务端入口是否存在
276
+ if (!artifacts.serverEntry) {
277
+ logger.warn("未找到服务端入口文件,跳过服务端打包");
278
+ return;
279
+ }
280
+ // 输出路径配置
281
+ const outputPath = path.join(projectRoot, outputDir, "server-handler");
282
+ const outputFile = path.join(outputPath, "handler.js");
283
+ // 获取适配器钩子
284
+ const adapterHooks = adapter?.hooks || {};
285
+ // 包装器配置
286
+ const wrapperConfig = {
287
+ serverEntryPath: artifacts.serverEntry,
288
+ };
289
+ // 创建服务端包装器
290
+ let wrapperPath;
291
+ if (adapterHooks.generateServerWrapper) {
292
+ // 使用适配器提供的自定义包装器生成逻辑
293
+ const wrapperContent = await adapterHooks.generateServerWrapper(context, wrapperConfig);
294
+ wrapperPath = path.join(projectRoot, "server-wrapper.temp.js");
295
+ await writeFile(wrapperPath, wrapperContent);
296
+ }
297
+ else {
298
+ // 使用默认包装器
299
+ wrapperPath = await createServerWrapper(context, wrapperConfig);
300
+ }
301
+ // 准备打包配置
302
+ let bundleConfig = {
303
+ entryPoints: [wrapperPath],
304
+ outfile: outputFile,
305
+ };
306
+ // 调用打包前钩子,允许修改配置
307
+ if (context.viteConfig && adapterHooks.beforeBundle) {
308
+ bundleConfig = await adapterHooks.beforeBundle(context, bundleConfig);
309
+ }
310
+ // 执行打包
311
+ await bundleServerCode(context, bundleConfig);
312
+ // 清理临时包装器文件
313
+ await cleanupWrapper(wrapperPath);
314
+ // 调用打包后钩子
315
+ if (adapterHooks.afterBundle) {
316
+ await adapterHooks.afterBundle(context, outputFile);
317
+ }
318
+ logger.verbose(`服务端代码已打包到 ${outputDir}/server-handler/handler.js`);
319
+ }
320
+ /**
321
+ * 生成 meta.json 配置文件
322
+ *
323
+ * meta.json 是 EdgeOne 部署的核心配置文件,包含:
324
+ * - 路由信息:告诉 EdgeOne 哪些路径需要 SSR,哪些是静态资源
325
+ * - HTTP 配置:响应头、重定向、重写、缓存规则
326
+ * - 404 处理配置
327
+ *
328
+ * @param context - 构建上下文
329
+ * @param adapter - 框架适配器(可选)
330
+ */
331
+ async function generateMetaJson(context, adapter) {
332
+ const { projectRoot, outputDir, isSSR, logger } = context;
333
+ // 生成路由信息
334
+ let routes = [];
335
+ const adapterHooks = adapter?.hooks || {};
336
+ if (adapterHooks.generateRoutes) {
337
+ // 使用适配器提供的路由生成逻辑
338
+ routes = await adapterHooks.generateRoutes(context);
339
+ }
340
+ else {
341
+ // 默认:单个根路由
342
+ routes = [
343
+ {
344
+ path: "/",
345
+ isStatic: !isSSR, // SSR 模式下不是静态路由
346
+ srcRoute: "/",
347
+ },
348
+ ];
349
+ }
350
+ // 生成元数据配置
351
+ let metaConfig;
352
+ if (adapterHooks.generateMeta) {
353
+ // 使用适配器提供的元数据生成逻辑
354
+ metaConfig = await adapterHooks.generateMeta(context, routes);
355
+ }
356
+ else {
357
+ // 使用默认配置
358
+ metaConfig = {
359
+ conf: {
360
+ headers: [], // HTTP 响应头规则
361
+ redirects: [], // 重定向规则
362
+ rewrites: [], // URL 重写规则
363
+ caches: [], // 缓存规则
364
+ has404: false, // 是否有自定义 404 页面
365
+ ssr404: isSSR, // 404 是否使用 SSR
366
+ },
367
+ has404: false,
368
+ frameworkRoutes: routes,
369
+ };
370
+ }
371
+ // 将配置转换为 JSON 字符串
372
+ const metaContent = JSON.stringify(metaConfig, null, 2);
373
+ // SSR 模式下,在 server-handler 目录也写入一份
374
+ if (isSSR) {
375
+ const serverMetaPath = path.join(projectRoot, outputDir, "server-handler", "meta.json");
376
+ await writeFile(serverMetaPath, metaContent);
377
+ }
378
+ // 在输出根目录写入 meta.json
379
+ const rootMetaPath = path.join(projectRoot, outputDir, "meta.json");
380
+ await writeFile(rootMetaPath, metaContent);
381
+ logger.verbose(`meta.json 已生成,包含 ${routes.length} 个路由`);
382
+ }
383
+ export default createCoreAdapter;
384
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @edgeone/vite-plugin-adapter
3
+ *
4
+ * EdgeOne 平台的核心适配器插件
5
+ *
6
+ * 本包为构建框架特定适配器提供基础设施,主要功能包括:
7
+ * - 构建产物检测和处理
8
+ * - 使用 esbuild 打包服务端代码
9
+ * - 静态资源管理
10
+ * - 路由配置生成
11
+ * - 生成 EdgeOne 部署所需的 meta.json 配置文件
12
+ *
13
+ * 使用场景:
14
+ * 1. 直接使用核心适配器构建自定义适配器
15
+ * 2. 作为其他框架适配器(如 React Router、TanStack Start)的基础依赖
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * // 直接使用核心适配器创建自定义适配器
20
+ * import { createCoreAdapter } from '@edgeone/vite-plugin-adapter';
21
+ *
22
+ * export default defineConfig({
23
+ * plugins: [
24
+ * createCoreAdapter({
25
+ * verbose: true, // 启用详细日志
26
+ * hooks: {
27
+ * // 自定义路由生成逻辑
28
+ * generateRoutes: async (ctx) => [...],
29
+ * // 自定义服务端包装器生成逻辑
30
+ * generateServerWrapper: async (ctx, config) => '...',
31
+ * }
32
+ * })
33
+ * ]
34
+ * });
35
+ * ```
36
+ */
37
+ export { createCoreAdapter, default } from "./core.js";
38
+ export { bundleServerCode, // 使用 esbuild 打包服务端代码
39
+ createServerWrapper, // 创建服务端包装器文件
40
+ cleanupWrapper, // 清理临时包装器文件
41
+ getBundleSize, } from "./bundler.js";
42
+ export { createLogger, // 创建日志记录器
43
+ pathExists, // 检查路径是否存在
44
+ findExistingPath, // 从候选列表中找到第一个存在的路径
45
+ copyDirectory, // 递归复制目录
46
+ cleanDirectory, // 清理目录(删除后重建)
47
+ ensureDirectory, // 确保目录存在
48
+ readFile, // 读取文件内容
49
+ writeFile, // 写入文件内容
50
+ deleteFile, // 删除文件
51
+ formatSize, // 格式化文件大小
52
+ waitFor, // 等待条件满足(带重试)
53
+ listFiles, // 列出目录内容
54
+ countFiles, } from "./utils.js";
55
+ export type { RouteInfo, // 路由信息
56
+ MetaConfig, // 元数据配置
57
+ HeaderRule, // HTTP 响应头规则
58
+ RedirectRule, // 重定向规则
59
+ RewriteRule, // URL 重写规则
60
+ CacheRule, // 缓存规则
61
+ BuildContext, // 构建上下文
62
+ Logger, // 日志接口
63
+ BuildArtifacts, // 构建产物信息
64
+ ServerWrapperConfig, // 服务端包装器配置
65
+ ServerBundleConfig, // esbuild 打包配置
66
+ BeforeBuildHook, // 构建前钩子
67
+ AfterBuildHook, // 构建后钩子
68
+ BeforeBundleHook, // 打包前钩子
69
+ AfterBundleHook, // 打包后钩子
70
+ GenerateRoutesHook, // 路由生成钩子
71
+ GenerateMetaHook, // 元数据生成钩子
72
+ GenerateServerWrapperHook, // 服务端包装器生成钩子
73
+ AdapterHooks, // 适配器钩子集合
74
+ FrameworkAdapter, // 框架适配器接口
75
+ CoreAdapterOptions, // 核心适配器选项
76
+ ViteAdapterOptions, // Vite 适配器选项
77
+ ReactRouterAdapterOptions, // React Router 适配器选项
78
+ TanStackStartAdapterOptions, // TanStack Start 适配器选项
79
+ CreateAdapterPlugin, } from "./types.js";
80
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAIH,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EACL,gBAAgB,EAAO,qBAAqB;AAC5C,mBAAmB,EAAI,aAAa;AACpC,cAAc,EAAS,YAAY;AACnC,aAAa,GACd,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,YAAY,EAAW,UAAU;AACjC,UAAU,EAAa,WAAW;AAClC,gBAAgB,EAAO,mBAAmB;AAC1C,aAAa,EAAU,SAAS;AAChC,cAAc,EAAS,cAAc;AACrC,eAAe,EAAQ,SAAS;AAChC,QAAQ,EAAe,SAAS;AAChC,SAAS,EAAc,SAAS;AAChC,UAAU,EAAa,OAAO;AAC9B,UAAU,EAAa,UAAU;AACjC,OAAO,EAAgB,cAAc;AACrC,SAAS,EAAc,SAAS;AAChC,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,YAAY,EAEV,SAAS,EAAc,OAAO;AAC9B,UAAU,EAAa,QAAQ;AAC/B,UAAU,EAAa,aAAa;AACpC,YAAY,EAAW,QAAQ;AAC/B,WAAW,EAAY,WAAW;AAClC,SAAS,EAAc,OAAO;AAC9B,YAAY,EAAW,QAAQ;AAC/B,MAAM,EAAiB,OAAO;AAC9B,cAAc,EAAS,SAAS;AAGhC,mBAAmB,EAAI,WAAW;AAClC,kBAAkB,EAAK,eAAe;AAGtC,eAAe,EAAQ,QAAQ;AAC/B,cAAc,EAAS,QAAQ;AAC/B,gBAAgB,EAAO,QAAQ;AAC/B,eAAe,EAAQ,QAAQ;AAC/B,kBAAkB,EAAK,SAAS;AAChC,gBAAgB,EAAO,UAAU;AACjC,yBAAyB,EAAG,aAAa;AACzC,YAAY,EAAW,UAAU;AAGjC,gBAAgB,EAAO,UAAU;AACjC,kBAAkB,EAAK,UAAU;AACjC,kBAAkB,EAAK,aAAa;AACpC,yBAAyB,EAAM,qBAAqB;AACpD,2BAA2B,EAAI,uBAAuB;AACtD,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @edgeone/vite-plugin-adapter
3
+ *
4
+ * EdgeOne 平台的核心适配器插件
5
+ *
6
+ * 本包为构建框架特定适配器提供基础设施,主要功能包括:
7
+ * - 构建产物检测和处理
8
+ * - 使用 esbuild 打包服务端代码
9
+ * - 静态资源管理
10
+ * - 路由配置生成
11
+ * - 生成 EdgeOne 部署所需的 meta.json 配置文件
12
+ *
13
+ * 使用场景:
14
+ * 1. 直接使用核心适配器构建自定义适配器
15
+ * 2. 作为其他框架适配器(如 React Router、TanStack Start)的基础依赖
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * // 直接使用核心适配器创建自定义适配器
20
+ * import { createCoreAdapter } from '@edgeone/vite-plugin-adapter';
21
+ *
22
+ * export default defineConfig({
23
+ * plugins: [
24
+ * createCoreAdapter({
25
+ * verbose: true, // 启用详细日志
26
+ * hooks: {
27
+ * // 自定义路由生成逻辑
28
+ * generateRoutes: async (ctx) => [...],
29
+ * // 自定义服务端包装器生成逻辑
30
+ * generateServerWrapper: async (ctx, config) => '...',
31
+ * }
32
+ * })
33
+ * ]
34
+ * });
35
+ * ```
36
+ */
37
+ // ==================== 核心插件导出 ====================
38
+ // createCoreAdapter: 创建核心适配器插件的工厂函数
39
+ export { createCoreAdapter, default } from "./core.js";
40
+ // ==================== 打包工具导出 ====================
41
+ export { bundleServerCode, // 使用 esbuild 打包服务端代码
42
+ createServerWrapper, // 创建服务端包装器文件
43
+ cleanupWrapper, // 清理临时包装器文件
44
+ getBundleSize, // 获取打包结果的文件大小
45
+ } from "./bundler.js";
46
+ // ==================== 工具函数导出 ====================
47
+ export { createLogger, // 创建日志记录器
48
+ pathExists, // 检查路径是否存在
49
+ findExistingPath, // 从候选列表中找到第一个存在的路径
50
+ copyDirectory, // 递归复制目录
51
+ cleanDirectory, // 清理目录(删除后重建)
52
+ ensureDirectory, // 确保目录存在
53
+ readFile, // 读取文件内容
54
+ writeFile, // 写入文件内容
55
+ deleteFile, // 删除文件
56
+ formatSize, // 格式化文件大小
57
+ waitFor, // 等待条件满足(带重试)
58
+ listFiles, // 列出目录内容
59
+ countFiles, // 递归统计文件数量
60
+ } from "./utils.js";
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,mDAAmD;AACnD,oCAAoC;AACpC,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEvD,mDAAmD;AACnD,OAAO,EACL,gBAAgB,EAAO,qBAAqB;AAC5C,mBAAmB,EAAI,aAAa;AACpC,cAAc,EAAS,YAAY;AACnC,aAAa,EAAU,cAAc;EACtC,MAAM,cAAc,CAAC;AAEtB,mDAAmD;AACnD,OAAO,EACL,YAAY,EAAW,UAAU;AACjC,UAAU,EAAa,WAAW;AAClC,gBAAgB,EAAO,mBAAmB;AAC1C,aAAa,EAAU,SAAS;AAChC,cAAc,EAAS,cAAc;AACrC,eAAe,EAAQ,SAAS;AAChC,QAAQ,EAAe,SAAS;AAChC,SAAS,EAAc,SAAS;AAChC,UAAU,EAAa,OAAO;AAC9B,UAAU,EAAa,UAAU;AACjC,OAAO,EAAgB,cAAc;AACrC,SAAS,EAAc,SAAS;AAChC,UAAU,EAAa,WAAW;EACnC,MAAM,YAAY,CAAC"}