vome-core 0.0.16 → 0.0.18

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.
Files changed (45) hide show
  1. package/dist/admin/api/client.js +2 -0
  2. package/dist/admin/config/plugin-dev.js +1 -1
  3. package/dist/admin/crud/config.js +1 -1
  4. package/dist/admin/crud/confirm.js +1 -1
  5. package/dist/admin/crud/dict.js +1 -1
  6. package/dist/admin/crud/index.js +1 -1
  7. package/dist/admin/crud/key.js +1 -1
  8. package/dist/admin/crud/mitt.js +1 -1
  9. package/dist/admin/crud/plugins.js +1 -1
  10. package/dist/admin/crud/span.js +1 -1
  11. package/dist/admin/crud/style.js +1 -1
  12. package/dist/admin/crud/validate.js +1 -1
  13. package/dist/admin/directives/perm.js +1 -1
  14. package/dist/admin/hooks/useUpload.js +1 -1
  15. package/dist/admin/hooks/useVome.d.ts +3 -1
  16. package/dist/admin/lib/browser.js +1 -1
  17. package/dist/admin/lib/cn.js +1 -1
  18. package/dist/admin/lib/dialog-float.js +1 -1
  19. package/dist/admin/lib/eps.d.ts +2 -11
  20. package/dist/admin/lib/eps.js +7 -33
  21. package/dist/admin/lib/menu.js +1 -1
  22. package/dist/admin/lib/tree.js +1 -1
  23. package/dist/admin/lib/upload.js +1 -1
  24. package/dist/admin/service/base.d.ts +2 -27
  25. package/dist/admin/service/base.js +1 -76
  26. package/dist/admin/service/index.d.ts +10 -16
  27. package/dist/admin/service/index.js +31 -259
  28. package/dist/client/base.d.ts +28 -0
  29. package/dist/client/base.js +77 -0
  30. package/dist/client/configure.d.ts +9 -0
  31. package/dist/client/configure.js +10 -0
  32. package/dist/client/eps.d.ts +12 -0
  33. package/dist/client/eps.js +42 -0
  34. package/dist/client/index.d.ts +4 -0
  35. package/dist/client/index.js +22 -0
  36. package/dist/client/service.d.ts +31 -0
  37. package/dist/client/service.js +299 -0
  38. package/dist/client/vite-plugin-eps.d.ts +42 -0
  39. package/dist/client/vite-plugin-eps.js +266 -0
  40. package/dist/index.js +1 -1
  41. package/dist/server/index.js +1 -1
  42. package/dist/shared/index.js +1 -1
  43. package/dist/shared/tree.js +1 -1
  44. package/package.json +46 -4
  45. package/typings/admin/comm/eps.d.ts +48 -0
@@ -0,0 +1,77 @@
1
+ import { getClientRequest } from "./configure";
2
+ function stripTimeMeta(data) {
3
+ if (Array.isArray(data))
4
+ return data.map((item) => stripTimeMeta(item));
5
+ if (data && typeof data === "object") {
6
+ const out = { ...data };
7
+ delete out.createTime;
8
+ delete out.updateTime;
9
+ return out;
10
+ }
11
+ return data;
12
+ }
13
+
14
+ export class BaseService {
15
+ namespace;
16
+ constructor(namespace) {
17
+ if (namespace)
18
+ this.namespace = namespace.replace(/^\//, "");
19
+ }
20
+ async request(options = {}) {
21
+ let url = options.url || "";
22
+ if (url && !/^https?:\/\//.test(url)) {
23
+ if (this.namespace) {
24
+ const ns = this.namespace.startsWith("/") ? this.namespace : `/${this.namespace}`;
25
+ url = url.startsWith("/") ? `${ns}${url}` : `${ns}/${url}`;
26
+ }
27
+ if (!url.startsWith("/"))
28
+ url = `/${url}`;
29
+ }
30
+ const request = getClientRequest();
31
+ const method = (options.method || "GET").toUpperCase();
32
+ if (method === "GET") {
33
+ const params = options.params || {};
34
+ const q = new URLSearchParams;
35
+ for (const [k, v] of Object.entries(params)) {
36
+ if (v == null)
37
+ continue;
38
+ q.set(k, String(v));
39
+ }
40
+ const qs = q.toString();
41
+ return request(qs ? `${url}?${qs}` : url);
42
+ }
43
+ return request(url, {
44
+ method,
45
+ body: JSON.stringify(stripTimeMeta(options.data ?? {}))
46
+ });
47
+ }
48
+ page(data = {}) {
49
+ return this.request({ url: "/page", method: "POST", data });
50
+ }
51
+ list(data = {}) {
52
+ return this.request({
53
+ url: "/list",
54
+ method: "POST",
55
+ data
56
+ });
57
+ }
58
+ info(params) {
59
+ return this.request({
60
+ url: "/info",
61
+ method: "GET",
62
+ params
63
+ });
64
+ }
65
+ add(data) {
66
+ return this.request({ url: "/add", method: "POST", data });
67
+ }
68
+ update(data) {
69
+ return this.request({ url: "/update", method: "POST", data });
70
+ }
71
+ delete(data) {
72
+ return this.request({ url: "/delete", method: "POST", data });
73
+ }
74
+ restore(data) {
75
+ return this.request({ url: "/restore", method: "POST", data });
76
+ }
77
+ }
@@ -0,0 +1,9 @@
1
+ import type { RequestOptions } from '../../typings/admin/comm/request';
2
+ /** 宿主注入的 HTTP 能力(admin / web / uni 各自实现) */
3
+ export type ClientRequestFn = <T>(path: string, init?: RequestOptions) => Promise<T>;
4
+ export type ClientHooks = {
5
+ request: ClientRequestFn;
6
+ };
7
+ /** 各端在加载 request 后立刻调用一次 */
8
+ export declare function configureClient(next: ClientHooks): void;
9
+ export declare function getClientRequest(): ClientRequestFn;
@@ -0,0 +1,10 @@
1
+ let hooks = null;
2
+ export function configureClient(next) {
3
+ hooks = next;
4
+ }
5
+ export function getClientRequest() {
6
+ if (!hooks?.request) {
7
+ throw new Error("[vome-client] configureClient({ request }) before loadEps / service");
8
+ }
9
+ return hooks.request;
10
+ }
@@ -0,0 +1,12 @@
1
+ import type { EpsEntity, EpsModuleMap } from '../../typings/admin/comm/eps';
2
+ export type EpsSide = 'admin' | 'app';
3
+ /** 拉取 EPS;公开接口建议 request 侧 toast:false */
4
+ export declare function loadEps(force?: boolean, side?: EpsSide): Promise<EpsModuleMap>;
5
+ export declare function loadAllEps(force?: boolean): Promise<{
6
+ admin: EpsModuleMap;
7
+ app: EpsModuleMap;
8
+ }>;
9
+ export declare function getEps(side?: EpsSide): EpsModuleMap;
10
+ /** 按 prefix 找实体,如 /admin/base/user、/app/user/info */
11
+ export declare function findEpsEntity(prefix: string, side?: EpsSide): EpsEntity;
12
+ export declare function clearEpsCache(side?: EpsSide): void;
@@ -0,0 +1,42 @@
1
+ import { getClientRequest } from "./configure";
2
+ const EPS_URL = {
3
+ admin: "/admin/base/open/eps",
4
+ app: "/app/base/open/eps"
5
+ };
6
+ const cache = {
7
+ admin: null,
8
+ app: null
9
+ };
10
+ export async function loadEps(force = false, side = "admin") {
11
+ if (cache[side] && !force)
12
+ return cache[side];
13
+ const request = getClientRequest();
14
+ cache[side] = await request(EPS_URL[side], { toast: false }) || {};
15
+ return cache[side];
16
+ }
17
+ export async function loadAllEps(force = false) {
18
+ await Promise.all([loadEps(force, "admin"), loadEps(force, "app")]);
19
+ return { admin: cache.admin, app: cache.app };
20
+ }
21
+ export function getEps(side = "admin") {
22
+ return cache[side];
23
+ }
24
+ export function findEpsEntity(prefix, side = "admin") {
25
+ const map = cache[side];
26
+ if (!map)
27
+ return;
28
+ for (const list of Object.values(map)) {
29
+ const hit = list.find((e) => e.prefix === prefix || e.prefix === prefix.replace(/\/$/, ""));
30
+ if (hit)
31
+ return hit;
32
+ }
33
+ return;
34
+ }
35
+ export function clearEpsCache(side) {
36
+ if (side) {
37
+ cache[side] = null;
38
+ return;
39
+ }
40
+ cache.admin = null;
41
+ cache.app = null;
42
+ }
@@ -0,0 +1,4 @@
1
+ export { configureClient, getClientRequest, type ClientHooks, type ClientRequestFn, } from './configure';
2
+ export { loadEps, loadAllEps, getEps, findEpsEntity, clearEpsCache, type EpsSide, } from './eps';
3
+ export { BaseService } from './base';
4
+ export { service, getService, createEps, bindEpsHotReload, setServicePerms, resolveService, serviceOf, createEpsService, type CreateEpsOptions, type ServiceLeaf, type ServiceTree, } from './service';
@@ -0,0 +1,22 @@
1
+ export {
2
+ configureClient,
3
+ getClientRequest
4
+ } from "./configure";
5
+ export {
6
+ loadEps,
7
+ loadAllEps,
8
+ getEps,
9
+ findEpsEntity,
10
+ clearEpsCache
11
+ } from "./eps";
12
+ export { BaseService } from "./base";
13
+ export {
14
+ service,
15
+ getService,
16
+ createEps,
17
+ bindEpsHotReload,
18
+ setServicePerms,
19
+ resolveService,
20
+ serviceOf,
21
+ createEpsService
22
+ } from "./service";
@@ -0,0 +1,31 @@
1
+ import type { ServiceLeaf, ServiceTree } from '../../typings/admin/comm/service';
2
+ import { BaseService } from './base';
3
+ import { type EpsSide } from './eps';
4
+ type ServiceRoot = ServiceTree & {
5
+ request: BaseService['request'];
6
+ };
7
+ export declare function getService(side?: EpsSide): ServiceRoot;
8
+ /** 兼容旧 admin:默认 admin 侧 service */
9
+ export declare const service: ServiceRoot;
10
+ export type CreateEpsOptions = {
11
+ force?: boolean;
12
+ side?: EpsSide;
13
+ /**
14
+ * 挂载后必须存在的根模块键(admin 为 base)。
15
+ * false = 只校验 EPS 非空。
16
+ */
17
+ requireRoot?: string | false;
18
+ };
19
+ /**
20
+ * 从 EPS 重建 service 树。
21
+ * 兼容旧签名:`createEps()` / `createEps(true)` → admin。
22
+ */
23
+ export declare function createEps(forceOrOpts?: boolean | CreateEpsOptions): Promise<ServiceRoot>;
24
+ /** 开发态:监听 Vite `eps-update` 热更(各端自行调用) */
25
+ export declare function bindEpsHotReload(side?: EpsSide): void;
26
+ export declare function setServicePerms(perms: string[], isSuper?: boolean, side?: EpsSide): void;
27
+ export declare function resolveService(path: string, side?: EpsSide): ServiceLeaf | undefined;
28
+ export declare function serviceOf(prefix: string, side?: EpsSide): ServiceLeaf;
29
+ /** @deprecated 请用 service.xxx */
30
+ export declare function createEpsService(prefix: string, side?: EpsSide): ServiceLeaf;
31
+ export type { ServiceLeaf, ServiceTree };
@@ -0,0 +1,299 @@
1
+ import { BaseService } from "./base";
2
+ import { loadEps } from "./eps";
3
+ function toCamel(str) {
4
+ return str.replace(/([^-])(?:-+([^-]))/g, (_m, a, b) => a + String(b).toUpperCase());
5
+ }
6
+ function methodName(path) {
7
+ return path.replace(/^\//, "").replace(/[:,\s/-]/g, "");
8
+ }
9
+ function isValidName(name) {
10
+ return Boolean(name) && !["{", "}", ":"].some((c) => name.includes(c));
11
+ }
12
+ function resolvePermCode(prefix, action, side) {
13
+ const parts = prefix.replace(/^\//, "").split("/").filter(Boolean);
14
+ const module = side === "admin" ? parts[1] || parts[0] || "base" : parts[0] || "user";
15
+ let resource = side === "admin" ? parts.slice(2).join(":") : parts.slice(1).join(":");
16
+ if (resource === module) {
17
+ resource = module;
18
+ } else if (resource.startsWith(`${module}:`)) {
19
+ resource = resource.slice(module.length + 1);
20
+ }
21
+ const head = `${module}-`;
22
+ if (resource.startsWith(head))
23
+ resource = resource.slice(head.length);
24
+ resource = resource.replace(/-/g, ":");
25
+ if (!resource)
26
+ resource = module;
27
+ return `${module}:${resource}:${action}`;
28
+ }
29
+ function prefixToParts(prefix, side) {
30
+ const raw = prefix.replace(/^\//, "");
31
+ return raw.replace(new RegExp(`^${side}/?`), "").split("/").filter(Boolean).map(toCamel);
32
+ }
33
+ function bindCrud(leaf, base) {
34
+ const proto = BaseService.prototype;
35
+ for (const name of [
36
+ "request",
37
+ "page",
38
+ "list",
39
+ "info",
40
+ "add",
41
+ "update",
42
+ "delete",
43
+ "restore"
44
+ ]) {
45
+ const fn = proto[name];
46
+ if (typeof fn === "function") {
47
+ leaf[name] = fn.bind(base);
48
+ }
49
+ }
50
+ }
51
+ function bindApis(leaf, base, apis, side) {
52
+ leaf.permission ||= {};
53
+ for (const api of apis) {
54
+ const name = methodName(api.path);
55
+ if (!isValidName(name) || /[-:]/g.test(name))
56
+ continue;
57
+ const method = (api.method || "get").toLowerCase();
58
+ leaf[name] = function(data) {
59
+ return this.request({
60
+ url: api.path.startsWith("/") ? api.path : `/${api.path}`,
61
+ method,
62
+ [method === "post" ? "data" : "params"]: data
63
+ });
64
+ }.bind(base);
65
+ leaf.permission[name] = api.perms?.[0] || resolvePermCode(`/${leaf.namespace}`, name, side);
66
+ }
67
+ }
68
+ function createLeaf(namespace, apis = [], side) {
69
+ const ns = namespace.replace(/^\//, "");
70
+ const base = new BaseService(ns);
71
+ const leaf = base;
72
+ leaf.namespace = ns;
73
+ leaf.permission = {};
74
+ leaf._permission = {};
75
+ bindCrud(leaf, base);
76
+ bindApis(leaf, base, apis, side);
77
+ return leaf;
78
+ }
79
+ function attachLeaf(tree, prefix, apis = [], side) {
80
+ const raw = prefix.replace(/^\//, "");
81
+ const arr = prefixToParts(prefix, side);
82
+ if (!arr.length)
83
+ return;
84
+ let node = tree;
85
+ for (let i = 0;i < arr.length; i++) {
86
+ const key = arr[i];
87
+ const isLast = i === arr.length - 1;
88
+ if (!isLast) {
89
+ const cur = node[key];
90
+ if (!cur || typeof cur !== "object" || "namespace" in cur) {
91
+ node[key] = {};
92
+ }
93
+ node = node[key];
94
+ continue;
95
+ }
96
+ const leaf = createLeaf(raw, apis, side);
97
+ node[key] = leaf;
98
+ return leaf;
99
+ }
100
+ return;
101
+ }
102
+ function buildFromEps(map, side, root) {
103
+ const list = Object.values(map).flat();
104
+ for (const e of list) {
105
+ if (!e?.prefix)
106
+ continue;
107
+ const leaf = attachLeaf(root, e.prefix, e.api || [], side);
108
+ if (leaf) {
109
+ const op = e.pageQueryOp;
110
+ if (op) {
111
+ leaf.search = {
112
+ fieldEq: op.fieldEq,
113
+ fieldLike: op.fieldLike,
114
+ fieldArray: op.fieldArray,
115
+ fieldRange: op.fieldRange,
116
+ keyWordLikeFields: op.keyWordLikeFields
117
+ };
118
+ }
119
+ }
120
+ }
121
+ }
122
+ function normalizeEpsMap(input) {
123
+ if (!input || typeof input !== "object")
124
+ return {};
125
+ const m = input;
126
+ if ("code" in m && "data" in m && m.data && typeof m.data === "object" && !Array.isArray(m.data)) {
127
+ return m.data;
128
+ }
129
+ return input;
130
+ }
131
+ function countPrefixedEntities(map) {
132
+ return Object.values(map).flat().filter((e) => e && typeof e === "object" && Boolean(e.prefix)).length;
133
+ }
134
+ function rootKey(side) {
135
+ return Symbol.for(`vome.${side}.service.root`);
136
+ }
137
+ function epsKey(side) {
138
+ return Symbol.for(`vome.${side}.service.eps`);
139
+ }
140
+ function createServiceRoot() {
141
+ const root = new BaseService;
142
+ return {
143
+ request: root.request.bind(root)
144
+ };
145
+ }
146
+ function getOrCreateRoot(side) {
147
+ const g = globalThis;
148
+ const key = rootKey(side);
149
+ if (!g[key]) {
150
+ g[key] = createServiceRoot();
151
+ }
152
+ return g[key];
153
+ }
154
+ function resetServiceModules(side) {
155
+ const root = getOrCreateRoot(side);
156
+ for (const key of Object.keys(root)) {
157
+ if (key === "request")
158
+ continue;
159
+ delete root[key];
160
+ }
161
+ }
162
+ function createServiceProxy(side) {
163
+ return new Proxy({}, {
164
+ get(_t, prop, _r) {
165
+ const root = getOrCreateRoot(side);
166
+ const val = Reflect.get(root, prop, root);
167
+ return typeof val === "function" ? val.bind(root) : val;
168
+ },
169
+ set(_t, prop, value) {
170
+ return Reflect.set(getOrCreateRoot(side), prop, value);
171
+ },
172
+ has(_t, prop) {
173
+ return Reflect.has(getOrCreateRoot(side), prop);
174
+ },
175
+ ownKeys() {
176
+ return Reflect.ownKeys(getOrCreateRoot(side));
177
+ },
178
+ getOwnPropertyDescriptor(_t, prop) {
179
+ const desc = Reflect.getOwnPropertyDescriptor(getOrCreateRoot(side), prop);
180
+ if (desc)
181
+ desc.configurable = true;
182
+ return desc;
183
+ }
184
+ });
185
+ }
186
+ const serviceBySide = {};
187
+ export function getService(side = "admin") {
188
+ if (!serviceBySide[side]) {
189
+ serviceBySide[side] = createServiceProxy(side);
190
+ }
191
+ return serviceBySide[side];
192
+ }
193
+ export const service = getService("admin");
194
+ export async function createEps(forceOrOpts = false) {
195
+ const opts = typeof forceOrOpts === "boolean" ? { force: forceOrOpts, side: "admin", requireRoot: "base" } : {
196
+ side: "admin",
197
+ requireRoot: forceOrOpts.side === "app" ? false : "base",
198
+ ...forceOrOpts
199
+ };
200
+ const side = opts.side ?? "admin";
201
+ const force = Boolean(opts.force);
202
+ const requireRoot = opts.requireRoot === undefined ? side === "admin" ? "base" : false : opts.requireRoot;
203
+ const g = globalThis;
204
+ const promiseKey = epsKey(side);
205
+ if (!force && g[promiseKey])
206
+ return g[promiseKey];
207
+ const run = (async () => {
208
+ const raw = await loadEps(force, side) || {};
209
+ const map = normalizeEpsMap(raw);
210
+ const n = countPrefixedEntities(map);
211
+ if (!n) {
212
+ throw new Error(`[vome-eps] empty or invalid — enable vome.eps and check GET /${side}/base/open/eps`);
213
+ }
214
+ resetServiceModules(side);
215
+ const root = getOrCreateRoot(side);
216
+ buildFromEps(map, side, root);
217
+ if (requireRoot) {
218
+ const hit = root[requireRoot];
219
+ if (!hit || typeof hit !== "object") {
220
+ throw new Error(`[vome-eps] mount failed: service.${requireRoot} missing after EPS apply`);
221
+ }
222
+ }
223
+ return root;
224
+ })();
225
+ g[promiseKey] = run;
226
+ try {
227
+ return await run;
228
+ } catch (e) {
229
+ g[promiseKey] = null;
230
+ throw e;
231
+ }
232
+ }
233
+ export function bindEpsHotReload(side = "admin") {
234
+ try {
235
+ const meta = import.meta;
236
+ if (!meta.hot)
237
+ return;
238
+ meta.hot.on("eps-update", () => {
239
+ globalThis[epsKey(side)] = null;
240
+ createEps({ force: true, side }).then(() => {
241
+ if (meta.env?.DEV)
242
+ console.log(`[vome-eps] ${side} service hot updated`);
243
+ });
244
+ });
245
+ } catch {}
246
+ }
247
+ export function setServicePerms(perms, isSuper = false, side = "admin") {
248
+ const list = perms || [];
249
+ const root = getOrCreateRoot(side);
250
+ const sidePrefix = `${side}/`;
251
+ function deep(d) {
252
+ if (!d || typeof d !== "object")
253
+ return;
254
+ const obj = d;
255
+ if (obj.permission && obj.namespace) {
256
+ obj._permission = {};
257
+ for (const key of Object.keys(obj.permission)) {
258
+ if (isSuper) {
259
+ obj._permission[key] = true;
260
+ continue;
261
+ }
262
+ const code = obj.permission[key];
263
+ obj._permission[key] = list.includes(code) || list.some((p) => p.replace(/:/g, "/").includes(`${obj.namespace.replace(new RegExp(`^${sidePrefix}`), "")}/${key}`));
264
+ }
265
+ return;
266
+ }
267
+ for (const k of Object.keys(obj)) {
268
+ if (k === "request")
269
+ continue;
270
+ deep(obj[k]);
271
+ }
272
+ }
273
+ deep(root);
274
+ }
275
+ export function resolveService(path, side = "admin") {
276
+ const parts = path.replace(/^\//, "").split(".").filter(Boolean);
277
+ let cur = getOrCreateRoot(side);
278
+ for (const p of parts) {
279
+ if (!cur || typeof cur !== "object")
280
+ return;
281
+ cur = cur[p];
282
+ }
283
+ if (cur && typeof cur === "object" && "namespace" in cur) {
284
+ return cur;
285
+ }
286
+ return;
287
+ }
288
+ export function serviceOf(prefix, side = "admin") {
289
+ const raw = prefix.replace(/\/$/, "");
290
+ const path = prefixToParts(raw, side).join(".");
291
+ const hit = resolveService(path, side);
292
+ if (!hit) {
293
+ throw new Error(`[vome-eps] service missing: ${prefix} (await createEps first)`);
294
+ }
295
+ return hit;
296
+ }
297
+ export function createEpsService(prefix, side = "admin") {
298
+ return serviceOf(prefix, side);
299
+ }
@@ -0,0 +1,42 @@
1
+ import type { Plugin } from 'vite';
2
+ export type EpsSide = 'admin' | 'app';
3
+ type EpsApi = {
4
+ method?: string;
5
+ path?: string;
6
+ summary?: string;
7
+ perms?: string[];
8
+ };
9
+ type EpsColumn = {
10
+ propertyName?: string;
11
+ type?: string;
12
+ comment?: string;
13
+ nullable?: boolean;
14
+ };
15
+ type EpsEntity = {
16
+ module?: string;
17
+ prefix?: string;
18
+ name?: string;
19
+ api?: EpsApi[];
20
+ columns?: EpsColumn[];
21
+ pageColumns?: EpsColumn[];
22
+ };
23
+ /** 生成 declare namespace Eps(按 side 剥前缀) */
24
+ export declare function buildEpsDts(map: Record<string, EpsEntity[]>, side: EpsSide): string;
25
+ export type EpsVitePluginOptions = {
26
+ /** 生成哪一侧的 d.ts;both 时 d.ts 仍以 dtsSide 为准,json 含双侧 */
27
+ side?: EpsSide | 'both';
28
+ /** d.ts 使用的侧,默认与 side 相同;side=both 时默认 admin */
29
+ dtsSide?: EpsSide;
30
+ /** 后端根,默认 http://127.0.0.1:3001 */
31
+ apiBase?: string;
32
+ /** eps.json 目录,相对项目根,默认 build */
33
+ dist?: string;
34
+ /** eps.d.ts 路径,相对项目根,默认 typings/eps.d.ts */
35
+ dts?: string;
36
+ };
37
+ /**
38
+ * Vite 插件:拉 EPS → typings/eps.d.ts + build/eps.json
39
+ * web / uniapp 用 side:'app';admin 可用 side:'both'
40
+ */
41
+ export declare function createEpsVitePlugin(options?: EpsVitePluginOptions): Plugin;
42
+ export {};