@uni-helper/vite-plugin-uni-pages 0.0.6 → 0.0.7
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 +1 -1
- package/dist/index.cjs +5 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +686 -12
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -97,4 +97,4 @@ How? console the `process.env` and found `UNI_*`, you can do this!
|
|
|
97
97
|
|
|
98
98
|
- [ ] only update the changed page
|
|
99
99
|
- [x] [vite-plugin-uni-middleware](https://github.com/uni-helper/vite-plugin-uni-middleware)
|
|
100
|
-
- [
|
|
100
|
+
- [x] pages [type](./src/config/types.ts)
|
package/dist/index.cjs
CHANGED
|
@@ -39,7 +39,10 @@ var import_vite = require("vite");
|
|
|
39
39
|
var import_consola = __toESM(require("consola"), 1);
|
|
40
40
|
var isPagePath = (path, options) => {
|
|
41
41
|
const dirPath = (0, import_path.resolve)(process.cwd(), options.pagesDir);
|
|
42
|
-
const filter = (0, import_vite.createFilter)(
|
|
42
|
+
const filter = (0, import_vite.createFilter)(
|
|
43
|
+
dirPath + "/**/*.(vue|nvue|uvue)",
|
|
44
|
+
options.exclude
|
|
45
|
+
);
|
|
43
46
|
return filter(path);
|
|
44
47
|
};
|
|
45
48
|
var logger = import_consola.default.create({
|
|
@@ -87,7 +90,7 @@ var Context = class {
|
|
|
87
90
|
this.pagesConfig = config;
|
|
88
91
|
}
|
|
89
92
|
async scanPages() {
|
|
90
|
-
const files = await (0, import_fast_glob.default)("**/*.(vue|nvue)", {
|
|
93
|
+
const files = await (0, import_fast_glob.default)("**/*.(vue|nvue|uvue)", {
|
|
91
94
|
ignore: ["node_modules", ".git", "**/__*__/*", ...this.options.exclude],
|
|
92
95
|
onlyFiles: true,
|
|
93
96
|
cwd: (0, import_path2.resolve)(process.cwd(), this.options.pagesDir)
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/constant.ts","../src/context/index.ts","../src/config/index.ts"],"sourcesContent":["import { ModuleNode, normalizePath, Plugin } from \"vite\";\nimport { ResolvedOptions, UserOptions } from \"./types\";\nimport { isPagePath, logger } from \"./utils\";\nimport { virtualModuleId, resolvedVirtualModuleId } from \"./constant\";\nimport { Context } from \"./context\";\n\nexport * from \"./config\";\n\nfunction resolveOptions(userOptions: UserOptions): ResolvedOptions {\n return {\n pagesDir: \"src/pages\",\n outDir: \"src\",\n exclude: [],\n onBeforeLoadUserConfig: () => {},\n onAfterLoadUserConfig: () => {},\n onBeforeScanPages: () => {},\n onAfterScanPages: () => {},\n onBeforeMergePagesMeta: () => {},\n onAfterMergePagesMeta: () => {},\n onBeforeWriteFile: () => {},\n onAfterWriteFile: () => {},\n ...userOptions,\n };\n}\n\nexport const VitePluginUniPages = async (\n userOptions: UserOptions = {}\n): Promise<Plugin> => {\n const options = resolveOptions(userOptions);\n logger.debug(\"Create uni-pages context with\", options);\n const ctx = new Context(options);\n return {\n name: \"vite-plugin-uni-pages\",\n enforce: \"pre\",\n async configureServer({ watcher, moduleGraph, ws }) {\n const pagesConfigSourcePaths = await ctx.pagesConfigSourcePaths();\n logger.debug(\"Add watcher\", pagesConfigSourcePaths);\n watcher.add(pagesConfigSourcePaths);\n\n const reloadModule = (module: ModuleNode | undefined, path = \"*\") => {\n if (module) {\n moduleGraph.invalidateModule(module);\n if (ws) {\n ws.send({\n path,\n type: \"full-reload\",\n });\n }\n }\n };\n const updateVirtualModule = () => {\n logger.debug(\"Update virtualModule\");\n const module = moduleGraph.getModuleById(resolvedVirtualModuleId);\n reloadModule(module);\n };\n\n watcher.on(\"change\", async (path) => {\n if (\n pagesConfigSourcePaths.includes(normalizePath(path)) ||\n isPagePath(path, options)\n ) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n watcher.on(\"add\", async (path) => {\n if (isPagePath(path, options)) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n watcher.on(\"unlink\", async (path) => {\n if (isPagePath(path, options)) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n },\n resolveId(id) {\n if (id === virtualModuleId) {\n return resolvedVirtualModuleId;\n }\n },\n\n load(id) {\n if (id === resolvedVirtualModuleId) {\n return ctx.virtualModule();\n }\n },\n };\n};\n\nexport default VitePluginUniPages;\n","import { resolve } from \"path\";\nimport { ResolvedOptions } from \"./types\";\nimport { createFilter } from \"vite\";\nimport consola from \"consola\";\n\nexport const isPagePath = (path: string, options: ResolvedOptions) => {\n const dirPath = resolve(process.cwd(), options.pagesDir);\n const filter = createFilter(dirPath + \"/**/*.(vue|nvue)\", options.exclude);\n return filter(path);\n};\n\nexport const logger = consola.create({\n defaults: {\n tag: \"vite-plugin-uni-pages\",\n },\n});\n","export const virtualModuleId = \"virtual:uni-pages\";\nexport const resolvedVirtualModuleId = \"\\0\" + virtualModuleId;\n","import { extname, join, relative, resolve } from \"path\";\nimport { loadConfig } from \"unconfig\";\nimport { normalizePath } from \"vite\";\nimport { PagesConfig } from \"../config/types\";\nimport { PageMeta, PagePathInfo, ResolvedOptions } from \"../types\";\nimport fg from \"fast-glob\";\nimport { parse as JSONParse } from \"jsonc-parser\";\nimport { parse } from \"@vue/compiler-dom\";\nimport fs from \"fs\";\nimport { defu } from \"defu\";\nimport { logger } from \"../utils\";\nexport class Context {\n options: ResolvedOptions;\n pagesConfig!: PagesConfig;\n pagesPathInfo: PagePathInfo[] = [];\n pagesMeta: PageMeta[] = [];\n constructor(options: ResolvedOptions) {\n this.options = options;\n this.createOrUpdatePagesJSON();\n }\n\n async loadUserPagesConfig() {\n const { config } = await loadConfig({\n sources: [\n {\n files: \"pages.config\",\n },\n ],\n merge: false,\n });\n if (!config) {\n logger.error(\n \"Can't found pages.config, please create pages.config.(ts|mts|cts|js|cjs|mjs|json)\"\n );\n process.exit(-1);\n }\n logger.debug(\"Loaded user pages config\", config);\n this.pagesConfig = config as PagesConfig;\n }\n\n async scanPages() {\n const files = await fg(\"**/*.(vue|nvue)\", {\n ignore: [\"node_modules\", \".git\", \"**/__*__/*\", ...this.options.exclude],\n onlyFiles: true,\n cwd: resolve(process.cwd(), this.options.pagesDir),\n });\n const basePath = relative(\n resolve(process.cwd(), this.options.outDir),\n this.options.pagesDir\n );\n this.pagesPathInfo = files.map((file) => {\n return {\n relative: normalizePath(join(basePath, file)),\n absolute: normalizePath(\n resolve(process.cwd(), this.options.pagesDir, file)\n ),\n };\n });\n logger.debug(\"Scanned pages dir\", this.pagesPathInfo);\n }\n\n async parsePage({ relative, absolute }: PagePathInfo): Promise<PageMeta> {\n const code = await fs.promises.readFile(absolute, {\n encoding: \"utf-8\",\n });\n const t = parse(code);\n const path = relative.replace(extname(relative), \"\");\n let pageMeta: PageMeta = {\n path,\n type: \"page\",\n };\n t?.children.forEach((v) => {\n if (v.type !== 1) {\n return;\n }\n if (v.tag === \"route\") {\n v.props.forEach((prop) => {\n if (prop.type === 6 && prop.name === \"type\") {\n pageMeta.type = prop.value?.content ?? pageMeta.type;\n }\n });\n const astContent = v.children?.[0];\n if (astContent && astContent.type === 2) {\n const _pageMeta = JSONParse(astContent.content);\n Object.keys(_pageMeta).forEach((key) => {\n pageMeta[key] = _pageMeta[key];\n });\n // overwrite path\n pageMeta[\"path\"] = path;\n }\n }\n });\n return pageMeta;\n }\n\n async mergePagesMeta() {\n const pagesMeta = await Promise.all(\n this.pagesPathInfo?.map(async (page) => await this.parsePage(page))\n );\n const pages = Object.values(defu({}, pagesMeta, this.pagesConfig.pages));\n // @ts-ignore\n pages.sort((a) => (a.type === \"home\" ? -1 : 0));\n // @ts-ignore\n this.pagesMeta = pages;\n logger.debug(\"merged pages\", this.pagesMeta);\n }\n\n async createOrUpdatePagesJSON() {\n const outputName = \"pages.json\";\n const resolvedOutput = normalizePath(\n resolve(process.cwd(), this.options.outDir, outputName)\n );\n\n // 如果不存在,先输出一个占位文件\n if (!fs.existsSync(resolvedOutput)) {\n fs.writeFileSync(resolvedOutput, `{\"pages\": [{\"path\": \"\"}]}`, {\n encoding: \"utf-8\",\n });\n }\n\n this.options.onBeforeLoadUserConfig(this);\n await this.loadUserPagesConfig();\n this.options.onAfterLoadUserConfig(this);\n\n this.options.onBeforeScanPages(this);\n await this.scanPages();\n this.options.onAfterScanPages(this);\n\n this.options.onBeforeMergePagesMeta(this);\n await this.mergePagesMeta();\n this.options.onAfterMergePagesMeta(this);\n\n this.options.onBeforeWriteFile(this);\n fs.writeFileSync(resolvedOutput, this.pagesJson, {\n encoding: \"utf-8\",\n });\n this.options.onAfterWriteFile(this);\n }\n\n async virtualModule() {\n return `export const pages = ${JSON.stringify(this.pagesMeta)};`;\n }\n\n async pagesConfigSourcePaths() {\n return await fg(\"pages.config.(ts|mts|cts|js|cjs|mjs|json)\", {\n deep: 0,\n onlyFiles: true,\n absolute: true,\n });\n }\n\n get pagesJson() {\n return JSON.stringify({\n ...this.pagesConfig,\n pages: this.pagesMeta,\n });\n }\n}\n","import { UserPagesConfig } from \"./types\";\nexport * from \"./types\";\nexport function definePages(config: UserPagesConfig) {\n return config;\n}\n"],"mappings":"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","names":["import_vite","consola","import_path","import_vite","fg","relative","fs","_a","JSONParse","module"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/constant.ts","../src/context/index.ts","../src/config/index.ts"],"sourcesContent":["import { ModuleNode, normalizePath, Plugin } from \"vite\";\nimport { ResolvedOptions, UserOptions } from \"./types\";\nimport { isPagePath, logger } from \"./utils\";\nimport { virtualModuleId, resolvedVirtualModuleId } from \"./constant\";\nimport { Context } from \"./context\";\n\nexport * from \"./config\";\n\nfunction resolveOptions(userOptions: UserOptions): ResolvedOptions {\n return {\n pagesDir: \"src/pages\",\n outDir: \"src\",\n exclude: [],\n onBeforeLoadUserConfig: () => {},\n onAfterLoadUserConfig: () => {},\n onBeforeScanPages: () => {},\n onAfterScanPages: () => {},\n onBeforeMergePagesMeta: () => {},\n onAfterMergePagesMeta: () => {},\n onBeforeWriteFile: () => {},\n onAfterWriteFile: () => {},\n ...userOptions,\n };\n}\n\nexport const VitePluginUniPages = async (\n userOptions: UserOptions = {}\n): Promise<Plugin> => {\n const options = resolveOptions(userOptions);\n logger.debug(\"Create uni-pages context with\", options);\n const ctx = new Context(options);\n return {\n name: \"vite-plugin-uni-pages\",\n enforce: \"pre\",\n async configureServer({ watcher, moduleGraph, ws }) {\n const pagesConfigSourcePaths = await ctx.pagesConfigSourcePaths();\n logger.debug(\"Add watcher\", pagesConfigSourcePaths);\n watcher.add(pagesConfigSourcePaths);\n\n const reloadModule = (module: ModuleNode | undefined, path = \"*\") => {\n if (module) {\n moduleGraph.invalidateModule(module);\n if (ws) {\n ws.send({\n path,\n type: \"full-reload\",\n });\n }\n }\n };\n const updateVirtualModule = () => {\n logger.debug(\"Update virtualModule\");\n const module = moduleGraph.getModuleById(resolvedVirtualModuleId);\n reloadModule(module);\n };\n\n watcher.on(\"change\", async (path) => {\n if (\n pagesConfigSourcePaths.includes(normalizePath(path)) ||\n isPagePath(path, options)\n ) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n watcher.on(\"add\", async (path) => {\n if (isPagePath(path, options)) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n watcher.on(\"unlink\", async (path) => {\n if (isPagePath(path, options)) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n },\n resolveId(id) {\n if (id === virtualModuleId) {\n return resolvedVirtualModuleId;\n }\n },\n\n load(id) {\n if (id === resolvedVirtualModuleId) {\n return ctx.virtualModule();\n }\n },\n };\n};\n\nexport default VitePluginUniPages;\n","import { resolve } from \"path\";\nimport { ResolvedOptions } from \"./types\";\nimport { createFilter } from \"vite\";\nimport consola from \"consola\";\n\nexport const isPagePath = (path: string, options: ResolvedOptions) => {\n const dirPath = resolve(process.cwd(), options.pagesDir);\n const filter = createFilter(\n dirPath + \"/**/*.(vue|nvue|uvue)\",\n options.exclude\n );\n return filter(path);\n};\n\nexport const logger = consola.create({\n defaults: {\n tag: \"vite-plugin-uni-pages\",\n },\n});\n","export const virtualModuleId = \"virtual:uni-pages\";\nexport const resolvedVirtualModuleId = \"\\0\" + virtualModuleId;\n","import { extname, join, relative, resolve } from \"path\";\nimport { loadConfig } from \"unconfig\";\nimport { normalizePath } from \"vite\";\nimport { PagesConfig } from \"../config/types\";\nimport { PageMeta, PagePathInfo, ResolvedOptions } from \"../types\";\nimport fg from \"fast-glob\";\nimport { parse as JSONParse } from \"jsonc-parser\";\nimport { parse } from \"@vue/compiler-dom\";\nimport fs from \"fs\";\nimport { defu } from \"defu\";\nimport { logger } from \"../utils\";\nexport class Context {\n options: ResolvedOptions;\n pagesConfig!: PagesConfig;\n pagesPathInfo: PagePathInfo[] = [];\n pagesMeta: PageMeta[] = [];\n constructor(options: ResolvedOptions) {\n this.options = options;\n this.createOrUpdatePagesJSON();\n }\n\n async loadUserPagesConfig() {\n const { config } = await loadConfig({\n sources: [\n {\n files: \"pages.config\",\n },\n ],\n merge: false,\n });\n if (!config) {\n logger.error(\n \"Can't found pages.config, please create pages.config.(ts|mts|cts|js|cjs|mjs|json)\"\n );\n process.exit(-1);\n }\n logger.debug(\"Loaded user pages config\", config);\n this.pagesConfig = config as PagesConfig;\n }\n\n async scanPages() {\n const files = await fg(\"**/*.(vue|nvue|uvue)\", {\n ignore: [\"node_modules\", \".git\", \"**/__*__/*\", ...this.options.exclude],\n onlyFiles: true,\n cwd: resolve(process.cwd(), this.options.pagesDir),\n });\n const basePath = relative(\n resolve(process.cwd(), this.options.outDir),\n this.options.pagesDir\n );\n this.pagesPathInfo = files.map((file) => {\n return {\n relative: normalizePath(join(basePath, file)),\n absolute: normalizePath(\n resolve(process.cwd(), this.options.pagesDir, file)\n ),\n };\n });\n logger.debug(\"Scanned pages dir\", this.pagesPathInfo);\n }\n\n async parsePage({ relative, absolute }: PagePathInfo): Promise<PageMeta> {\n const code = await fs.promises.readFile(absolute, {\n encoding: \"utf-8\",\n });\n const t = parse(code);\n const path = relative.replace(extname(relative), \"\");\n let pageMeta: PageMeta = {\n path,\n type: \"page\",\n };\n t?.children.forEach((v) => {\n if (v.type !== 1) {\n return;\n }\n if (v.tag === \"route\") {\n v.props.forEach((prop) => {\n if (prop.type === 6 && prop.name === \"type\") {\n pageMeta.type = prop.value?.content ?? pageMeta.type;\n }\n });\n const astContent = v.children?.[0];\n if (astContent && astContent.type === 2) {\n const _pageMeta = JSONParse(astContent.content);\n Object.keys(_pageMeta).forEach((key) => {\n pageMeta[key] = _pageMeta[key];\n });\n // overwrite path\n pageMeta[\"path\"] = path;\n }\n }\n });\n return pageMeta;\n }\n\n async mergePagesMeta() {\n const pagesMeta = await Promise.all(\n this.pagesPathInfo?.map(async (page) => await this.parsePage(page))\n );\n const pages = Object.values(defu({}, pagesMeta, this.pagesConfig.pages));\n // @ts-ignore\n pages.sort((a) => (a.type === \"home\" ? -1 : 0));\n // @ts-ignore\n this.pagesMeta = pages;\n logger.debug(\"merged pages\", this.pagesMeta);\n }\n\n async createOrUpdatePagesJSON() {\n const outputName = \"pages.json\";\n const resolvedOutput = normalizePath(\n resolve(process.cwd(), this.options.outDir, outputName)\n );\n\n // 如果不存在,先输出一个占位文件\n if (!fs.existsSync(resolvedOutput)) {\n fs.writeFileSync(resolvedOutput, `{\"pages\": [{\"path\": \"\"}]}`, {\n encoding: \"utf-8\",\n });\n }\n\n this.options.onBeforeLoadUserConfig(this);\n await this.loadUserPagesConfig();\n this.options.onAfterLoadUserConfig(this);\n\n this.options.onBeforeScanPages(this);\n await this.scanPages();\n this.options.onAfterScanPages(this);\n\n this.options.onBeforeMergePagesMeta(this);\n await this.mergePagesMeta();\n this.options.onAfterMergePagesMeta(this);\n\n this.options.onBeforeWriteFile(this);\n fs.writeFileSync(resolvedOutput, this.pagesJson, {\n encoding: \"utf-8\",\n });\n this.options.onAfterWriteFile(this);\n }\n\n async virtualModule() {\n return `export const pages = ${JSON.stringify(this.pagesMeta)};`;\n }\n\n async pagesConfigSourcePaths() {\n return await fg(\"pages.config.(ts|mts|cts|js|cjs|mjs|json)\", {\n deep: 0,\n onlyFiles: true,\n absolute: true,\n });\n }\n\n get pagesJson() {\n return JSON.stringify({\n ...this.pagesConfig,\n pages: this.pagesMeta,\n });\n }\n}\n","import { UserPagesConfig } from \"./types\";\nexport * from \"./types\";\nexport function definePages(config: UserPagesConfig) {\n return config;\n}\n"],"mappings":"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","names":["import_vite","consola","import_path","import_vite","fg","relative","fs","_a","JSONParse","module"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,20 +1,694 @@
|
|
|
1
1
|
import { Plugin } from 'vite';
|
|
2
|
+
import { PartialDeep } from 'type-fest';
|
|
2
3
|
|
|
4
|
+
interface Easycom {
|
|
5
|
+
autoscan: boolean;
|
|
6
|
+
custom: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
type hexcolor = string;
|
|
10
|
+
|
|
11
|
+
interface AppPlus {
|
|
12
|
+
/**
|
|
13
|
+
* 窗体背景色。无论vue页面还是nvue页面,在App上都有一个父级原生窗体,该窗体的背景色生效时间快于页面里的css生效时间
|
|
14
|
+
* @type HexColor
|
|
15
|
+
* @default "#FFFFFF"
|
|
16
|
+
* @desc App
|
|
17
|
+
*/
|
|
18
|
+
background: hexcolor;
|
|
19
|
+
/**
|
|
20
|
+
* 导航栏 ,详见:导航栏
|
|
21
|
+
* @type Object
|
|
22
|
+
* @desc App、H5
|
|
23
|
+
*/
|
|
24
|
+
titleNView: object;
|
|
25
|
+
/**
|
|
26
|
+
* 原生子窗体,详见:原生子窗体
|
|
27
|
+
* @type Object
|
|
28
|
+
* @desc App 1.9.10+
|
|
29
|
+
*/
|
|
30
|
+
subNVues: object;
|
|
31
|
+
/**
|
|
32
|
+
* 页面回弹效果,设置为 "none" 时关闭效果。
|
|
33
|
+
* @type String
|
|
34
|
+
* @desc App-vue(nvue Android无页面级bounce效果,仅list、recycle-list、waterfall等滚动组件有bounce效果)
|
|
35
|
+
*/
|
|
36
|
+
bounce: string;
|
|
37
|
+
/**
|
|
38
|
+
* 侧滑返回功能,可选值:"close"(启用侧滑返回)、"none"(禁用侧滑返回)
|
|
39
|
+
* @type String
|
|
40
|
+
* @default "close"
|
|
41
|
+
* @desc App-iOS
|
|
42
|
+
*/
|
|
43
|
+
popGesture: string;
|
|
44
|
+
/**
|
|
45
|
+
* iOS软键盘上完成工具栏的显示模式,设置为 "none" 时关闭工具栏。
|
|
46
|
+
* @type String
|
|
47
|
+
* @default "auto"
|
|
48
|
+
* @desc App-iOS
|
|
49
|
+
*/
|
|
50
|
+
softinputNavBar: string;
|
|
51
|
+
/**
|
|
52
|
+
* 软键盘弹出模式,支持 adjustResize、adjustPan 两种模式
|
|
53
|
+
* @type String
|
|
54
|
+
* @default "adjustPan"
|
|
55
|
+
* @desc App
|
|
56
|
+
*/
|
|
57
|
+
softinputMode: string;
|
|
58
|
+
/**
|
|
59
|
+
* 下拉刷新
|
|
60
|
+
* @type Object
|
|
61
|
+
* @desc App
|
|
62
|
+
*/
|
|
63
|
+
pullToRefresh: object;
|
|
64
|
+
/**
|
|
65
|
+
* 滚动条显示策略,设置为 "none" 时不显示滚动条。
|
|
66
|
+
* @type String
|
|
67
|
+
* @desc App
|
|
68
|
+
*/
|
|
69
|
+
scrollIndicator: string;
|
|
70
|
+
/**
|
|
71
|
+
* 窗口显示的动画效果,详见:窗口动画。
|
|
72
|
+
* @type String
|
|
73
|
+
* @default "pop-in"
|
|
74
|
+
* @desc App
|
|
75
|
+
*/
|
|
76
|
+
animationType: string;
|
|
77
|
+
/**
|
|
78
|
+
* 窗口显示动画的持续时间,单位为 ms。
|
|
79
|
+
* @type Number
|
|
80
|
+
* @default "300"
|
|
81
|
+
* @desc App
|
|
82
|
+
*/
|
|
83
|
+
animationDuration: number;
|
|
84
|
+
[x: string]: any;
|
|
85
|
+
}
|
|
86
|
+
interface H5 {
|
|
87
|
+
/**
|
|
88
|
+
* 背景颜色,颜色值格式为"#RRGGBB"。
|
|
89
|
+
* @type String
|
|
90
|
+
* @default "#F7F7F7"
|
|
91
|
+
* @desc
|
|
92
|
+
*/
|
|
93
|
+
backgroundColor: string;
|
|
94
|
+
/**
|
|
95
|
+
* 自定义按钮,参考 buttons
|
|
96
|
+
* @type Array
|
|
97
|
+
* @desc
|
|
98
|
+
*/
|
|
99
|
+
buttons: any[];
|
|
100
|
+
/**
|
|
101
|
+
* 标题文字颜色
|
|
102
|
+
* @type String
|
|
103
|
+
* @default "#000000"
|
|
104
|
+
* @desc
|
|
105
|
+
*/
|
|
106
|
+
titleColor: string;
|
|
107
|
+
/**
|
|
108
|
+
* 标题文字内容
|
|
109
|
+
* @type String
|
|
110
|
+
* @desc
|
|
111
|
+
*/
|
|
112
|
+
titleText: string;
|
|
113
|
+
/**
|
|
114
|
+
* 标题文字字体大小
|
|
115
|
+
* @type String
|
|
116
|
+
* @desc
|
|
117
|
+
*/
|
|
118
|
+
titleSize: string;
|
|
119
|
+
/**
|
|
120
|
+
* 导航栏样式。"default"-默认样式;"transparent"-透明渐变。
|
|
121
|
+
* @type String
|
|
122
|
+
* @default "default"
|
|
123
|
+
* @desc
|
|
124
|
+
*/
|
|
125
|
+
type: string;
|
|
126
|
+
/**
|
|
127
|
+
* 导航栏上的搜索框样式,详见:searchInput
|
|
128
|
+
* @type Object
|
|
129
|
+
* @desc 1.6.5
|
|
130
|
+
*/
|
|
131
|
+
searchInput: object;
|
|
132
|
+
[x: string]: any;
|
|
133
|
+
}
|
|
134
|
+
interface GlobalStyle {
|
|
135
|
+
/**
|
|
136
|
+
* 导航栏背景颜色(同状态栏背景色)
|
|
137
|
+
* @type HexColor
|
|
138
|
+
* @default "#F7F7F7"
|
|
139
|
+
* @desc APP与H5为#F7F7F7,小程序平台请参考相应小程序文档
|
|
140
|
+
*/
|
|
141
|
+
navigationBarBackgroundColor: hexcolor;
|
|
142
|
+
/**
|
|
143
|
+
* 导航栏标题颜色及状态栏前景颜色,仅支持 black/white
|
|
144
|
+
* @type String
|
|
145
|
+
* @default "white"
|
|
146
|
+
* @desc 支付宝小程序不支持,请使用 my.setNavigationBar
|
|
147
|
+
*/
|
|
148
|
+
navigationBarTextStyle: string;
|
|
149
|
+
/**
|
|
150
|
+
* 导航栏标题文字内容
|
|
151
|
+
* @type String
|
|
152
|
+
* @desc
|
|
153
|
+
*/
|
|
154
|
+
navigationBarTitleText: string;
|
|
155
|
+
/**
|
|
156
|
+
* 导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏,需看使用注意
|
|
157
|
+
* @type String
|
|
158
|
+
* @default "default"
|
|
159
|
+
* @desc 微信小程序 7.0+、百度小程序、H5、App(2.0.3+)
|
|
160
|
+
*/
|
|
161
|
+
navigationStyle: string;
|
|
162
|
+
/**
|
|
163
|
+
* 下拉显示出来的窗口的背景色
|
|
164
|
+
* @type HexColor
|
|
165
|
+
* @default "#ffffff"
|
|
166
|
+
* @desc 微信小程序
|
|
167
|
+
*/
|
|
168
|
+
backgroundColor: hexcolor;
|
|
169
|
+
/**
|
|
170
|
+
* 下拉 loading 的样式,仅支持 dark / light
|
|
171
|
+
* @type String
|
|
172
|
+
* @default "dark"
|
|
173
|
+
* @desc 微信小程序
|
|
174
|
+
*/
|
|
175
|
+
backgroundTextStyle: string;
|
|
176
|
+
/**
|
|
177
|
+
* 是否开启下拉刷新,详见页面生命周期。
|
|
178
|
+
* @type Boolean
|
|
179
|
+
* @default "false"
|
|
180
|
+
* @desc
|
|
181
|
+
*/
|
|
182
|
+
enablePullDownRefresh: boolean;
|
|
183
|
+
/**
|
|
184
|
+
* 页面上拉触底事件触发时距页面底部距离,单位只支持px,详见页面生命周期
|
|
185
|
+
* @type Number
|
|
186
|
+
* @default "50"
|
|
187
|
+
* @desc
|
|
188
|
+
*/
|
|
189
|
+
onReachBottomDistance: number;
|
|
190
|
+
/**
|
|
191
|
+
* 顶部窗口的背景色(bounce回弹区域)
|
|
192
|
+
* @type HexColor
|
|
193
|
+
* @default "#ffffff"
|
|
194
|
+
* @desc 仅 iOS 平台
|
|
195
|
+
*/
|
|
196
|
+
backgroundColorTop: hexcolor;
|
|
197
|
+
/**
|
|
198
|
+
* 底部窗口的背景色(bounce回弹区域)
|
|
199
|
+
* @type HexColor
|
|
200
|
+
* @default "#ffffff"
|
|
201
|
+
* @desc 仅 iOS 平台
|
|
202
|
+
*/
|
|
203
|
+
backgroundColorBottom: hexcolor;
|
|
204
|
+
/**
|
|
205
|
+
* 导航栏图片地址(替换当前文字标题),支付宝小程序内必须使用https的图片链接地址
|
|
206
|
+
* @type String
|
|
207
|
+
* @desc 支付宝小程序、H5、APP
|
|
208
|
+
*/
|
|
209
|
+
titleImage: string;
|
|
210
|
+
/**
|
|
211
|
+
* 导航栏整体(前景、背景)透明设置。支持 always 一直透明 / auto 滑动自适应 / none 不透明
|
|
212
|
+
* @type String
|
|
213
|
+
* @default "none"
|
|
214
|
+
* @desc 支付宝小程序、H5、APP
|
|
215
|
+
*/
|
|
216
|
+
transparentTitle: string;
|
|
217
|
+
/**
|
|
218
|
+
* 导航栏点击穿透
|
|
219
|
+
* @type String
|
|
220
|
+
* @default "NO"
|
|
221
|
+
* @desc 支付宝小程序、H5
|
|
222
|
+
*/
|
|
223
|
+
titlePenetrate: string;
|
|
224
|
+
/**
|
|
225
|
+
* 横屏配置,屏幕旋转设置,仅支持 auto / portrait / landscape 详见 响应显示区域变化
|
|
226
|
+
* @type String
|
|
227
|
+
* @default "portrait"
|
|
228
|
+
* @desc App 2.4.7+、微信小程序、QQ小程序
|
|
229
|
+
*/
|
|
230
|
+
pageOrientation: string;
|
|
231
|
+
/**
|
|
232
|
+
* 窗口显示的动画效果,详见:窗口动画
|
|
233
|
+
* @type String
|
|
234
|
+
* @default "pop-in"
|
|
235
|
+
* @desc App
|
|
236
|
+
*/
|
|
237
|
+
animationType: string;
|
|
238
|
+
/**
|
|
239
|
+
* 窗口显示动画的持续时间,单位为 ms
|
|
240
|
+
* @type Number
|
|
241
|
+
* @default "300"
|
|
242
|
+
* @desc App
|
|
243
|
+
*/
|
|
244
|
+
animationDuration: number;
|
|
245
|
+
/**
|
|
246
|
+
* 设置编译到 App 平台的特定样式,配置项参考下方 app-plus
|
|
247
|
+
* @type AppPlus
|
|
248
|
+
* @desc App
|
|
249
|
+
*/
|
|
250
|
+
"app-plus": AppPlus;
|
|
251
|
+
/**
|
|
252
|
+
* 设置编译到 H5 平台的特定样式,配置项参考下方 H5
|
|
253
|
+
* @type H5
|
|
254
|
+
* @desc H5
|
|
255
|
+
*/
|
|
256
|
+
h5: H5;
|
|
257
|
+
/**
|
|
258
|
+
* 设置编译到 mp-alipay 平台的特定样式,配置项参考下方 MP-ALIPAY
|
|
259
|
+
* @type Object
|
|
260
|
+
* @desc 支付宝小程序
|
|
261
|
+
*/
|
|
262
|
+
"mp-alipay": object;
|
|
263
|
+
/**
|
|
264
|
+
* 设置编译到 mp-weixin 平台的特定样式
|
|
265
|
+
* @type Object
|
|
266
|
+
* @desc 微信小程序
|
|
267
|
+
*/
|
|
268
|
+
"mp-weixin": object;
|
|
269
|
+
/**
|
|
270
|
+
* 设置编译到 mp-baidu 平台的特定样式
|
|
271
|
+
* @type Object
|
|
272
|
+
* @desc 百度小程序
|
|
273
|
+
*/
|
|
274
|
+
"mp-baidu": object;
|
|
275
|
+
/**
|
|
276
|
+
* 设置编译到 mp-toutiao 平台的特定样式
|
|
277
|
+
* @type Object
|
|
278
|
+
* @desc 字节跳动小程序
|
|
279
|
+
*/
|
|
280
|
+
"mp-toutiao": object;
|
|
281
|
+
/**
|
|
282
|
+
* 设置编译到 mp-lark 平台的特定样式
|
|
283
|
+
* @type Object
|
|
284
|
+
* @desc 飞书小程序
|
|
285
|
+
*/
|
|
286
|
+
"mp-lark": object;
|
|
287
|
+
/**
|
|
288
|
+
* 设置编译到 mp-qq 平台的特定样式
|
|
289
|
+
* @type Object
|
|
290
|
+
* @desc QQ小程序
|
|
291
|
+
*/
|
|
292
|
+
"mp-qq": object;
|
|
293
|
+
/**
|
|
294
|
+
* 设置编译到 mp-kuaishou 平台的特定样式
|
|
295
|
+
* @type Object
|
|
296
|
+
* @desc 快手小程序
|
|
297
|
+
*/
|
|
298
|
+
"mp-kuaishou": object;
|
|
299
|
+
/**
|
|
300
|
+
* 设置编译到 mp-jd 平台的特定样式
|
|
301
|
+
* @type Object
|
|
302
|
+
* @desc 京东小程序
|
|
303
|
+
*/
|
|
304
|
+
"mp-jd": object;
|
|
305
|
+
/**
|
|
306
|
+
* 引用小程序组件,参考 小程序组件
|
|
307
|
+
* @type Record<string, string>
|
|
308
|
+
* @desc
|
|
309
|
+
*/
|
|
310
|
+
usingComponents: Record<string, string>;
|
|
311
|
+
/**
|
|
312
|
+
* 同层渲染,webrtc(实时音视频) 无法正常时尝试配置 seperated 强制关掉同层
|
|
313
|
+
* @type String
|
|
314
|
+
* @desc 微信小程序
|
|
315
|
+
*/
|
|
316
|
+
renderingMode: string;
|
|
317
|
+
/**
|
|
318
|
+
* 当存在 leftWindow 时,默认是否显示 leftWindow
|
|
319
|
+
* @type Boolean
|
|
320
|
+
* @default "true"
|
|
321
|
+
* @desc H5
|
|
322
|
+
*/
|
|
323
|
+
leftWindow: boolean;
|
|
324
|
+
/**
|
|
325
|
+
* 当存在 topWindow 时,默认是否显示 topWindow
|
|
326
|
+
* @type Boolean
|
|
327
|
+
* @default "true"
|
|
328
|
+
* @desc H5
|
|
329
|
+
*/
|
|
330
|
+
topWindow: boolean;
|
|
331
|
+
/**
|
|
332
|
+
* 当存在 rightWindow 时,默认是否显示 rightWindow
|
|
333
|
+
* @type Boolean
|
|
334
|
+
* @default "true"
|
|
335
|
+
* @desc H5
|
|
336
|
+
*/
|
|
337
|
+
rightWindow: boolean;
|
|
338
|
+
/**
|
|
339
|
+
* rpx 计算所支持的最大设备宽度,单位 px
|
|
340
|
+
* @type Number
|
|
341
|
+
* @default "960"
|
|
342
|
+
* @desc App(vue2 且不含 nvue)、H5(2.8.12+)
|
|
343
|
+
*/
|
|
344
|
+
rpxCalcMaxDeviceWidth: number;
|
|
345
|
+
/**
|
|
346
|
+
* rpx 计算使用的基准设备宽度,设备实际宽度超出 rpx 计算所支持的最大设备宽度时将按基准宽度计算,单位 px
|
|
347
|
+
* @type Number
|
|
348
|
+
* @default "375"
|
|
349
|
+
* @desc App(vue2 且不含 nvue)、H5(2.8.12+)
|
|
350
|
+
*/
|
|
351
|
+
rpxCalcBaseDeviceWidth: number;
|
|
352
|
+
/**
|
|
353
|
+
* rpx 计算特殊处理的值,始终按实际的设备宽度计算,单位 rpx
|
|
354
|
+
* @type Number
|
|
355
|
+
* @default "750"
|
|
356
|
+
* @desc App(vue2 且不含 nvue)、H5(2.8.12+)
|
|
357
|
+
*/
|
|
358
|
+
rpxCalcIncludeWidth: number;
|
|
359
|
+
/**
|
|
360
|
+
* 动态 rpx,屏幕大小变化会重新渲染 rpx
|
|
361
|
+
* @type Boolean
|
|
362
|
+
* @default "false"
|
|
363
|
+
* @desc App-nvue(vue3 固定值为 true) 3.2.13+
|
|
364
|
+
*/
|
|
365
|
+
dynamicRpx: boolean;
|
|
366
|
+
/**
|
|
367
|
+
* 单位px,当浏览器可见区域宽度大于maxWidth时,两侧留白,当小于等于maxWidth时,页面铺满;不同页面支持配置不同的maxWidth;maxWidth = leftWindow(可选)+page(页面主体)+rightWindow(可选)
|
|
368
|
+
* @type Number
|
|
369
|
+
* @desc H5(2.9.9+)
|
|
370
|
+
*/
|
|
371
|
+
maxWidth: number;
|
|
372
|
+
[x: string]: any;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
interface IconFont {
|
|
376
|
+
/**
|
|
377
|
+
* 字库 Unicode 码
|
|
378
|
+
*/
|
|
379
|
+
text: string;
|
|
380
|
+
/**
|
|
381
|
+
* 选中后字库 Unicode 码
|
|
382
|
+
*/
|
|
383
|
+
selectedText: string;
|
|
384
|
+
/**
|
|
385
|
+
* 字体图标字号(px)
|
|
386
|
+
*/
|
|
387
|
+
fontSize: string;
|
|
388
|
+
/**
|
|
389
|
+
* 字体图标颜色
|
|
390
|
+
*/
|
|
391
|
+
color: string;
|
|
392
|
+
/**
|
|
393
|
+
* 字体图标选中颜色
|
|
394
|
+
*/
|
|
395
|
+
selectedColor: string;
|
|
396
|
+
}
|
|
397
|
+
interface TabBarItem {
|
|
398
|
+
/**
|
|
399
|
+
* 页面路径,必须在 pages 中先定义
|
|
400
|
+
* @type String
|
|
401
|
+
*/
|
|
402
|
+
pagePath: string;
|
|
403
|
+
/**
|
|
404
|
+
* tab 上按钮文字,在 App 和 H5 平台为非必填。例如中间可放一个没有文字的+号图标
|
|
405
|
+
* @type String
|
|
406
|
+
*/
|
|
407
|
+
text: string;
|
|
408
|
+
/**
|
|
409
|
+
* 图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px,当 position 为 top 时,此参数无效,不支持网络图片,不支持字体图标
|
|
410
|
+
* @type String
|
|
411
|
+
*/
|
|
412
|
+
iconPath: string;
|
|
413
|
+
/**
|
|
414
|
+
* 选中时的图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px ,当 position 为 top 时,此参数无效
|
|
415
|
+
* @type String
|
|
416
|
+
*/
|
|
417
|
+
selectedIconPath: string;
|
|
418
|
+
/**
|
|
419
|
+
* 该项是否显示,默认显示
|
|
420
|
+
* @type Boolean
|
|
421
|
+
* @desc App (3.2.10+)、H5 (3.2.10+)
|
|
422
|
+
*/
|
|
423
|
+
visible: boolean;
|
|
424
|
+
/**
|
|
425
|
+
* 字体图标,优先级高于 iconPath
|
|
426
|
+
* @type IconFont
|
|
427
|
+
* @desc App(3.4.4+)、H5 (3.5.3+)
|
|
428
|
+
*/
|
|
429
|
+
iconfont: IconFont;
|
|
430
|
+
[x: string]: any;
|
|
431
|
+
}
|
|
432
|
+
interface MidButton {
|
|
433
|
+
/**
|
|
434
|
+
* 中间按钮的宽度,tabBar 其它项为减去此宽度后平分,默认值为与其它项平分宽度
|
|
435
|
+
* @type String
|
|
436
|
+
* @default "80px"
|
|
437
|
+
*/
|
|
438
|
+
width: string;
|
|
439
|
+
/**
|
|
440
|
+
* 中间按钮的高度,可以大于 tabBar 高度,达到中间凸起的效果
|
|
441
|
+
* @type String
|
|
442
|
+
* @default "50px"
|
|
443
|
+
*/
|
|
444
|
+
height: string;
|
|
445
|
+
/**
|
|
446
|
+
* 中间按钮的文字
|
|
447
|
+
* @type String
|
|
448
|
+
*/
|
|
449
|
+
text: string;
|
|
450
|
+
/**
|
|
451
|
+
* 中间按钮的图片路径
|
|
452
|
+
* @type String
|
|
453
|
+
*/
|
|
454
|
+
iconPath: string;
|
|
455
|
+
/**
|
|
456
|
+
* 图片宽度(高度等比例缩放)
|
|
457
|
+
* @type String
|
|
458
|
+
* @default "24px"
|
|
459
|
+
*/
|
|
460
|
+
iconWidth: string;
|
|
461
|
+
/**
|
|
462
|
+
* 中间按钮的背景图片路径
|
|
463
|
+
* @type String
|
|
464
|
+
*/
|
|
465
|
+
backgroundImage: string;
|
|
466
|
+
/**
|
|
467
|
+
* 字体图标,优先级高于 iconPath
|
|
468
|
+
* @type IconFont
|
|
469
|
+
*/
|
|
470
|
+
iconfont: IconFont;
|
|
471
|
+
}
|
|
472
|
+
interface TabBar {
|
|
473
|
+
/**
|
|
474
|
+
* tab 上的文字默认颜色
|
|
475
|
+
* @type HexColor
|
|
476
|
+
*/
|
|
477
|
+
color: hexcolor;
|
|
478
|
+
/**
|
|
479
|
+
* tab 上的文字选中时的颜色
|
|
480
|
+
* @type HexColor
|
|
481
|
+
*/
|
|
482
|
+
selectedColor: hexcolor;
|
|
483
|
+
/**
|
|
484
|
+
* tab 的背景色
|
|
485
|
+
* @type HexColor
|
|
486
|
+
*/
|
|
487
|
+
backgroundColor: hexcolor;
|
|
488
|
+
/**
|
|
489
|
+
* tabbar 上边框的颜色,可选值 black/white,也支持其他颜色值
|
|
490
|
+
* @type String
|
|
491
|
+
* @default "black"
|
|
492
|
+
* @desc App 2.3.4+ 、H5 3.0.0+
|
|
493
|
+
*/
|
|
494
|
+
borderStyle: string;
|
|
495
|
+
/**
|
|
496
|
+
* iOS 高斯模糊效果,可选值 dark/extralight/light/none(参考:使用说明)
|
|
497
|
+
* @type String
|
|
498
|
+
* @default "none"
|
|
499
|
+
* @desc App 2.4.0+ 支持、H5 3.0.0+(只有最新版浏览器才支持)
|
|
500
|
+
*/
|
|
501
|
+
blurEffect: string;
|
|
502
|
+
/**
|
|
503
|
+
* tab 的列表,详见 list 属性说明,最少2个、最多5个 tab
|
|
504
|
+
* @type TabBarItem[]
|
|
505
|
+
*/
|
|
506
|
+
list: PartialDeep<TabBarItem>[];
|
|
507
|
+
/**
|
|
508
|
+
* 可选值 bottom、top
|
|
509
|
+
* @type String
|
|
510
|
+
* @default "bottom"
|
|
511
|
+
* @desc top 值仅微信小程序支持
|
|
512
|
+
*/
|
|
513
|
+
position: string;
|
|
514
|
+
/**
|
|
515
|
+
* 文字默认大小
|
|
516
|
+
* @type String
|
|
517
|
+
* @default "10px"
|
|
518
|
+
* @desc App 2.3.4+、H5 3.0.0+
|
|
519
|
+
*/
|
|
520
|
+
fontSize: string;
|
|
521
|
+
/**
|
|
522
|
+
* 图标默认宽度(高度等比例缩放)
|
|
523
|
+
* @type String
|
|
524
|
+
* @default "24px"
|
|
525
|
+
* @desc App 2.3.4+、H5 3.0.0+
|
|
526
|
+
*/
|
|
527
|
+
iconWidth: string;
|
|
528
|
+
/**
|
|
529
|
+
* 图标和文字的间距
|
|
530
|
+
* @type String
|
|
531
|
+
* @default "3px"
|
|
532
|
+
* @desc App 2.3.4+、H5 3.0.0+
|
|
533
|
+
*/
|
|
534
|
+
spacing: string;
|
|
535
|
+
/**
|
|
536
|
+
* tabBar 默认高度
|
|
537
|
+
* @type String
|
|
538
|
+
* @default "50px"
|
|
539
|
+
* @desc App 2.3.4+、H5 3.0.0+
|
|
540
|
+
*/
|
|
541
|
+
height: string;
|
|
542
|
+
/**
|
|
543
|
+
* 中间按钮 仅在 list 项为偶数时有效
|
|
544
|
+
* @type MidButton
|
|
545
|
+
* @desc App 2.3.4+、H5 3.0.0+
|
|
546
|
+
*/
|
|
547
|
+
midButton: MidButton;
|
|
548
|
+
/**
|
|
549
|
+
* list设置 iconfont 属性时,需要指定字体文件路径
|
|
550
|
+
* @type String
|
|
551
|
+
* @desc App 3.4.4+、H5 3.5.3+
|
|
552
|
+
*/
|
|
553
|
+
iconfontSrc: string;
|
|
554
|
+
[x: string]: any;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
interface Page {
|
|
558
|
+
/**
|
|
559
|
+
* 配置页面路径
|
|
560
|
+
*/
|
|
561
|
+
path: string;
|
|
562
|
+
/**
|
|
563
|
+
* 配置页面窗口表现,配置项参考下方 pageStyle
|
|
564
|
+
*/
|
|
565
|
+
style: GlobalStyle;
|
|
566
|
+
[x: string]: any;
|
|
567
|
+
}
|
|
568
|
+
interface TheWindow {
|
|
569
|
+
/**
|
|
570
|
+
* 配置页面路径
|
|
571
|
+
*/
|
|
572
|
+
path: string;
|
|
573
|
+
/**
|
|
574
|
+
* 配置页面窗口表现,配置项参考下方 pageStyle
|
|
575
|
+
*/
|
|
576
|
+
style: GlobalStyle;
|
|
577
|
+
/**
|
|
578
|
+
* 配置显示该窗口的规则,配置项参考下方 matchMedia
|
|
579
|
+
*/
|
|
580
|
+
matchMedia: {
|
|
581
|
+
/**
|
|
582
|
+
* 当设备可见区域宽度 >= minWidth 时,显示该 window
|
|
583
|
+
* @type number
|
|
584
|
+
* @default "768"
|
|
585
|
+
*/
|
|
586
|
+
minWidth: number;
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
interface PreloadRule {
|
|
590
|
+
/**
|
|
591
|
+
* 进入页面后预下载分包的 root 或 name。__APP__ 表示主包。
|
|
592
|
+
*/
|
|
593
|
+
packages: string[];
|
|
594
|
+
/**
|
|
595
|
+
* 在指定网络下预下载,可选值为:all(不限网络)、wifi(仅wifi下预下载)
|
|
596
|
+
* @default "wifi"
|
|
597
|
+
*/
|
|
598
|
+
network: string;
|
|
599
|
+
}
|
|
600
|
+
interface SubPackage {
|
|
601
|
+
/**
|
|
602
|
+
* 子包的根目录
|
|
603
|
+
*/
|
|
604
|
+
root: string;
|
|
605
|
+
/**
|
|
606
|
+
* 子包由哪些页面组成,参数同 pages
|
|
607
|
+
*/
|
|
608
|
+
pages: any[];
|
|
609
|
+
}
|
|
610
|
+
interface ConditionItem {
|
|
611
|
+
/**
|
|
612
|
+
* 启动模式名称
|
|
613
|
+
*/
|
|
614
|
+
name: string;
|
|
615
|
+
/**
|
|
616
|
+
* 启动页面路径
|
|
617
|
+
*/
|
|
618
|
+
path: string;
|
|
619
|
+
/**
|
|
620
|
+
* 启动参数,可在页面的 onLoad 函数里获得
|
|
621
|
+
*/
|
|
622
|
+
query: string;
|
|
623
|
+
}
|
|
624
|
+
interface Condition {
|
|
625
|
+
/**
|
|
626
|
+
* 当前激活的模式,list节点的索引值
|
|
627
|
+
*/
|
|
628
|
+
current: number;
|
|
629
|
+
/**
|
|
630
|
+
* 启动模式列表
|
|
631
|
+
*/
|
|
632
|
+
list: Partial<ConditionItem>[];
|
|
633
|
+
}
|
|
3
634
|
interface PagesConfig {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
635
|
+
/**
|
|
636
|
+
* 设置页面路径及窗口表现
|
|
637
|
+
*/
|
|
638
|
+
pages: PartialDeep<Page>[];
|
|
639
|
+
/**
|
|
640
|
+
* 设置默认页面的窗口表现
|
|
641
|
+
*/
|
|
642
|
+
globalStyle: GlobalStyle;
|
|
643
|
+
/**
|
|
644
|
+
* 组件自动引入规则
|
|
645
|
+
* @desc 2.5.5+
|
|
646
|
+
*/
|
|
647
|
+
easycom: Easycom;
|
|
648
|
+
/**
|
|
649
|
+
* 设置底部 tab 的表现
|
|
650
|
+
*/
|
|
651
|
+
tabBar: TabBar;
|
|
652
|
+
/**
|
|
653
|
+
* 启动模式配置
|
|
654
|
+
*/
|
|
655
|
+
condition: Condition;
|
|
656
|
+
/**
|
|
657
|
+
* 分包加载配置
|
|
658
|
+
*/
|
|
659
|
+
subPackages: PartialDeep<SubPackage>[];
|
|
660
|
+
/**
|
|
661
|
+
* 分包预下载规则
|
|
662
|
+
* @desc 微信小程序
|
|
663
|
+
*/
|
|
664
|
+
preloadRule: PreloadRule;
|
|
665
|
+
/**
|
|
666
|
+
* `Worker` 代码放置的目录
|
|
667
|
+
* @desc 微信小程序
|
|
668
|
+
*/
|
|
11
669
|
workers: any;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
670
|
+
/**
|
|
671
|
+
* 大屏左侧窗口
|
|
672
|
+
* @desc H5
|
|
673
|
+
*/
|
|
674
|
+
leftWindow: TheWindow;
|
|
675
|
+
/**
|
|
676
|
+
* 大屏顶部窗口
|
|
677
|
+
* @desc H5
|
|
678
|
+
*/
|
|
679
|
+
topWindow: TheWindow;
|
|
680
|
+
/**
|
|
681
|
+
* 大屏右侧窗口
|
|
682
|
+
* @desc H5
|
|
683
|
+
*/
|
|
684
|
+
rightWindow: TheWindow;
|
|
685
|
+
/**
|
|
686
|
+
* 自动跳转相关配置,新增于HBuilderX 3.5.0
|
|
687
|
+
*/
|
|
15
688
|
uniIdRouter: any;
|
|
689
|
+
[x: string]: any;
|
|
16
690
|
}
|
|
17
|
-
interface UserPagesConfig extends
|
|
691
|
+
interface UserPagesConfig extends PartialDeep<PagesConfig> {
|
|
18
692
|
}
|
|
19
693
|
|
|
20
694
|
declare class Context {
|
|
@@ -76,4 +750,4 @@ declare function definePages(config: UserPagesConfig): UserPagesConfig;
|
|
|
76
750
|
|
|
77
751
|
declare const VitePluginUniPages: (userOptions?: UserOptions) => Promise<Plugin>;
|
|
78
752
|
|
|
79
|
-
export { PagesConfig, UserPagesConfig, VitePluginUniPages, VitePluginUniPages as default, definePages };
|
|
753
|
+
export { AppPlus, Condition, ConditionItem, Easycom, GlobalStyle, H5, IconFont, MidButton, Page, PagesConfig, PreloadRule, SubPackage, TabBar, TabBarItem, TheWindow, UserPagesConfig, VitePluginUniPages, VitePluginUniPages as default, definePages };
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,10 @@ import { createFilter } from "vite";
|
|
|
7
7
|
import consola from "consola";
|
|
8
8
|
var isPagePath = (path, options) => {
|
|
9
9
|
const dirPath = resolve(process.cwd(), options.pagesDir);
|
|
10
|
-
const filter = createFilter(
|
|
10
|
+
const filter = createFilter(
|
|
11
|
+
dirPath + "/**/*.(vue|nvue|uvue)",
|
|
12
|
+
options.exclude
|
|
13
|
+
);
|
|
11
14
|
return filter(path);
|
|
12
15
|
};
|
|
13
16
|
var logger = consola.create({
|
|
@@ -55,7 +58,7 @@ var Context = class {
|
|
|
55
58
|
this.pagesConfig = config;
|
|
56
59
|
}
|
|
57
60
|
async scanPages() {
|
|
58
|
-
const files = await fg("**/*.(vue|nvue)", {
|
|
61
|
+
const files = await fg("**/*.(vue|nvue|uvue)", {
|
|
59
62
|
ignore: ["node_modules", ".git", "**/__*__/*", ...this.options.exclude],
|
|
60
63
|
onlyFiles: true,
|
|
61
64
|
cwd: resolve2(process.cwd(), this.options.pagesDir)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/constant.ts","../src/context/index.ts","../src/config/index.ts"],"sourcesContent":["import { ModuleNode, normalizePath, Plugin } from \"vite\";\nimport { ResolvedOptions, UserOptions } from \"./types\";\nimport { isPagePath, logger } from \"./utils\";\nimport { virtualModuleId, resolvedVirtualModuleId } from \"./constant\";\nimport { Context } from \"./context\";\n\nexport * from \"./config\";\n\nfunction resolveOptions(userOptions: UserOptions): ResolvedOptions {\n return {\n pagesDir: \"src/pages\",\n outDir: \"src\",\n exclude: [],\n onBeforeLoadUserConfig: () => {},\n onAfterLoadUserConfig: () => {},\n onBeforeScanPages: () => {},\n onAfterScanPages: () => {},\n onBeforeMergePagesMeta: () => {},\n onAfterMergePagesMeta: () => {},\n onBeforeWriteFile: () => {},\n onAfterWriteFile: () => {},\n ...userOptions,\n };\n}\n\nexport const VitePluginUniPages = async (\n userOptions: UserOptions = {}\n): Promise<Plugin> => {\n const options = resolveOptions(userOptions);\n logger.debug(\"Create uni-pages context with\", options);\n const ctx = new Context(options);\n return {\n name: \"vite-plugin-uni-pages\",\n enforce: \"pre\",\n async configureServer({ watcher, moduleGraph, ws }) {\n const pagesConfigSourcePaths = await ctx.pagesConfigSourcePaths();\n logger.debug(\"Add watcher\", pagesConfigSourcePaths);\n watcher.add(pagesConfigSourcePaths);\n\n const reloadModule = (module: ModuleNode | undefined, path = \"*\") => {\n if (module) {\n moduleGraph.invalidateModule(module);\n if (ws) {\n ws.send({\n path,\n type: \"full-reload\",\n });\n }\n }\n };\n const updateVirtualModule = () => {\n logger.debug(\"Update virtualModule\");\n const module = moduleGraph.getModuleById(resolvedVirtualModuleId);\n reloadModule(module);\n };\n\n watcher.on(\"change\", async (path) => {\n if (\n pagesConfigSourcePaths.includes(normalizePath(path)) ||\n isPagePath(path, options)\n ) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n watcher.on(\"add\", async (path) => {\n if (isPagePath(path, options)) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n watcher.on(\"unlink\", async (path) => {\n if (isPagePath(path, options)) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n },\n resolveId(id) {\n if (id === virtualModuleId) {\n return resolvedVirtualModuleId;\n }\n },\n\n load(id) {\n if (id === resolvedVirtualModuleId) {\n return ctx.virtualModule();\n }\n },\n };\n};\n\nexport default VitePluginUniPages;\n","import { resolve } from \"path\";\nimport { ResolvedOptions } from \"./types\";\nimport { createFilter } from \"vite\";\nimport consola from \"consola\";\n\nexport const isPagePath = (path: string, options: ResolvedOptions) => {\n const dirPath = resolve(process.cwd(), options.pagesDir);\n const filter = createFilter(dirPath + \"/**/*.(vue|nvue)\", options.exclude);\n return filter(path);\n};\n\nexport const logger = consola.create({\n defaults: {\n tag: \"vite-plugin-uni-pages\",\n },\n});\n","export const virtualModuleId = \"virtual:uni-pages\";\nexport const resolvedVirtualModuleId = \"\\0\" + virtualModuleId;\n","import { extname, join, relative, resolve } from \"path\";\nimport { loadConfig } from \"unconfig\";\nimport { normalizePath } from \"vite\";\nimport { PagesConfig } from \"../config/types\";\nimport { PageMeta, PagePathInfo, ResolvedOptions } from \"../types\";\nimport fg from \"fast-glob\";\nimport { parse as JSONParse } from \"jsonc-parser\";\nimport { parse } from \"@vue/compiler-dom\";\nimport fs from \"fs\";\nimport { defu } from \"defu\";\nimport { logger } from \"../utils\";\nexport class Context {\n options: ResolvedOptions;\n pagesConfig!: PagesConfig;\n pagesPathInfo: PagePathInfo[] = [];\n pagesMeta: PageMeta[] = [];\n constructor(options: ResolvedOptions) {\n this.options = options;\n this.createOrUpdatePagesJSON();\n }\n\n async loadUserPagesConfig() {\n const { config } = await loadConfig({\n sources: [\n {\n files: \"pages.config\",\n },\n ],\n merge: false,\n });\n if (!config) {\n logger.error(\n \"Can't found pages.config, please create pages.config.(ts|mts|cts|js|cjs|mjs|json)\"\n );\n process.exit(-1);\n }\n logger.debug(\"Loaded user pages config\", config);\n this.pagesConfig = config as PagesConfig;\n }\n\n async scanPages() {\n const files = await fg(\"**/*.(vue|nvue)\", {\n ignore: [\"node_modules\", \".git\", \"**/__*__/*\", ...this.options.exclude],\n onlyFiles: true,\n cwd: resolve(process.cwd(), this.options.pagesDir),\n });\n const basePath = relative(\n resolve(process.cwd(), this.options.outDir),\n this.options.pagesDir\n );\n this.pagesPathInfo = files.map((file) => {\n return {\n relative: normalizePath(join(basePath, file)),\n absolute: normalizePath(\n resolve(process.cwd(), this.options.pagesDir, file)\n ),\n };\n });\n logger.debug(\"Scanned pages dir\", this.pagesPathInfo);\n }\n\n async parsePage({ relative, absolute }: PagePathInfo): Promise<PageMeta> {\n const code = await fs.promises.readFile(absolute, {\n encoding: \"utf-8\",\n });\n const t = parse(code);\n const path = relative.replace(extname(relative), \"\");\n let pageMeta: PageMeta = {\n path,\n type: \"page\",\n };\n t?.children.forEach((v) => {\n if (v.type !== 1) {\n return;\n }\n if (v.tag === \"route\") {\n v.props.forEach((prop) => {\n if (prop.type === 6 && prop.name === \"type\") {\n pageMeta.type = prop.value?.content ?? pageMeta.type;\n }\n });\n const astContent = v.children?.[0];\n if (astContent && astContent.type === 2) {\n const _pageMeta = JSONParse(astContent.content);\n Object.keys(_pageMeta).forEach((key) => {\n pageMeta[key] = _pageMeta[key];\n });\n // overwrite path\n pageMeta[\"path\"] = path;\n }\n }\n });\n return pageMeta;\n }\n\n async mergePagesMeta() {\n const pagesMeta = await Promise.all(\n this.pagesPathInfo?.map(async (page) => await this.parsePage(page))\n );\n const pages = Object.values(defu({}, pagesMeta, this.pagesConfig.pages));\n // @ts-ignore\n pages.sort((a) => (a.type === \"home\" ? -1 : 0));\n // @ts-ignore\n this.pagesMeta = pages;\n logger.debug(\"merged pages\", this.pagesMeta);\n }\n\n async createOrUpdatePagesJSON() {\n const outputName = \"pages.json\";\n const resolvedOutput = normalizePath(\n resolve(process.cwd(), this.options.outDir, outputName)\n );\n\n // 如果不存在,先输出一个占位文件\n if (!fs.existsSync(resolvedOutput)) {\n fs.writeFileSync(resolvedOutput, `{\"pages\": [{\"path\": \"\"}]}`, {\n encoding: \"utf-8\",\n });\n }\n\n this.options.onBeforeLoadUserConfig(this);\n await this.loadUserPagesConfig();\n this.options.onAfterLoadUserConfig(this);\n\n this.options.onBeforeScanPages(this);\n await this.scanPages();\n this.options.onAfterScanPages(this);\n\n this.options.onBeforeMergePagesMeta(this);\n await this.mergePagesMeta();\n this.options.onAfterMergePagesMeta(this);\n\n this.options.onBeforeWriteFile(this);\n fs.writeFileSync(resolvedOutput, this.pagesJson, {\n encoding: \"utf-8\",\n });\n this.options.onAfterWriteFile(this);\n }\n\n async virtualModule() {\n return `export const pages = ${JSON.stringify(this.pagesMeta)};`;\n }\n\n async pagesConfigSourcePaths() {\n return await fg(\"pages.config.(ts|mts|cts|js|cjs|mjs|json)\", {\n deep: 0,\n onlyFiles: true,\n absolute: true,\n });\n }\n\n get pagesJson() {\n return JSON.stringify({\n ...this.pagesConfig,\n pages: this.pagesMeta,\n });\n }\n}\n","import { UserPagesConfig } from \"./types\";\nexport * from \"./types\";\nexport function definePages(config: UserPagesConfig) {\n return config;\n}\n"],"mappings":"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","names":["normalizePath","resolve","resolve","relative","_a","normalizePath"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/constant.ts","../src/context/index.ts","../src/config/index.ts"],"sourcesContent":["import { ModuleNode, normalizePath, Plugin } from \"vite\";\nimport { ResolvedOptions, UserOptions } from \"./types\";\nimport { isPagePath, logger } from \"./utils\";\nimport { virtualModuleId, resolvedVirtualModuleId } from \"./constant\";\nimport { Context } from \"./context\";\n\nexport * from \"./config\";\n\nfunction resolveOptions(userOptions: UserOptions): ResolvedOptions {\n return {\n pagesDir: \"src/pages\",\n outDir: \"src\",\n exclude: [],\n onBeforeLoadUserConfig: () => {},\n onAfterLoadUserConfig: () => {},\n onBeforeScanPages: () => {},\n onAfterScanPages: () => {},\n onBeforeMergePagesMeta: () => {},\n onAfterMergePagesMeta: () => {},\n onBeforeWriteFile: () => {},\n onAfterWriteFile: () => {},\n ...userOptions,\n };\n}\n\nexport const VitePluginUniPages = async (\n userOptions: UserOptions = {}\n): Promise<Plugin> => {\n const options = resolveOptions(userOptions);\n logger.debug(\"Create uni-pages context with\", options);\n const ctx = new Context(options);\n return {\n name: \"vite-plugin-uni-pages\",\n enforce: \"pre\",\n async configureServer({ watcher, moduleGraph, ws }) {\n const pagesConfigSourcePaths = await ctx.pagesConfigSourcePaths();\n logger.debug(\"Add watcher\", pagesConfigSourcePaths);\n watcher.add(pagesConfigSourcePaths);\n\n const reloadModule = (module: ModuleNode | undefined, path = \"*\") => {\n if (module) {\n moduleGraph.invalidateModule(module);\n if (ws) {\n ws.send({\n path,\n type: \"full-reload\",\n });\n }\n }\n };\n const updateVirtualModule = () => {\n logger.debug(\"Update virtualModule\");\n const module = moduleGraph.getModuleById(resolvedVirtualModuleId);\n reloadModule(module);\n };\n\n watcher.on(\"change\", async (path) => {\n if (\n pagesConfigSourcePaths.includes(normalizePath(path)) ||\n isPagePath(path, options)\n ) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n watcher.on(\"add\", async (path) => {\n if (isPagePath(path, options)) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n watcher.on(\"unlink\", async (path) => {\n if (isPagePath(path, options)) {\n await ctx.createOrUpdatePagesJSON();\n updateVirtualModule();\n }\n });\n },\n resolveId(id) {\n if (id === virtualModuleId) {\n return resolvedVirtualModuleId;\n }\n },\n\n load(id) {\n if (id === resolvedVirtualModuleId) {\n return ctx.virtualModule();\n }\n },\n };\n};\n\nexport default VitePluginUniPages;\n","import { resolve } from \"path\";\nimport { ResolvedOptions } from \"./types\";\nimport { createFilter } from \"vite\";\nimport consola from \"consola\";\n\nexport const isPagePath = (path: string, options: ResolvedOptions) => {\n const dirPath = resolve(process.cwd(), options.pagesDir);\n const filter = createFilter(\n dirPath + \"/**/*.(vue|nvue|uvue)\",\n options.exclude\n );\n return filter(path);\n};\n\nexport const logger = consola.create({\n defaults: {\n tag: \"vite-plugin-uni-pages\",\n },\n});\n","export const virtualModuleId = \"virtual:uni-pages\";\nexport const resolvedVirtualModuleId = \"\\0\" + virtualModuleId;\n","import { extname, join, relative, resolve } from \"path\";\nimport { loadConfig } from \"unconfig\";\nimport { normalizePath } from \"vite\";\nimport { PagesConfig } from \"../config/types\";\nimport { PageMeta, PagePathInfo, ResolvedOptions } from \"../types\";\nimport fg from \"fast-glob\";\nimport { parse as JSONParse } from \"jsonc-parser\";\nimport { parse } from \"@vue/compiler-dom\";\nimport fs from \"fs\";\nimport { defu } from \"defu\";\nimport { logger } from \"../utils\";\nexport class Context {\n options: ResolvedOptions;\n pagesConfig!: PagesConfig;\n pagesPathInfo: PagePathInfo[] = [];\n pagesMeta: PageMeta[] = [];\n constructor(options: ResolvedOptions) {\n this.options = options;\n this.createOrUpdatePagesJSON();\n }\n\n async loadUserPagesConfig() {\n const { config } = await loadConfig({\n sources: [\n {\n files: \"pages.config\",\n },\n ],\n merge: false,\n });\n if (!config) {\n logger.error(\n \"Can't found pages.config, please create pages.config.(ts|mts|cts|js|cjs|mjs|json)\"\n );\n process.exit(-1);\n }\n logger.debug(\"Loaded user pages config\", config);\n this.pagesConfig = config as PagesConfig;\n }\n\n async scanPages() {\n const files = await fg(\"**/*.(vue|nvue|uvue)\", {\n ignore: [\"node_modules\", \".git\", \"**/__*__/*\", ...this.options.exclude],\n onlyFiles: true,\n cwd: resolve(process.cwd(), this.options.pagesDir),\n });\n const basePath = relative(\n resolve(process.cwd(), this.options.outDir),\n this.options.pagesDir\n );\n this.pagesPathInfo = files.map((file) => {\n return {\n relative: normalizePath(join(basePath, file)),\n absolute: normalizePath(\n resolve(process.cwd(), this.options.pagesDir, file)\n ),\n };\n });\n logger.debug(\"Scanned pages dir\", this.pagesPathInfo);\n }\n\n async parsePage({ relative, absolute }: PagePathInfo): Promise<PageMeta> {\n const code = await fs.promises.readFile(absolute, {\n encoding: \"utf-8\",\n });\n const t = parse(code);\n const path = relative.replace(extname(relative), \"\");\n let pageMeta: PageMeta = {\n path,\n type: \"page\",\n };\n t?.children.forEach((v) => {\n if (v.type !== 1) {\n return;\n }\n if (v.tag === \"route\") {\n v.props.forEach((prop) => {\n if (prop.type === 6 && prop.name === \"type\") {\n pageMeta.type = prop.value?.content ?? pageMeta.type;\n }\n });\n const astContent = v.children?.[0];\n if (astContent && astContent.type === 2) {\n const _pageMeta = JSONParse(astContent.content);\n Object.keys(_pageMeta).forEach((key) => {\n pageMeta[key] = _pageMeta[key];\n });\n // overwrite path\n pageMeta[\"path\"] = path;\n }\n }\n });\n return pageMeta;\n }\n\n async mergePagesMeta() {\n const pagesMeta = await Promise.all(\n this.pagesPathInfo?.map(async (page) => await this.parsePage(page))\n );\n const pages = Object.values(defu({}, pagesMeta, this.pagesConfig.pages));\n // @ts-ignore\n pages.sort((a) => (a.type === \"home\" ? -1 : 0));\n // @ts-ignore\n this.pagesMeta = pages;\n logger.debug(\"merged pages\", this.pagesMeta);\n }\n\n async createOrUpdatePagesJSON() {\n const outputName = \"pages.json\";\n const resolvedOutput = normalizePath(\n resolve(process.cwd(), this.options.outDir, outputName)\n );\n\n // 如果不存在,先输出一个占位文件\n if (!fs.existsSync(resolvedOutput)) {\n fs.writeFileSync(resolvedOutput, `{\"pages\": [{\"path\": \"\"}]}`, {\n encoding: \"utf-8\",\n });\n }\n\n this.options.onBeforeLoadUserConfig(this);\n await this.loadUserPagesConfig();\n this.options.onAfterLoadUserConfig(this);\n\n this.options.onBeforeScanPages(this);\n await this.scanPages();\n this.options.onAfterScanPages(this);\n\n this.options.onBeforeMergePagesMeta(this);\n await this.mergePagesMeta();\n this.options.onAfterMergePagesMeta(this);\n\n this.options.onBeforeWriteFile(this);\n fs.writeFileSync(resolvedOutput, this.pagesJson, {\n encoding: \"utf-8\",\n });\n this.options.onAfterWriteFile(this);\n }\n\n async virtualModule() {\n return `export const pages = ${JSON.stringify(this.pagesMeta)};`;\n }\n\n async pagesConfigSourcePaths() {\n return await fg(\"pages.config.(ts|mts|cts|js|cjs|mjs|json)\", {\n deep: 0,\n onlyFiles: true,\n absolute: true,\n });\n }\n\n get pagesJson() {\n return JSON.stringify({\n ...this.pagesConfig,\n pages: this.pagesMeta,\n });\n }\n}\n","import { UserPagesConfig } from \"./types\";\nexport * from \"./types\";\nexport function definePages(config: UserPagesConfig) {\n return config;\n}\n"],"mappings":"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","names":["normalizePath","resolve","resolve","relative","_a","normalizePath"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uni-helper/vite-plugin-uni-pages",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.7",
|
|
5
5
|
"packageManager": "pnpm@7.16.1",
|
|
6
6
|
"description": "File system based routing for uni-app applications using Vite",
|
|
7
7
|
"author": "KeJun",
|
|
@@ -64,6 +64,7 @@
|
|
|
64
64
|
"defu": "^6.1.1",
|
|
65
65
|
"fast-glob": "^3.2.12",
|
|
66
66
|
"jsonc-parser": "^3.2.0",
|
|
67
|
+
"type-fest": "^3.2.0",
|
|
67
68
|
"unconfig": "^0.3.7"
|
|
68
69
|
}
|
|
69
70
|
}
|