phecda-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 fgsreally
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,180 @@
1
+ import * as mitt from 'mitt';
2
+ import { EventType, Emitter, Handler } from 'mitt';
3
+ import * as vue from 'vue';
4
+ import { Ref, UnwrapNestedRefs, App } from 'vue';
5
+
6
+ interface PhecdaNameSpace {
7
+ [name: string]: Phecda;
8
+ }
9
+ interface PhecdaEvents extends Record<EventType, unknown> {
10
+ [key: EventType]: any;
11
+ }
12
+ interface UsePipeOptions {
13
+ transform: boolean;
14
+ collectError: boolean;
15
+ }
16
+ interface PhecdaHandler {
17
+ init?: (instance: Phecda, isFirstTime: boolean) => any;
18
+ validate?: (instance: Phecda) => string | void;
19
+ pipe?: (instance: Phecda) => void;
20
+ error?: any;
21
+ watch?: any;
22
+ rule?: any;
23
+ info?: any;
24
+ ignore?: boolean;
25
+ meta?: any;
26
+ beforeUnload?: (instance: Phecda) => any;
27
+ beforeLoad?: (instance: Phecda, v: any) => any;
28
+ }
29
+ type Vret<I> = {
30
+ [P in keyof I]: I[P] extends Function ? I[P] : Ref<I[P]>;
31
+ };
32
+ type ClassValue<I> = {
33
+ [P in keyof I]: I[P] extends Function ? undefined : I[P];
34
+ };
35
+ type SchemaToObj<S> = {
36
+ [P in keyof S]: S[P] extends object ? SchemaToObj<S[P]> : (S[P] extends string ? any : S[P]);
37
+ };
38
+
39
+ declare class Phecda {
40
+ protected static __PHECDA_EMIT__: Emitter<PhecdaEvents>;
41
+ protected static __PHECDA_NAMESPACE__: PhecdaNameSpace;
42
+ protected static __PHECDA_MODEL__: string[];
43
+ protected _symbol: string;
44
+ protected _namespace: {
45
+ __INIT_EVENT__: Set<PropertyKey>;
46
+ __STATE_VAR__: Set<PropertyKey>;
47
+ __STATE_HANDLER__: Map<PropertyKey, PhecdaHandler>;
48
+ };
49
+ constructor();
50
+ on<Key extends keyof PhecdaEvents>(type: Key, handler: Handler<PhecdaEvents[Key]>): void;
51
+ emit(type: keyof PhecdaEvents, event: PhecdaEvents[keyof PhecdaEvents]): void;
52
+ off<Key extends keyof PhecdaEvents>(type: Key, handler?: Handler<PhecdaEvents[Key]>): void;
53
+ }
54
+ declare class PhecdaWeb extends Phecda {
55
+ constructor();
56
+ }
57
+ declare function register(instance: any): void;
58
+
59
+ declare function plainToClass<M extends new (...args: any) => any, Data extends Record<PropertyKey, any>>(Model: M, input: Data, options?: Partial<UsePipeOptions>): Promise<{
60
+ err: string[];
61
+ data: InstanceType<M>;
62
+ }>;
63
+ declare function classToValue<M>(instance: M): ClassValue<M>;
64
+ declare function to<T extends (...args: any) => any>(task: T, oldTasks?: Function[]): {
65
+ to: <R extends (arg: ReturnType<T>) => any>(task: R) => {
66
+ to: <R_1 extends (arg: ReturnType<R>) => any>(task: R_1) => {
67
+ to: <R_2 extends (arg: ReturnType<R_1>) => any>(task: R_2) => {
68
+ to: <R_3 extends (arg: ReturnType<R_2>) => any>(task: R_3) => {
69
+ to: <R_4 extends (arg: ReturnType<R_3>) => any>(task: R_4) => {
70
+ to: <R_5 extends (arg: ReturnType<R_4>) => any>(task: R_5) => {
71
+ to: <R_6 extends (arg: ReturnType<R_5>) => any>(task: R_6) => {
72
+ to: <R_7 extends (arg: ReturnType<R_6>) => any>(task: R_7) => {
73
+ to: <R_8 extends (arg: ReturnType<R_7>) => any>(task: R_8) => {
74
+ to: <R_9 extends (arg: ReturnType<R_8>) => any>(task: R_9) => {
75
+ to: <R_10 extends (arg: ReturnType<R_9>) => any>(task: R_10) => any;
76
+ value: Function[];
77
+ };
78
+ value: Function[];
79
+ };
80
+ value: Function[];
81
+ };
82
+ value: Function[];
83
+ };
84
+ value: Function[];
85
+ };
86
+ value: Function[];
87
+ };
88
+ value: Function[];
89
+ };
90
+ value: Function[];
91
+ };
92
+ value: Function[];
93
+ };
94
+ value: Function[];
95
+ };
96
+ value: Function[];
97
+ };
98
+ declare function snapShot<T extends new (...args: any) => any>(data: UnwrapNestedRefs<InstanceType<T>>): {
99
+ data: UnwrapNestedRefs<InstanceType<T>>;
100
+ clear(): void;
101
+ apply(): void;
102
+ };
103
+
104
+ declare function regisInitEvent(target: any, key: string): void;
105
+ declare function getInitEvent(target: any): string[];
106
+ declare function setModalState(target: any, key: PropertyKey): void;
107
+ declare function setExposeKey(target: any, key: PropertyKey): void;
108
+ declare function setIgnoreKey(target: any, key: PropertyKey): void;
109
+ declare function getModelState(target: any): string[];
110
+ declare function getExposeKey(target: any): string[];
111
+ declare function getIgnoreKey(target: any): string[];
112
+ declare function regisHandler(target: any, key: PropertyKey, handler: PhecdaHandler): void;
113
+ declare function getHandler(target: any, key: PropertyKey): any;
114
+ declare function Init(target: any, key: string): void;
115
+ declare function Rule(rule: RegExp | string | Function | number, info: string, meta?: any): (obj: any, key: string) => void;
116
+ declare function Ignore(target: any, key: string): void;
117
+ declare function Clear(target: any, key: string): void;
118
+ declare function Err<Fn extends (...args: any) => any>(cb: Fn): (target: any, key: PropertyKey) => void;
119
+ declare function Get(target: any, key: string): void;
120
+ declare function Pipe(v: ReturnType<typeof to>): (obj: any, key: string) => void;
121
+ declare function Watcher(eventName: string): (obj: any, key: string) => void;
122
+ declare function Tag(tag: string): (target: any) => void;
123
+ declare function Storage(target: any): void;
124
+
125
+ declare const EXPRESS_RE: RegExp;
126
+ declare const FN_RE: RegExp;
127
+ declare function createFilter<Data extends Record<string, any>>(initState?: Object, option?: {
128
+ expressionRE?: RegExp;
129
+ fnRE?: RegExp;
130
+ exclude?: string[];
131
+ }): {
132
+ filter: <Schema>(obj: Schema) => SchemaToObj<Schema>;
133
+ data: [Data] extends [vue.Ref<any>] ? Data : vue.Ref<vue.UnwrapRef<Data>>;
134
+ init: (params?: Data) => void;
135
+ setState: <Key extends string>(key: Key, value: Data[Key]) => void;
136
+ storeState: (key: string, params?: Data) => void;
137
+ store: {
138
+ [key: string]: Data;
139
+ };
140
+ applyStore: (key: string) => void;
141
+ dispose: () => void;
142
+ clearStore: (key: string) => void;
143
+ };
144
+
145
+ declare function validate(p: RegExp | string | Function | Object | Number, v: any): Promise<any>;
146
+ declare function isAsyncFunc(fn: Function): boolean;
147
+
148
+ declare const emitter: mitt.Emitter<PhecdaEvents>;
149
+ declare const emit: {
150
+ <Key extends keyof PhecdaEvents>(type: Key, event: PhecdaEvents[Key]): void;
151
+ <Key_1 extends keyof PhecdaEvents>(type: undefined extends PhecdaEvents[Key_1] ? Key_1 : never): void;
152
+ };
153
+
154
+ declare const phecdaSymbol: unique symbol;
155
+ declare function createPhecda(): vue.Raw<{
156
+ install(app: App): void;
157
+ vProxyMap: WeakMap<object, any>;
158
+ vMap: WeakMap<object, any>;
159
+ }>;
160
+ interface PhecdaInstance {
161
+ vProxyMap: WeakMap<any, any>;
162
+ vMap: WeakMap<any, any>;
163
+ }
164
+ declare function setActivePhecda(phecda: PhecdaInstance): void;
165
+ declare function getActivePhecda(): PhecdaInstance;
166
+
167
+ type _DeepPartial<T> = {
168
+ [K in keyof T]?: _DeepPartial<T[K]>;
169
+ };
170
+
171
+ declare function useR<T extends new (...args: any) => any>(Model: T): UnwrapNestedRefs<InstanceType<T>>;
172
+ declare function usePatch<T extends new (...args: any) => any>(Model: T, Data: _DeepPartial<InstanceType<T>>): void;
173
+ declare function useListen(eventName: Parameters<typeof emitter['on']>[0], cb: Parameters<typeof emitter['on']>[1]): () => void;
174
+ declare function useV<T extends new (...args: any) => any>(Model: T): Vret<InstanceType<T>>;
175
+ declare function cloneV<Instance extends Object>(instance: Instance): Instance;
176
+ declare function initalize<M extends new (...args: any) => any>(Model: M): InstanceType<M> | void;
177
+ declare function clearStorage<M extends new (...args: any) => any>(Model: M, isForceUpdate?: boolean): void;
178
+ declare function deleteStorage(tag: string): void;
179
+
180
+ export { ClassValue, Clear, EXPRESS_RE, Err, FN_RE, Get, Ignore, Init, Phecda, PhecdaEvents, PhecdaHandler, PhecdaNameSpace, PhecdaWeb, Pipe, Rule, SchemaToObj, Storage, Tag, UsePipeOptions, Vret, Watcher, classToValue, clearStorage, cloneV, createFilter, createPhecda, deleteStorage, emit, emitter, getActivePhecda, getExposeKey, getHandler, getIgnoreKey, getInitEvent, getModelState, initalize, isAsyncFunc, phecdaSymbol, plainToClass, regisHandler, regisInitEvent, register, setActivePhecda, setExposeKey, setIgnoreKey, setModalState, snapShot, to, useListen, usePatch, useR, useV, validate };
package/dist/index.js ADDED
@@ -0,0 +1,609 @@
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 = (to2, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to2, key) && key !== except)
16
+ __defProp(to2, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to2;
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
+ Clear: () => Clear,
30
+ EXPRESS_RE: () => EXPRESS_RE,
31
+ Err: () => Err,
32
+ FN_RE: () => FN_RE,
33
+ Get: () => Get,
34
+ Ignore: () => Ignore,
35
+ Init: () => Init,
36
+ Phecda: () => Phecda,
37
+ PhecdaWeb: () => PhecdaWeb,
38
+ Pipe: () => Pipe,
39
+ Rule: () => Rule,
40
+ Storage: () => Storage,
41
+ Tag: () => Tag,
42
+ Watcher: () => Watcher,
43
+ classToValue: () => classToValue,
44
+ clearStorage: () => clearStorage,
45
+ cloneV: () => cloneV,
46
+ createFilter: () => createFilter,
47
+ createPhecda: () => createPhecda,
48
+ deleteStorage: () => deleteStorage,
49
+ emit: () => emit,
50
+ emitter: () => emitter,
51
+ getActivePhecda: () => getActivePhecda,
52
+ getExposeKey: () => getExposeKey,
53
+ getHandler: () => getHandler,
54
+ getIgnoreKey: () => getIgnoreKey,
55
+ getInitEvent: () => getInitEvent,
56
+ getModelState: () => getModelState,
57
+ initalize: () => initalize,
58
+ isAsyncFunc: () => isAsyncFunc,
59
+ phecdaSymbol: () => phecdaSymbol,
60
+ plainToClass: () => plainToClass,
61
+ regisHandler: () => regisHandler,
62
+ regisInitEvent: () => regisInitEvent,
63
+ register: () => register,
64
+ setActivePhecda: () => setActivePhecda,
65
+ setExposeKey: () => setExposeKey,
66
+ setIgnoreKey: () => setIgnoreKey,
67
+ setModalState: () => setModalState,
68
+ snapShot: () => snapShot,
69
+ to: () => to,
70
+ useListen: () => useListen,
71
+ usePatch: () => usePatch,
72
+ useR: () => useR,
73
+ useV: () => useV,
74
+ validate: () => validate
75
+ });
76
+ module.exports = __toCommonJS(src_exports);
77
+
78
+ // src/emitter.ts
79
+ var import_mitt = __toESM(require("mitt"));
80
+ var emitter = (0, import_mitt.default)();
81
+ var emit = emitter.emit.bind(emitter);
82
+
83
+ // src/decorators.ts
84
+ function init(target) {
85
+ if (!target._namespace) {
86
+ target._namespace = {
87
+ __INIT_EVENT__: /* @__PURE__ */ new Set(),
88
+ __EXPOSE_VAR__: /* @__PURE__ */ new Set(),
89
+ __IGNORE_VAR__: /* @__PURE__ */ new Set(),
90
+ __STATE_VAR__: /* @__PURE__ */ new Set(),
91
+ __STATE_HANDLER__: /* @__PURE__ */ new Map()
92
+ };
93
+ }
94
+ }
95
+ function regisInitEvent(target, key) {
96
+ init(target);
97
+ target._namespace.__INIT_EVENT__.add(key);
98
+ }
99
+ function getInitEvent(target) {
100
+ init(target);
101
+ return [...target._namespace.__INIT_EVENT__];
102
+ }
103
+ function setModalState(target, key) {
104
+ init(target);
105
+ target._namespace.__STATE_VAR__.add(key);
106
+ setExposeKey(target, key);
107
+ }
108
+ function setExposeKey(target, key) {
109
+ init(target);
110
+ target._namespace.__EXPOSE_VAR__.add(key);
111
+ }
112
+ function setIgnoreKey(target, key) {
113
+ init(target);
114
+ target._namespace.__IGNORE_VAR__.add(key);
115
+ }
116
+ function getModelState(target) {
117
+ init(target);
118
+ return [...target._namespace.__STATE_VAR__].reverse();
119
+ }
120
+ function getExposeKey(target) {
121
+ init(target);
122
+ return [...target._namespace.__EXPOSE_VAR__];
123
+ }
124
+ function getIgnoreKey(target) {
125
+ init(target);
126
+ return [...target._namespace.__IGNORE_VAR__];
127
+ }
128
+ function regisHandler(target, key, handler) {
129
+ init(target);
130
+ if (!target._namespace.__STATE_HANDLER__.has(key))
131
+ target._namespace.__STATE_HANDLER__.set(key, [handler]);
132
+ else
133
+ target._namespace.__STATE_HANDLER__.get(key).push(handler);
134
+ }
135
+ function getHandler(target, key) {
136
+ return target._namespace.__STATE_HANDLER__.get(key) || [];
137
+ }
138
+ function Init(target, key) {
139
+ setModalState(target, key);
140
+ regisHandler(target, key, {
141
+ async init(instance) {
142
+ instance[key]();
143
+ }
144
+ });
145
+ }
146
+ function Rule(rule, info, meta) {
147
+ return (obj, key) => {
148
+ setModalState(obj, key);
149
+ regisHandler(obj, key, {
150
+ rule,
151
+ info,
152
+ meta
153
+ });
154
+ };
155
+ }
156
+ function Ignore(target, key) {
157
+ setIgnoreKey(target, key);
158
+ }
159
+ function Clear(target, key) {
160
+ init(target);
161
+ target._namespace.__INIT_EVENT__.delete(key);
162
+ target._namespace.__EXPOSE_VAR__.delete(key);
163
+ target._namespace.__IGNORE_VAR__.delete(key);
164
+ target._namespace.__STATE_VAR__.delete(key);
165
+ target._namespace.__STATE_HANDLER__.delete(key);
166
+ }
167
+ function Err(cb) {
168
+ return (target, key) => {
169
+ setModalState(target, key);
170
+ regisHandler(target, key, {
171
+ error: cb
172
+ });
173
+ };
174
+ }
175
+ function Get(target, key) {
176
+ setExposeKey(target, key);
177
+ }
178
+ function Pipe(v) {
179
+ return (obj, key) => {
180
+ setModalState(obj, key);
181
+ regisHandler(obj, key, {
182
+ async pipe(instance) {
183
+ const tasks = v.value;
184
+ for (const task of tasks)
185
+ instance[key] = await task(instance[key]);
186
+ }
187
+ });
188
+ };
189
+ }
190
+ function Watcher(eventName) {
191
+ return (obj, key) => {
192
+ setModalState(obj, key);
193
+ regisHandler(obj, key, {
194
+ init(instance) {
195
+ emitter.on(eventName, instance[key].bind(instance));
196
+ }
197
+ });
198
+ };
199
+ }
200
+ function Tag(tag) {
201
+ return (target) => {
202
+ target.prototype._symbol = tag;
203
+ };
204
+ }
205
+ function Storage(target) {
206
+ init(target.prototype);
207
+ const tag = target.prototype._symbol;
208
+ const uniTag = Symbol(tag);
209
+ setModalState(target.prototype, uniTag);
210
+ regisHandler(target.prototype, uniTag, {
211
+ init: (instance) => {
212
+ const { state } = instance;
213
+ window.addEventListener("beforeunload", () => {
214
+ localStorage.setItem(`_phecda_${tag}`, JSON.stringify(state));
215
+ });
216
+ const lastObjStr = localStorage.getItem(`_phecda_${tag}`);
217
+ if (lastObjStr && lastObjStr !== "undefined") {
218
+ const lastObj = JSON.parse(lastObjStr);
219
+ for (const i in lastObj)
220
+ state[i] = lastObj[i];
221
+ }
222
+ }
223
+ });
224
+ }
225
+
226
+ // src/model.ts
227
+ var Phecda = class {
228
+ constructor() {
229
+ if (!this._symbol)
230
+ throw new Error("phecda miss tag");
231
+ if (!Phecda.__PHECDA_MODEL__) {
232
+ Phecda.__PHECDA_MODEL__ = [];
233
+ Phecda.__PHECDA_NAMESPACE__ = {};
234
+ Phecda.__PHECDA_EMIT__ = emitter;
235
+ }
236
+ }
237
+ on(type, handler) {
238
+ Phecda.__PHECDA_EMIT__.on(type, handler);
239
+ }
240
+ emit(type, event) {
241
+ Phecda.__PHECDA_EMIT__.emit(type, event);
242
+ }
243
+ off(type, handler) {
244
+ Phecda.__PHECDA_EMIT__.off(type, handler);
245
+ }
246
+ };
247
+ var PhecdaWeb = class extends Phecda {
248
+ constructor() {
249
+ super();
250
+ if (!window.__PHECDA_EMIT__) {
251
+ window.__PHECDA_EMIT__ = Phecda.__PHECDA_EMIT__;
252
+ window.__PHECDA_MODEL__ = Phecda.__PHECDA_MODEL__;
253
+ window.__PHECDA_NAMESPACE__ = Phecda.__PHECDA_NAMESPACE__;
254
+ }
255
+ }
256
+ };
257
+ function register(instance) {
258
+ const stateVars = getModelState(instance);
259
+ for (const item of stateVars) {
260
+ const handlers = getHandler(instance, item);
261
+ for (const hanlder of handlers)
262
+ hanlder.init?.(instance);
263
+ }
264
+ }
265
+
266
+ // src/utils.ts
267
+ async function validate(p, v) {
268
+ if (typeof p === "string" || typeof p === "number") {
269
+ if (v === p)
270
+ return true;
271
+ }
272
+ if (typeof p === "function")
273
+ return p(v);
274
+ if (p instanceof RegExp)
275
+ return p.test(v);
276
+ return false;
277
+ }
278
+ function isAsyncFunc(fn) {
279
+ return fn[Symbol.toStringTag] === "AsyncFunction";
280
+ }
281
+
282
+ // src/composable.ts
283
+ async function plainToClass(Model, input, options = {}) {
284
+ const data = new Model();
285
+ const resolvedOptions = {
286
+ collectError: true,
287
+ transform: false,
288
+ ...options
289
+ };
290
+ const err = [];
291
+ const stateVars = getModelState(data);
292
+ for (const item of stateVars) {
293
+ data[item] = input[item];
294
+ const handlers = getHandler(data, item);
295
+ if (handlers) {
296
+ for (const handler of handlers) {
297
+ const rule = handler.rule;
298
+ if (rule && !await validate(rule, data[item])) {
299
+ err.push(handler.info || "");
300
+ if (!resolvedOptions.collectError)
301
+ break;
302
+ }
303
+ }
304
+ if (err.length > 0 && !resolvedOptions.transform)
305
+ return { err, data };
306
+ for (const handler of handlers)
307
+ await handler.pipe?.(data);
308
+ }
309
+ }
310
+ return { data, err };
311
+ }
312
+ function classToValue(instance) {
313
+ const data = {};
314
+ const exposeVar = getExposeKey(instance);
315
+ const ignoreVars = getIgnoreKey(instance);
316
+ for (const item of exposeVar) {
317
+ if (ignoreVars.includes(item))
318
+ continue;
319
+ data[item] = instance[item];
320
+ }
321
+ return data;
322
+ }
323
+ function to(task, oldTasks) {
324
+ const tasks = oldTasks || [];
325
+ tasks.push(task);
326
+ return { to: (task2) => to(task2, tasks), value: tasks };
327
+ }
328
+ function snapShot(data) {
329
+ const snap = {};
330
+ for (const i in data)
331
+ snap[i] = data[i];
332
+ return {
333
+ data,
334
+ clear() {
335
+ for (const i in snap)
336
+ delete data[i];
337
+ },
338
+ apply() {
339
+ for (const i in snap)
340
+ data[i] = snap[i];
341
+ }
342
+ };
343
+ }
344
+
345
+ // src/filter.ts
346
+ var import_vue = require("vue");
347
+ var EXPRESS_RE = /^{{(.*)}}$/;
348
+ var FN_RE = /^\[\[(.*)\]\]$/;
349
+ function createFilter(initState = {}, option = {}) {
350
+ const resolveOption = Object.assign(
351
+ {
352
+ expressionRE: EXPRESS_RE,
353
+ fnRE: FN_RE,
354
+ exclude: []
355
+ },
356
+ option
357
+ );
358
+ let data = (0, import_vue.ref)(initState);
359
+ let store = {};
360
+ function traverse(obj) {
361
+ for (const i in obj) {
362
+ if (Array.isArray(obj[i]) || resolveOption.exclude.includes(i))
363
+ continue;
364
+ if (typeof obj[i] === "object" && obj[i])
365
+ traverse(obj[i]);
366
+ if (typeof obj[i] === "string") {
367
+ if (resolveOption.expressionRE.test(obj[i])) {
368
+ const body = obj[i].match(resolveOption.expressionRE)[1];
369
+ Object.defineProperty(obj, i, {
370
+ get() {
371
+ return new Function(...Object.keys(data.value), `return ${body}`)(
372
+ ...Object.values(data.value)
373
+ );
374
+ }
375
+ });
376
+ }
377
+ if (resolveOption.fnRE.test(obj[i])) {
378
+ const body = obj[i].match(resolveOption.fnRE)[1];
379
+ Object.defineProperty(obj, i, {
380
+ get() {
381
+ return new Function(...Object.keys(data.value), `${body}`)(
382
+ ...Object.values(data.value)
383
+ );
384
+ }
385
+ });
386
+ }
387
+ }
388
+ }
389
+ }
390
+ function filter(obj) {
391
+ obj = (0, import_vue.reactive)(obj);
392
+ traverse(obj);
393
+ return obj;
394
+ }
395
+ function setState(key, value) {
396
+ data.value[key] = value;
397
+ }
398
+ function storeState(key, params) {
399
+ store[key] = data.value;
400
+ init2(params);
401
+ }
402
+ function applyStore(key) {
403
+ if (!store[key])
404
+ return;
405
+ data.value = store[key];
406
+ }
407
+ function init2(params) {
408
+ data.value = params || initState || {};
409
+ }
410
+ function clearStore(key) {
411
+ delete store[key];
412
+ }
413
+ function dispose() {
414
+ data = null;
415
+ store = null;
416
+ }
417
+ return { filter, data, init: init2, setState, storeState, store, applyStore, dispose, clearStore };
418
+ }
419
+
420
+ // src/vue/phecda.ts
421
+ var import_vue2 = require("vue");
422
+ var phecdaSymbol = Symbol("phecda");
423
+ function createPhecda() {
424
+ const phecda = (0, import_vue2.markRaw)({
425
+ install(app) {
426
+ app.provide(phecdaSymbol, phecda);
427
+ app.config.globalProperties.$phecda = phecda;
428
+ },
429
+ vProxyMap: /* @__PURE__ */ new WeakMap(),
430
+ vMap: /* @__PURE__ */ new WeakMap()
431
+ });
432
+ return phecda;
433
+ }
434
+ var activePhecda = {
435
+ vProxyMap: /* @__PURE__ */ new WeakMap(),
436
+ vMap: /* @__PURE__ */ new WeakMap()
437
+ };
438
+ function setActivePhecda(phecda) {
439
+ activePhecda = phecda;
440
+ }
441
+ function getActivePhecda() {
442
+ return activePhecda;
443
+ }
444
+
445
+ // src/vue/composable.ts
446
+ var import_vue4 = require("vue");
447
+
448
+ // src/vue/utils.ts
449
+ var import_vue3 = require("vue");
450
+ function isObject(o) {
451
+ return Object.prototype.toString.call(o) === "[object Object]";
452
+ }
453
+ function mergeReactiveObjects(target, patchToApply) {
454
+ for (const key in patchToApply) {
455
+ if (!patchToApply.hasOwnProperty(key))
456
+ continue;
457
+ const subPatch = patchToApply[key];
458
+ const targetValue = target[key];
459
+ if (isObject(targetValue) && isObject(subPatch) && target.hasOwnProperty(key) && !(0, import_vue3.isRef)(subPatch) && !(0, import_vue3.isReactive)(subPatch)) {
460
+ target[key] = mergeReactiveObjects(targetValue, subPatch);
461
+ } else {
462
+ target[key] = subPatch;
463
+ }
464
+ }
465
+ return target;
466
+ }
467
+
468
+ // src/vue/composable.ts
469
+ function useR(Model) {
470
+ if ((0, import_vue4.getCurrentInstance)()) {
471
+ const cur = (0, import_vue4.inject)(phecdaSymbol, null);
472
+ if (cur)
473
+ setActivePhecda(cur);
474
+ }
475
+ const { vMap } = getActivePhecda();
476
+ if (!vMap.has(Model)) {
477
+ const instance = (0, import_vue4.reactive)(new Model());
478
+ vMap.set(Model, instance);
479
+ register(instance);
480
+ }
481
+ return vMap.get(Model);
482
+ }
483
+ function usePatch(Model, Data) {
484
+ useR(Model);
485
+ const { vMap } = getActivePhecda();
486
+ const target = vMap.get(Model);
487
+ mergeReactiveObjects(target, Data);
488
+ }
489
+ function useListen(eventName, cb) {
490
+ (0, import_vue4.onUnmounted)(() => {
491
+ emitter.off(eventName, cb);
492
+ });
493
+ emitter.on(eventName, cb);
494
+ return () => emitter.off(eventName, cb);
495
+ }
496
+ function useV(Model) {
497
+ useR(Model);
498
+ const { vProxyMap, vMap } = getActivePhecda();
499
+ if (vProxyMap.has(Model))
500
+ return vProxyMap.get(Model);
501
+ const instance = vMap.get(Model);
502
+ const proxy = new Proxy(instance, {
503
+ get(target, key) {
504
+ if (typeof target[key] === "function") {
505
+ const errorHandler = getHandler(target, key).find((item) => item.error)?.error;
506
+ if (!errorHandler)
507
+ return target[key].bind(target);
508
+ if (isAsyncFunc(target[key])) {
509
+ return (...args) => {
510
+ return target[key].apply(target, args).catch(errorHandler);
511
+ };
512
+ } else {
513
+ return (...args) => {
514
+ try {
515
+ return target[key].apply(target, args);
516
+ } catch (e) {
517
+ return errorHandler(e);
518
+ }
519
+ };
520
+ }
521
+ }
522
+ return (0, import_vue4.computed)({
523
+ get() {
524
+ return target[key];
525
+ },
526
+ set(v) {
527
+ return target[key] = v;
528
+ }
529
+ });
530
+ },
531
+ set(target, key, v) {
532
+ target[key] = v;
533
+ return true;
534
+ }
535
+ });
536
+ vProxyMap.set(Model, proxy);
537
+ return proxy;
538
+ }
539
+ function cloneV(instance) {
540
+ const newInstance = {};
541
+ for (const key in instance) {
542
+ if (instance.hasOwnProperty(key))
543
+ newInstance[key] = instance[key];
544
+ }
545
+ return newInstance;
546
+ }
547
+ function initalize(Model) {
548
+ const instance = useR(Model);
549
+ if (instance) {
550
+ Object.assign(instance, new Model());
551
+ return instance;
552
+ }
553
+ }
554
+ function clearStorage(Model, isForceUpdate = true) {
555
+ localStorage.removeItem(`_phecda_${useR(Model)._symbol}`);
556
+ isForceUpdate && initalize(Model);
557
+ }
558
+ function deleteStorage(tag) {
559
+ localStorage.removeItem(`_phecda_${tag}`);
560
+ }
561
+ // Annotate the CommonJS export names for ESM import in node:
562
+ 0 && (module.exports = {
563
+ Clear,
564
+ EXPRESS_RE,
565
+ Err,
566
+ FN_RE,
567
+ Get,
568
+ Ignore,
569
+ Init,
570
+ Phecda,
571
+ PhecdaWeb,
572
+ Pipe,
573
+ Rule,
574
+ Storage,
575
+ Tag,
576
+ Watcher,
577
+ classToValue,
578
+ clearStorage,
579
+ cloneV,
580
+ createFilter,
581
+ createPhecda,
582
+ deleteStorage,
583
+ emit,
584
+ emitter,
585
+ getActivePhecda,
586
+ getExposeKey,
587
+ getHandler,
588
+ getIgnoreKey,
589
+ getInitEvent,
590
+ getModelState,
591
+ initalize,
592
+ isAsyncFunc,
593
+ phecdaSymbol,
594
+ plainToClass,
595
+ regisHandler,
596
+ regisInitEvent,
597
+ register,
598
+ setActivePhecda,
599
+ setExposeKey,
600
+ setIgnoreKey,
601
+ setModalState,
602
+ snapShot,
603
+ to,
604
+ useListen,
605
+ usePatch,
606
+ useR,
607
+ useV,
608
+ validate
609
+ });
package/dist/index.mjs ADDED
@@ -0,0 +1,531 @@
1
+ // src/emitter.ts
2
+ import mitt from "mitt";
3
+ var emitter = mitt();
4
+ var emit = emitter.emit.bind(emitter);
5
+
6
+ // src/decorators.ts
7
+ function init(target) {
8
+ if (!target._namespace) {
9
+ target._namespace = {
10
+ __INIT_EVENT__: /* @__PURE__ */ new Set(),
11
+ __EXPOSE_VAR__: /* @__PURE__ */ new Set(),
12
+ __IGNORE_VAR__: /* @__PURE__ */ new Set(),
13
+ __STATE_VAR__: /* @__PURE__ */ new Set(),
14
+ __STATE_HANDLER__: /* @__PURE__ */ new Map()
15
+ };
16
+ }
17
+ }
18
+ function regisInitEvent(target, key) {
19
+ init(target);
20
+ target._namespace.__INIT_EVENT__.add(key);
21
+ }
22
+ function getInitEvent(target) {
23
+ init(target);
24
+ return [...target._namespace.__INIT_EVENT__];
25
+ }
26
+ function setModalState(target, key) {
27
+ init(target);
28
+ target._namespace.__STATE_VAR__.add(key);
29
+ setExposeKey(target, key);
30
+ }
31
+ function setExposeKey(target, key) {
32
+ init(target);
33
+ target._namespace.__EXPOSE_VAR__.add(key);
34
+ }
35
+ function setIgnoreKey(target, key) {
36
+ init(target);
37
+ target._namespace.__IGNORE_VAR__.add(key);
38
+ }
39
+ function getModelState(target) {
40
+ init(target);
41
+ return [...target._namespace.__STATE_VAR__].reverse();
42
+ }
43
+ function getExposeKey(target) {
44
+ init(target);
45
+ return [...target._namespace.__EXPOSE_VAR__];
46
+ }
47
+ function getIgnoreKey(target) {
48
+ init(target);
49
+ return [...target._namespace.__IGNORE_VAR__];
50
+ }
51
+ function regisHandler(target, key, handler) {
52
+ init(target);
53
+ if (!target._namespace.__STATE_HANDLER__.has(key))
54
+ target._namespace.__STATE_HANDLER__.set(key, [handler]);
55
+ else
56
+ target._namespace.__STATE_HANDLER__.get(key).push(handler);
57
+ }
58
+ function getHandler(target, key) {
59
+ return target._namespace.__STATE_HANDLER__.get(key) || [];
60
+ }
61
+ function Init(target, key) {
62
+ setModalState(target, key);
63
+ regisHandler(target, key, {
64
+ async init(instance) {
65
+ instance[key]();
66
+ }
67
+ });
68
+ }
69
+ function Rule(rule, info, meta) {
70
+ return (obj, key) => {
71
+ setModalState(obj, key);
72
+ regisHandler(obj, key, {
73
+ rule,
74
+ info,
75
+ meta
76
+ });
77
+ };
78
+ }
79
+ function Ignore(target, key) {
80
+ setIgnoreKey(target, key);
81
+ }
82
+ function Clear(target, key) {
83
+ init(target);
84
+ target._namespace.__INIT_EVENT__.delete(key);
85
+ target._namespace.__EXPOSE_VAR__.delete(key);
86
+ target._namespace.__IGNORE_VAR__.delete(key);
87
+ target._namespace.__STATE_VAR__.delete(key);
88
+ target._namespace.__STATE_HANDLER__.delete(key);
89
+ }
90
+ function Err(cb) {
91
+ return (target, key) => {
92
+ setModalState(target, key);
93
+ regisHandler(target, key, {
94
+ error: cb
95
+ });
96
+ };
97
+ }
98
+ function Get(target, key) {
99
+ setExposeKey(target, key);
100
+ }
101
+ function Pipe(v) {
102
+ return (obj, key) => {
103
+ setModalState(obj, key);
104
+ regisHandler(obj, key, {
105
+ async pipe(instance) {
106
+ const tasks = v.value;
107
+ for (const task of tasks)
108
+ instance[key] = await task(instance[key]);
109
+ }
110
+ });
111
+ };
112
+ }
113
+ function Watcher(eventName) {
114
+ return (obj, key) => {
115
+ setModalState(obj, key);
116
+ regisHandler(obj, key, {
117
+ init(instance) {
118
+ emitter.on(eventName, instance[key].bind(instance));
119
+ }
120
+ });
121
+ };
122
+ }
123
+ function Tag(tag) {
124
+ return (target) => {
125
+ target.prototype._symbol = tag;
126
+ };
127
+ }
128
+ function Storage(target) {
129
+ init(target.prototype);
130
+ const tag = target.prototype._symbol;
131
+ const uniTag = Symbol(tag);
132
+ setModalState(target.prototype, uniTag);
133
+ regisHandler(target.prototype, uniTag, {
134
+ init: (instance) => {
135
+ const { state } = instance;
136
+ window.addEventListener("beforeunload", () => {
137
+ localStorage.setItem(`_phecda_${tag}`, JSON.stringify(state));
138
+ });
139
+ const lastObjStr = localStorage.getItem(`_phecda_${tag}`);
140
+ if (lastObjStr && lastObjStr !== "undefined") {
141
+ const lastObj = JSON.parse(lastObjStr);
142
+ for (const i in lastObj)
143
+ state[i] = lastObj[i];
144
+ }
145
+ }
146
+ });
147
+ }
148
+
149
+ // src/model.ts
150
+ var Phecda = class {
151
+ constructor() {
152
+ if (!this._symbol)
153
+ throw new Error("phecda miss tag");
154
+ if (!Phecda.__PHECDA_MODEL__) {
155
+ Phecda.__PHECDA_MODEL__ = [];
156
+ Phecda.__PHECDA_NAMESPACE__ = {};
157
+ Phecda.__PHECDA_EMIT__ = emitter;
158
+ }
159
+ }
160
+ on(type, handler) {
161
+ Phecda.__PHECDA_EMIT__.on(type, handler);
162
+ }
163
+ emit(type, event) {
164
+ Phecda.__PHECDA_EMIT__.emit(type, event);
165
+ }
166
+ off(type, handler) {
167
+ Phecda.__PHECDA_EMIT__.off(type, handler);
168
+ }
169
+ };
170
+ var PhecdaWeb = class extends Phecda {
171
+ constructor() {
172
+ super();
173
+ if (!window.__PHECDA_EMIT__) {
174
+ window.__PHECDA_EMIT__ = Phecda.__PHECDA_EMIT__;
175
+ window.__PHECDA_MODEL__ = Phecda.__PHECDA_MODEL__;
176
+ window.__PHECDA_NAMESPACE__ = Phecda.__PHECDA_NAMESPACE__;
177
+ }
178
+ }
179
+ };
180
+ function register(instance) {
181
+ const stateVars = getModelState(instance);
182
+ for (const item of stateVars) {
183
+ const handlers = getHandler(instance, item);
184
+ for (const hanlder of handlers)
185
+ hanlder.init?.(instance);
186
+ }
187
+ }
188
+
189
+ // src/utils.ts
190
+ async function validate(p, v) {
191
+ if (typeof p === "string" || typeof p === "number") {
192
+ if (v === p)
193
+ return true;
194
+ }
195
+ if (typeof p === "function")
196
+ return p(v);
197
+ if (p instanceof RegExp)
198
+ return p.test(v);
199
+ return false;
200
+ }
201
+ function isAsyncFunc(fn) {
202
+ return fn[Symbol.toStringTag] === "AsyncFunction";
203
+ }
204
+
205
+ // src/composable.ts
206
+ async function plainToClass(Model, input, options = {}) {
207
+ const data = new Model();
208
+ const resolvedOptions = {
209
+ collectError: true,
210
+ transform: false,
211
+ ...options
212
+ };
213
+ const err = [];
214
+ const stateVars = getModelState(data);
215
+ for (const item of stateVars) {
216
+ data[item] = input[item];
217
+ const handlers = getHandler(data, item);
218
+ if (handlers) {
219
+ for (const handler of handlers) {
220
+ const rule = handler.rule;
221
+ if (rule && !await validate(rule, data[item])) {
222
+ err.push(handler.info || "");
223
+ if (!resolvedOptions.collectError)
224
+ break;
225
+ }
226
+ }
227
+ if (err.length > 0 && !resolvedOptions.transform)
228
+ return { err, data };
229
+ for (const handler of handlers)
230
+ await handler.pipe?.(data);
231
+ }
232
+ }
233
+ return { data, err };
234
+ }
235
+ function classToValue(instance) {
236
+ const data = {};
237
+ const exposeVar = getExposeKey(instance);
238
+ const ignoreVars = getIgnoreKey(instance);
239
+ for (const item of exposeVar) {
240
+ if (ignoreVars.includes(item))
241
+ continue;
242
+ data[item] = instance[item];
243
+ }
244
+ return data;
245
+ }
246
+ function to(task, oldTasks) {
247
+ const tasks = oldTasks || [];
248
+ tasks.push(task);
249
+ return { to: (task2) => to(task2, tasks), value: tasks };
250
+ }
251
+ function snapShot(data) {
252
+ const snap = {};
253
+ for (const i in data)
254
+ snap[i] = data[i];
255
+ return {
256
+ data,
257
+ clear() {
258
+ for (const i in snap)
259
+ delete data[i];
260
+ },
261
+ apply() {
262
+ for (const i in snap)
263
+ data[i] = snap[i];
264
+ }
265
+ };
266
+ }
267
+
268
+ // src/filter.ts
269
+ import { reactive, ref } from "vue";
270
+ var EXPRESS_RE = /^{{(.*)}}$/;
271
+ var FN_RE = /^\[\[(.*)\]\]$/;
272
+ function createFilter(initState = {}, option = {}) {
273
+ const resolveOption = Object.assign(
274
+ {
275
+ expressionRE: EXPRESS_RE,
276
+ fnRE: FN_RE,
277
+ exclude: []
278
+ },
279
+ option
280
+ );
281
+ let data = ref(initState);
282
+ let store = {};
283
+ function traverse(obj) {
284
+ for (const i in obj) {
285
+ if (Array.isArray(obj[i]) || resolveOption.exclude.includes(i))
286
+ continue;
287
+ if (typeof obj[i] === "object" && obj[i])
288
+ traverse(obj[i]);
289
+ if (typeof obj[i] === "string") {
290
+ if (resolveOption.expressionRE.test(obj[i])) {
291
+ const body = obj[i].match(resolveOption.expressionRE)[1];
292
+ Object.defineProperty(obj, i, {
293
+ get() {
294
+ return new Function(...Object.keys(data.value), `return ${body}`)(
295
+ ...Object.values(data.value)
296
+ );
297
+ }
298
+ });
299
+ }
300
+ if (resolveOption.fnRE.test(obj[i])) {
301
+ const body = obj[i].match(resolveOption.fnRE)[1];
302
+ Object.defineProperty(obj, i, {
303
+ get() {
304
+ return new Function(...Object.keys(data.value), `${body}`)(
305
+ ...Object.values(data.value)
306
+ );
307
+ }
308
+ });
309
+ }
310
+ }
311
+ }
312
+ }
313
+ function filter(obj) {
314
+ obj = reactive(obj);
315
+ traverse(obj);
316
+ return obj;
317
+ }
318
+ function setState(key, value) {
319
+ data.value[key] = value;
320
+ }
321
+ function storeState(key, params) {
322
+ store[key] = data.value;
323
+ init2(params);
324
+ }
325
+ function applyStore(key) {
326
+ if (!store[key])
327
+ return;
328
+ data.value = store[key];
329
+ }
330
+ function init2(params) {
331
+ data.value = params || initState || {};
332
+ }
333
+ function clearStore(key) {
334
+ delete store[key];
335
+ }
336
+ function dispose() {
337
+ data = null;
338
+ store = null;
339
+ }
340
+ return { filter, data, init: init2, setState, storeState, store, applyStore, dispose, clearStore };
341
+ }
342
+
343
+ // src/vue/phecda.ts
344
+ import { markRaw } from "vue";
345
+ var phecdaSymbol = Symbol("phecda");
346
+ function createPhecda() {
347
+ const phecda = markRaw({
348
+ install(app) {
349
+ app.provide(phecdaSymbol, phecda);
350
+ app.config.globalProperties.$phecda = phecda;
351
+ },
352
+ vProxyMap: /* @__PURE__ */ new WeakMap(),
353
+ vMap: /* @__PURE__ */ new WeakMap()
354
+ });
355
+ return phecda;
356
+ }
357
+ var activePhecda = {
358
+ vProxyMap: /* @__PURE__ */ new WeakMap(),
359
+ vMap: /* @__PURE__ */ new WeakMap()
360
+ };
361
+ function setActivePhecda(phecda) {
362
+ activePhecda = phecda;
363
+ }
364
+ function getActivePhecda() {
365
+ return activePhecda;
366
+ }
367
+
368
+ // src/vue/composable.ts
369
+ import { computed, getCurrentInstance, inject, onUnmounted, reactive as reactive2 } from "vue";
370
+
371
+ // src/vue/utils.ts
372
+ import { isReactive, isRef } from "vue";
373
+ function isObject(o) {
374
+ return Object.prototype.toString.call(o) === "[object Object]";
375
+ }
376
+ function mergeReactiveObjects(target, patchToApply) {
377
+ for (const key in patchToApply) {
378
+ if (!patchToApply.hasOwnProperty(key))
379
+ continue;
380
+ const subPatch = patchToApply[key];
381
+ const targetValue = target[key];
382
+ if (isObject(targetValue) && isObject(subPatch) && target.hasOwnProperty(key) && !isRef(subPatch) && !isReactive(subPatch)) {
383
+ target[key] = mergeReactiveObjects(targetValue, subPatch);
384
+ } else {
385
+ target[key] = subPatch;
386
+ }
387
+ }
388
+ return target;
389
+ }
390
+
391
+ // src/vue/composable.ts
392
+ function useR(Model) {
393
+ if (getCurrentInstance()) {
394
+ const cur = inject(phecdaSymbol, null);
395
+ if (cur)
396
+ setActivePhecda(cur);
397
+ }
398
+ const { vMap } = getActivePhecda();
399
+ if (!vMap.has(Model)) {
400
+ const instance = reactive2(new Model());
401
+ vMap.set(Model, instance);
402
+ register(instance);
403
+ }
404
+ return vMap.get(Model);
405
+ }
406
+ function usePatch(Model, Data) {
407
+ useR(Model);
408
+ const { vMap } = getActivePhecda();
409
+ const target = vMap.get(Model);
410
+ mergeReactiveObjects(target, Data);
411
+ }
412
+ function useListen(eventName, cb) {
413
+ onUnmounted(() => {
414
+ emitter.off(eventName, cb);
415
+ });
416
+ emitter.on(eventName, cb);
417
+ return () => emitter.off(eventName, cb);
418
+ }
419
+ function useV(Model) {
420
+ useR(Model);
421
+ const { vProxyMap, vMap } = getActivePhecda();
422
+ if (vProxyMap.has(Model))
423
+ return vProxyMap.get(Model);
424
+ const instance = vMap.get(Model);
425
+ const proxy = new Proxy(instance, {
426
+ get(target, key) {
427
+ if (typeof target[key] === "function") {
428
+ const errorHandler = getHandler(target, key).find((item) => item.error)?.error;
429
+ if (!errorHandler)
430
+ return target[key].bind(target);
431
+ if (isAsyncFunc(target[key])) {
432
+ return (...args) => {
433
+ return target[key].apply(target, args).catch(errorHandler);
434
+ };
435
+ } else {
436
+ return (...args) => {
437
+ try {
438
+ return target[key].apply(target, args);
439
+ } catch (e) {
440
+ return errorHandler(e);
441
+ }
442
+ };
443
+ }
444
+ }
445
+ return computed({
446
+ get() {
447
+ return target[key];
448
+ },
449
+ set(v) {
450
+ return target[key] = v;
451
+ }
452
+ });
453
+ },
454
+ set(target, key, v) {
455
+ target[key] = v;
456
+ return true;
457
+ }
458
+ });
459
+ vProxyMap.set(Model, proxy);
460
+ return proxy;
461
+ }
462
+ function cloneV(instance) {
463
+ const newInstance = {};
464
+ for (const key in instance) {
465
+ if (instance.hasOwnProperty(key))
466
+ newInstance[key] = instance[key];
467
+ }
468
+ return newInstance;
469
+ }
470
+ function initalize(Model) {
471
+ const instance = useR(Model);
472
+ if (instance) {
473
+ Object.assign(instance, new Model());
474
+ return instance;
475
+ }
476
+ }
477
+ function clearStorage(Model, isForceUpdate = true) {
478
+ localStorage.removeItem(`_phecda_${useR(Model)._symbol}`);
479
+ isForceUpdate && initalize(Model);
480
+ }
481
+ function deleteStorage(tag) {
482
+ localStorage.removeItem(`_phecda_${tag}`);
483
+ }
484
+ export {
485
+ Clear,
486
+ EXPRESS_RE,
487
+ Err,
488
+ FN_RE,
489
+ Get,
490
+ Ignore,
491
+ Init,
492
+ Phecda,
493
+ PhecdaWeb,
494
+ Pipe,
495
+ Rule,
496
+ Storage,
497
+ Tag,
498
+ Watcher,
499
+ classToValue,
500
+ clearStorage,
501
+ cloneV,
502
+ createFilter,
503
+ createPhecda,
504
+ deleteStorage,
505
+ emit,
506
+ emitter,
507
+ getActivePhecda,
508
+ getExposeKey,
509
+ getHandler,
510
+ getIgnoreKey,
511
+ getInitEvent,
512
+ getModelState,
513
+ initalize,
514
+ isAsyncFunc,
515
+ phecdaSymbol,
516
+ plainToClass,
517
+ regisHandler,
518
+ regisInitEvent,
519
+ register,
520
+ setActivePhecda,
521
+ setExposeKey,
522
+ setIgnoreKey,
523
+ setModalState,
524
+ snapShot,
525
+ to,
526
+ useListen,
527
+ usePatch,
528
+ useR,
529
+ useV,
530
+ validate
531
+ };
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "phecda-core",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "keywords": [],
9
+ "author": "",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "license": "MIT",
14
+ "dependencies": {
15
+ "mitt": "^3.0.0",
16
+ "vue": "^3.2.45"
17
+ },
18
+ "devDependencies": {
19
+ "tsup": "^6.5.0"
20
+ },
21
+ "scripts": {
22
+ "dev": "tsup --watch",
23
+ "build": "tsup"
24
+ }
25
+ }