@uni-helper/vite-plugin-uni-pages 0.4.8 → 0.5.0
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 +388 -50
- package/client.d.ts +2 -4
- package/dist/index.d.mts +708 -357
- package/dist/index.mjs +1739 -870
- package/package.json +27 -35
- package/dist/index.cjs +0 -1399
- package/dist/index.d.cts +0 -569
- package/index.d.ts +0 -4
package/dist/index.d.mts
CHANGED
|
@@ -1,570 +1,921 @@
|
|
|
1
|
-
import { createRequire } from "node:module";
|
|
2
1
|
import { FSWatcher } from "chokidar";
|
|
3
2
|
import { Logger, Plugin, ViteDevServer } from "vite";
|
|
4
|
-
import fs from "node:fs";
|
|
5
3
|
import Debug from "debug";
|
|
6
4
|
import { LoadConfigSource } from "unconfig";
|
|
7
|
-
import
|
|
8
|
-
import
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import { CallExpression } from "@babel/types";
|
|
9
7
|
import { SFCDescriptor, SFCParseOptions } from "@vue/compiler-sfc";
|
|
10
|
-
import {
|
|
11
|
-
export * from "@uni-helper/uni-pages-types";
|
|
12
|
-
|
|
13
|
-
//#region \0rolldown/runtime.js
|
|
14
|
-
declare namespace index_d_exports$1 {
|
|
15
|
-
export { defineUniPages };
|
|
16
|
-
}
|
|
17
|
-
import * as import__uni_helper_uni_pages_types from "@uni-helper/uni-pages-types";
|
|
8
|
+
import { PageItem, PagesConfig, SubPackages, TabBar, TabBarItem, UserPagesConfig } from "@uni-helper/uni-pages-types";
|
|
9
|
+
export type * from "@uni-helper/uni-pages-types";
|
|
10
|
+
//#region src/condition.d.ts
|
|
18
11
|
/**
|
|
19
|
-
*
|
|
20
|
-
* Used in pages.config.ts configuration file to provide type hints and validation
|
|
12
|
+
* 按平台写不同页面配置的小工具
|
|
21
13
|
*
|
|
22
|
-
* @
|
|
23
|
-
*
|
|
14
|
+
* 用法来自 @uni-ku/pages-json:define().ifdef().ifndef()。用户在
|
|
15
|
+
* 函数式 definePage 里调用 define() 拿到可链式写的定义对象,先写
|
|
16
|
+
* 所有平台共用的配置,再按平台加不同的部分。插件在宏求值完就立刻
|
|
17
|
+
* 按当前平台算出最终结果,后面的步骤只会看到普通对象。
|
|
24
18
|
*/
|
|
25
|
-
declare function defineUniPages(config: UserPagesConfig): UserPagesConfig;
|
|
26
|
-
//#endregion
|
|
27
|
-
//#region src/page.d.ts
|
|
28
19
|
/**
|
|
29
|
-
*
|
|
20
|
+
* 可以链式调用的"按平台写配置"对象
|
|
30
21
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* 2. Parse page metadata defined by definePage macro
|
|
34
|
-
* 3. Provide tabBar configuration information
|
|
35
|
-
* 4. Track page file change status
|
|
22
|
+
* 用户在函数式 definePage 里通过 define() 创建。分支按写的顺序生效,
|
|
23
|
+
* 后写的同名键会盖掉先写的。
|
|
36
24
|
*/
|
|
37
|
-
declare class
|
|
38
|
-
/**
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
* @param path - Page path information
|
|
54
|
-
*/
|
|
55
|
-
constructor(ctx: PageContext, path: PagePath);
|
|
56
|
-
/**
|
|
57
|
-
* Get page metadata
|
|
58
|
-
* Parse configuration defined by definePage macro and return metadata for pages.json
|
|
59
|
-
*
|
|
60
|
-
* @param forceUpdate - Whether to force update, ignoring cache
|
|
61
|
-
* @returns Page metadata object
|
|
62
|
-
*/
|
|
63
|
-
getPageMeta(forceUpdate?: boolean): Promise<PageMetaDatum>;
|
|
64
|
-
/**
|
|
65
|
-
* Get page tabBar configuration
|
|
66
|
-
* Extract tabBar related configuration from definePage macro
|
|
67
|
-
*
|
|
68
|
-
* @param forceUpdate - Whether to force update, ignoring cache
|
|
69
|
-
* @returns tabBar configuration object, or undefined if page doesn't define tabBar
|
|
70
|
-
*/
|
|
71
|
-
getTabBar(forceUpdate?: boolean): Promise<index_d_exports$1.TabBarItem & {
|
|
72
|
-
index: number;
|
|
73
|
-
} | undefined>;
|
|
74
|
-
/**
|
|
75
|
-
* Check if the page has changed
|
|
76
|
-
* @returns Whether the page has changed
|
|
77
|
-
*/
|
|
78
|
-
hasChanged(): boolean;
|
|
79
|
-
/**
|
|
80
|
-
* Read page file and parse metadata
|
|
81
|
-
* Extract configuration defined by definePage macro from Vue SFC
|
|
82
|
-
*/
|
|
83
|
-
read(): Promise<void>;
|
|
84
|
-
private readPageMetaFromFile;
|
|
25
|
+
declare class DefineConditional {
|
|
26
|
+
/** 所有平台共用的基础配置 */
|
|
27
|
+
private readonly base;
|
|
28
|
+
/** 按写的顺序记下的条件分支 */
|
|
29
|
+
private readonly branches;
|
|
30
|
+
constructor(base: Record<string, any>);
|
|
31
|
+
/** 仅在给定平台应用 `partial` */
|
|
32
|
+
ifdef(platform: string | string[], partial: Record<string, any>): this;
|
|
33
|
+
/** 在除给定平台之外的所有平台应用 `partial` */
|
|
34
|
+
ifndef(platform: string | string[], partial: Record<string, any>): this;
|
|
35
|
+
/**
|
|
36
|
+
* 算出某个平台最终用的普通配置:从基础配置开始,按写的顺序把每个
|
|
37
|
+
* 匹配的分支合并进去。平台列表里 `h5` 和 `web` 互相通用(见
|
|
38
|
+
* platformMatches)。
|
|
39
|
+
*/
|
|
40
|
+
resolve(platform: string): Record<string, any>;
|
|
85
41
|
}
|
|
42
|
+
/** 判断宏求值的结果是不是一个条件定义 */
|
|
43
|
+
declare function isConditional(obj: unknown): obj is DefineConditional;
|
|
86
44
|
/**
|
|
87
|
-
*
|
|
88
|
-
* Compatible with different versions of @vue/compiler-sfc
|
|
89
|
-
*
|
|
90
|
-
* @param code - Vue SFC source code
|
|
91
|
-
* @param options - Parse options
|
|
92
|
-
* @returns SFC descriptor object
|
|
93
|
-
*/
|
|
94
|
-
declare function parseSFC(code: string, options?: SFCParseOptions): SFCDescriptor;
|
|
95
|
-
/**
|
|
96
|
-
* Try to extract page metadata defined by definePage macro from SFC
|
|
97
|
-
* Support using definePage in script setup or regular script
|
|
98
|
-
*
|
|
99
|
-
* @param sfc - Vue SFC descriptor
|
|
100
|
-
* @returns Page metadata object, or undefined if definePage is not found
|
|
101
|
-
*/
|
|
102
|
-
declare function tryPageMetaFromMacro(sfc: SFCDescriptor): Promise<UserPageMeta | undefined>;
|
|
103
|
-
/**
|
|
104
|
-
* Find definePage macro call in AST
|
|
105
|
-
* Support function expressions, arrow functions and object expressions as arguments
|
|
45
|
+
* 把条件定义算成某个平台的普通配置
|
|
106
46
|
*
|
|
107
|
-
* @
|
|
108
|
-
*
|
|
109
|
-
* @returns definePage call expression, or undefined if not found
|
|
47
|
+
* 简单包了一层 {@link DefineConditional.resolve},调用方不用导入
|
|
48
|
+
* 这个类。
|
|
110
49
|
*/
|
|
111
|
-
declare function
|
|
50
|
+
declare function resolveConditional(cond: DefineConditional, platform: string): Record<string, any>;
|
|
51
|
+
//#endregion
|
|
52
|
+
//#region src/logger.d.ts
|
|
112
53
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
* @param stmts - AST statement array
|
|
117
|
-
* @returns Import declaration array
|
|
54
|
+
* 调试日志工具
|
|
55
|
+
* 基于 debug 包做分级日志输出
|
|
56
|
+
* 通过环境变量 DEBUG=vite-plugin-uni-pages:* 开启
|
|
118
57
|
*/
|
|
119
|
-
declare
|
|
58
|
+
declare const debug: {
|
|
59
|
+
/** HMR 相关日志 */
|
|
60
|
+
hmr: Debug.Debugger;
|
|
61
|
+
/** 配置项相关日志 */
|
|
62
|
+
options: Debug.Debugger;
|
|
63
|
+
/** 主包页面扫描日志 */
|
|
64
|
+
pages: Debug.Debugger;
|
|
65
|
+
/** 子包页面扫描日志 */
|
|
66
|
+
subPages: Debug.Debugger;
|
|
67
|
+
/** 错误日志 */
|
|
68
|
+
error: Debug.Debugger;
|
|
69
|
+
/** 缓存相关日志 */
|
|
70
|
+
cache: Debug.Debugger;
|
|
71
|
+
/** 声明文件生成日志 */
|
|
72
|
+
declaration: Debug.Debugger;
|
|
73
|
+
/** definePage 宏解析日志 */
|
|
74
|
+
definePage: Debug.Debugger;
|
|
75
|
+
};
|
|
120
76
|
//#endregion
|
|
121
77
|
//#region src/context.d.ts
|
|
122
78
|
/**
|
|
123
|
-
*
|
|
79
|
+
* 页面上下文:负责扫描页面、加载配置、合并页面信息、生成 pages.json
|
|
124
80
|
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* 4. Merge page configurations and generate pages.json
|
|
130
|
-
* 5. Provide virtual module and HMR support
|
|
81
|
+
* 做的事情按固定顺序是:加载用户配置 → 扫描页面文件 → 合并页面
|
|
82
|
+
* 信息 → 写入 pages.json。这个顺序由 {@link updatePagesJSON}(完整
|
|
83
|
+
* 流程)或 {@link scanAndMerge}(只算不写)管理,调用方不用关心
|
|
84
|
+
* 内部步骤。
|
|
131
85
|
*/
|
|
132
86
|
declare class PageContext {
|
|
133
87
|
private _server;
|
|
134
|
-
/**
|
|
135
|
-
pagesGlobConfig:
|
|
136
|
-
/**
|
|
88
|
+
/** 从用户配置文件(pages.config.ts)解析出的配置对象 */
|
|
89
|
+
pagesGlobConfig: PagesConfig | undefined;
|
|
90
|
+
/** 用户配置文件的来源路径列表 */
|
|
137
91
|
pagesConfigSourcePaths: string[];
|
|
138
|
-
/**
|
|
92
|
+
/** 主包页面映射,键为页面文件的绝对路径 */
|
|
139
93
|
pages: Map<string, Page>;
|
|
140
|
-
/**
|
|
94
|
+
/** 子包页面映射,键为子包根目录,值为该子包下的页面映射 */
|
|
141
95
|
subPages: Map<string, Map<string, Page>>;
|
|
142
|
-
/**
|
|
143
|
-
pageMetaData:
|
|
144
|
-
/**
|
|
145
|
-
subPageMetaData:
|
|
146
|
-
/**
|
|
96
|
+
/** 主包页面配置数组,用于生成 pages.json 的 pages 字段 */
|
|
97
|
+
pageMetaData: InternalPages;
|
|
98
|
+
/** 子包页面配置数组,用于生成 pages.json 的 subPackages 字段 */
|
|
99
|
+
subPageMetaData: SubPackages;
|
|
100
|
+
/**
|
|
101
|
+
* 最近一次合并出的 tabBar(配置文件与 definePage 声明的合体)。
|
|
102
|
+
* 类型声明生成 tab 页列表时用它,definePage 声明的 tabBar 页才能
|
|
103
|
+
* 一起从 navigateTo 的 url 类型里排除
|
|
104
|
+
*/
|
|
105
|
+
tabBar: TabBar | undefined;
|
|
106
|
+
/** 生成的 pages.json 文件路径 */
|
|
147
107
|
resolvedPagesJSONPath: string;
|
|
148
|
-
|
|
149
|
-
private resolvedPagesJSONNewline?;
|
|
150
|
-
private resolvedPagesJSONEofNewline?;
|
|
151
|
-
/** Original options passed by the user */
|
|
152
|
-
rawOptions: UserOptions;
|
|
153
|
-
/** Project root directory */
|
|
108
|
+
/** 项目根目录 */
|
|
154
109
|
root: string;
|
|
155
|
-
/**
|
|
110
|
+
/** 解析后的配置项 */
|
|
156
111
|
options: ResolvedOptions;
|
|
112
|
+
/** 当前平台标识,如 'mp-weixin';由调用方传入,不依赖模块加载时冻结的环境 */
|
|
113
|
+
readonly platform: string;
|
|
157
114
|
logger?: Logger;
|
|
158
|
-
/**
|
|
115
|
+
/** 是否与 vite-plugin-uni-platform 插件协同工作 */
|
|
159
116
|
withUniPlatform: boolean;
|
|
160
|
-
/**
|
|
161
|
-
private
|
|
117
|
+
/** pages.json 中页面路径的解析基准路径 */
|
|
118
|
+
private get basePath();
|
|
162
119
|
/**
|
|
163
|
-
*
|
|
164
|
-
* @param userOptions -
|
|
165
|
-
* @param viteRoot - Vite
|
|
120
|
+
* 创建 PageContext 实例
|
|
121
|
+
* @param userOptions - 用户配置项
|
|
122
|
+
* @param viteRoot - Vite 项目根目录,默认为当前工作目录
|
|
123
|
+
* @param platform - 当前平台标识,默认取 uni-env 的平台
|
|
166
124
|
*/
|
|
167
|
-
constructor(userOptions: UserOptions, viteRoot?: string);
|
|
125
|
+
constructor(userOptions: UserOptions, viteRoot?: string, platform?: string);
|
|
168
126
|
/**
|
|
169
|
-
*
|
|
170
|
-
* @param logger - Vite logger
|
|
127
|
+
* 设置 Vite logger
|
|
128
|
+
* @param logger - Vite logger 实例
|
|
171
129
|
*/
|
|
172
130
|
setLogger(logger: Logger): void;
|
|
173
131
|
/**
|
|
174
|
-
*
|
|
175
|
-
*
|
|
132
|
+
* 加载用户页面配置文件(如 pages.config.ts)
|
|
133
|
+
* 使用 unconfig 加载配置,支持多种配置文件格式
|
|
176
134
|
*/
|
|
177
135
|
loadUserPagesConfig(): Promise<void>;
|
|
178
136
|
/**
|
|
179
|
-
*
|
|
180
|
-
*
|
|
137
|
+
* 按顺序跑完扫描与合并:先扫描主包和子包的页面,再合并它们的
|
|
138
|
+
* 信息。步骤顺序只维护在这里,调用方和测试都不用关心。
|
|
181
139
|
*/
|
|
182
|
-
|
|
140
|
+
scanAndMerge(): Promise<void>;
|
|
183
141
|
/**
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*/
|
|
187
|
-
scanSubPages(): Promise<void>;
|
|
188
|
-
/**
|
|
189
|
-
* Set up Vite dev server for HMR and file watching
|
|
190
|
-
* @param server - Vite dev server instance
|
|
142
|
+
* 设置 Vite 开发服务器,用于 HMR 与文件监听
|
|
143
|
+
* @param server - Vite 开发服务器实例
|
|
191
144
|
*/
|
|
192
145
|
setupViteServer(server: ViteDevServer): void;
|
|
193
146
|
/**
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
* @param watcher - chokidar
|
|
147
|
+
* 设置文件监听器,监听页面文件与配置文件变更
|
|
148
|
+
* 页面文件或配置文件变化时自动更新 pages.json
|
|
149
|
+
* @param watcher - chokidar 文件监听器实例
|
|
197
150
|
*/
|
|
198
151
|
setupWatcher(watcher: FSWatcher): Promise<void>;
|
|
199
152
|
/**
|
|
200
|
-
*
|
|
201
|
-
*
|
|
153
|
+
* 页面更新回调,页面文件或配置变化时触发
|
|
154
|
+
* 负责使虚拟模块失效并通知浏览器整页刷新
|
|
202
155
|
*/
|
|
203
156
|
onUpdate(): void;
|
|
204
157
|
/**
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
158
|
+
* 更新 pages.json 文件
|
|
159
|
+
* 这是负责协调整个页面配置生成流程的核心方法:
|
|
160
|
+
* 1. 检查文件变更(指定 filepath 时)
|
|
161
|
+
* 2. 加载用户配置
|
|
162
|
+
* 3. 扫描页面文件
|
|
163
|
+
* 4. 合并页面配置
|
|
164
|
+
* 5. 生成并写入 pages.json
|
|
165
|
+
* @param filepath - 发生变更的文件路径,用于增量更新判断
|
|
166
|
+
* @returns pages.json 是否成功更新
|
|
210
167
|
*/
|
|
211
|
-
|
|
168
|
+
updatePagesJSON(filepath?: string): Promise<boolean>;
|
|
212
169
|
/**
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
* @returns
|
|
170
|
+
* 生成虚拟模块内容
|
|
171
|
+
* 返回包含 pages 与 subPackages 导出的 JavaScript 代码
|
|
172
|
+
* @returns 虚拟模块代码字符串
|
|
216
173
|
*/
|
|
217
|
-
|
|
174
|
+
virtualModule(): string;
|
|
218
175
|
/**
|
|
219
|
-
*
|
|
220
|
-
*
|
|
176
|
+
* 将主包路由数据解析为 JSON 字符串
|
|
177
|
+
* @returns 主包页面配置的 JSON 字符串
|
|
221
178
|
*/
|
|
222
|
-
|
|
179
|
+
resolveRoutes(): string;
|
|
223
180
|
/**
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
* Preserves sub-package level properties like plugins from user config
|
|
181
|
+
* 将子包路由数据解析为 JSON 字符串
|
|
182
|
+
* @returns 子包页面配置的 JSON 字符串
|
|
227
183
|
*/
|
|
228
|
-
|
|
184
|
+
resolveSubRoutes(): string;
|
|
229
185
|
/**
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
* 2. Load user configuration
|
|
234
|
-
* 3. Scan page files
|
|
235
|
-
* 4. Merge page metadata
|
|
236
|
-
* 5. Generate and write pages.json
|
|
237
|
-
* @param filepath - Changed file path for incremental update judgment
|
|
238
|
-
* @returns Whether pages.json was successfully updated
|
|
186
|
+
* 解析 tabBar 配置
|
|
187
|
+
* 将页面定义的 tabBar 项与配置文件定义的 tabBar 合并
|
|
188
|
+
* @returns 合并后的 tabBar 配置对象,无 tabBar 时为 undefined
|
|
239
189
|
*/
|
|
240
|
-
|
|
190
|
+
resolveTabBar(): Promise<TabBar | undefined>;
|
|
241
191
|
/**
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
* @returns Virtual module code string
|
|
192
|
+
* 生成 TypeScript 声明文件
|
|
193
|
+
* 为页面路径生成类型定义,导航时提供类型提示
|
|
245
194
|
*/
|
|
246
|
-
|
|
195
|
+
generateDeclaration(): Promise<void> | undefined;
|
|
247
196
|
/**
|
|
248
|
-
*
|
|
249
|
-
*
|
|
197
|
+
* 扫描主包页面目录并收集所有页面文件路径
|
|
198
|
+
* 根据配置的 dirs 选项扫描对应目录
|
|
250
199
|
*/
|
|
251
|
-
|
|
200
|
+
private scanPages;
|
|
252
201
|
/**
|
|
253
|
-
*
|
|
254
|
-
* @
|
|
202
|
+
* 按页面文件绝对路径查找被跟踪的页面(主包或任一子包)
|
|
203
|
+
* @param filepath - 页面文件的绝对路径
|
|
204
|
+
* @returns 被跟踪的页面,文件未被跟踪时为 undefined
|
|
255
205
|
*/
|
|
256
|
-
|
|
206
|
+
private findPage;
|
|
257
207
|
/**
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
* @returns Merged tabBar configuration object, or undefined if no tabBar exists
|
|
208
|
+
* 扫描子包页面目录并收集所有子包页面文件路径
|
|
209
|
+
* 根据配置的 subPackages 选项扫描对应目录
|
|
261
210
|
*/
|
|
262
|
-
|
|
211
|
+
private scanSubPages;
|
|
263
212
|
/**
|
|
264
|
-
*
|
|
265
|
-
*
|
|
213
|
+
* 解析 pages 规则并设置页面类型
|
|
214
|
+
* @param pages 页面路径映射
|
|
215
|
+
* @param packageType 页面包类型(主包或子包)
|
|
216
|
+
* @param overrides 自定义页面配置
|
|
217
|
+
* @returns pages 规则
|
|
266
218
|
*/
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
219
|
+
private parsePages;
|
|
220
|
+
/**
|
|
221
|
+
* 设置首页
|
|
222
|
+
* @param result pages 规则数组
|
|
223
|
+
* @returns pages 规则
|
|
224
|
+
*/
|
|
225
|
+
private setHomePage;
|
|
226
|
+
/**
|
|
227
|
+
* 合并主包页面配置
|
|
228
|
+
* 过滤掉属于子包的页面,再解析页面配置并与用户配置合并
|
|
229
|
+
*/
|
|
230
|
+
private mergePageMetaData;
|
|
231
|
+
/**
|
|
232
|
+
* 合并子包页面配置
|
|
233
|
+
* 为每个子包解析页面配置并处理子包配置继承
|
|
234
|
+
* 保留用户配置中子包级别的属性(如 plugins)
|
|
235
|
+
*/
|
|
236
|
+
private mergeSubPageMetaData;
|
|
273
237
|
}
|
|
238
|
+
/**
|
|
239
|
+
* 应用 vite-plugin-uni-platform 的页面文件名后缀规则(如 `index.h5.vue`
|
|
240
|
+
* 对应页面 `index`):丢弃其他平台的后缀页面,保留当前平台的并把文件名
|
|
241
|
+
* 里的后缀剥掉。
|
|
242
|
+
*
|
|
243
|
+
* 带点的判断只看路径最后一段(文件名),和 vite-plugin-uni-platform
|
|
244
|
+
* 自己的规则一致(它也只在文件名上判断后缀),目录名里的点(如
|
|
245
|
+
* `pages/v1.2/detail`)不算平台后缀。
|
|
246
|
+
*
|
|
247
|
+
* 注意后缀匹配仍是原始的 `path.includes(platform)`,没有做 definePage
|
|
248
|
+
* 那边 h5/web 的别名换算(见 condition.ts 的 platformMatches):
|
|
249
|
+
* UNI_PLATFORM=web 时,`.h5` 后缀的页面会被过滤掉。这是一直以来的
|
|
250
|
+
* 行为,为了和 vite-plugin-uni-platform 自己的命名规则保持一致而保留。
|
|
251
|
+
*
|
|
252
|
+
* @param pages - 合并后的主包页面配置
|
|
253
|
+
* @param platform - 当前平台标识
|
|
254
|
+
* @returns 过滤并剥掉后缀的新数组,入参不被修改
|
|
255
|
+
*/
|
|
256
|
+
declare function filterPlatformSuffixPages(pages: InternalPages, platform: string): InternalPages;
|
|
274
257
|
//#endregion
|
|
275
|
-
//#region src/
|
|
258
|
+
//#region src/page.d.ts
|
|
276
259
|
/**
|
|
277
|
-
*
|
|
278
|
-
* When page configuration changes, the virtual module needs to be invalidated to regenerate content
|
|
260
|
+
* 表示一个 Vue 页面文件的 Page 类
|
|
279
261
|
*
|
|
280
|
-
*
|
|
262
|
+
* 职责:
|
|
263
|
+
* 1. 读取页面文件内容
|
|
264
|
+
* 2. 解析 definePage 宏定义的页面配置
|
|
265
|
+
* 3. 提供 tabBar 配置信息
|
|
266
|
+
* 4. 跟踪页面文件变更状态
|
|
281
267
|
*/
|
|
282
|
-
declare
|
|
268
|
+
declare class Page {
|
|
269
|
+
/** 页面上下文实例 */
|
|
270
|
+
ctx: PageContext;
|
|
271
|
+
/** 页面路径信息,包含相对路径与绝对路径 */
|
|
272
|
+
path: PagePath;
|
|
273
|
+
/** 页面 URI,用于 pages.json 的 path 字段 */
|
|
274
|
+
uri: string;
|
|
275
|
+
/** 页面是否发生变化,用于增量更新判断 */
|
|
276
|
+
changed: boolean;
|
|
277
|
+
/**
|
|
278
|
+
* 页面是否通过 `definePage(null)` 或函数式宏在当前平台返回 null 而
|
|
279
|
+
* 退出了 pages.json
|
|
280
|
+
*/
|
|
281
|
+
skipped: boolean;
|
|
282
|
+
/** 页面文件是否至少被读取过一次 */
|
|
283
|
+
private loaded;
|
|
284
|
+
/** 页面配置的原始 JSON 字符串,用于变更检测 */
|
|
285
|
+
private raw;
|
|
286
|
+
/** 解析后的页面配置 */
|
|
287
|
+
private meta;
|
|
288
|
+
/**
|
|
289
|
+
* 创建页面实例
|
|
290
|
+
* @param ctx - 页面上下文实例
|
|
291
|
+
* @param path - 页面路径信息
|
|
292
|
+
*/
|
|
293
|
+
constructor(ctx: PageContext, path: PagePath);
|
|
294
|
+
/**
|
|
295
|
+
* 获取页面配置
|
|
296
|
+
* 解析 definePage 宏定义的配置并返回用于 pages.json 的配置
|
|
297
|
+
*
|
|
298
|
+
* @param forceUpdate - 是否强制更新,忽略缓存
|
|
299
|
+
* @returns 页面配置对象
|
|
300
|
+
*/
|
|
301
|
+
getPageMeta(forceUpdate?: boolean): Promise<InternalPageItem>;
|
|
302
|
+
/**
|
|
303
|
+
* 获取页面 tabBar 配置
|
|
304
|
+
* 从 definePage 宏中提取 tabBar 相关配置
|
|
305
|
+
*
|
|
306
|
+
* @param forceUpdate - 是否强制更新,忽略缓存
|
|
307
|
+
* @returns tabBar 配置对象,页面未定义 tabBar 时返回 undefined
|
|
308
|
+
*/
|
|
309
|
+
getTabBar(forceUpdate?: boolean): Promise<TabBarItem & {
|
|
310
|
+
index: number;
|
|
311
|
+
} | undefined>;
|
|
312
|
+
/**
|
|
313
|
+
* 确保页面文件至少被读取过一次,使 `skipped` 与缓存的配置反映
|
|
314
|
+
* 当前文件内容
|
|
315
|
+
*/
|
|
316
|
+
ensureLoaded(): Promise<void>;
|
|
317
|
+
/**
|
|
318
|
+
* 检查页面是否发生变化
|
|
319
|
+
* @returns 页面是否发生变化
|
|
320
|
+
*/
|
|
321
|
+
hasChanged(): boolean;
|
|
322
|
+
/**
|
|
323
|
+
* 读取页面文件并解析配置
|
|
324
|
+
* 从 Vue SFC 中提取 definePage 宏定义的配置
|
|
325
|
+
*/
|
|
326
|
+
read(): Promise<void>;
|
|
327
|
+
private readPageMetaFromFile;
|
|
328
|
+
}
|
|
329
|
+
//#endregion
|
|
330
|
+
//#region src/types.d.ts
|
|
283
331
|
/**
|
|
284
|
-
*
|
|
285
|
-
* Uses debug package for leveled log output
|
|
286
|
-
* Enable via environment variable DEBUG=vite-plugin-uni-pages:*
|
|
332
|
+
* 从对象类型中排除索引签名键,仅保留显式键
|
|
287
333
|
*/
|
|
288
|
-
|
|
289
|
-
/** HMR related logs */hmr: Debug.Debugger; /** Configuration options related logs */
|
|
290
|
-
options: Debug.Debugger; /** Main package page scanning logs */
|
|
291
|
-
pages: Debug.Debugger; /** Sub-package page scanning logs */
|
|
292
|
-
subPages: Debug.Debugger; /** Error logs */
|
|
293
|
-
error: Debug.Debugger; /** Cache related logs */
|
|
294
|
-
cache: Debug.Debugger; /** Declaration file generation logs */
|
|
295
|
-
declaration: Debug.Debugger; /** definePage macro parsing logs */
|
|
296
|
-
definePage: Debug.Debugger;
|
|
297
|
-
};
|
|
334
|
+
type ExcludeIndexSignature<T> = { [K in keyof T as string extends K ? never : number extends K ? never : symbol extends K ? never : K]: T[K]; };
|
|
298
335
|
/**
|
|
299
|
-
*
|
|
300
|
-
*
|
|
301
|
-
*
|
|
336
|
+
* 插件内部的页面信息
|
|
337
|
+
* 在标准 PageItem 之上加了插件自己用的 `type` 标记。
|
|
338
|
+
* 插件写的条目会带着它进 pages.json(之后的运行靠它找回首页);
|
|
339
|
+
* 只有比较两个条目相不相等时,会先把它去掉再比
|
|
302
340
|
*/
|
|
303
|
-
|
|
341
|
+
interface InternalPageItem extends PageItem {
|
|
342
|
+
/** 插件用于识别首页的内部标记 */
|
|
343
|
+
type?: 'home' | 'page';
|
|
344
|
+
}
|
|
345
|
+
type InternalPages = InternalPageItem[];
|
|
304
346
|
/**
|
|
305
|
-
*
|
|
306
|
-
*
|
|
307
|
-
*
|
|
308
|
-
* @param path - File path
|
|
309
|
-
* @returns Whether it's a target file
|
|
347
|
+
* 用户可在 definePage 宏中定义的 tabBar 项
|
|
348
|
+
* 在文档级 TabBarItem 之上扩展插件专有字段
|
|
310
349
|
*/
|
|
311
|
-
|
|
350
|
+
interface UserTabBarItem extends Partial<TabBarItem> {
|
|
351
|
+
/**
|
|
352
|
+
* 页面路径,省略时由插件自动填充
|
|
353
|
+
*
|
|
354
|
+
* @deprecated 改用 pages.json 的 pagePath
|
|
355
|
+
*/
|
|
356
|
+
pagePath?: string;
|
|
357
|
+
/**
|
|
358
|
+
* 插件用于排序 tabBar 项的索引
|
|
359
|
+
*
|
|
360
|
+
* @default 0
|
|
361
|
+
*/
|
|
362
|
+
index?: number;
|
|
363
|
+
[x: string]: any;
|
|
364
|
+
}
|
|
312
365
|
/**
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
* TODO: support merge middleware
|
|
366
|
+
* 用户可在 definePage 宏中定义的页面配置
|
|
367
|
+
* 在文档级 PageItem 之上扩展插件专有字段
|
|
316
368
|
*/
|
|
317
|
-
|
|
369
|
+
interface UserPageItem extends Partial<PageItem> {
|
|
370
|
+
/**
|
|
371
|
+
* @deprecated 改用 pages.json 的 path
|
|
372
|
+
*/
|
|
373
|
+
path?: string;
|
|
374
|
+
/**
|
|
375
|
+
* 页面类型,设为 "home" 标记首页
|
|
376
|
+
*/
|
|
377
|
+
type?: 'home' | 'page';
|
|
378
|
+
/**
|
|
379
|
+
* tabBar 项配置,插件收集它生成 pages.json 的 tabBar.list
|
|
380
|
+
*/
|
|
381
|
+
tabBar?: UserTabBarItem;
|
|
382
|
+
[x: string]: any;
|
|
383
|
+
}
|
|
384
|
+
/** 值或值的 Promise */
|
|
385
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
386
|
+
/** 值或返回该值的函数 */
|
|
387
|
+
type MaybeCallable<T> = T | (() => T);
|
|
388
|
+
/** 值、返回该值的函数,或返回该值 Promise 的函数 */
|
|
389
|
+
type MaybePromiseCallable<T> = T | (() => T) | (() => Promise<T>);
|
|
318
390
|
/**
|
|
319
|
-
*
|
|
391
|
+
* 注入函数式 definePage 宏的上下文
|
|
392
|
+
*/
|
|
393
|
+
interface DefinePageContext {
|
|
394
|
+
/** 当前平台标识,如 'mp-weixin' */
|
|
395
|
+
platform: string;
|
|
396
|
+
/**
|
|
397
|
+
* 开始写"按平台不同"的页面配置
|
|
398
|
+
*
|
|
399
|
+
* 用法:`define(base).ifdef(platforms, partial).ifndef(platforms, partial)`。
|
|
400
|
+
* 匹配的分支按写的顺序合并进 `base`:对象一层层合并,数组和普通值
|
|
401
|
+
* 整个替换。`h5` 和 `web` 是同一个平台的两个名字,写哪个都算
|
|
402
|
+
* 两个都匹配。
|
|
403
|
+
*/
|
|
404
|
+
define: (base: UserPageItem) => DefineConditional;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* 在 Vue 页面文件中定义页面配置
|
|
408
|
+
* 宏调用会在构建时被插件移除
|
|
320
409
|
*
|
|
321
|
-
*
|
|
322
|
-
*
|
|
323
|
-
* @param options.code - TypeScript code content to execute
|
|
324
|
-
* @param options.filename - Script filename for error location and context
|
|
325
|
-
* @returns Script execution result, if export is a function then execute and return its return value
|
|
410
|
+
* 返回 `null`(或直接传 `null`)可把页面从当前平台的 pages.json 里
|
|
411
|
+
* 排除。用传进来的 `define` 就能按平台写不同配置,不用自己判断平台。
|
|
326
412
|
*/
|
|
327
|
-
declare function
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
413
|
+
declare function definePage(options: UserPageItem | null | ((context: DefinePageContext) => MaybePromise<UserPageItem | DefineConditional | null>)): void;
|
|
414
|
+
/** definePage 宏的类型 */
|
|
415
|
+
type DefinePage = typeof definePage;
|
|
416
|
+
/** 调试日志类型,对应 debug 对象中的方法 */
|
|
417
|
+
type DebugType = keyof typeof debug;
|
|
332
418
|
/**
|
|
333
|
-
*
|
|
334
|
-
* @param ms - Sleep duration in milliseconds
|
|
335
|
-
* @returns Promise object
|
|
419
|
+
* @deprecated 改用 {@link DebugType}
|
|
336
420
|
*/
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
|
|
340
|
-
//#endregion
|
|
341
|
-
//#region src/types.d.ts
|
|
342
|
-
/** Debug log type, corresponding to methods in the debug object */
|
|
343
|
-
type debugType = keyof typeof debug;
|
|
344
|
-
/** Configuration source type, supports string path or unconfig LoadConfigSource object */
|
|
345
|
-
type ConfigSource = string | LoadConfigSource<index_d_exports$1.PagesConfig> | LoadConfigSource<index_d_exports$1.PagesConfig>[];
|
|
421
|
+
type debugType = DebugType;
|
|
422
|
+
/** 配置来源类型,支持字符串路径或 unconfig 的 LoadConfigSource 对象 */
|
|
423
|
+
type ConfigSource = string | LoadConfigSource<PagesConfig> | LoadConfigSource<PagesConfig>[];
|
|
346
424
|
/**
|
|
347
|
-
*
|
|
348
|
-
*
|
|
425
|
+
* 插件配置项接口
|
|
426
|
+
* 定义用户可传入的全部配置选项
|
|
427
|
+
*
|
|
428
|
+
* 内部流水线:加载用户配置 -> 扫描页面文件 -> 合并页面配置 ->
|
|
429
|
+
* 生成并写入 pages.json
|
|
349
430
|
*/
|
|
350
431
|
interface Options {
|
|
351
432
|
/**
|
|
352
|
-
*
|
|
433
|
+
* 是否为页面路径生成 TypeScript 声明
|
|
353
434
|
*
|
|
354
|
-
*
|
|
435
|
+
* 为 `true` 时在项目根目录生成 `uni-pages.d.ts`;
|
|
436
|
+
* 为字符串时作为相对项目根目录的自定义输出路径。
|
|
355
437
|
*
|
|
356
438
|
* @default true
|
|
439
|
+
* @since 0.2.9
|
|
357
440
|
*/
|
|
358
441
|
dts?: boolean | string;
|
|
359
442
|
/**
|
|
360
|
-
*
|
|
443
|
+
* 页面配置文件的加载来源
|
|
444
|
+
*
|
|
445
|
+
* 基于 unconfig,支持合并多个配置来源
|
|
361
446
|
*
|
|
362
|
-
* @default 'pages.config
|
|
447
|
+
* @default 'pages.config'
|
|
448
|
+
* @since 0.2.7
|
|
363
449
|
*/
|
|
364
450
|
configSource: ConfigSource;
|
|
365
451
|
/**
|
|
366
|
-
*
|
|
367
|
-
*
|
|
452
|
+
* 默认应用入口页面(首页)
|
|
453
|
+
*
|
|
454
|
+
* 在没有页面通过 `definePage({ type: 'home' })` 标记为首页时使用。
|
|
455
|
+
* 支持多种路径写法,兼容不同的目录布局。
|
|
456
|
+
*
|
|
457
|
+
* @default ['pages/index', 'pages/index/index']
|
|
458
|
+
* @since 0.1.9
|
|
368
459
|
*/
|
|
369
|
-
homePage: string;
|
|
460
|
+
homePage: string | string[];
|
|
370
461
|
/**
|
|
371
|
-
*
|
|
462
|
+
* 是否自动扫描目录并把页面配置合并进 pages.json
|
|
463
|
+
*
|
|
464
|
+
* 关闭时只加载用户配置文件,不扫描文件系统
|
|
465
|
+
*
|
|
372
466
|
* @default true
|
|
467
|
+
* @since 0.1.0
|
|
373
468
|
*/
|
|
374
469
|
mergePages: boolean;
|
|
375
470
|
/**
|
|
376
|
-
*
|
|
471
|
+
* 主包页面的搜索目录
|
|
472
|
+
*
|
|
473
|
+
* 支持 glob 模式,如 'src/{pages,views}'。
|
|
474
|
+
* 最终结果由 tinyglobby 解析为匹配到的目录列表。
|
|
475
|
+
*
|
|
377
476
|
* @default 'src/pages'
|
|
477
|
+
* @since 0.1.0
|
|
378
478
|
*/
|
|
379
479
|
dir: string;
|
|
380
480
|
/**
|
|
381
|
-
*
|
|
481
|
+
* uni-app 分包加载的子包页面目录
|
|
382
482
|
*
|
|
383
|
-
*
|
|
483
|
+
* 支持字符串形式(目录路径)或对象形式(pages.json 中的自定义 root)
|
|
384
484
|
*
|
|
385
|
-
*
|
|
386
|
-
*
|
|
387
|
-
* avoiding '..' in the generated root path.
|
|
485
|
+
* monorepo 项目中页面可能位于项目根目录之外。使用对象形式指定
|
|
486
|
+
* 出现在 pages.json 中的自定义 root,避免生成的 root 路径含 '..'。
|
|
388
487
|
*
|
|
389
488
|
* @see https://github.com/uni-helper/vite-plugin-uni-pages/issues/271
|
|
390
489
|
* @default []
|
|
490
|
+
* @since 0.1.8
|
|
391
491
|
*/
|
|
392
492
|
subPackages: (string | SubPackageConfig)[];
|
|
393
493
|
/**
|
|
394
|
-
* pages.json
|
|
395
|
-
*
|
|
494
|
+
* pages.json 所在目录
|
|
495
|
+
*
|
|
496
|
+
* 相对项目根目录,也是计算页面相对路径的基准
|
|
497
|
+
*
|
|
498
|
+
* @default 'src'
|
|
499
|
+
* @since 0.0.1
|
|
396
500
|
*/
|
|
397
501
|
outDir: string;
|
|
398
502
|
/**
|
|
399
|
-
*
|
|
400
|
-
*
|
|
503
|
+
* 排除的文件/目录模式
|
|
504
|
+
*
|
|
505
|
+
* 基于 [tinyglobby 的 ignore 选项](https://superchupu.dev/tinyglobby/documentation#ignore)
|
|
506
|
+
*
|
|
507
|
+
* @default ['node_modules', '.git', '**\/__*__/**']
|
|
508
|
+
* @since 0.0.4
|
|
401
509
|
*/
|
|
402
510
|
exclude: string[];
|
|
403
511
|
/**
|
|
404
|
-
*
|
|
512
|
+
* 压缩生成的 pages.json
|
|
405
513
|
* @default false
|
|
514
|
+
* @since 0.1.6
|
|
406
515
|
*/
|
|
407
516
|
minify: boolean;
|
|
408
517
|
/**
|
|
409
|
-
*
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
518
|
+
* 是否在生成的 pages.json 末尾追加换行符
|
|
519
|
+
* @default false
|
|
520
|
+
* @since 0.5.0
|
|
521
|
+
*/
|
|
522
|
+
insertFinalNewline: boolean;
|
|
523
|
+
/**
|
|
524
|
+
* 生成的 pages.json 的缩进
|
|
525
|
+
*
|
|
526
|
+
* 接受空格数或字符串(如 `'\t'`)
|
|
527
|
+
*
|
|
528
|
+
* `minify` 为 `true` 时忽略
|
|
529
|
+
* @default 2
|
|
530
|
+
* @since 0.5.0
|
|
531
|
+
*/
|
|
532
|
+
indent: number | string;
|
|
533
|
+
/**
|
|
534
|
+
* 生成的 pages.json 的换行符
|
|
535
|
+
* @default '\n'
|
|
536
|
+
* @since 0.5.0
|
|
537
|
+
*/
|
|
538
|
+
eol: '\n' | '\r\n';
|
|
539
|
+
/**
|
|
540
|
+
* 启用调试日志
|
|
541
|
+
*
|
|
542
|
+
* 为 `true` 时启用所有分类;为字符串时只启用对应分类。可用分类:
|
|
543
|
+
* hmr | options | pages | subPages | error | cache | declaration | definePage。
|
|
544
|
+
* 也可通过 DEBUG=vite-plugin-uni-pages:* 环境变量控制。
|
|
545
|
+
*
|
|
546
|
+
* @default false
|
|
547
|
+
* @since 0.1.8
|
|
548
|
+
*/
|
|
549
|
+
debug: boolean | DebugType;
|
|
550
|
+
/**
|
|
551
|
+
* 生命周期钩子,在各流水线阶段触发。钩子只接收该阶段的输入或输出
|
|
552
|
+
* 数据,绝不接收整个上下文。
|
|
553
|
+
*
|
|
554
|
+
* @since 0.0.3
|
|
555
|
+
*/
|
|
556
|
+
onBeforeLoadUserConfig: () => void;
|
|
557
|
+
onAfterLoadUserConfig: (pagesGlobConfig: PagesConfig | undefined) => void;
|
|
558
|
+
onBeforeScanPages: () => void;
|
|
559
|
+
onAfterScanPages: (pages: Map<string, Page>, subPages: Map<string, Map<string, Page>>) => void;
|
|
560
|
+
onBeforeMergePageMetaData: (pages: Map<string, Page>, pagesGlobConfig: PagesConfig | undefined) => void;
|
|
561
|
+
onAfterMergePageMetaData: (pageMetaData: InternalPages, subPageMetaData: SubPackages) => void;
|
|
562
|
+
onBeforeWriteFile: (filePath: string) => void;
|
|
563
|
+
onAfterWriteFile: (filePath: string, content: string) => void;
|
|
420
564
|
}
|
|
421
|
-
/**
|
|
565
|
+
/** 用户配置项类型,所有选项均为可选 */
|
|
422
566
|
type UserOptions = Partial<Options>;
|
|
423
567
|
/**
|
|
424
|
-
*
|
|
425
|
-
*
|
|
568
|
+
* 解析后的配置项接口
|
|
569
|
+
* 经 resolveOptions 处理的配置,所有路径均解析为绝对路径
|
|
426
570
|
*/
|
|
427
571
|
interface ResolvedOptions extends Omit<Options, 'dir' | 'homePage' | 'configSource' | 'dts' | 'subPackages'> {
|
|
428
572
|
/**
|
|
429
|
-
*
|
|
573
|
+
* 解析为 Vite 配置中的 `root` 值。
|
|
430
574
|
* @default config.root
|
|
431
575
|
*/
|
|
432
576
|
root: string;
|
|
433
577
|
dts: string | false;
|
|
434
578
|
/**
|
|
435
|
-
*
|
|
579
|
+
* 解析后的页面目录列表
|
|
436
580
|
*/
|
|
437
581
|
dirs: string[];
|
|
438
582
|
/**
|
|
439
|
-
*
|
|
583
|
+
* 解析后的入口页面
|
|
440
584
|
*/
|
|
441
585
|
homePage: string[];
|
|
442
|
-
configSource: LoadConfigSource<
|
|
586
|
+
configSource: LoadConfigSource<PagesConfig>[];
|
|
443
587
|
/**
|
|
444
|
-
*
|
|
588
|
+
* 解析后的子包目录列表
|
|
445
589
|
*/
|
|
446
590
|
subPackages: string[];
|
|
447
591
|
/**
|
|
448
|
-
*
|
|
449
|
-
*
|
|
592
|
+
* 子包的自定义 root 映射(目录 -> root)
|
|
593
|
+
* 用于 monorepo 支持,指定 pages.json 中的自定义 root 路径
|
|
450
594
|
*/
|
|
451
595
|
subPackageRootMap: Map<string, string>;
|
|
452
596
|
}
|
|
453
597
|
/**
|
|
454
|
-
*
|
|
455
|
-
*
|
|
598
|
+
* 子包配置接口
|
|
599
|
+
* 为 monorepo 支持,允许自定义 pages.json 中的 root 路径
|
|
456
600
|
*
|
|
457
|
-
*
|
|
458
|
-
*
|
|
459
|
-
*
|
|
601
|
+
* monorepo 项目中页面可能位于项目根目录之外(如 ../../packages/login/src/pages)。
|
|
602
|
+
* 默认情况下插件会生成含 '..' 的 root 路径,而 uni-app 不支持。
|
|
603
|
+
* 通过该配置指定出现在 pages.json 中的自定义 root。
|
|
460
604
|
*
|
|
461
605
|
* @example
|
|
462
606
|
* ```ts
|
|
463
607
|
* subPackages: [
|
|
464
608
|
* {
|
|
465
|
-
* dir: '../../packages/login/src/pages', //
|
|
466
|
-
* root: 'packages/login/src/pages', //
|
|
609
|
+
* dir: '../../packages/login/src/pages', // 实际扫描的物理目录
|
|
610
|
+
* root: 'packages/login/src/pages', // pages.json 中的自定义 root
|
|
467
611
|
* }
|
|
468
612
|
* ]
|
|
469
613
|
* ```
|
|
470
614
|
*/
|
|
471
615
|
interface SubPackageConfig {
|
|
472
|
-
/**
|
|
616
|
+
/** 扫描页面文件的实际物理目录路径 */
|
|
473
617
|
dir: string;
|
|
474
|
-
/**
|
|
618
|
+
/** 出现在 pages.json subPackages.root 中的自定义根路径 */
|
|
475
619
|
root: string;
|
|
476
620
|
}
|
|
477
621
|
/**
|
|
478
|
-
*
|
|
479
|
-
*
|
|
622
|
+
* 页面路径信息接口
|
|
623
|
+
* 包含页面文件的相对路径与绝对路径
|
|
480
624
|
*/
|
|
481
625
|
interface PagePath {
|
|
482
|
-
/**
|
|
626
|
+
/** 相对输出目录的路径 */
|
|
483
627
|
relativePath: string;
|
|
484
|
-
/**
|
|
628
|
+
/** 页面文件的绝对路径 */
|
|
485
629
|
absolutePath: string;
|
|
486
630
|
}
|
|
487
631
|
//#endregion
|
|
632
|
+
//#region src/config.d.ts
|
|
633
|
+
/**
|
|
634
|
+
* 定义 uni-pages 配置
|
|
635
|
+
* 在 pages.config.ts 配置文件中使用,提供类型提示与校验
|
|
636
|
+
*
|
|
637
|
+
* @param config - 页面配置对象
|
|
638
|
+
* @returns 配置对象
|
|
639
|
+
*/
|
|
640
|
+
declare function defineUniPages(config: UserPagesConfig): UserPagesConfig;
|
|
641
|
+
//#endregion
|
|
488
642
|
//#region src/constant.d.ts
|
|
489
|
-
/**
|
|
643
|
+
/** Vite 模块解析用的虚拟模块标识 */
|
|
490
644
|
declare const MODULE_ID_VIRTUAL = "virtual:uni-pages";
|
|
491
|
-
/**
|
|
645
|
+
/** 加 \0 前缀解析后的虚拟模块标识,避免与其他模块冲突 */
|
|
492
646
|
declare const RESOLVED_MODULE_ID_VIRTUAL = "\0virtual:uni-pages";
|
|
493
|
-
/**
|
|
647
|
+
/** 输出文件名,即 uni-app 的页面配置文件 */
|
|
494
648
|
declare const OUTPUT_NAME = "pages.json";
|
|
495
|
-
/**
|
|
649
|
+
/** 支持的页面文件扩展名 */
|
|
496
650
|
declare const FILE_EXTENSIONS: string[];
|
|
497
651
|
//#endregion
|
|
498
652
|
//#region src/files.d.ts
|
|
499
653
|
/**
|
|
500
|
-
*
|
|
654
|
+
* 解析给定上下文下可作为有效页面的文件列表。
|
|
501
655
|
*/
|
|
502
656
|
declare function getPageFiles(path: string, options: ResolvedOptions): string[];
|
|
503
657
|
/**
|
|
504
|
-
*
|
|
505
|
-
*
|
|
506
|
-
*
|
|
658
|
+
* 检查文件是否为目标页面文件
|
|
659
|
+
* 判断文件扩展名是否在支持的页面文件类型列表中
|
|
660
|
+
*
|
|
661
|
+
* @param path - 文件路径
|
|
662
|
+
* @returns 是否为目标文件
|
|
663
|
+
*/
|
|
664
|
+
declare function isTargetFile(path: string): boolean;
|
|
665
|
+
/**
|
|
666
|
+
* 根据项目根目录与输出目录解析 pages.json 文件路径
|
|
667
|
+
*
|
|
668
|
+
* @param root - 项目根目录
|
|
669
|
+
* @param outDir - 相对 root 的 pages.json 输出目录
|
|
670
|
+
* @returns pages.json 绝对路径
|
|
671
|
+
*/
|
|
672
|
+
declare function resolvePagesJsonPath(root: string, outDir: string): string;
|
|
673
|
+
/**
|
|
674
|
+
* 确保这个路径上有一个能用的 pages.json 文件。
|
|
675
|
+
*
|
|
676
|
+
* 文件不存在时创建一个占位文件,占位内容很快会被下一次生成覆盖。
|
|
677
|
+
* 已存在的文件绝不删除重建:删它会悄悄弄丢手写的内容(只读的文件
|
|
678
|
+
* 也能被删除,只要它所在的目录可写),所以"路径存在但不是普通文件、
|
|
679
|
+
* 或者读不了也写不了"都算必须由用户自己修的硬错误(例如
|
|
680
|
+
* `chmod u+w`)。
|
|
681
|
+
*
|
|
682
|
+
* @param path - 待检查的文件路径
|
|
683
|
+
* @throws 路径存在但不是普通文件、缺少读写权限,或占位文件创建失败时
|
|
684
|
+
* 抛出
|
|
507
685
|
*/
|
|
508
|
-
declare function checkPagesJsonFileSync(path: fs.PathLike):
|
|
686
|
+
declare function checkPagesJsonFileSync(path: fs.PathLike): void;
|
|
509
687
|
/**
|
|
510
|
-
*
|
|
688
|
+
* 拿到文件的独占锁后运行任务,运行完自动放锁。
|
|
689
|
+
*
|
|
690
|
+
* 它保护"读文件 → 算新内容 → 写回"的整个过程:锁从 `task` 开始
|
|
691
|
+
* 一直拿到它结束,别的进程看不到、也覆盖不了写了一半的文件。
|
|
692
|
+
* pages.json 的生成靠这一点:新内容要根据当前文件来算(里面有其他
|
|
693
|
+
* 平台的 `#ifdef` 块)。
|
|
511
694
|
*
|
|
512
|
-
*
|
|
513
|
-
*
|
|
514
|
-
* resolves, so concurrent processes cannot observe or overwrite a half-written
|
|
515
|
-
* state. This is required by pages.json generation, where the new content
|
|
516
|
-
* depends on the current content (other platforms' `#ifdef` blocks).
|
|
695
|
+
* 同进程的调用方先在上面那条按路径的队列里排队,再碰 OS 锁;下面的
|
|
696
|
+
* 重试只用来等其他进程放锁。
|
|
517
697
|
*
|
|
518
|
-
* @param path -
|
|
519
|
-
* @param task -
|
|
520
|
-
* @param retry -
|
|
521
|
-
* @returns
|
|
698
|
+
* @param path - 要加锁的文件路径
|
|
699
|
+
* @param task - 在锁内运行的异步任务;返回值原样返回给调用方
|
|
700
|
+
* @param retry - 锁被别人拿着时的重试次数,默认 3
|
|
701
|
+
* @returns `task` 的结果;一直拿不到锁时为 `undefined`
|
|
522
702
|
*/
|
|
523
703
|
declare function withFileLock<T>(path: string, task: () => Promise<T>, retry?: number): Promise<T | undefined>;
|
|
704
|
+
//#endregion
|
|
705
|
+
//#region src/macro.d.ts
|
|
524
706
|
/**
|
|
525
|
-
*
|
|
526
|
-
* Avoid data corruption caused by concurrent writes through file lock
|
|
527
|
-
* Use atomic write to ensure file write integrity
|
|
707
|
+
* definePage 宏的解析与求值
|
|
528
708
|
*
|
|
529
|
-
*
|
|
530
|
-
*
|
|
531
|
-
*
|
|
709
|
+
* 这个文件负责看懂一个 definePage 宏要的全部步骤:解析 Vue 单文件
|
|
710
|
+
* 组件、逐个 script 块解析(单个块失败不影响别的块)、找到宏调用、
|
|
711
|
+
* 收集 import 语句、放进沙箱求值。外部只用两个函数:
|
|
712
|
+
* evaluateDefinePage(扫描时用)和 findDefinePageMacro(转换时用)。
|
|
532
713
|
*
|
|
533
|
-
* @
|
|
534
|
-
*
|
|
535
|
-
* @param retry - Number of retries when lock acquisition fails, defaults to 3
|
|
714
|
+
* 两个入口都从 {@link parseSfcBlocks} 的块模型取宏:「两边按同一套
|
|
715
|
+
* 规则找到同一个宏」由这个共享模型保证,不靠两边各自实现再对齐。
|
|
536
716
|
*/
|
|
537
|
-
|
|
717
|
+
/**
|
|
718
|
+
* 解析 Vue 单文件组件(SFC)
|
|
719
|
+
* 兼容不同版本的 @vue/compiler-sfc
|
|
720
|
+
*
|
|
721
|
+
* @param code - Vue SFC 源码
|
|
722
|
+
* @param options - 解析选项
|
|
723
|
+
* @returns SFC descriptor 对象
|
|
724
|
+
*/
|
|
725
|
+
declare function parseSFC(code: string, options?: SFCParseOptions): SFCDescriptor;
|
|
726
|
+
/**
|
|
727
|
+
* 求值 Vue SFC 里的 definePage 宏,返回页面信息
|
|
728
|
+
*
|
|
729
|
+
* 扫描时用。解析或求值出错时,错误会交给调用方(Page.read),它会把
|
|
730
|
+
* 这个页面退回成只含路径的简单信息。
|
|
731
|
+
*
|
|
732
|
+
* @param code - Vue SFC 源码
|
|
733
|
+
* @param filename - SFC 文件名,用于错误提示和模块解析
|
|
734
|
+
* @param platform - 当前平台标识,传给函数式宏;默认取 uni-env 的平台
|
|
735
|
+
* @returns 页面信息对象;宏明确退出(definePage(null) 或函数返回
|
|
736
|
+
* null)时为 `null`;没找到 definePage 时为 undefined
|
|
737
|
+
*/
|
|
738
|
+
declare function evaluateDefinePage(code: string, filename: string, platform?: string): Promise<UserPageItem | null | undefined>;
|
|
739
|
+
/**
|
|
740
|
+
* 在 Vue SFC 中定位 definePage 宏调用但不求值
|
|
741
|
+
*
|
|
742
|
+
* 转换插件用它找到宏再删掉,不求值。块解析失败通过 `onParseError`
|
|
743
|
+
* 报出来,不抛错。
|
|
744
|
+
*
|
|
745
|
+
* @param code - Vue SFC 源码
|
|
746
|
+
* @param filename - 用于错误上报的 SFC 文件名
|
|
747
|
+
* @param options - 可选的按块解析失败钩子
|
|
748
|
+
* @param options.onParseError - 以失败的 script 块名与错误对象调用
|
|
749
|
+
* @returns definePage 调用表达式,未找到时为 undefined
|
|
750
|
+
*/
|
|
751
|
+
declare function findDefinePageMacro(code: string, filename: string, options?: {
|
|
752
|
+
onParseError?: (block: string, error: unknown) => void;
|
|
753
|
+
}): CallExpression | undefined;
|
|
538
754
|
//#endregion
|
|
539
755
|
//#region src/options.d.ts
|
|
540
756
|
/**
|
|
541
|
-
*
|
|
542
|
-
*
|
|
757
|
+
* 解析用户配置项
|
|
758
|
+
* 将用户提供的配置与默认值合并,并处理路径解析
|
|
543
759
|
*
|
|
544
|
-
* @param userOptions -
|
|
545
|
-
* @param viteRoot - Vite
|
|
546
|
-
* @returns
|
|
760
|
+
* @param userOptions - 用户配置项
|
|
761
|
+
* @param viteRoot - Vite 项目根目录
|
|
762
|
+
* @returns 解析后的配置项
|
|
547
763
|
*/
|
|
548
764
|
declare function resolveOptions(userOptions: UserOptions, viteRoot?: string): ResolvedOptions;
|
|
549
765
|
/**
|
|
550
|
-
*
|
|
766
|
+
* 根据给定的 glob 模式解析页面目录
|
|
767
|
+
* @param dir - 页面目录 glob 模式
|
|
768
|
+
* @param root - 项目根目录
|
|
769
|
+
* @param exclude - 需要排除的 glob 模式
|
|
770
|
+
* @returns 匹配到的目录路径
|
|
551
771
|
*/
|
|
552
772
|
declare function resolvePageDirs(dir: string, root: string, exclude: string[]): string[];
|
|
553
|
-
|
|
554
|
-
|
|
773
|
+
//#endregion
|
|
774
|
+
//#region src/pages-json.d.ts
|
|
775
|
+
/**
|
|
776
|
+
* pages.json 的读取、合并、写回
|
|
777
|
+
*
|
|
778
|
+
* 这个文件负责 pages.json 的主流程:
|
|
779
|
+
* - 多个平台共用一个文件时,用 #ifdef 注释区分各自的条目(合并规则
|
|
780
|
+
* 的核心在 platform-variants.ts,数组侧的适配在这里,对象侧
|
|
781
|
+
* tabBar 属性的适配在 tab-bar.ts)
|
|
782
|
+
* - 合并时保持首页排最前
|
|
783
|
+
* - 写入"由插件生成"的标记,靠它识别哪些条目是插件写的
|
|
784
|
+
* - 序列化格式(缩进、换行)
|
|
785
|
+
* - 文件锁和原子写入,防止并发写坏文件
|
|
786
|
+
*
|
|
787
|
+
* 外部只需要用 writePagesJson(写文件)和 mergePagesJson(纯计算),
|
|
788
|
+
* 不用接触 comment-json 的内部结构。
|
|
789
|
+
*
|
|
790
|
+
* 当前平台用不到的区块怎么处理,分两种情况:
|
|
791
|
+
* - tabBar 的外观属性:uni-app 条件编译能把整段剥掉,保留并包上 #ifdef
|
|
792
|
+
* - 没有任何页面的子包:构建产物里会留下指向不存在目录的空壳,直接删掉
|
|
793
|
+
*/
|
|
794
|
+
/** 由扫描/合并流水线组装出的路由数据 */
|
|
795
|
+
interface PagesJsonData {
|
|
796
|
+
/** 主包页面配置 */
|
|
797
|
+
pages: InternalPages;
|
|
798
|
+
/** 子包页面配置 */
|
|
799
|
+
subPackages: SubPackages;
|
|
800
|
+
/** 解析后的 tabBar 配置 */
|
|
801
|
+
tabBar?: TabBar;
|
|
802
|
+
/**
|
|
803
|
+
* 从扫描出的配置解析出的首页路径。从 pages.json 合并而来的条目
|
|
804
|
+
* 可能缺少内部 `type` 标记(手写条目从不携带它),因此首页条目主要
|
|
805
|
+
* 按路径重新定位;未设置时退回到 `type` 标记。
|
|
806
|
+
*/
|
|
807
|
+
homePath?: string;
|
|
808
|
+
}
|
|
809
|
+
/** 生成 pages.json 时怎么排版 */
|
|
810
|
+
interface PagesJsonFormatOptions {
|
|
811
|
+
/**
|
|
812
|
+
* 压缩成一行输出,优先级高于 `indent`。单行 JSON 放不下注释,
|
|
813
|
+
* 生成标记、用户注释、所有 `#ifdef` 块都会丢失:只属于其他平台的
|
|
814
|
+
* 条目和区块会直接暴露在本平台的构建产物里(如外来的 tabBar
|
|
815
|
+
* list),tabBar 外观属性也变成"谁最后写谁说了算"。所以同一个
|
|
816
|
+
* 项目的所有平台要保持这个配置一致
|
|
817
|
+
*/
|
|
818
|
+
minify?: boolean;
|
|
819
|
+
/** 缩进,空格数或字符串(如 '\t') */
|
|
820
|
+
indent?: number | string;
|
|
821
|
+
/** 换行符 */
|
|
822
|
+
eol?: '\n' | '\r\n';
|
|
823
|
+
/** 是否在末尾追加换行符 */
|
|
824
|
+
insertFinalNewline?: boolean;
|
|
825
|
+
}
|
|
826
|
+
interface WritePagesJsonOptions {
|
|
827
|
+
/** 当前平台标识,如 'mp-weixin' 或 'h5' */
|
|
828
|
+
platform: string;
|
|
829
|
+
/** 来自 pages.config.ts 的用户配置;pages/subPackages/tabBar 之外的字段原样写进输出 */
|
|
830
|
+
globConfig?: PagesConfig;
|
|
831
|
+
/** 序列化格式 */
|
|
832
|
+
format?: PagesJsonFormatOptions;
|
|
833
|
+
}
|
|
834
|
+
/** 纯合并步骤的选项:{@link WritePagesJsonOptions} 中与文件无关的部分 */
|
|
835
|
+
type MergePagesJsonOptions = Pick<WritePagesJsonOptions, 'platform' | 'globConfig' | 'format'>;
|
|
836
|
+
/**
|
|
837
|
+
* 把路由数据合并进 pages.json 并写回
|
|
838
|
+
*
|
|
839
|
+
* 整个"读取 → 合并 → 写回"都锁在同一把文件锁里:因为新内容要参考
|
|
840
|
+
* 当前文件里其他平台的 `#ifdef` 块,两个终端同时跑(比如
|
|
841
|
+
* dev:mp-weixin + dev:mp-alipay)时才不会互相覆盖或读到写了一半的
|
|
842
|
+
* 内容。写入用临时文件 + rename,中途崩溃也不会留下截断的文件。
|
|
843
|
+
*
|
|
844
|
+
* @param jsonPath - pages.json 文件路径
|
|
845
|
+
* @param data - 由扫描/合并流水线组装的路由数据
|
|
846
|
+
* @param options - 平台、用户配置与序列化格式
|
|
847
|
+
* @returns 写入结果;获取不到文件锁时为 undefined
|
|
848
|
+
*/
|
|
849
|
+
declare function writePagesJson(jsonPath: string, data: PagesJsonData, options: WritePagesJsonOptions): Promise<{
|
|
850
|
+
updated: boolean;
|
|
851
|
+
content: string;
|
|
852
|
+
} | undefined>;
|
|
853
|
+
/**
|
|
854
|
+
* 不碰文件系统,只做计算:把路由数据合并进现有 pages.json 文本
|
|
855
|
+
* (多平台 `#ifdef` 块、首页重排、生成标记、过期子包清理)并序列化
|
|
856
|
+
* 成字符串。文件锁、变更检测和原子写入都在 {@link writePagesJson}
|
|
857
|
+
* 里;测试直接用字符串检查这个函数。
|
|
858
|
+
*
|
|
859
|
+
* @param existingContent - 当前 pages.json 文本,没有时传空字符串
|
|
860
|
+
* @param data - 由扫描/合并流水线组装的路由数据
|
|
861
|
+
* @param options - 平台、用户配置与序列化格式
|
|
862
|
+
* @returns 序列化后的 pages.json 内容
|
|
863
|
+
*/
|
|
864
|
+
declare function mergePagesJson(existingContent: string, data: PagesJsonData, options: MergePagesJsonOptions): string;
|
|
865
|
+
//#endregion
|
|
866
|
+
//#region src/pipeline.d.ts
|
|
867
|
+
/**
|
|
868
|
+
* 插件对外的主要入口
|
|
869
|
+
*
|
|
870
|
+
* "扫描 → 合并 → 写入"这一整套流程,在这里包成一次调用就能跑的
|
|
871
|
+
* 函数。`root` 和 `platform` 可以从外面传进来,调用方和测试就不用
|
|
872
|
+
* 受制于进程启动时定死的工作目录和环境变量。Vite 插件和 PageContext
|
|
873
|
+
* 也是这里的调用方;测试通过这个入口跑完整流程,不去碰内部步骤。
|
|
874
|
+
*/
|
|
875
|
+
/** 可以从外面传进来的流水线输入 */
|
|
876
|
+
interface PipelineOverrides {
|
|
877
|
+
/** 项目根目录,默认为当前工作目录 */
|
|
878
|
+
root?: string;
|
|
879
|
+
/** 当前平台标识,如 'mp-weixin';默认取 uni-env 的平台 */
|
|
880
|
+
platform?: string;
|
|
555
881
|
}
|
|
556
882
|
/**
|
|
557
|
-
*
|
|
883
|
+
* 创建 PageContext,并在内存里跑完「扫描/合并」
|
|
884
|
+
*
|
|
885
|
+
* 不写任何文件;路由数据通过 `resolveRoutes`、`resolveSubRoutes`、
|
|
886
|
+
* `resolveTabBar` 和 `virtualModule` 取。
|
|
887
|
+
*
|
|
888
|
+
* @param userOptions - 用户配置项
|
|
889
|
+
* @param overrides - 从外面传入的 root 与 platform
|
|
890
|
+
* @returns 完成扫描与合并的 PageContext
|
|
891
|
+
*/
|
|
892
|
+
declare function createPages(userOptions?: UserOptions, overrides?: PipelineOverrides): Promise<PageContext>;
|
|
893
|
+
/**
|
|
894
|
+
* 运行完整流水线:加载用户配置、扫描、合并并写入 pages.json
|
|
895
|
+
* (以及 TypeScript 声明文件)
|
|
896
|
+
*
|
|
897
|
+
* @param userOptions - 用户配置项
|
|
898
|
+
* @param overrides - 从外面传入的 root 与 platform
|
|
899
|
+
* @returns pages.json 是否有更新,以及产出它的上下文
|
|
900
|
+
*/
|
|
901
|
+
declare function generateAll(userOptions?: UserOptions, overrides?: PipelineOverrides): Promise<{
|
|
902
|
+
updated: boolean;
|
|
903
|
+
ctx: PageContext;
|
|
904
|
+
}>;
|
|
905
|
+
//#endregion
|
|
906
|
+
//#region src/index.d.ts
|
|
907
|
+
/**
|
|
908
|
+
* vite-plugin-uni-pages 插件主入口
|
|
558
909
|
*
|
|
559
|
-
*
|
|
560
|
-
*
|
|
561
|
-
*
|
|
562
|
-
*
|
|
563
|
-
*
|
|
910
|
+
* 自动扫描页面目录并生成 pages.json 配置文件
|
|
911
|
+
* 支持 definePage 宏定义页面配置
|
|
912
|
+
* 支持多平台条件编译
|
|
913
|
+
* 支持分包配置
|
|
914
|
+
* 支持 TypeScript 声明文件生成
|
|
564
915
|
*
|
|
565
|
-
* @param userOptions -
|
|
566
|
-
* @returns Vite
|
|
916
|
+
* @param userOptions - 用户配置项
|
|
917
|
+
* @returns Vite 插件实例
|
|
567
918
|
*/
|
|
568
919
|
declare function VitePluginUniPages(userOptions?: UserOptions): Plugin;
|
|
569
920
|
//#endregion
|
|
570
|
-
export { ConfigSource, type DefinePage, type ExcludeIndexSignature, FILE_EXTENSIONS, MODULE_ID_VIRTUAL, type MaybeCallable, type MaybePromise, type MaybePromiseCallable, OUTPUT_NAME, Options, Page, PageContext, type
|
|
921
|
+
export { type ConfigSource, type DebugType, DefineConditional, type DefinePage, type DefinePageContext, type ExcludeIndexSignature, FILE_EXTENSIONS, type InternalPageItem, type InternalPages, MODULE_ID_VIRTUAL, type MaybeCallable, type MaybePromise, type MaybePromiseCallable, MergePagesJsonOptions, OUTPUT_NAME, type Options, Page, PageContext, type PagePath, PagesJsonData, PagesJsonFormatOptions, PipelineOverrides, RESOLVED_MODULE_ID_VIRTUAL, type ResolvedOptions, type SubPackageConfig, type UserOptions, type UserPageItem, type UserTabBarItem, VitePluginUniPages, VitePluginUniPages as default, WritePagesJsonOptions, checkPagesJsonFileSync, createPages, debug, type debugType, type definePage, defineUniPages, evaluateDefinePage, filterPlatformSuffixPages, findDefinePageMacro, generateAll, getPageFiles, isConditional, isTargetFile, mergePagesJson, parseSFC, resolveConditional, resolveOptions, resolvePageDirs, resolvePagesJsonPath, withFileLock, writePagesJson };
|