@uni-helper/vite-plugin-uni-pages 0.0.1 → 0.0.3

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.
@@ -0,0 +1,94 @@
1
+ # @uni-helper/vite-plugin-uni-pages
2
+
3
+ 在 Vite 驱动的 uni-app 上使用基于文件的路由系统
4
+
5
+ [English](./README.md) | 简体中文
6
+
7
+ ## 安装
8
+
9
+ ```bash
10
+ pnpm i -D @uni-helper/vite-plugin-uni-pages
11
+ ```
12
+
13
+ ## 使用
14
+
15
+ ```ts
16
+ // vite.config.ts
17
+ import { defineConfig } from "vite";
18
+ import Uni from "@dcloudio/vite-plugin-uni";
19
+ import UniPages from "@uni-helper/vite-plugin-uni-pages";
20
+ // It is recommended to put it in front of Uni
21
+ export default defineConfig({
22
+ plugins: [UniPages(), Uni()],
23
+ });
24
+ ```
25
+
26
+ 在 `pages.config.ts` 定义全局属性
27
+
28
+ ```ts
29
+ // pages.config.ts
30
+ import { definePages } from "@uni-helper/vite-plugin-uni-pages/config";
31
+
32
+ export default definePages({
33
+ // You can also specify pages, and the content will be merged
34
+ pages: []
35
+ globalStyle: {
36
+ navigationBarTextStyle: "black",
37
+ navigationBarTitleText: "@uni-helper",
38
+ navigationBarBackgroundColor: "#F8F8F8",
39
+ backgroundColor: "#F8F8F8",
40
+ },
41
+ });
42
+ ```
43
+
44
+ 现在所有的 page 都会被自动发现!
45
+
46
+ 你可以在页面中使用 route-block 来指定元数据
47
+
48
+ ```vue
49
+ <!-- index.vue -->
50
+ <!-- use type to set index -->
51
+ <route lang="json" type="home">
52
+ {
53
+ "style": { "navigationBarTitleText": "@uni-helper" }
54
+ }
55
+ </route>
56
+
57
+ <!-- other.vue -->
58
+ <route lang="json">
59
+ {
60
+ "style": { "navigationBarTitleText": "@uni-helper" },
61
+ "any-meta-data": "hello"
62
+ }
63
+ </route>
64
+ ```
65
+
66
+ 导入虚拟模块即可访问所有页面的元数据
67
+
68
+ ```ts
69
+ /// <reference types="@uni-helper/vite-plugin-uni-pages/client" />
70
+ import { pages } from "virtual:uni-pages";
71
+ console.log(pages);
72
+ ```
73
+
74
+ ## 配置
75
+
76
+ 查看 [types.ts](./src/types.ts)
77
+
78
+ ## 钩子
79
+
80
+ 你不能在 `pages.json` 中使用类似 `#ifdef H5`, 但是使用 [hooks](./src/types.ts) 可以改变 pagesMeta.
81
+
82
+ ```ts
83
+ // vite.config.ts
84
+ UniPages({
85
+ onBeforeWriteFile(ctx) {
86
+ ctx.pagesMeta = ctx.pagesMeta?.filter((v) => !v.path.includes("test"));
87
+ },
88
+ });
89
+ ...
90
+ ```
91
+
92
+ 这是条件编译的一个很好的替代方案
93
+
94
+ 怎么做? 打印 `process.env` 然后找到 `UNI_*`, 我相信你已经会了
package/README.md CHANGED
@@ -1,9 +1,101 @@
1
1
  # @uni-helper/vite-plugin-uni-pages
2
2
 
3
- **WIP** File system based routing for uni-app applications using Vite
3
+ File system-based routing for uni-app applications using Vite
4
+
5
+ English | [简体中文](./README.Zh-CN.md)
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ pnpm i -D @uni-helper/vite-plugin-uni-pages
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```ts
16
+ // vite.config.ts
17
+ import { defineConfig } from "vite";
18
+ import Uni from "@dcloudio/vite-plugin-uni";
19
+ import UniPages from "@uni-helper/vite-plugin-uni-pages";
20
+ // It is recommended to put it in front of Uni
21
+ export default defineConfig({
22
+ plugins: [UniPages(), Uni()],
23
+ });
24
+ ```
25
+
26
+ Define global properties in `pages.config.ts`
27
+
28
+ ```ts
29
+ // pages.config.ts
30
+ import { definePages } from "@uni-helper/vite-plugin-uni-pages/config";
31
+
32
+ export default definePages({
33
+ // You can also specify pages, and the content will be merged
34
+ pages: []
35
+ globalStyle: {
36
+ navigationBarTextStyle: "black",
37
+ navigationBarTitleText: "@uni-helper",
38
+ navigationBarBackgroundColor: "#F8F8F8",
39
+ backgroundColor: "#F8F8F8",
40
+ },
41
+ });
42
+ ```
43
+
44
+ Now all pages will be found automatically!
45
+
46
+ You can use route-block in the page to specify metadata
47
+
48
+ ```vue
49
+ <!-- index.vue -->
50
+ <!-- use type to set index -->
51
+ <route lang="json" type="home">
52
+ {
53
+ "style": { "navigationBarTitleText": "@uni-helper" }
54
+ }
55
+ </route>
56
+
57
+ <!-- other.vue -->
58
+ <route lang="json">
59
+ {
60
+ "style": { "navigationBarTitleText": "@uni-helper" },
61
+ "any-meta-data": "hello"
62
+ }
63
+ </route>
64
+ ```
65
+
66
+ Import the virtual module to access the metadata of all pages
67
+
68
+ ```ts
69
+ /// <reference types="@uni-helper/vite-plugin-uni-pages/client" />
70
+ import { pages } from "virtual:uni-pages";
71
+ console.log(pages);
72
+ ```
73
+
74
+ ## Configuration
75
+
76
+ see [types.ts](./src/types.ts)
77
+
78
+ ## Hooks
79
+
80
+ You can not use like `#ifdef H5` in `pages.json`, but use [hooks](./src/types.ts) to change pagesMeta.
81
+
82
+ ```ts
83
+ // vite.config.ts
84
+ UniPages({
85
+ onBeforeWriteFile(ctx) {
86
+ ctx.pagesMeta = ctx.pagesMeta?.filter((v) => !v.path.includes("test"));
87
+ },
88
+ });
89
+ ...
90
+ ```
91
+
92
+ This is a good alternative to conditional compilation
93
+
94
+ How? console the `process.env` and found `UNI_*`, you can do this!
4
95
 
5
96
  ## TODO
6
97
 
7
- - [ ] only update change page
8
- - [ ] middleware
9
- - [ ] pages [type](./src/config/types.ts)
98
+ - [ ] only update the changed page
99
+ - [ ] ~~middleware~~
100
+ - vite-plugin-uni-middleware
101
+ - [ ] pages [type](./src/config/types.ts)
package/client.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ declare module "virtual:uni-pages" {
2
+ export const pages: {
3
+ path: string;
4
+ type: "home" | "page";
5
+ style: any;
6
+ }[];
7
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/config/index.ts
21
+ var config_exports = {};
22
+ __export(config_exports, {
23
+ definePages: () => definePages
24
+ });
25
+ module.exports = __toCommonJS(config_exports);
26
+ function definePages(config) {
27
+ return config;
28
+ }
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ definePages
32
+ });
33
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/index.ts"],"sourcesContent":["import { UserPagesConfig } from \"./types\";\nexport * from \"./types\";\nexport function definePages(config: UserPagesConfig) {\n return config;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,YAAY,QAAyB;AACnD,SAAO;AACT;","names":[]}
@@ -0,0 +1,20 @@
1
+ interface PagesConfig {
2
+ pages: any;
3
+ globalStyle: any;
4
+ easycom: any;
5
+ tabBar: any;
6
+ condition: any;
7
+ subPackages: any;
8
+ preloadRule: any;
9
+ workers: any;
10
+ leftWindow: any;
11
+ topWindow: any;
12
+ rightWindow: any;
13
+ uniIdRouter: any;
14
+ }
15
+ interface UserPagesConfig extends Partial<PagesConfig> {
16
+ }
17
+
18
+ declare function definePages(config: UserPagesConfig): UserPagesConfig;
19
+
20
+ export { PagesConfig, UserPagesConfig, definePages };
@@ -0,0 +1,8 @@
1
+ // src/config/index.ts
2
+ function definePages(config) {
3
+ return config;
4
+ }
5
+ export {
6
+ definePages
7
+ };
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/index.ts"],"sourcesContent":["import { UserPagesConfig } from \"./types\";\nexport * from \"./types\";\nexport function definePages(config: UserPagesConfig) {\n return config;\n}\n"],"mappings":";AAEO,SAAS,YAAY,QAAyB;AACnD,SAAO;AACT;","names":[]}
package/dist/index.cjs CHANGED
@@ -1,156 +1,289 @@
1
- 'use strict';
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
+
26
+ // src/index.ts
27
+ var src_exports = {};
28
+ __export(src_exports, {
29
+ VitePluginUniPages: () => VitePluginUniPages,
30
+ default: () => src_default,
31
+ definePages: () => definePages
32
+ });
33
+ module.exports = __toCommonJS(src_exports);
34
+ var import_vite3 = require("vite");
2
35
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
36
+ // src/utils.ts
37
+ var import_path = require("path");
38
+ var import_vite = require("vite");
39
+ var import_consola = __toESM(require("consola"), 1);
40
+ var isPagePath = (path, options) => {
41
+ const dirPath = (0, import_path.resolve)(process.cwd(), options.pagesDir);
42
+ const filter = (0, import_vite.createFilter)(dirPath + "/**/*.(vue|nvue)");
43
+ return filter(path);
44
+ };
45
+ var logger = import_consola.default.create({
46
+ defaults: {
47
+ tag: "vite-plugin-uni-pages"
48
+ }
49
+ });
4
50
 
5
- const vite = require('vite');
6
- const unconfig = require('unconfig');
7
- const path = require('path');
8
- const fs = require('fs');
9
- const fg = require('fast-glob');
10
- const compilerDom = require('@vue/compiler-dom');
11
- const jsoncParser = require('jsonc-parser');
12
- const defu = require('defu');
51
+ // src/constant.ts
52
+ var virtualModuleId = "virtual:uni-pages";
53
+ var resolvedVirtualModuleId = "\0" + virtualModuleId;
13
54
 
14
- const isPagePath = (path$1, options) => {
15
- const dirPath = path.resolve(process.cwd(), options.pagesDir);
16
- const filter = vite.createFilter(dirPath + "/**/*.(vue|nvue)");
17
- return filter(path$1);
55
+ // src/context/index.ts
56
+ var import_path2 = require("path");
57
+ var import_unconfig = require("unconfig");
58
+ var import_vite2 = require("vite");
59
+ var import_fast_glob = __toESM(require("fast-glob"), 1);
60
+ var import_jsonc_parser = require("jsonc-parser");
61
+ var import_compiler_dom = require("@vue/compiler-dom");
62
+ var import_fs = __toESM(require("fs"), 1);
63
+ var import_defu = require("defu");
64
+ var Context = class {
65
+ constructor(options) {
66
+ this.pagesPathInfo = [];
67
+ this.pagesMeta = [];
68
+ this.options = options;
69
+ this.createOrUpdatePagesJSON();
70
+ }
71
+ async loadUserPagesConfig() {
72
+ const { config } = await (0, import_unconfig.loadConfig)({
73
+ sources: [
74
+ {
75
+ files: this.options.entry,
76
+ extensions: [this.options.extension]
77
+ }
78
+ ],
79
+ merge: false
80
+ });
81
+ logger.debug("Loaded user pages config", config);
82
+ this.pagesConfig = config;
83
+ }
84
+ async scanPages() {
85
+ const files = await (0, import_fast_glob.default)("**/*.(vue|nvue)", {
86
+ ignore: ["node_modules", ".git", "**/__*__/*"],
87
+ onlyFiles: true,
88
+ cwd: (0, import_path2.resolve)(process.cwd(), this.options.pagesDir)
89
+ });
90
+ const basePath = (0, import_path2.relative)(
91
+ (0, import_path2.resolve)(process.cwd(), this.options.outDir),
92
+ this.options.pagesDir
93
+ );
94
+ this.pagesPathInfo = files.map((file) => {
95
+ return {
96
+ relative: (0, import_vite2.normalizePath)((0, import_path2.join)(basePath, file)),
97
+ absolute: (0, import_vite2.normalizePath)(
98
+ (0, import_path2.resolve)(process.cwd(), this.options.pagesDir, file)
99
+ )
100
+ };
101
+ });
102
+ logger.debug("Scanned pages dir", this.pagesPathInfo);
103
+ }
104
+ async parsePage({ relative: relative2, absolute }) {
105
+ const code = await import_fs.default.promises.readFile(absolute, {
106
+ encoding: "utf-8"
107
+ });
108
+ const t = (0, import_compiler_dom.parse)(code);
109
+ const path = relative2.replace((0, import_path2.extname)(relative2), "");
110
+ let pageMeta = {
111
+ path,
112
+ type: "page"
113
+ };
114
+ t == null ? void 0 : t.children.forEach((v) => {
115
+ var _a;
116
+ if (v.type !== 1) {
117
+ return;
118
+ }
119
+ if (v.tag === "route") {
120
+ v.props.forEach((prop) => {
121
+ var _a2;
122
+ if (prop.type === 6 && prop.name === "type") {
123
+ pageMeta.type = ((_a2 = prop.value) == null ? void 0 : _a2.content) ?? pageMeta.type;
124
+ }
125
+ });
126
+ const astContent = (_a = v.children) == null ? void 0 : _a[0];
127
+ if (astContent && astContent.type === 2) {
128
+ const _pageMeta = (0, import_jsonc_parser.parse)(astContent.content);
129
+ Object.keys(_pageMeta).forEach((key) => {
130
+ pageMeta[key] = _pageMeta[key];
131
+ });
132
+ pageMeta["path"] = path;
133
+ }
134
+ }
135
+ });
136
+ return pageMeta;
137
+ }
138
+ async mergePagesMeta() {
139
+ var _a;
140
+ const pagesMeta = await Promise.all(
141
+ (_a = this.pagesPathInfo) == null ? void 0 : _a.map(async (page) => await this.parsePage(page))
142
+ );
143
+ const pages = Object.values((0, import_defu.defu)({}, pagesMeta, this.pagesConfig.pages));
144
+ pages.sort((a) => a.type === "home" ? -1 : 0);
145
+ this.pagesMeta = pages;
146
+ logger.debug("merged pages", this.pagesMeta);
147
+ }
148
+ async createOrUpdatePagesJSON() {
149
+ const outputName = "pages.json";
150
+ const resolvedOutput = (0, import_vite2.normalizePath)(
151
+ (0, import_path2.resolve)(process.cwd(), this.options.outDir, outputName)
152
+ );
153
+ if (!import_fs.default.existsSync(resolvedOutput)) {
154
+ import_fs.default.writeFileSync(resolvedOutput, `{"pages": [{"path": ""}]}`, {
155
+ encoding: "utf-8"
156
+ });
157
+ }
158
+ this.options.onBeforeLoadUserConfig(this);
159
+ await this.loadUserPagesConfig();
160
+ this.options.onAfterLoadUserConfig(this);
161
+ this.options.onBeforeScanPages(this);
162
+ await this.scanPages();
163
+ this.options.onAfterScanPages(this);
164
+ this.options.onBeforeMergePagesMeta(this);
165
+ await this.mergePagesMeta();
166
+ this.options.onAfterMergePagesMeta(this);
167
+ this.options.onBeforeWriteFile(this);
168
+ import_fs.default.writeFileSync(resolvedOutput, this.pagesJson, {
169
+ encoding: "utf-8"
170
+ });
171
+ this.options.onAfterWriteFile(this);
172
+ }
173
+ async virtualModule() {
174
+ return `export const pages = ${JSON.stringify(this.pagesMeta)};`;
175
+ }
176
+ get pagesConfigSourcePath() {
177
+ return (0, import_vite2.normalizePath)(
178
+ (0, import_path2.resolve)(process.cwd(), `${this.options.entry}.${this.options.extension}`)
179
+ );
180
+ }
181
+ get pagesJson() {
182
+ return JSON.stringify({
183
+ ...this.pagesConfig,
184
+ pages: this.pagesMeta
185
+ });
186
+ }
18
187
  };
19
188
 
189
+ // src/index.ts
190
+ var import_fs2 = require("fs");
191
+
192
+ // src/config/index.ts
20
193
  function definePages(config) {
21
194
  return config;
22
195
  }
23
196
 
24
- function defineMiddleware(middleware) {
25
- return middleware;
26
- }
27
-
197
+ // src/index.ts
28
198
  function resolveOptions(userOptions) {
29
199
  return {
30
200
  pagesDir: "src/pages",
31
201
  outDir: "src",
32
202
  entry: "pages.config",
33
203
  extension: "ts",
204
+ onBeforeLoadUserConfig: () => {
205
+ },
206
+ onAfterLoadUserConfig: () => {
207
+ },
208
+ onBeforeScanPages: () => {
209
+ },
210
+ onAfterScanPages: () => {
211
+ },
212
+ onBeforeMergePagesMeta: () => {
213
+ },
214
+ onAfterMergePagesMeta: () => {
215
+ },
216
+ onBeforeWriteFile: () => {
217
+ },
218
+ onAfterWriteFile: () => {
219
+ },
34
220
  ...userOptions
35
221
  };
36
222
  }
37
- const loadUserPagesConfig = async (options) => {
38
- const { config } = await unconfig.loadConfig({
39
- sources: [
40
- {
41
- files: options.entry,
42
- extensions: [options.extension]
43
- }
44
- ],
45
- merge: false
46
- });
47
- return config;
48
- };
49
- const scanPages = async (options) => {
50
- const files = await fg("**/*.(vue|nvue)", {
51
- ignore: ["node_modules", ".git", "**/__*__/*"],
52
- onlyFiles: true,
53
- cwd: path.resolve(process.cwd(), options.pagesDir)
54
- });
55
- const basePath = path.relative(
56
- path.resolve(process.cwd(), options.outDir),
57
- options.pagesDir
58
- );
59
- return files.map((file) => {
60
- return {
61
- relative: vite.normalizePath(path.join(basePath, file)),
62
- absolute: vite.normalizePath(path.resolve(process.cwd(), options.pagesDir, file))
63
- };
64
- });
65
- };
66
- const parsePage = async ({
67
- relative: relative2,
68
- absolute
69
- }) => {
70
- const code = await fs.promises.readFile(absolute, {
71
- encoding: "utf-8"
72
- });
73
- const t = compilerDom.parse(code);
74
- const path$1 = relative2.replace(path.extname(relative2), "");
75
- let pageMeta = {
76
- path: path$1,
77
- type: "page"
78
- };
79
- t?.children.forEach((v) => {
80
- if (v.type !== 1) {
81
- return;
82
- }
83
- if (v.tag === "route") {
84
- v.props.forEach((prop) => {
85
- if (prop.type === 6 && prop.name === "type") {
86
- pageMeta.type = prop.value?.content ?? pageMeta.type;
87
- }
88
- });
89
- const astContent = v.children?.[0];
90
- if (astContent && astContent.type === 2) {
91
- const _pageMeta = jsoncParser.parse(astContent.content);
92
- Object.keys(_pageMeta).forEach((key) => {
93
- pageMeta[key] = _pageMeta[key];
94
- });
95
- pageMeta["path"] = path$1;
96
- }
97
- }
98
- });
99
- return pageMeta;
100
- };
101
- const createOrUpdatePagesJSON = async (options, path$1) => {
102
- const outputName = "pages.json";
103
- const resolvedOutput = vite.normalizePath(
104
- path.resolve(process.cwd(), options.outDir, outputName)
105
- );
106
- if (!fs.existsSync(resolvedOutput)) {
107
- fs.writeFileSync(resolvedOutput, "{}", {
108
- encoding: "utf-8"
109
- });
110
- }
111
- const config = await loadUserPagesConfig(options);
112
- const pagesPathList = await scanPages(options);
113
- const pagesMeta = await Promise.all(
114
- pagesPathList.map(async (page) => await parsePage(page))
115
- );
116
- const pages = Object.values(defu.defu({}, pagesMeta, config.pages));
117
- pages.sort((a) => a.type === "home" ? -1 : 0);
118
- config.pages = pages;
119
- fs.writeFileSync(resolvedOutput, JSON.stringify(config), {
120
- encoding: "utf-8"
121
- });
122
- };
123
- const VitePluginUniPages = async (userOptions = {}) => {
223
+ var VitePluginUniPages = async (userOptions = {}) => {
124
224
  const options = resolveOptions(userOptions);
125
- const pagesConfigSource = vite.normalizePath(
126
- path.resolve(process.cwd(), `${options.entry}.${options.extension}`)
127
- );
128
- await createOrUpdatePagesJSON(options);
225
+ logger.debug("Create uni-pages context with", options);
226
+ const ctx = new Context(options);
227
+ if (!(0, import_fs2.existsSync)(ctx.pagesConfigSourcePath)) {
228
+ logger.error(`Can't found ${options.entry}.${options.extension}`);
229
+ }
129
230
  return {
130
231
  name: "vite-plugin-uni-pages",
131
232
  enforce: "pre",
132
- configureServer({ watcher }) {
133
- watcher.add(pagesConfigSource);
233
+ configureServer({ watcher, moduleGraph, ws }) {
234
+ logger.debug("Add watcher", ctx.pagesConfigSourcePath);
235
+ watcher.add(ctx.pagesConfigSourcePath);
236
+ const reloadModule = (module2, path = "*") => {
237
+ if (module2) {
238
+ moduleGraph.invalidateModule(module2);
239
+ if (ws) {
240
+ ws.send({
241
+ path,
242
+ type: "full-reload"
243
+ });
244
+ }
245
+ }
246
+ };
247
+ const updateVirtualModule = () => {
248
+ logger.debug("Update virtualModule");
249
+ const module2 = moduleGraph.getModuleById(resolvedVirtualModuleId);
250
+ reloadModule(module2);
251
+ };
134
252
  watcher.on("change", async (path) => {
135
- if (vite.normalizePath(path) === pagesConfigSource || isPagePath(path, options)) {
136
- await createOrUpdatePagesJSON(options);
253
+ if ((0, import_vite3.normalizePath)(path) === ctx.pagesConfigSourcePath || isPagePath(path, options)) {
254
+ await ctx.createOrUpdatePagesJSON();
255
+ updateVirtualModule();
137
256
  }
138
257
  });
139
258
  watcher.on("add", async (path) => {
140
259
  if (isPagePath(path, options)) {
141
- await createOrUpdatePagesJSON(options);
260
+ await ctx.createOrUpdatePagesJSON();
261
+ updateVirtualModule();
142
262
  }
143
263
  });
144
264
  watcher.on("unlink", async (path) => {
145
265
  if (isPagePath(path, options)) {
146
- await createOrUpdatePagesJSON(options);
266
+ await ctx.createOrUpdatePagesJSON();
267
+ updateVirtualModule();
147
268
  }
148
269
  });
270
+ },
271
+ resolveId(id) {
272
+ if (id === virtualModuleId) {
273
+ return resolvedVirtualModuleId;
274
+ }
275
+ },
276
+ load(id) {
277
+ if (id === resolvedVirtualModuleId) {
278
+ return ctx.virtualModule();
279
+ }
149
280
  }
150
281
  };
151
282
  };
152
-
153
- exports.VitePluginUniPages = VitePluginUniPages;
154
- exports.default = VitePluginUniPages;
155
- exports.defineMiddleware = defineMiddleware;
156
- exports.definePages = definePages;
283
+ var src_default = VitePluginUniPages;
284
+ // Annotate the CommonJS export names for ESM import in node:
285
+ 0 && (module.exports = {
286
+ VitePluginUniPages,
287
+ definePages
288
+ });
289
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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\";\nimport { existsSync } from \"fs\";\n\nexport * from \"./config\";\n\nfunction resolveOptions(userOptions: UserOptions): ResolvedOptions {\n return {\n pagesDir: \"src/pages\",\n outDir: \"src\",\n entry: \"pages.config\",\n extension: \"ts\",\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 if (!existsSync(ctx.pagesConfigSourcePath)) {\n logger.error(`Can't found ${options.entry}.${options.extension}`);\n }\n return {\n name: \"vite-plugin-uni-pages\",\n enforce: \"pre\",\n configureServer({ watcher, moduleGraph, ws }) {\n logger.debug(\"Add watcher\", ctx.pagesConfigSourcePath);\n watcher.add(ctx.pagesConfigSourcePath);\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 normalizePath(path) === ctx.pagesConfigSourcePath ||\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)\");\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\";\n\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: this.options.entry,\n extensions: [this.options.extension],\n },\n ],\n merge: false,\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\", \"**/__*__/*\"],\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 get pagesConfigSourcePath() {\n return normalizePath(\n resolve(process.cwd(), `${this.options.entry}.${this.options.extension}`)\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","import_fs","module"]}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,22 @@
1
1
  import { Plugin } from 'vite';
2
+ import { PagesConfig } from './config/index.js';
3
+ export { PagesConfig, UserPagesConfig, definePages } from './config/index.js';
4
+
5
+ declare class Context {
6
+ options: ResolvedOptions;
7
+ pagesConfig: PagesConfig;
8
+ pagesPathInfo: PagePathInfo[];
9
+ pagesMeta: PageMeta[];
10
+ constructor(options: ResolvedOptions);
11
+ loadUserPagesConfig(): Promise<void>;
12
+ scanPages(): Promise<void>;
13
+ parsePage({ relative, absolute }: PagePathInfo): Promise<PageMeta>;
14
+ mergePagesMeta(): Promise<void>;
15
+ createOrUpdatePagesJSON(): Promise<void>;
16
+ virtualModule(): Promise<string>;
17
+ get pagesConfigSourcePath(): string;
18
+ get pagesJson(): string;
19
+ }
2
20
 
3
21
  interface Options {
4
22
  /**
@@ -21,33 +39,29 @@ interface Options {
21
39
  * @default "ts"
22
40
  */
23
41
  extension: string;
42
+ onBeforeLoadUserConfig: (ctx: Context) => void;
43
+ onAfterLoadUserConfig: (ctx: Context) => void;
44
+ onBeforeScanPages: (ctx: Context) => void;
45
+ onAfterScanPages: (ctx: Context) => void;
46
+ onBeforeMergePagesMeta: (ctx: Context) => void;
47
+ onAfterMergePagesMeta: (ctx: Context) => void;
48
+ onBeforeWriteFile: (ctx: Context) => void;
49
+ onAfterWriteFile: (ctx: Context) => void;
24
50
  }
25
51
  interface UserOptions extends Partial<Options> {
26
52
  }
27
-
28
- interface PagesConfig {
29
- pages: any;
30
- globalStyle: any;
31
- easycom: any;
32
- tabBar: any;
33
- condition: any;
34
- subPackages: any;
35
- preloadRule: any;
36
- workers: any;
37
- leftWindow: any;
38
- topWindow: any;
39
- rightWindow: any;
40
- uniIdRouter: any;
53
+ interface ResolvedOptions extends Options {
41
54
  }
42
- interface UserPagesConfig extends Partial<PagesConfig> {
55
+ interface PagePathInfo {
56
+ relative: string;
57
+ absolute: string;
58
+ }
59
+ interface PageMeta {
60
+ path: string;
61
+ type: string;
62
+ [x: string]: any;
43
63
  }
44
-
45
- declare function definePages(config: UserPagesConfig): UserPagesConfig;
46
-
47
- declare type Middleware = (to: string, from: string) => void | boolean | string;
48
-
49
- declare function defineMiddleware(middleware: Middleware): Middleware;
50
64
 
51
65
  declare const VitePluginUniPages: (userOptions?: UserOptions) => Promise<Plugin>;
52
66
 
53
- export { Middleware, PagesConfig, UserPagesConfig, VitePluginUniPages, VitePluginUniPages as default, defineMiddleware, definePages };
67
+ export { VitePluginUniPages, VitePluginUniPages as default };
package/dist/index.js ADDED
@@ -0,0 +1,257 @@
1
+ // src/index.ts
2
+ import { normalizePath as normalizePath2 } from "vite";
3
+
4
+ // src/utils.ts
5
+ import { resolve } from "path";
6
+ import { createFilter } from "vite";
7
+ import consola from "consola";
8
+ var isPagePath = (path, options) => {
9
+ const dirPath = resolve(process.cwd(), options.pagesDir);
10
+ const filter = createFilter(dirPath + "/**/*.(vue|nvue)");
11
+ return filter(path);
12
+ };
13
+ var logger = consola.create({
14
+ defaults: {
15
+ tag: "vite-plugin-uni-pages"
16
+ }
17
+ });
18
+
19
+ // src/constant.ts
20
+ var virtualModuleId = "virtual:uni-pages";
21
+ var resolvedVirtualModuleId = "\0" + virtualModuleId;
22
+
23
+ // src/context/index.ts
24
+ import { extname, join, relative, resolve as resolve2 } from "path";
25
+ import { loadConfig } from "unconfig";
26
+ import { normalizePath } from "vite";
27
+ import fg from "fast-glob";
28
+ import { parse as JSONParse } from "jsonc-parser";
29
+ import { parse } from "@vue/compiler-dom";
30
+ import fs from "fs";
31
+ import { defu } from "defu";
32
+ var Context = class {
33
+ constructor(options) {
34
+ this.pagesPathInfo = [];
35
+ this.pagesMeta = [];
36
+ this.options = options;
37
+ this.createOrUpdatePagesJSON();
38
+ }
39
+ async loadUserPagesConfig() {
40
+ const { config } = await loadConfig({
41
+ sources: [
42
+ {
43
+ files: this.options.entry,
44
+ extensions: [this.options.extension]
45
+ }
46
+ ],
47
+ merge: false
48
+ });
49
+ logger.debug("Loaded user pages config", config);
50
+ this.pagesConfig = config;
51
+ }
52
+ async scanPages() {
53
+ const files = await fg("**/*.(vue|nvue)", {
54
+ ignore: ["node_modules", ".git", "**/__*__/*"],
55
+ onlyFiles: true,
56
+ cwd: resolve2(process.cwd(), this.options.pagesDir)
57
+ });
58
+ const basePath = relative(
59
+ resolve2(process.cwd(), this.options.outDir),
60
+ this.options.pagesDir
61
+ );
62
+ this.pagesPathInfo = files.map((file) => {
63
+ return {
64
+ relative: normalizePath(join(basePath, file)),
65
+ absolute: normalizePath(
66
+ resolve2(process.cwd(), this.options.pagesDir, file)
67
+ )
68
+ };
69
+ });
70
+ logger.debug("Scanned pages dir", this.pagesPathInfo);
71
+ }
72
+ async parsePage({ relative: relative2, absolute }) {
73
+ const code = await fs.promises.readFile(absolute, {
74
+ encoding: "utf-8"
75
+ });
76
+ const t = parse(code);
77
+ const path = relative2.replace(extname(relative2), "");
78
+ let pageMeta = {
79
+ path,
80
+ type: "page"
81
+ };
82
+ t == null ? void 0 : t.children.forEach((v) => {
83
+ var _a;
84
+ if (v.type !== 1) {
85
+ return;
86
+ }
87
+ if (v.tag === "route") {
88
+ v.props.forEach((prop) => {
89
+ var _a2;
90
+ if (prop.type === 6 && prop.name === "type") {
91
+ pageMeta.type = ((_a2 = prop.value) == null ? void 0 : _a2.content) ?? pageMeta.type;
92
+ }
93
+ });
94
+ const astContent = (_a = v.children) == null ? void 0 : _a[0];
95
+ if (astContent && astContent.type === 2) {
96
+ const _pageMeta = JSONParse(astContent.content);
97
+ Object.keys(_pageMeta).forEach((key) => {
98
+ pageMeta[key] = _pageMeta[key];
99
+ });
100
+ pageMeta["path"] = path;
101
+ }
102
+ }
103
+ });
104
+ return pageMeta;
105
+ }
106
+ async mergePagesMeta() {
107
+ var _a;
108
+ const pagesMeta = await Promise.all(
109
+ (_a = this.pagesPathInfo) == null ? void 0 : _a.map(async (page) => await this.parsePage(page))
110
+ );
111
+ const pages = Object.values(defu({}, pagesMeta, this.pagesConfig.pages));
112
+ pages.sort((a) => a.type === "home" ? -1 : 0);
113
+ this.pagesMeta = pages;
114
+ logger.debug("merged pages", this.pagesMeta);
115
+ }
116
+ async createOrUpdatePagesJSON() {
117
+ const outputName = "pages.json";
118
+ const resolvedOutput = normalizePath(
119
+ resolve2(process.cwd(), this.options.outDir, outputName)
120
+ );
121
+ if (!fs.existsSync(resolvedOutput)) {
122
+ fs.writeFileSync(resolvedOutput, `{"pages": [{"path": ""}]}`, {
123
+ encoding: "utf-8"
124
+ });
125
+ }
126
+ this.options.onBeforeLoadUserConfig(this);
127
+ await this.loadUserPagesConfig();
128
+ this.options.onAfterLoadUserConfig(this);
129
+ this.options.onBeforeScanPages(this);
130
+ await this.scanPages();
131
+ this.options.onAfterScanPages(this);
132
+ this.options.onBeforeMergePagesMeta(this);
133
+ await this.mergePagesMeta();
134
+ this.options.onAfterMergePagesMeta(this);
135
+ this.options.onBeforeWriteFile(this);
136
+ fs.writeFileSync(resolvedOutput, this.pagesJson, {
137
+ encoding: "utf-8"
138
+ });
139
+ this.options.onAfterWriteFile(this);
140
+ }
141
+ async virtualModule() {
142
+ return `export const pages = ${JSON.stringify(this.pagesMeta)};`;
143
+ }
144
+ get pagesConfigSourcePath() {
145
+ return normalizePath(
146
+ resolve2(process.cwd(), `${this.options.entry}.${this.options.extension}`)
147
+ );
148
+ }
149
+ get pagesJson() {
150
+ return JSON.stringify({
151
+ ...this.pagesConfig,
152
+ pages: this.pagesMeta
153
+ });
154
+ }
155
+ };
156
+
157
+ // src/index.ts
158
+ import { existsSync } from "fs";
159
+
160
+ // src/config/index.ts
161
+ function definePages(config) {
162
+ return config;
163
+ }
164
+
165
+ // src/index.ts
166
+ function resolveOptions(userOptions) {
167
+ return {
168
+ pagesDir: "src/pages",
169
+ outDir: "src",
170
+ entry: "pages.config",
171
+ extension: "ts",
172
+ onBeforeLoadUserConfig: () => {
173
+ },
174
+ onAfterLoadUserConfig: () => {
175
+ },
176
+ onBeforeScanPages: () => {
177
+ },
178
+ onAfterScanPages: () => {
179
+ },
180
+ onBeforeMergePagesMeta: () => {
181
+ },
182
+ onAfterMergePagesMeta: () => {
183
+ },
184
+ onBeforeWriteFile: () => {
185
+ },
186
+ onAfterWriteFile: () => {
187
+ },
188
+ ...userOptions
189
+ };
190
+ }
191
+ var VitePluginUniPages = async (userOptions = {}) => {
192
+ const options = resolveOptions(userOptions);
193
+ logger.debug("Create uni-pages context with", options);
194
+ const ctx = new Context(options);
195
+ if (!existsSync(ctx.pagesConfigSourcePath)) {
196
+ logger.error(`Can't found ${options.entry}.${options.extension}`);
197
+ }
198
+ return {
199
+ name: "vite-plugin-uni-pages",
200
+ enforce: "pre",
201
+ configureServer({ watcher, moduleGraph, ws }) {
202
+ logger.debug("Add watcher", ctx.pagesConfigSourcePath);
203
+ watcher.add(ctx.pagesConfigSourcePath);
204
+ const reloadModule = (module, path = "*") => {
205
+ if (module) {
206
+ moduleGraph.invalidateModule(module);
207
+ if (ws) {
208
+ ws.send({
209
+ path,
210
+ type: "full-reload"
211
+ });
212
+ }
213
+ }
214
+ };
215
+ const updateVirtualModule = () => {
216
+ logger.debug("Update virtualModule");
217
+ const module = moduleGraph.getModuleById(resolvedVirtualModuleId);
218
+ reloadModule(module);
219
+ };
220
+ watcher.on("change", async (path) => {
221
+ if (normalizePath2(path) === ctx.pagesConfigSourcePath || isPagePath(path, options)) {
222
+ await ctx.createOrUpdatePagesJSON();
223
+ updateVirtualModule();
224
+ }
225
+ });
226
+ watcher.on("add", async (path) => {
227
+ if (isPagePath(path, options)) {
228
+ await ctx.createOrUpdatePagesJSON();
229
+ updateVirtualModule();
230
+ }
231
+ });
232
+ watcher.on("unlink", async (path) => {
233
+ if (isPagePath(path, options)) {
234
+ await ctx.createOrUpdatePagesJSON();
235
+ updateVirtualModule();
236
+ }
237
+ });
238
+ },
239
+ resolveId(id) {
240
+ if (id === virtualModuleId) {
241
+ return resolvedVirtualModuleId;
242
+ }
243
+ },
244
+ load(id) {
245
+ if (id === resolvedVirtualModuleId) {
246
+ return ctx.virtualModule();
247
+ }
248
+ }
249
+ };
250
+ };
251
+ var src_default = VitePluginUniPages;
252
+ export {
253
+ VitePluginUniPages,
254
+ src_default as default,
255
+ definePages
256
+ };
257
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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\";\nimport { existsSync } from \"fs\";\n\nexport * from \"./config\";\n\nfunction resolveOptions(userOptions: UserOptions): ResolvedOptions {\n return {\n pagesDir: \"src/pages\",\n outDir: \"src\",\n entry: \"pages.config\",\n extension: \"ts\",\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 if (!existsSync(ctx.pagesConfigSourcePath)) {\n logger.error(`Can't found ${options.entry}.${options.extension}`);\n }\n return {\n name: \"vite-plugin-uni-pages\",\n enforce: \"pre\",\n configureServer({ watcher, moduleGraph, ws }) {\n logger.debug(\"Add watcher\", ctx.pagesConfigSourcePath);\n watcher.add(ctx.pagesConfigSourcePath);\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 normalizePath(path) === ctx.pagesConfigSourcePath ||\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)\");\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\";\n\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: this.options.entry,\n extensions: [this.options.extension],\n },\n ],\n merge: false,\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\", \"**/__*__/*\"],\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 get pagesConfigSourcePath() {\n return normalizePath(\n resolve(process.cwd(), `${this.options.entry}.${this.options.extension}`)\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.1",
4
+ "version": "0.0.3",
5
5
  "packageManager": "pnpm@7.14.0",
6
6
  "description": "File system based routing for uni-app applications using Vite",
7
7
  "author": "KeJun",
@@ -18,43 +18,43 @@
18
18
  ".": {
19
19
  "types": "./dist/index.d.ts",
20
20
  "require": "./dist/index.cjs",
21
- "import": "./dist/index.mjs"
21
+ "import": "./dist/index.js"
22
+ },
23
+ "./config": {
24
+ "types": "./dist/config/index.d.ts",
25
+ "require": "./dist/config/index.cjs",
26
+ "import": "./dist/config/index.js"
27
+ },
28
+ "./client": {
29
+ "types": "./client.d.ts"
22
30
  }
23
31
  },
24
32
  "main": "./dist/index.mjs",
25
- "module": "./dist/index.mjs",
33
+ "module": "./dist/index.js",
26
34
  "types": "./dist/index.d.ts",
27
- "typesVersions": {
28
- "*": {
29
- "*": [
30
- "./dist/*",
31
- "./dist/index.d.ts"
32
- ]
33
- }
34
- },
35
35
  "files": [
36
- "dist"
36
+ "dist",
37
+ "client.d.ts"
37
38
  ],
38
39
  "scripts": {
39
- "build": "unbuild",
40
- "dev": "unbuild --stub",
40
+ "build": "tsup",
41
+ "dev": "tsup --watch",
41
42
  "play": "nr -C playground dev:h5",
42
43
  "prepublishOnly": "pnpm build",
43
44
  "release": "bumpp && npm publish --access public",
44
- "start": "esno src/index.ts",
45
45
  "test": "vitest"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/node": "^18.11.9",
49
49
  "bumpp": "^8.2.1",
50
- "esno": "^0.16.3",
50
+ "tsup": "^6.5.0",
51
51
  "typescript": "^4.8.4",
52
- "unbuild": "^0.9.4",
53
- "vite": "^3.2.3",
54
- "vitest": "^0.24.5"
52
+ "vite": "^3.2.3"
55
53
  },
56
54
  "dependencies": {
57
55
  "@vue/compiler-dom": "^3.2.45",
56
+ "colorette": "^2.0.19",
57
+ "consola": "^2.15.3",
58
58
  "defu": "^6.1.0",
59
59
  "fast-glob": "^3.2.12",
60
60
  "jsonc-parser": "^3.2.0",
package/dist/index.mjs DELETED
@@ -1,149 +0,0 @@
1
- import { createFilter, normalizePath } from 'vite';
2
- import { loadConfig } from 'unconfig';
3
- import { resolve, relative, join, extname } from 'path';
4
- import fs from 'fs';
5
- import fg from 'fast-glob';
6
- import { parse } from '@vue/compiler-dom';
7
- import { parse as parse$1 } from 'jsonc-parser';
8
- import { defu } from 'defu';
9
-
10
- const isPagePath = (path, options) => {
11
- const dirPath = resolve(process.cwd(), options.pagesDir);
12
- const filter = createFilter(dirPath + "/**/*.(vue|nvue)");
13
- return filter(path);
14
- };
15
-
16
- function definePages(config) {
17
- return config;
18
- }
19
-
20
- function defineMiddleware(middleware) {
21
- return middleware;
22
- }
23
-
24
- function resolveOptions(userOptions) {
25
- return {
26
- pagesDir: "src/pages",
27
- outDir: "src",
28
- entry: "pages.config",
29
- extension: "ts",
30
- ...userOptions
31
- };
32
- }
33
- const loadUserPagesConfig = async (options) => {
34
- const { config } = await loadConfig({
35
- sources: [
36
- {
37
- files: options.entry,
38
- extensions: [options.extension]
39
- }
40
- ],
41
- merge: false
42
- });
43
- return config;
44
- };
45
- const scanPages = async (options) => {
46
- const files = await fg("**/*.(vue|nvue)", {
47
- ignore: ["node_modules", ".git", "**/__*__/*"],
48
- onlyFiles: true,
49
- cwd: resolve(process.cwd(), options.pagesDir)
50
- });
51
- const basePath = relative(
52
- resolve(process.cwd(), options.outDir),
53
- options.pagesDir
54
- );
55
- return files.map((file) => {
56
- return {
57
- relative: normalizePath(join(basePath, file)),
58
- absolute: normalizePath(resolve(process.cwd(), options.pagesDir, file))
59
- };
60
- });
61
- };
62
- const parsePage = async ({
63
- relative: relative2,
64
- absolute
65
- }) => {
66
- const code = await fs.promises.readFile(absolute, {
67
- encoding: "utf-8"
68
- });
69
- const t = parse(code);
70
- const path = relative2.replace(extname(relative2), "");
71
- let pageMeta = {
72
- path,
73
- type: "page"
74
- };
75
- t?.children.forEach((v) => {
76
- if (v.type !== 1) {
77
- return;
78
- }
79
- if (v.tag === "route") {
80
- v.props.forEach((prop) => {
81
- if (prop.type === 6 && prop.name === "type") {
82
- pageMeta.type = prop.value?.content ?? pageMeta.type;
83
- }
84
- });
85
- const astContent = v.children?.[0];
86
- if (astContent && astContent.type === 2) {
87
- const _pageMeta = parse$1(astContent.content);
88
- Object.keys(_pageMeta).forEach((key) => {
89
- pageMeta[key] = _pageMeta[key];
90
- });
91
- pageMeta["path"] = path;
92
- }
93
- }
94
- });
95
- return pageMeta;
96
- };
97
- const createOrUpdatePagesJSON = async (options, path) => {
98
- const outputName = "pages.json";
99
- const resolvedOutput = normalizePath(
100
- resolve(process.cwd(), options.outDir, outputName)
101
- );
102
- if (!fs.existsSync(resolvedOutput)) {
103
- fs.writeFileSync(resolvedOutput, "{}", {
104
- encoding: "utf-8"
105
- });
106
- }
107
- const config = await loadUserPagesConfig(options);
108
- const pagesPathList = await scanPages(options);
109
- const pagesMeta = await Promise.all(
110
- pagesPathList.map(async (page) => await parsePage(page))
111
- );
112
- const pages = Object.values(defu({}, pagesMeta, config.pages));
113
- pages.sort((a) => a.type === "home" ? -1 : 0);
114
- config.pages = pages;
115
- fs.writeFileSync(resolvedOutput, JSON.stringify(config), {
116
- encoding: "utf-8"
117
- });
118
- };
119
- const VitePluginUniPages = async (userOptions = {}) => {
120
- const options = resolveOptions(userOptions);
121
- const pagesConfigSource = normalizePath(
122
- resolve(process.cwd(), `${options.entry}.${options.extension}`)
123
- );
124
- await createOrUpdatePagesJSON(options);
125
- return {
126
- name: "vite-plugin-uni-pages",
127
- enforce: "pre",
128
- configureServer({ watcher }) {
129
- watcher.add(pagesConfigSource);
130
- watcher.on("change", async (path) => {
131
- if (normalizePath(path) === pagesConfigSource || isPagePath(path, options)) {
132
- await createOrUpdatePagesJSON(options);
133
- }
134
- });
135
- watcher.on("add", async (path) => {
136
- if (isPagePath(path, options)) {
137
- await createOrUpdatePagesJSON(options);
138
- }
139
- });
140
- watcher.on("unlink", async (path) => {
141
- if (isPagePath(path, options)) {
142
- await createOrUpdatePagesJSON(options);
143
- }
144
- });
145
- }
146
- };
147
- };
148
-
149
- export { VitePluginUniPages, VitePluginUniPages as default, defineMiddleware, definePages };