@lark.js/mvc 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +608 -721
- package/dist/{chunk-IIIY575B.js → chunk-3HSA7OHB.js} +6 -6
- package/dist/index.cjs +225 -924
- package/dist/index.d.cts +106 -182
- package/dist/index.d.ts +106 -182
- package/dist/index.js +221 -907
- package/dist/runtime.cjs +1 -1
- package/dist/runtime.js +1 -1
- package/dist/vite.cjs +6 -6
- package/dist/vite.js +1 -1
- package/dist/webpack.cjs +6 -6
- package/dist/webpack.js +1 -1
- package/package.json +22 -21
- package/src/client.d.ts +1 -0
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/constants.ts
|
|
2
2
|
var globalCounter = 0;
|
|
3
|
-
var SPLITTER =
|
|
3
|
+
var SPLITTER = String.fromCharCode(30);
|
|
4
4
|
var RouterEvents = {
|
|
5
5
|
CHANGE: "change",
|
|
6
6
|
CHANGED: "changed",
|
|
@@ -305,7 +305,7 @@ function safeguard(data, getter, setter, isRoot) {
|
|
|
305
305
|
set(target, property, value) {
|
|
306
306
|
if (!setter && !prefix) {
|
|
307
307
|
throw new Error(
|
|
308
|
-
"Avoid write back, key: " + prefix + property + " value:" + value + " more: https://github.com/hangtiancheng/
|
|
308
|
+
"Avoid write back, key: " + prefix + property + " value:" + value + " more: https://github.com/hangtiancheng/lark"
|
|
309
309
|
);
|
|
310
310
|
}
|
|
311
311
|
Reflect.set(target, property, value);
|
|
@@ -767,6 +767,7 @@ var cachedDefaultPath;
|
|
|
767
767
|
var cachedRewrite;
|
|
768
768
|
var defaultTitle;
|
|
769
769
|
var frameworkConfig;
|
|
770
|
+
var routeMode = "history";
|
|
770
771
|
var beforeEachGuards = [];
|
|
771
772
|
function createEmptyLocation() {
|
|
772
773
|
return {
|
|
@@ -792,7 +793,8 @@ function attachViewAndPath(loc) {
|
|
|
792
793
|
cachedRewrite = frameworkConfig.rewrite;
|
|
793
794
|
}
|
|
794
795
|
if (!loc.view) {
|
|
795
|
-
|
|
796
|
+
const rawPath = routeMode === "history" ? loc.query["path"] || loc.hash["path"] : loc.hash["path"];
|
|
797
|
+
let path = rawPath || cachedDefaultPath || "/";
|
|
796
798
|
if (cachedRewrite) {
|
|
797
799
|
path = cachedRewrite(
|
|
798
800
|
path,
|
|
@@ -858,7 +860,16 @@ function getChanged(oldLoc, newLoc) {
|
|
|
858
860
|
changedCache.set(tKey, finalResult);
|
|
859
861
|
return finalResult;
|
|
860
862
|
}
|
|
861
|
-
function
|
|
863
|
+
function updateBrowserUrl(path, replace) {
|
|
864
|
+
if (routeMode === "history") {
|
|
865
|
+
const url = path || "/";
|
|
866
|
+
if (replace) {
|
|
867
|
+
window.history.replaceState(null, "", url);
|
|
868
|
+
} else {
|
|
869
|
+
window.history.pushState(null, "", url);
|
|
870
|
+
}
|
|
871
|
+
return;
|
|
872
|
+
}
|
|
862
873
|
const hashbang = frameworkConfig?.hashbang || "#!";
|
|
863
874
|
const fullPath = path === "" ? "" : hashbang + path;
|
|
864
875
|
if (replace) {
|
|
@@ -869,9 +880,10 @@ function updateHash(path, replace) {
|
|
|
869
880
|
}
|
|
870
881
|
function updateUrl(path, params, loc, replace, silentFlag, lQuery) {
|
|
871
882
|
path = toUri(path, params, lQuery);
|
|
872
|
-
|
|
883
|
+
const currentSrc = routeMode === "history" ? loc.srcQuery : loc.srcHash;
|
|
884
|
+
if (path !== currentSrc) {
|
|
873
885
|
silent = silentFlag ? 1 : 0;
|
|
874
|
-
|
|
886
|
+
updateBrowserUrl(path, replace);
|
|
875
887
|
}
|
|
876
888
|
}
|
|
877
889
|
var Router = {
|
|
@@ -885,10 +897,29 @@ var Router = {
|
|
|
885
897
|
if (cached) {
|
|
886
898
|
return cached;
|
|
887
899
|
}
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
900
|
+
let srcQuery;
|
|
901
|
+
let srcHash;
|
|
902
|
+
let query;
|
|
903
|
+
let hash;
|
|
904
|
+
if (routeMode === "history") {
|
|
905
|
+
try {
|
|
906
|
+
const urlObj = new URL(href, window.location.origin);
|
|
907
|
+
srcQuery = urlObj.pathname + urlObj.search;
|
|
908
|
+
srcHash = urlObj.hash ? urlObj.hash.replace(/^#!?/, "") : "";
|
|
909
|
+
query = parseUri(srcQuery);
|
|
910
|
+
hash = srcHash ? parseUri(srcHash) : { path: "", params: {} };
|
|
911
|
+
} catch {
|
|
912
|
+
srcQuery = href.replace(URL_TRIM_HASH_REGEXP, "");
|
|
913
|
+
srcHash = href.replace(URL_TRIM_QUERY_REGEXP, "");
|
|
914
|
+
query = parseUri(srcQuery);
|
|
915
|
+
hash = parseUri(srcHash);
|
|
916
|
+
}
|
|
917
|
+
} else {
|
|
918
|
+
srcQuery = href.replace(URL_TRIM_HASH_REGEXP, "");
|
|
919
|
+
srcHash = href.replace(URL_TRIM_QUERY_REGEXP, "");
|
|
920
|
+
query = parseUri(srcQuery);
|
|
921
|
+
hash = parseUri(srcHash);
|
|
922
|
+
}
|
|
892
923
|
const params = assign({}, query["params"], hash["params"]);
|
|
893
924
|
const location = {
|
|
894
925
|
href,
|
|
@@ -962,7 +993,7 @@ var Router = {
|
|
|
962
993
|
}
|
|
963
994
|
}
|
|
964
995
|
if (tPath) {
|
|
965
|
-
if (!hasOwnProperty(window, "history")) {
|
|
996
|
+
if (routeMode === "hash" && !hasOwnProperty(window, "history")) {
|
|
966
997
|
for (const qKey of lQuery) {
|
|
967
998
|
if (!hasOwnProperty(tParams, qKey)) {
|
|
968
999
|
tParams[qKey] = "";
|
|
@@ -1014,32 +1045,41 @@ var Router = {
|
|
|
1014
1045
|
return Router;
|
|
1015
1046
|
},
|
|
1016
1047
|
/**
|
|
1017
|
-
* Internal: bind
|
|
1048
|
+
* Internal: bind routing events and beforeunload.
|
|
1018
1049
|
* Called by Framework.boot().
|
|
1050
|
+
* In hash mode, listens to hashchange + popstate.
|
|
1051
|
+
* In history mode, listens to popstate only.
|
|
1019
1052
|
*/
|
|
1020
1053
|
_bind() {
|
|
1021
1054
|
defaultTitle = document.title;
|
|
1022
|
-
|
|
1055
|
+
const getLocationKey = () => {
|
|
1056
|
+
if (routeMode === "history") {
|
|
1057
|
+
return window.location.pathname + window.location.search;
|
|
1058
|
+
}
|
|
1059
|
+
return Router.parse().srcHash;
|
|
1060
|
+
};
|
|
1061
|
+
let lastKey = getLocationKey();
|
|
1023
1062
|
let suspend;
|
|
1024
1063
|
const watchChange = () => {
|
|
1025
1064
|
if (suspend) {
|
|
1026
1065
|
return;
|
|
1027
1066
|
}
|
|
1067
|
+
hrefCache.clear();
|
|
1028
1068
|
const loc = Router.parse();
|
|
1029
|
-
const
|
|
1030
|
-
if (
|
|
1069
|
+
const newKey = routeMode === "history" ? loc.srcQuery : loc.srcHash;
|
|
1070
|
+
if (newKey !== lastKey) {
|
|
1031
1071
|
const changeEvent = {
|
|
1032
1072
|
p: 0,
|
|
1033
1073
|
reject: () => {
|
|
1034
1074
|
changeEvent.p = 1;
|
|
1035
1075
|
suspend = "";
|
|
1036
|
-
|
|
1076
|
+
updateBrowserUrl(lastKey);
|
|
1037
1077
|
},
|
|
1038
1078
|
resolve: () => {
|
|
1039
1079
|
changeEvent.p = 1;
|
|
1040
|
-
|
|
1080
|
+
lastKey = newKey;
|
|
1041
1081
|
suspend = "";
|
|
1042
|
-
|
|
1082
|
+
updateBrowserUrl(newKey);
|
|
1043
1083
|
Router.diff();
|
|
1044
1084
|
},
|
|
1045
1085
|
prevent: () => {
|
|
@@ -1083,8 +1123,12 @@ var Router = {
|
|
|
1083
1123
|
}
|
|
1084
1124
|
};
|
|
1085
1125
|
Router.notify = watchChange;
|
|
1086
|
-
|
|
1087
|
-
|
|
1126
|
+
if (routeMode === "history") {
|
|
1127
|
+
window.addEventListener("popstate", watchChange);
|
|
1128
|
+
} else {
|
|
1129
|
+
window.addEventListener("hashchange", watchChange);
|
|
1130
|
+
window.addEventListener("popstate", watchChange);
|
|
1131
|
+
}
|
|
1088
1132
|
window.addEventListener("beforeunload", (domEvent) => {
|
|
1089
1133
|
const data = {};
|
|
1090
1134
|
Router.fire(RouterEvents.PAGE_UNLOAD, data);
|
|
@@ -1100,11 +1144,15 @@ var Router = {
|
|
|
1100
1144
|
*/
|
|
1101
1145
|
_setConfig(cfg) {
|
|
1102
1146
|
frameworkConfig = cfg;
|
|
1147
|
+
routeMode = cfg.routeMode || "history";
|
|
1103
1148
|
}
|
|
1104
1149
|
};
|
|
1105
1150
|
function markRouterBooted() {
|
|
1106
1151
|
booted2 = true;
|
|
1107
1152
|
}
|
|
1153
|
+
function getRouteMode() {
|
|
1154
|
+
return routeMode;
|
|
1155
|
+
}
|
|
1108
1156
|
|
|
1109
1157
|
// src/event-delegator.ts
|
|
1110
1158
|
var rootEvents = {};
|
|
@@ -2443,6 +2491,7 @@ function defineView(props, statics) {
|
|
|
2443
2491
|
// src/module-loader.ts
|
|
2444
2492
|
var config = {
|
|
2445
2493
|
rootId: "root",
|
|
2494
|
+
routeMode: "history",
|
|
2446
2495
|
hashbang: "#!",
|
|
2447
2496
|
error: (error) => {
|
|
2448
2497
|
throw error;
|
|
@@ -3554,6 +3603,23 @@ var FrameVisualBridge = {
|
|
|
3554
3603
|
MSG_TREE_DELTA: "LARK_VIS_TREE_DELTA"
|
|
3555
3604
|
};
|
|
3556
3605
|
function serializeView(view) {
|
|
3606
|
+
const evtMap = view.eventObjectMap;
|
|
3607
|
+
const eventMethodKeys = evtMap ? Object.keys(evtMap) : [];
|
|
3608
|
+
const resourceKeys = view.resources ? Object.keys(view.resources) : [];
|
|
3609
|
+
const lookup = view;
|
|
3610
|
+
const hasAssign = typeof lookup["assign"] === "function";
|
|
3611
|
+
let updaterData = null;
|
|
3612
|
+
try {
|
|
3613
|
+
const ref = view.updater?.refData;
|
|
3614
|
+
if (ref && typeof ref === "object") {
|
|
3615
|
+
updaterData = {};
|
|
3616
|
+
for (const k of Object.keys(ref)) {
|
|
3617
|
+
const v = ref[k];
|
|
3618
|
+
updaterData[k] = v === null || typeof v !== "object" ? v : `[${typeof v}]`;
|
|
3619
|
+
}
|
|
3620
|
+
}
|
|
3621
|
+
} catch {
|
|
3622
|
+
}
|
|
3557
3623
|
return {
|
|
3558
3624
|
id: view.id,
|
|
3559
3625
|
rendered: !!view.rendered,
|
|
@@ -3564,7 +3630,11 @@ function serializeView(view) {
|
|
|
3564
3630
|
keys: view.locationObserved.keys,
|
|
3565
3631
|
observePath: view.locationObserved.observePath
|
|
3566
3632
|
},
|
|
3567
|
-
hasTemplate: !!view.template
|
|
3633
|
+
hasTemplate: !!view.template,
|
|
3634
|
+
eventMethodKeys,
|
|
3635
|
+
resourceKeys,
|
|
3636
|
+
hasAssign,
|
|
3637
|
+
updaterData
|
|
3568
3638
|
};
|
|
3569
3639
|
}
|
|
3570
3640
|
function serializeFrame(frameId) {
|
|
@@ -4003,904 +4073,161 @@ if (typeof window !== "undefined") {
|
|
|
4003
4073
|
window.__lark_registerViewClass = registerViewClass;
|
|
4004
4074
|
}
|
|
4005
4075
|
|
|
4006
|
-
// src/
|
|
4007
|
-
|
|
4008
|
-
|
|
4009
|
-
|
|
4010
|
-
|
|
4011
|
-
|
|
4012
|
-
|
|
4013
|
-
|
|
4014
|
-
|
|
4015
|
-
|
|
4016
|
-
|
|
4017
|
-
|
|
4018
|
-
var hasStructuredClone = typeof globalThis !== "undefined" && typeof globalThis.structuredClone === "function";
|
|
4019
|
-
var deepCloneFallback = (obj) => {
|
|
4020
|
-
if (!obj || !isObject(obj)) return {};
|
|
4021
|
-
const newData = Array.isArray(obj) ? [] : {};
|
|
4022
|
-
for (const key in obj) {
|
|
4023
|
-
if (hasOwnProperty2(obj, key)) {
|
|
4024
|
-
const value = obj[key];
|
|
4025
|
-
newData[key] = isObject(value) ? deepCloneFallback(value) : value;
|
|
4026
|
-
}
|
|
4027
|
-
}
|
|
4028
|
-
return newData;
|
|
4029
|
-
};
|
|
4030
|
-
var deepClone = (obj) => {
|
|
4031
|
-
if (hasStructuredClone) {
|
|
4032
|
-
try {
|
|
4033
|
-
return structuredClone(obj);
|
|
4034
|
-
} catch {
|
|
4035
|
-
return deepCloneFallback(obj);
|
|
4036
|
-
}
|
|
4037
|
-
}
|
|
4038
|
-
return deepCloneFallback(obj);
|
|
4039
|
-
};
|
|
4040
|
-
var cloneData = (data) => isObject(data) ? deepClone(data) : data;
|
|
4041
|
-
var getDataByKey = (target, key) => {
|
|
4042
|
-
if (!key.includes(".")) {
|
|
4043
|
-
return target[key];
|
|
4044
|
-
}
|
|
4045
|
-
let data = target;
|
|
4046
|
-
for (const k of key.split(".")) {
|
|
4047
|
-
if (!isObject(data)) return void 0;
|
|
4048
|
-
data = data[k];
|
|
4049
|
-
}
|
|
4050
|
-
return data;
|
|
4051
|
-
};
|
|
4052
|
-
var Queue = class {
|
|
4053
|
-
pendingTasks = /* @__PURE__ */ new Set();
|
|
4054
|
-
queue = [];
|
|
4055
|
-
flushTasks() {
|
|
4056
|
-
const { pendingTasks, queue } = this;
|
|
4057
|
-
const flushTickTask = () => {
|
|
4058
|
-
while (queue.length > 0) {
|
|
4059
|
-
const task2 = queue.shift();
|
|
4060
|
-
if (task2) {
|
|
4061
|
-
pendingTasks.delete(task2);
|
|
4062
|
-
runTask(task2);
|
|
4063
|
-
}
|
|
4064
|
-
}
|
|
4065
|
-
};
|
|
4066
|
-
Promise.resolve().then(flushTickTask);
|
|
4067
|
-
}
|
|
4068
|
-
add(tasks) {
|
|
4069
|
-
const isQueueEmpty = this.queue.length === 0;
|
|
4070
|
-
for (const { cb, params } of tasks) {
|
|
4071
|
-
addParams2Callback(cb, params);
|
|
4072
|
-
if (!this.pendingTasks.has(cb)) {
|
|
4073
|
-
this.queue.push(cb);
|
|
4074
|
-
this.pendingTasks.add(cb);
|
|
4075
|
-
}
|
|
4076
|
-
}
|
|
4077
|
-
if (isQueueEmpty) this.flushTasks();
|
|
4078
|
-
}
|
|
4079
|
-
delete(tasks) {
|
|
4080
|
-
if (this.pendingTasks.size === 0) return;
|
|
4081
|
-
for (const { cb } of tasks) {
|
|
4082
|
-
if (this.pendingTasks.has(cb)) {
|
|
4083
|
-
this.pendingTasks.delete(cb);
|
|
4084
|
-
const index = this.queue.findIndex((item) => item === cb);
|
|
4085
|
-
if (index !== -1) this.queue.splice(index, 1);
|
|
4086
|
-
}
|
|
4087
|
-
}
|
|
4088
|
-
}
|
|
4089
|
-
clear() {
|
|
4090
|
-
this.queue = [];
|
|
4091
|
-
this.pendingTasks.clear();
|
|
4092
|
-
}
|
|
4093
|
-
};
|
|
4094
|
-
var addParams2Callback = (cb, params) => {
|
|
4095
|
-
if (!cb || !params) return;
|
|
4096
|
-
const tagged = cb;
|
|
4097
|
-
const existing = tagged.params;
|
|
4098
|
-
if (isObject(existing)) {
|
|
4099
|
-
Object.assign(existing, params);
|
|
4100
|
-
} else {
|
|
4101
|
-
tagged.params = params;
|
|
4102
|
-
}
|
|
4103
|
-
};
|
|
4104
|
-
var runTask = (cb) => {
|
|
4105
|
-
const tagged = cb;
|
|
4106
|
-
const params = tagged.params;
|
|
4107
|
-
delete tagged.params;
|
|
4108
|
-
try {
|
|
4109
|
-
cb(params);
|
|
4110
|
-
} catch {
|
|
4111
|
-
}
|
|
4112
|
-
};
|
|
4113
|
-
var getDefScheduler = () => new Queue();
|
|
4114
|
-
var run = (tasks, scheduler) => {
|
|
4115
|
-
if (scheduler) {
|
|
4116
|
-
if (isFunction(scheduler)) {
|
|
4117
|
-
for (const { cb, params } of tasks) scheduler(cb, params);
|
|
4118
|
-
} else {
|
|
4119
|
-
scheduler.add(tasks);
|
|
4076
|
+
// src/url-state.ts
|
|
4077
|
+
function useUrlState(view, initialState) {
|
|
4078
|
+
const keys2 = initialState ? Object.keys(initialState) : [];
|
|
4079
|
+
if (keys2.length > 0) {
|
|
4080
|
+
view.observeLocation(keys2);
|
|
4081
|
+
}
|
|
4082
|
+
const getState = () => {
|
|
4083
|
+
const loc = Router.parse();
|
|
4084
|
+
const result = { ...initialState || {} };
|
|
4085
|
+
for (const key of keys2) {
|
|
4086
|
+
const val = loc.get(key);
|
|
4087
|
+
if (val) result[key] = val;
|
|
4120
4088
|
}
|
|
4121
|
-
} else {
|
|
4122
|
-
for (const { cb, params } of tasks) cb(params);
|
|
4123
|
-
}
|
|
4124
|
-
};
|
|
4125
|
-
var ArrMethods = {};
|
|
4126
|
-
["indexOf", "lastIndexOf", "includes"].forEach((key) => {
|
|
4127
|
-
const rawMethod = Array.prototype[key];
|
|
4128
|
-
ArrMethods[key] = function(...args) {
|
|
4129
|
-
let res = rawMethod.apply(this, args);
|
|
4130
|
-
if (res === -1 || res === false) {
|
|
4131
|
-
res = rawMethod.apply(
|
|
4132
|
-
this,
|
|
4133
|
-
args.map(
|
|
4134
|
-
(item) => isObject(item) ? ProxyCache.get(item) ?? item : item
|
|
4135
|
-
)
|
|
4136
|
-
);
|
|
4137
|
-
}
|
|
4138
|
-
return res;
|
|
4139
|
-
};
|
|
4140
|
-
});
|
|
4141
|
-
var inArrUpdate = false;
|
|
4142
|
-
["unshift", "shift", "push", "pop", "splice"].forEach((key) => {
|
|
4143
|
-
const rawMethod = Array.prototype[key];
|
|
4144
|
-
ArrMethods[key] = function(...args) {
|
|
4145
|
-
inArrUpdate = true;
|
|
4146
|
-
const result = rawMethod.apply(this, args);
|
|
4147
|
-
inArrUpdate = false;
|
|
4148
4089
|
return result;
|
|
4149
4090
|
};
|
|
4150
|
-
|
|
4151
|
-
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
return getLinkKeys(newVal) === createLinkKeys(target, key);
|
|
4155
|
-
}
|
|
4156
|
-
var defStateConfig = {
|
|
4157
|
-
belong: LARK_GLOBAL,
|
|
4158
|
-
linkKeys: "",
|
|
4159
|
-
shallow: false
|
|
4160
|
-
};
|
|
4161
|
-
var StateConfigMap = /* @__PURE__ */ new WeakMap();
|
|
4162
|
-
var setStateConfig = (target, config2) => {
|
|
4163
|
-
if (target && isObject(config2)) StateConfigMap.set(target, config2);
|
|
4164
|
-
};
|
|
4165
|
-
function getStateConfig(target, key) {
|
|
4166
|
-
if (!StateConfigMap.has(target)) {
|
|
4167
|
-
return void 0;
|
|
4168
|
-
}
|
|
4169
|
-
const config2 = StateConfigMap.get(target);
|
|
4170
|
-
return key ? config2?.[key] : config2;
|
|
4171
|
-
}
|
|
4172
|
-
var isState = (target) => isObject(target) && StateConfigMap.has(target);
|
|
4173
|
-
var createLinkKeys = (target, property) => {
|
|
4174
|
-
if (!hasLinkKeys(target)) return property;
|
|
4175
|
-
if (Array.isArray(target)) return getLinkKeys(target) ?? property;
|
|
4176
|
-
return `${getLinkKeys(target)}.${property}`;
|
|
4177
|
-
};
|
|
4178
|
-
var formatLinkKeys = (target, key) => {
|
|
4179
|
-
const originKeysStr = getLinkKeys(target);
|
|
4180
|
-
if (!originKeysStr) return null;
|
|
4181
|
-
const linkKeys = [];
|
|
4182
|
-
const originKeys = originKeysStr.split(".");
|
|
4183
|
-
let pre = "";
|
|
4184
|
-
for (const k of originKeys) {
|
|
4185
|
-
const curr = pre ? `${pre}.${k}` : k;
|
|
4186
|
-
linkKeys.push(curr);
|
|
4187
|
-
pre = curr;
|
|
4188
|
-
}
|
|
4189
|
-
linkKeys.push(`${originKeysStr}.${key}`);
|
|
4190
|
-
return linkKeys;
|
|
4191
|
-
};
|
|
4192
|
-
var getLinkKeys = (target) => getStateConfig(target, "linkKeys");
|
|
4193
|
-
var hasLinkKeys = (target) => !!getLinkKeys(target);
|
|
4194
|
-
var ProxyCache = /* @__PURE__ */ new WeakMap();
|
|
4195
|
-
var keepKey = null;
|
|
4196
|
-
var keep = (key) => {
|
|
4197
|
-
if (keepKey) throw new Error("[lark-store] keepKey is not null");
|
|
4198
|
-
keepKey = key;
|
|
4199
|
-
};
|
|
4200
|
-
var needKeep = (key) => {
|
|
4201
|
-
if (keepKey === key) {
|
|
4202
|
-
keepKey = null;
|
|
4203
|
-
return true;
|
|
4204
|
-
}
|
|
4205
|
-
return false;
|
|
4206
|
-
};
|
|
4207
|
-
var canSetNewVal = (params) => {
|
|
4208
|
-
const { property, newVal, oldVal } = params;
|
|
4209
|
-
if (hasOwnProperty2(params.target, property) && newVal === oldVal)
|
|
4210
|
-
return false;
|
|
4211
|
-
return true;
|
|
4212
|
-
};
|
|
4213
|
-
var getNewVal = (params) => {
|
|
4214
|
-
const { target, newVal, property, needKeepVal = false } = params;
|
|
4215
|
-
const config2 = getStateConfig(target);
|
|
4216
|
-
if (!isObject(newVal)) return newVal;
|
|
4217
|
-
if (needKeepArrItem(target, newVal, property)) return newVal;
|
|
4218
|
-
if (config2?.shallow) return newVal;
|
|
4219
|
-
if (needKeepVal) return newVal;
|
|
4220
|
-
const linkKeys = createLinkKeys(target, property);
|
|
4221
|
-
const newState = createState(newVal, { ...config2, linkKeys });
|
|
4222
|
-
if (isPromise(newVal)) handlePromise(newVal, target, property);
|
|
4223
|
-
return newState;
|
|
4224
|
-
};
|
|
4225
|
-
var genPayload = (params) => {
|
|
4226
|
-
const { target, property, newVal, oldVal } = params;
|
|
4227
|
-
const config2 = getStateConfig(target) ?? defStateConfig;
|
|
4228
|
-
return {
|
|
4229
|
-
belong: config2.belong || LARK_GLOBAL,
|
|
4230
|
-
target,
|
|
4231
|
-
keys: formatLinkKeys(target, property) || [property],
|
|
4232
|
-
newVal,
|
|
4233
|
-
oldVal
|
|
4091
|
+
const setState = (patch) => {
|
|
4092
|
+
const current = getState();
|
|
4093
|
+
const resolved = typeof patch === "function" ? patch(current) : patch;
|
|
4094
|
+
Router.to(resolved);
|
|
4234
4095
|
};
|
|
4235
|
-
|
|
4236
|
-
var handlePromise = (child, parent, key) => {
|
|
4237
|
-
const childObj = child;
|
|
4238
|
-
child.then((res) => {
|
|
4239
|
-
const parentProxy = ProxyCache.get(parent);
|
|
4240
|
-
if (parentProxy) {
|
|
4241
|
-
const oldVal = parentProxy[key];
|
|
4242
|
-
if (ProxyCache.get(childObj) === oldVal) {
|
|
4243
|
-
parentProxy[key] = res;
|
|
4244
|
-
}
|
|
4245
|
-
}
|
|
4246
|
-
}).catch((err) => {
|
|
4247
|
-
const parentProxy = ProxyCache.get(parent);
|
|
4248
|
-
if (parentProxy) {
|
|
4249
|
-
const oldVal = parentProxy[key];
|
|
4250
|
-
if (ProxyCache.get(childObj) === oldVal) {
|
|
4251
|
-
parentProxy[key] = err;
|
|
4252
|
-
}
|
|
4253
|
-
}
|
|
4254
|
-
});
|
|
4255
|
-
};
|
|
4256
|
-
var _deleteKey = "_delete";
|
|
4257
|
-
var _markObjKey = "_markObj";
|
|
4258
|
-
var mark2 = (host, key) => {
|
|
4259
|
-
let sign;
|
|
4260
|
-
if (!host[_deleteKey]) {
|
|
4261
|
-
const markHost = host[_markObjKey] || (host[_markObjKey] = {});
|
|
4262
|
-
if (!hasOwnProperty2(markHost, key)) {
|
|
4263
|
-
markHost[key] = 0;
|
|
4264
|
-
}
|
|
4265
|
-
sign = ++markHost[key];
|
|
4266
|
-
}
|
|
4267
|
-
return () => {
|
|
4268
|
-
const temp = host[_markObjKey];
|
|
4269
|
-
return !!temp && sign === temp[key];
|
|
4270
|
-
};
|
|
4271
|
-
};
|
|
4272
|
-
var unmark2 = (host) => {
|
|
4273
|
-
host[_deleteKey] = 1;
|
|
4274
|
-
host[_markObjKey] = 0;
|
|
4275
|
-
};
|
|
4276
|
-
function createState(initialData, config2) {
|
|
4277
|
-
if (!isObject(initialData)) return initialData;
|
|
4278
|
-
const mergedConfig = Object.assign({ ...defStateConfig }, config2);
|
|
4279
|
-
const data = Array.isArray(initialData) ? [] : Object.create(Object.getPrototypeOf(initialData));
|
|
4280
|
-
const handler = {
|
|
4281
|
-
get(target, property, _receiver) {
|
|
4282
|
-
if (Array.isArray(target) && property in ArrMethods) {
|
|
4283
|
-
return ArrMethods[property];
|
|
4284
|
-
}
|
|
4285
|
-
return Reflect.get(target, property);
|
|
4286
|
-
},
|
|
4287
|
-
set(target, property, newVal, receiver) {
|
|
4288
|
-
const strProp = property;
|
|
4289
|
-
const oldVal = Reflect.get(target, property);
|
|
4290
|
-
const preventTrigger = isLazySet(strProp);
|
|
4291
|
-
const needKeepVal = needKeep(strProp);
|
|
4292
|
-
const canSet = canSetNewVal({
|
|
4293
|
-
target,
|
|
4294
|
-
property: strProp,
|
|
4295
|
-
newVal,
|
|
4296
|
-
oldVal
|
|
4297
|
-
});
|
|
4298
|
-
if (!canSet) return true;
|
|
4299
|
-
const proxyTarget = isObject(receiver) && receiver !== null ? receiver : state;
|
|
4300
|
-
newVal = getNewVal({
|
|
4301
|
-
target: proxyTarget,
|
|
4302
|
-
property: strProp,
|
|
4303
|
-
newVal,
|
|
4304
|
-
needKeepVal
|
|
4305
|
-
});
|
|
4306
|
-
Reflect.set(target, property, newVal, receiver);
|
|
4307
|
-
if (preventTrigger) return true;
|
|
4308
|
-
const payload = genPayload({
|
|
4309
|
-
target: proxyTarget,
|
|
4310
|
-
property: strProp,
|
|
4311
|
-
newVal,
|
|
4312
|
-
oldVal
|
|
4313
|
-
});
|
|
4314
|
-
trigger(payload);
|
|
4315
|
-
return true;
|
|
4316
|
-
},
|
|
4317
|
-
deleteProperty(target, property) {
|
|
4318
|
-
const strProp = property;
|
|
4319
|
-
if (!hasOwnProperty2(target, strProp)) return true;
|
|
4320
|
-
const oldVal = Reflect.get(target, property);
|
|
4321
|
-
Reflect.deleteProperty(target, property);
|
|
4322
|
-
const payload = genPayload({
|
|
4323
|
-
target: state,
|
|
4324
|
-
property: strProp,
|
|
4325
|
-
newVal: null,
|
|
4326
|
-
oldVal
|
|
4327
|
-
});
|
|
4328
|
-
trigger(payload);
|
|
4329
|
-
return true;
|
|
4330
|
-
}
|
|
4331
|
-
};
|
|
4332
|
-
const state = new Proxy(data, handler);
|
|
4333
|
-
ProxyCache.set(initialData, state);
|
|
4334
|
-
setStateConfig(state, mergedConfig);
|
|
4335
|
-
lazySet(state, initialData);
|
|
4336
|
-
return state;
|
|
4337
|
-
}
|
|
4338
|
-
var curLazySetKey = null;
|
|
4339
|
-
function lazySet(target, data) {
|
|
4340
|
-
if (isObject(data)) {
|
|
4341
|
-
Reflect.ownKeys(data).forEach((key) => {
|
|
4342
|
-
const strKey = key;
|
|
4343
|
-
if (curLazySetKey) throw new Error("[lark-store] lazy set key conflict");
|
|
4344
|
-
curLazySetKey = strKey;
|
|
4345
|
-
target[strKey] = data[strKey];
|
|
4346
|
-
});
|
|
4347
|
-
}
|
|
4348
|
-
}
|
|
4349
|
-
function isLazySet(property) {
|
|
4350
|
-
if (curLazySetKey === property) {
|
|
4351
|
-
curLazySetKey = "";
|
|
4352
|
-
return true;
|
|
4353
|
-
}
|
|
4354
|
-
return false;
|
|
4355
|
-
}
|
|
4356
|
-
function shallowSet(target, key, data) {
|
|
4357
|
-
if (!isState(target))
|
|
4358
|
-
throw new Error("[lark-store] shallowSet only supports state objects");
|
|
4359
|
-
if (!isObject(data)) return target[key] = data;
|
|
4360
|
-
keep(key);
|
|
4361
|
-
const config2 = getStateConfig(target);
|
|
4362
|
-
const linkKeys = createLinkKeys(target, key);
|
|
4363
|
-
target[key] = createState(data, { ...config2, linkKeys, shallow: true });
|
|
4364
|
-
return target[key];
|
|
4096
|
+
return [getState(), setState];
|
|
4365
4097
|
}
|
|
4366
|
-
|
|
4367
|
-
|
|
4368
|
-
|
|
4369
|
-
|
|
4370
|
-
|
|
4371
|
-
for (const { key, cb } of trackList) {
|
|
4372
|
-
if (isFunction(cb)) {
|
|
4373
|
-
let callbacks = deps.get(key);
|
|
4374
|
-
if (!callbacks) deps.set(key, callbacks = /* @__PURE__ */ new Set());
|
|
4375
|
-
callbacks.add(cb);
|
|
4376
|
-
}
|
|
4377
|
-
}
|
|
4378
|
-
}
|
|
4379
|
-
function trigger(payload) {
|
|
4380
|
-
const { belong, keys: keys2 } = payload;
|
|
4381
|
-
const store = getStore(belong);
|
|
4382
|
-
if (store && store.status !== 2 /* ACTIVE */ && belong !== LARK_GLOBAL)
|
|
4383
|
-
return;
|
|
4384
|
-
const deps = GlobalDeps.get(belong);
|
|
4385
|
-
if (!deps) return;
|
|
4386
|
-
const tasks = /* @__PURE__ */ new Set();
|
|
4387
|
-
for (const key of keys2) {
|
|
4388
|
-
const callbacks = deps.get(key);
|
|
4389
|
-
if (callbacks) {
|
|
4390
|
-
for (const cb of callbacks) {
|
|
4391
|
-
tasks.add({ cb, params: { [key]: true } });
|
|
4392
|
-
}
|
|
4393
|
-
}
|
|
4394
|
-
}
|
|
4395
|
-
if (tasks.size === 0) return;
|
|
4396
|
-
const scheduler = store?.scheduler;
|
|
4397
|
-
run(Array.from(tasks), scheduler);
|
|
4098
|
+
|
|
4099
|
+
// src/store.ts
|
|
4100
|
+
var COMPUTED_BRAND = /* @__PURE__ */ Symbol("lark-store-computed");
|
|
4101
|
+
function isComputedMarker(val) {
|
|
4102
|
+
return val !== null && typeof val === "object" && val[COMPUTED_BRAND] === true;
|
|
4398
4103
|
}
|
|
4399
|
-
function
|
|
4400
|
-
|
|
4401
|
-
|
|
4402
|
-
|
|
4403
|
-
|
|
4404
|
-
const
|
|
4405
|
-
const
|
|
4406
|
-
|
|
4407
|
-
const
|
|
4408
|
-
|
|
4409
|
-
|
|
4410
|
-
|
|
4411
|
-
|
|
4412
|
-
|
|
4413
|
-
|
|
4414
|
-
|
|
4415
|
-
|
|
4416
|
-
|
|
4417
|
-
|
|
4418
|
-
|
|
4419
|
-
|
|
4420
|
-
|
|
4104
|
+
function computed(deps, fn) {
|
|
4105
|
+
return { [COMPUTED_BRAND]: true, deps, fn };
|
|
4106
|
+
}
|
|
4107
|
+
var storeRegistry = /* @__PURE__ */ new Map();
|
|
4108
|
+
function create(name, creator) {
|
|
4109
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
4110
|
+
const computedDefs = /* @__PURE__ */ new Map();
|
|
4111
|
+
const computedKeys = /* @__PURE__ */ new Set();
|
|
4112
|
+
const actionKeys = /* @__PURE__ */ new Set();
|
|
4113
|
+
let state;
|
|
4114
|
+
let destroyed = false;
|
|
4115
|
+
const getState = () => state;
|
|
4116
|
+
const setState = (partial) => {
|
|
4117
|
+
if (destroyed) return;
|
|
4118
|
+
const prevState = state;
|
|
4119
|
+
const resolved = typeof partial === "function" ? partial(prevState) : partial;
|
|
4120
|
+
const nextState = { ...prevState };
|
|
4121
|
+
let changed = false;
|
|
4122
|
+
for (const key in resolved) {
|
|
4123
|
+
if (Object.prototype.hasOwnProperty.call(resolved, key) && !computedKeys.has(key) && !actionKeys.has(key)) {
|
|
4124
|
+
const newVal = resolved[key];
|
|
4125
|
+
if (!Object.is(prevState[key], newVal)) {
|
|
4126
|
+
nextState[key] = newVal;
|
|
4127
|
+
changed = true;
|
|
4421
4128
|
}
|
|
4422
4129
|
}
|
|
4423
4130
|
}
|
|
4424
|
-
|
|
4425
|
-
|
|
4426
|
-
|
|
4427
|
-
|
|
4428
|
-
|
|
4131
|
+
if (!changed) return;
|
|
4132
|
+
state = nextState;
|
|
4133
|
+
recomputeIfNeeded(prevState);
|
|
4134
|
+
for (const listener of listeners) {
|
|
4135
|
+
listener(state, prevState);
|
|
4429
4136
|
}
|
|
4430
|
-
}
|
|
4431
|
-
}
|
|
4432
|
-
var _storeName = /* @__PURE__ */ Symbol("store-name");
|
|
4433
|
-
var _storeStatus = /* @__PURE__ */ Symbol("store-status");
|
|
4434
|
-
var _storeScheduler = /* @__PURE__ */ Symbol("store-scheduler");
|
|
4435
|
-
var _storeCreate = /* @__PURE__ */ Symbol("fn:store-create");
|
|
4436
|
-
var _storeBoot = /* @__PURE__ */ Symbol("fn:store-boot");
|
|
4437
|
-
var _storeDestroy = /* @__PURE__ */ Symbol("fn:store-destroy");
|
|
4438
|
-
var _innerStore = /* @__PURE__ */ Symbol("inner-store");
|
|
4439
|
-
var _outerStore = /* @__PURE__ */ Symbol("outer-store");
|
|
4440
|
-
var _originState = /* @__PURE__ */ Symbol("origin-state");
|
|
4441
|
-
var _stateKeys = /* @__PURE__ */ Symbol("state-keys");
|
|
4442
|
-
var _storeState = /* @__PURE__ */ Symbol("store-state");
|
|
4443
|
-
var _storeDefScheduler = /* @__PURE__ */ Symbol("store-def-scheduler");
|
|
4444
|
-
var _storeProxy = /* @__PURE__ */ Symbol("fn:store-proxy");
|
|
4445
|
-
var _computedKeys = /* @__PURE__ */ Symbol("store-computed-keys");
|
|
4446
|
-
var COMPUTED_BRAND = /* @__PURE__ */ Symbol("store-computed-brand");
|
|
4447
|
-
function computed(deps, fn) {
|
|
4448
|
-
const marker = {
|
|
4449
|
-
[COMPUTED_BRAND]: true,
|
|
4450
|
-
deps,
|
|
4451
|
-
fn
|
|
4452
4137
|
};
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4456
|
-
|
|
4457
|
-
|
|
4458
|
-
|
|
4459
|
-
|
|
4460
|
-
|
|
4461
|
-
|
|
4462
|
-
|
|
4463
|
-
|
|
4464
|
-
|
|
4465
|
-
|
|
4466
|
-
|
|
4467
|
-
|
|
4468
|
-
|
|
4469
|
-
|
|
4470
|
-
|
|
4471
|
-
this[_storeStatus] = 3 /* DESTROYED */;
|
|
4472
|
-
}
|
|
4473
|
-
/**
|
|
4474
|
-
*
|
|
4475
|
-
* @param body - The object returned by the creator function
|
|
4476
|
-
* @param excludeFns - Function keys to exclude from handlers (e.g. ['observe'])
|
|
4477
|
-
*/
|
|
4478
|
-
[_storeCreate](body, excludeFns = ["observe"]) {
|
|
4479
|
-
this[_storeStatus] = 1 /* CREATED */;
|
|
4480
|
-
if (isObject(body)) {
|
|
4481
|
-
const state = {};
|
|
4482
|
-
const handlers = {};
|
|
4483
|
-
const computedDefs = {};
|
|
4484
|
-
const computedKeys = this[_computedKeys];
|
|
4485
|
-
Reflect.ownKeys(body).forEach((key) => {
|
|
4486
|
-
const strKey = key;
|
|
4487
|
-
const val = body[strKey];
|
|
4488
|
-
if (isComputedMarker(val)) {
|
|
4489
|
-
computedDefs[strKey] = val;
|
|
4490
|
-
state[strKey] = void 0;
|
|
4491
|
-
computedKeys.add(strKey);
|
|
4492
|
-
} else if (isFunction(val)) {
|
|
4493
|
-
if (!excludeFns.includes(strKey)) handlers[strKey] = val;
|
|
4494
|
-
} else {
|
|
4495
|
-
state[strKey] = val;
|
|
4496
|
-
}
|
|
4497
|
-
});
|
|
4498
|
-
Object.assign(this, handlers);
|
|
4499
|
-
this[_originState] = cloneData(state);
|
|
4500
|
-
this[_stateKeys] = Object.keys(state);
|
|
4501
|
-
this[_storeState] = createState(state, { belong: this[_storeName] });
|
|
4502
|
-
if (Object.keys(computedDefs).length > 0) {
|
|
4503
|
-
const belong = this[_storeName];
|
|
4504
|
-
const storeState = this[_storeState];
|
|
4505
|
-
for (const key of Object.keys(computedDefs)) {
|
|
4506
|
-
const def = computedDefs[key];
|
|
4507
|
-
const recompute = () => {
|
|
4508
|
-
storeState[key] = def.fn();
|
|
4509
|
-
};
|
|
4510
|
-
recompute();
|
|
4511
|
-
const trackList = def.deps.map((depKey) => ({
|
|
4512
|
-
key: depKey,
|
|
4513
|
-
cb: recompute
|
|
4514
|
-
}));
|
|
4515
|
-
if (trackList.length > 0) track({ belong, trackList });
|
|
4138
|
+
const recomputeIfNeeded = (prevState) => {
|
|
4139
|
+
if (computedDefs.size === 0) return;
|
|
4140
|
+
const changedKeys2 = /* @__PURE__ */ new Set();
|
|
4141
|
+
for (const key of Object.keys(state)) {
|
|
4142
|
+
if (!Object.is(
|
|
4143
|
+
state[key],
|
|
4144
|
+
prevState[key]
|
|
4145
|
+
)) {
|
|
4146
|
+
changedKeys2.add(key);
|
|
4147
|
+
}
|
|
4148
|
+
}
|
|
4149
|
+
let recomputed = false;
|
|
4150
|
+
for (const [key, def] of computedDefs) {
|
|
4151
|
+
if (def.deps.some((dep) => changedKeys2.has(dep))) {
|
|
4152
|
+
const newVal = def.fn();
|
|
4153
|
+
if (!Object.is(state[key], newVal)) {
|
|
4154
|
+
state[key] = newVal;
|
|
4155
|
+
recomputed = true;
|
|
4516
4156
|
}
|
|
4517
4157
|
}
|
|
4518
4158
|
}
|
|
4519
|
-
|
|
4520
|
-
constructor(name, config2) {
|
|
4521
|
-
this[_storeName] = name;
|
|
4522
|
-
this[_storeScheduler] = config2?.scheduler || this[_storeDefScheduler]();
|
|
4523
|
-
this[_outerStore] = this[_storeProxy](true);
|
|
4524
|
-
}
|
|
4525
|
-
[_innerStore]() {
|
|
4526
|
-
return this[_storeProxy]();
|
|
4527
|
-
}
|
|
4528
|
-
get status() {
|
|
4529
|
-
return this[_storeStatus];
|
|
4530
|
-
}
|
|
4531
|
-
get storeName() {
|
|
4532
|
-
return this[_storeName];
|
|
4533
|
-
}
|
|
4534
|
-
get scheduler() {
|
|
4535
|
-
return this[_storeScheduler];
|
|
4536
|
-
}
|
|
4537
|
-
[_storeProxy](toOut = false) {
|
|
4538
|
-
const self = this;
|
|
4539
|
-
const proxy = new Proxy(self, {
|
|
4540
|
-
get(target, property) {
|
|
4541
|
-
const strProp = property;
|
|
4542
|
-
if (self[_stateKeys].includes(strProp)) {
|
|
4543
|
-
const val = self[_storeState][strProp];
|
|
4544
|
-
return toOut ? cloneData(val) : val;
|
|
4545
|
-
}
|
|
4546
|
-
return Reflect.get(target, property);
|
|
4547
|
-
},
|
|
4548
|
-
set(_target, property, val) {
|
|
4549
|
-
if (toOut) return true;
|
|
4550
|
-
const strProp = property;
|
|
4551
|
-
if (self[_computedKeys].has(strProp)) return true;
|
|
4552
|
-
if (self[_stateKeys].includes(strProp)) {
|
|
4553
|
-
self[_storeState][strProp] = val;
|
|
4554
|
-
}
|
|
4555
|
-
return true;
|
|
4556
|
-
},
|
|
4557
|
-
has(target, property) {
|
|
4558
|
-
return Reflect.has(target, property) || self[_stateKeys].includes(property);
|
|
4559
|
-
}
|
|
4560
|
-
});
|
|
4561
|
-
return proxy;
|
|
4562
|
-
}
|
|
4563
|
-
};
|
|
4564
|
-
var LarkUtils = {
|
|
4565
|
-
isLarkView(instance) {
|
|
4566
|
-
if (!isObject(instance)) return false;
|
|
4567
|
-
const updater = instance["updater"];
|
|
4568
|
-
return isObject(updater) && isFunction(updater["set"]) && isFunction(updater["digest"]);
|
|
4569
|
-
},
|
|
4570
|
-
getRender(view) {
|
|
4571
|
-
return view.updater.digest.bind(view.updater);
|
|
4572
|
-
},
|
|
4573
|
-
getDataSetter(view) {
|
|
4574
|
-
return view.updater.set.bind(view.updater);
|
|
4575
|
-
},
|
|
4576
|
-
onDestroy(view, cb) {
|
|
4577
|
-
view.on("destroy", cb);
|
|
4578
|
-
}
|
|
4579
|
-
};
|
|
4580
|
-
var getLarkAdapter = (storeName) => ({
|
|
4581
|
-
Store: LarkStore,
|
|
4582
|
-
useStore: ((view) => {
|
|
4583
|
-
const store = getStore(storeName);
|
|
4584
|
-
if (!(store instanceof LarkStore)) return {};
|
|
4585
|
-
return store[_storeBoot](view);
|
|
4586
|
-
})
|
|
4587
|
-
});
|
|
4588
|
-
var _innerObserveFlags = /* @__PURE__ */ Symbol("store-inner-observe-flags");
|
|
4589
|
-
var _boundViews = /* @__PURE__ */ Symbol("store-bound-views");
|
|
4590
|
-
var LarkStore = class extends BaseStore {
|
|
4591
|
-
[_boundViews] = /* @__PURE__ */ new Set();
|
|
4592
|
-
[_innerObserveFlags] = /* @__PURE__ */ new Set();
|
|
4593
|
-
[_storeBoot](view) {
|
|
4594
|
-
if (view && LarkUtils.isLarkView(view) && !this[_boundViews].has(view)) {
|
|
4595
|
-
this[_boundViews].add(view);
|
|
4596
|
-
LarkUtils.onDestroy(view, () => {
|
|
4597
|
-
this[_boundViews].delete(view);
|
|
4598
|
-
});
|
|
4599
|
-
}
|
|
4600
|
-
return super[_storeBoot]();
|
|
4601
|
-
}
|
|
4602
|
-
[_storeDestroy]() {
|
|
4603
|
-
this[_boundViews].clear();
|
|
4604
|
-
this[_innerObserveFlags].clear();
|
|
4605
|
-
super[_storeDestroy]();
|
|
4606
|
-
}
|
|
4607
|
-
observe(view, keys2, defCallback) {
|
|
4608
|
-
if (this[_storeStatus] !== 2 /* ACTIVE */) return noop;
|
|
4609
|
-
let observeKeys = Array.isArray(keys2) ? keys2 : [];
|
|
4610
|
-
const _view = view;
|
|
4611
|
-
const renderFn = _view ? LarkUtils.getRender(_view) : noop;
|
|
4612
|
-
const dateSetterFn = _view ? LarkUtils.getDataSetter(_view) : noop;
|
|
4613
|
-
const isInnerObserve = !view;
|
|
4614
|
-
const innerFlags = /* @__PURE__ */ new Set();
|
|
4615
|
-
const storeInnerObserveFlags = this[_innerObserveFlags];
|
|
4616
|
-
if (isFunction(keys2)) {
|
|
4617
|
-
const res = keys2();
|
|
4618
|
-
if (Array.isArray(res)) observeKeys = res;
|
|
4619
|
-
}
|
|
4620
|
-
if (keys2 === void 0 && _view && observeKeys.length === 0 && Array.isArray(this[_stateKeys])) {
|
|
4621
|
-
observeKeys = this[_stateKeys].slice();
|
|
4622
|
-
}
|
|
4623
|
-
const defSetter = (immediate, key, alias, transform) => () => {
|
|
4624
|
-
const stateVal = getDataByKey(this, key);
|
|
4625
|
-
let data = { [alias || key]: stateVal };
|
|
4626
|
-
if (transform && isFunction(transform)) {
|
|
4627
|
-
const newData = transform(stateVal);
|
|
4628
|
-
if (isObject(newData)) data = newData;
|
|
4629
|
-
}
|
|
4630
|
-
if (immediate) dateSetterFn(data);
|
|
4631
|
-
else renderFn(data);
|
|
4632
|
-
};
|
|
4633
|
-
const getList = (immediate = false) => {
|
|
4634
|
-
const list = [];
|
|
4635
|
-
for (const item of observeKeys) {
|
|
4636
|
-
if (!item) continue;
|
|
4637
|
-
const payload = typeof item === "string" ? { key: item } : item;
|
|
4638
|
-
const { cb: cbDefault = defCallback, key } = payload;
|
|
4639
|
-
let cb = cbDefault;
|
|
4640
|
-
const { alias, lazy = true, transform } = payload;
|
|
4641
|
-
if (!key) continue;
|
|
4642
|
-
const c1 = !immediate;
|
|
4643
|
-
const c2 = !cb && !!_view;
|
|
4644
|
-
const c3 = !!cb && String(lazy) === "false";
|
|
4645
|
-
if (!(c1 || c2 || c3)) continue;
|
|
4646
|
-
if (isInnerObserve && cb) {
|
|
4647
|
-
const flag = `storeInner_${key}_${observeKeys.join("-")}_${cb.toString()}`;
|
|
4648
|
-
if (!storeInnerObserveFlags.has(flag)) {
|
|
4649
|
-
storeInnerObserveFlags.add(flag);
|
|
4650
|
-
innerFlags.add(flag);
|
|
4651
|
-
}
|
|
4652
|
-
}
|
|
4653
|
-
if (c2) cb = defSetter(immediate, key, alias, transform);
|
|
4654
|
-
if (cb) list.push({ key, cb });
|
|
4655
|
-
}
|
|
4656
|
-
return list;
|
|
4657
|
-
};
|
|
4658
|
-
const trackList = getList();
|
|
4659
|
-
track({ belong: this[_storeName], trackList });
|
|
4660
|
-
if (_view) {
|
|
4661
|
-
LarkUtils.onDestroy(
|
|
4662
|
-
_view,
|
|
4663
|
-
() => clear({ belong: this[_storeName], clearList: trackList })
|
|
4664
|
-
);
|
|
4159
|
+
if (recomputed) {
|
|
4665
4160
|
}
|
|
4666
|
-
|
|
4161
|
+
};
|
|
4162
|
+
const subscribe = (listener) => {
|
|
4163
|
+
listeners.add(listener);
|
|
4667
4164
|
return () => {
|
|
4668
|
-
|
|
4669
|
-
innerFlags.forEach((flag) => storeInnerObserveFlags.delete(flag));
|
|
4165
|
+
listeners.delete(listener);
|
|
4670
4166
|
};
|
|
4671
|
-
}
|
|
4672
|
-
|
|
4673
|
-
|
|
4674
|
-
|
|
4675
|
-
|
|
4676
|
-
|
|
4677
|
-
|
|
4678
|
-
|
|
4679
|
-
}
|
|
4680
|
-
}
|
|
4681
|
-
|
|
4682
|
-
|
|
4683
|
-
|
|
4684
|
-
|
|
4685
|
-
|
|
4686
|
-
|
|
4687
|
-
|
|
4688
|
-
|
|
4689
|
-
|
|
4690
|
-
scheduler: (cb, params) => cb(params)
|
|
4691
|
-
} : config2;
|
|
4692
|
-
super(name, effectiveConfig);
|
|
4693
|
-
}
|
|
4694
|
-
[_storeCreate](body) {
|
|
4695
|
-
super[_storeCreate](body);
|
|
4696
|
-
this[_observe](() => {
|
|
4697
|
-
this.stateChangeCount += 1;
|
|
4698
|
-
});
|
|
4699
|
-
}
|
|
4700
|
-
isStateChanged() {
|
|
4701
|
-
const currCount = this.stateChangeCount;
|
|
4702
|
-
const changed = this.lastCount !== currCount;
|
|
4703
|
-
this.lastCount = currCount;
|
|
4704
|
-
return changed;
|
|
4705
|
-
}
|
|
4706
|
-
[_getLastState](handlers) {
|
|
4707
|
-
if (this.isStateChanged() || !this.lastState) {
|
|
4708
|
-
const state = this[_storeState];
|
|
4709
|
-
const immutableState = freezeData(state);
|
|
4710
|
-
this.lastState = Object.assign({}, handlers, immutableState);
|
|
4711
|
-
}
|
|
4712
|
-
return this.lastState;
|
|
4713
|
-
}
|
|
4714
|
-
[_observe](cb) {
|
|
4715
|
-
const tasks = this[_stateKeys].map((key) => ({ key, cb }));
|
|
4716
|
-
track({ belong: this[_storeName], trackList: tasks });
|
|
4717
|
-
return () => clear({ belong: this[_storeName], clearList: tasks });
|
|
4718
|
-
}
|
|
4719
|
-
};
|
|
4720
|
-
var freezeData = (target) => {
|
|
4721
|
-
const data = {};
|
|
4722
|
-
const keys2 = Object.keys(target);
|
|
4723
|
-
for (const key of keys2) {
|
|
4724
|
-
const value = target[key];
|
|
4725
|
-
if (Array.isArray(value)) {
|
|
4726
|
-
data[key] = value.map(
|
|
4727
|
-
(item) => isObject(item) ? freezeData(item) : item
|
|
4728
|
-
);
|
|
4729
|
-
} else if (isObject(value)) {
|
|
4730
|
-
data[key] = freezeData(value);
|
|
4167
|
+
};
|
|
4168
|
+
const destroy = () => {
|
|
4169
|
+
destroyed = true;
|
|
4170
|
+
listeners.clear();
|
|
4171
|
+
storeRegistry.delete(name);
|
|
4172
|
+
};
|
|
4173
|
+
const api = { getState, setState, subscribe, destroy };
|
|
4174
|
+
const body = creator(setState, getState);
|
|
4175
|
+
const initialState = {};
|
|
4176
|
+
const actions = {};
|
|
4177
|
+
for (const key of Object.keys(body)) {
|
|
4178
|
+
const val = body[key];
|
|
4179
|
+
if (isComputedMarker(val)) {
|
|
4180
|
+
computedDefs.set(key, val);
|
|
4181
|
+
computedKeys.add(key);
|
|
4182
|
+
initialState[key] = void 0;
|
|
4183
|
+
} else if (typeof val === "function") {
|
|
4184
|
+
actions[key] = val;
|
|
4185
|
+
actionKeys.add(key);
|
|
4731
4186
|
} else {
|
|
4732
|
-
|
|
4187
|
+
initialState[key] = val;
|
|
4733
4188
|
}
|
|
4734
4189
|
}
|
|
4735
|
-
|
|
4736
|
-
|
|
4737
|
-
|
|
4738
|
-
Store: NodeStore,
|
|
4739
|
-
useStore: (() => {
|
|
4740
|
-
const store = getStore(storeName);
|
|
4741
|
-
if (!(store instanceof NodeStore)) return {};
|
|
4742
|
-
return store[_storeBoot]();
|
|
4743
|
-
})
|
|
4744
|
-
});
|
|
4745
|
-
var NodeStore = class extends BaseStore {
|
|
4746
|
-
observe(key, callback, immediate = true) {
|
|
4747
|
-
const tasks = [{ key, cb: callback }];
|
|
4748
|
-
track({ belong: this[_storeName], trackList: tasks });
|
|
4749
|
-
if (immediate) run(tasks);
|
|
4750
|
-
return () => clear({ belong: this[_storeName], clearList: tasks });
|
|
4190
|
+
state = { ...initialState, ...actions };
|
|
4191
|
+
for (const [key, def] of computedDefs) {
|
|
4192
|
+
state[key] = def.fn();
|
|
4751
4193
|
}
|
|
4752
|
-
|
|
4753
|
-
|
|
4754
|
-
switch (platform) {
|
|
4755
|
-
case "react" /* React */:
|
|
4756
|
-
return getReactAdapter(storeName);
|
|
4757
|
-
case "node" /* Node */:
|
|
4758
|
-
return getNodeAdapter(storeName);
|
|
4759
|
-
case "lark" /* Lark */:
|
|
4760
|
-
default:
|
|
4761
|
-
return getLarkAdapter(storeName);
|
|
4762
|
-
}
|
|
4763
|
-
};
|
|
4764
|
-
var getPlatform = (comp) => {
|
|
4765
|
-
if (LarkUtils.isLarkView(comp)) return "lark" /* Lark */;
|
|
4766
|
-
return void 0;
|
|
4767
|
-
};
|
|
4768
|
-
var extendApis = { lazySet, shallowSet, computed };
|
|
4769
|
-
var StoreCache = /* @__PURE__ */ new Map();
|
|
4770
|
-
function defineStore(name, creator, config2) {
|
|
4771
|
-
if (StoreCache.has(name)) {
|
|
4772
|
-
name = name + "_copy";
|
|
4773
|
-
}
|
|
4774
|
-
const { platform = "lark" /* Lark */ } = config2 || {};
|
|
4775
|
-
const adapter = getAdapter(platform, name);
|
|
4776
|
-
const StoreClass = adapter.Store;
|
|
4777
|
-
const useStore = adapter.useStore;
|
|
4778
|
-
const store = new StoreClass(name, config2);
|
|
4779
|
-
const innerProxy = store[_innerStore]();
|
|
4780
|
-
const body = creator(innerProxy, extendApis);
|
|
4781
|
-
store[_storeCreate](body);
|
|
4782
|
-
Object.defineProperties(useStore, {
|
|
4783
|
-
$storeName: { value: name, configurable: true },
|
|
4784
|
-
$destroyFn: { value: () => store[_storeDestroy](), configurable: true }
|
|
4785
|
-
});
|
|
4786
|
-
if (!StoreCache.has(name)) {
|
|
4787
|
-
StoreCache.set(name, {
|
|
4788
|
-
store,
|
|
4789
|
-
creator,
|
|
4790
|
-
config: config2,
|
|
4791
|
-
useStore
|
|
4792
|
-
});
|
|
4793
|
-
}
|
|
4794
|
-
return useStore;
|
|
4194
|
+
storeRegistry.set(name, api);
|
|
4195
|
+
return api;
|
|
4795
4196
|
}
|
|
4796
|
-
function
|
|
4797
|
-
if (
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
return void 0;
|
|
4802
|
-
}
|
|
4803
|
-
function delStore(name) {
|
|
4804
|
-
if (name && StoreCache.has(name)) StoreCache.delete(name);
|
|
4805
|
-
}
|
|
4806
|
-
function getUseStore(name) {
|
|
4807
|
-
if (name && StoreCache.has(name)) {
|
|
4808
|
-
const entry = StoreCache.get(name);
|
|
4809
|
-
return entry ? entry.useStore : void 0;
|
|
4810
|
-
}
|
|
4811
|
-
return void 0;
|
|
4812
|
-
}
|
|
4813
|
-
function cloneStore(name, useStore, config2) {
|
|
4814
|
-
const oldStoreName = useStore.$storeName ?? "";
|
|
4815
|
-
const cached = StoreCache.get(oldStoreName);
|
|
4816
|
-
const oldStoreCreator = cached?.creator;
|
|
4817
|
-
const oldConfig = cached?.config || {};
|
|
4818
|
-
if (!name || !oldStoreCreator) return;
|
|
4819
|
-
const mergedConfig = { ...oldConfig, ...config2 || {} };
|
|
4820
|
-
return defineStore(
|
|
4821
|
-
name,
|
|
4822
|
-
oldStoreCreator,
|
|
4823
|
-
mergedConfig
|
|
4824
|
-
);
|
|
4197
|
+
function isLarkView(instance) {
|
|
4198
|
+
if (!instance || typeof instance !== "object") return false;
|
|
4199
|
+
const obj = instance;
|
|
4200
|
+
const updater = obj["updater"];
|
|
4201
|
+
return updater !== null && typeof updater === "object" && typeof updater["set"] === "function" && typeof updater["digest"] === "function";
|
|
4825
4202
|
}
|
|
4826
|
-
function
|
|
4827
|
-
if (
|
|
4828
|
-
const entry = StoreCache.get(name);
|
|
4829
|
-
return entry ? entry.store.status === 2 /* ACTIVE */ : false;
|
|
4830
|
-
}
|
|
4831
|
-
return false;
|
|
4832
|
-
}
|
|
4833
|
-
var cellCount = 0;
|
|
4834
|
-
function cell(data) {
|
|
4835
|
-
const linkKeys = `${LARK_GLOBAL}_${cellCount++}`;
|
|
4836
|
-
return createState(data, { belong: LARK_GLOBAL, linkKeys });
|
|
4837
|
-
}
|
|
4838
|
-
function observeCell(state, cb, immediate = true) {
|
|
4839
|
-
const linkKeys = getLinkKeys(state);
|
|
4840
|
-
if (!linkKeys) return noop;
|
|
4841
|
-
const keys2 = linkKeys.split(".");
|
|
4842
|
-
const key = keys2[keys2.length - 1];
|
|
4843
|
-
const list = [{ key, cb }];
|
|
4844
|
-
track({ belong: LARK_GLOBAL, trackList: list });
|
|
4845
|
-
if (immediate) cb();
|
|
4846
|
-
return () => clear({ belong: LARK_GLOBAL, clearList: list });
|
|
4847
|
-
}
|
|
4848
|
-
function multi(useStore) {
|
|
4849
|
-
const storeName = useStore.$storeName ?? "";
|
|
4850
|
-
const flagSym = `lark-comp-${storeName}`;
|
|
4851
|
-
const map = /* @__PURE__ */ new Map();
|
|
4852
|
-
let rootViewPath;
|
|
4853
|
-
const getFlag = (viewContext) => {
|
|
4854
|
-
const owner = viewContext.owner;
|
|
4855
|
-
const viewPath = owner?.path ?? "";
|
|
4856
|
-
const viewId = owner?.id ?? "";
|
|
4857
|
-
let flag;
|
|
4858
|
-
if (viewPath === rootViewPath) {
|
|
4859
|
-
flag = `${flagSym}-${viewId}`;
|
|
4860
|
-
} else {
|
|
4861
|
-
const initParams = owner?.viewInitParams;
|
|
4862
|
-
const candidate = initParams?.[flagSym];
|
|
4863
|
-
flag = typeof candidate === "string" ? candidate : void 0;
|
|
4864
|
-
}
|
|
4865
|
-
if (owner && isFunction(owner.mountFrame)) {
|
|
4866
|
-
const rawMountFrame = owner.mountFrame;
|
|
4867
|
-
owner.mountFrame = (frameId, viewPath2, viewInitParams = {}) => rawMountFrame.call(
|
|
4868
|
-
owner,
|
|
4869
|
-
frameId,
|
|
4870
|
-
viewPath2,
|
|
4871
|
-
Object.assign(viewInitParams, { [flagSym]: flag })
|
|
4872
|
-
);
|
|
4873
|
-
}
|
|
4874
|
-
return flag ?? "";
|
|
4203
|
+
function bindStore(view, store, selector) {
|
|
4204
|
+
if (!isLarkView(view)) return () => {
|
|
4875
4205
|
};
|
|
4876
|
-
const
|
|
4877
|
-
if (
|
|
4878
|
-
|
|
4879
|
-
|
|
4880
|
-
)
|
|
4881
|
-
|
|
4882
|
-
const tag = viewCtx[flagSym];
|
|
4883
|
-
const flag = typeof tag === "string" ? tag : "";
|
|
4884
|
-
if (map.has(flag)) return map.get(flag);
|
|
4885
|
-
const newFn = cloneStore(flag, useStore);
|
|
4886
|
-
map.set(flag, newFn);
|
|
4887
|
-
return useFn(view);
|
|
4888
|
-
});
|
|
4889
|
-
const mixinObj = {
|
|
4890
|
-
make() {
|
|
4891
|
-
if (!rootViewPath) {
|
|
4892
|
-
rootViewPath = this.owner?.path ?? "";
|
|
4206
|
+
const extract = (s) => {
|
|
4207
|
+
if (selector) return selector(s);
|
|
4208
|
+
const result = {};
|
|
4209
|
+
for (const key in s) {
|
|
4210
|
+
if (Object.prototype.hasOwnProperty.call(s, key) && typeof s[key] !== "function") {
|
|
4211
|
+
result[key] = s[key];
|
|
4893
4212
|
}
|
|
4894
|
-
this[flagSym] = getFlag(this);
|
|
4895
4213
|
}
|
|
4214
|
+
return result;
|
|
4896
4215
|
};
|
|
4897
|
-
|
|
4216
|
+
view.updater.set(extract(store.getState()));
|
|
4217
|
+
view.updater.digest();
|
|
4218
|
+
const off = store.subscribe((state) => {
|
|
4219
|
+
view.updater.set(extract(state));
|
|
4220
|
+
view.updater.digest();
|
|
4221
|
+
});
|
|
4222
|
+
view.on("destroy", off);
|
|
4223
|
+
return off;
|
|
4898
4224
|
}
|
|
4225
|
+
var defineStore = create;
|
|
4899
4226
|
|
|
4900
4227
|
// src/compiler.ts
|
|
4901
4228
|
import { parse as babelParse } from "@babel/parser";
|
|
4902
|
-
var SPLITTER2 =
|
|
4903
|
-
var VIEW_ID_PLACEHOLDER =
|
|
4229
|
+
var SPLITTER2 = String.fromCharCode(30);
|
|
4230
|
+
var VIEW_ID_PLACEHOLDER = String.fromCharCode(31);
|
|
4904
4231
|
function jsObjectToUrlParams(paramsStr) {
|
|
4905
4232
|
const trimmed = paramsStr.trim();
|
|
4906
4233
|
if (!/^[{[]/.test(trimmed) && /=/.test(trimmed)) {
|
|
@@ -4960,7 +4287,7 @@ function addLineMarkers(source) {
|
|
|
4960
4287
|
if (parts.length > 1) {
|
|
4961
4288
|
const reconstructed = parts.map((part, i) => {
|
|
4962
4289
|
if (i === 0) return part;
|
|
4963
|
-
return openTag + SPLITTER2 + ++lineNo;
|
|
4290
|
+
return openTag + SPLITTER2 + ++lineNo + part;
|
|
4964
4291
|
}).join("");
|
|
4965
4292
|
result.push(reconstructed);
|
|
4966
4293
|
} else {
|
|
@@ -5353,7 +4680,7 @@ function extractGlobalVars(source) {
|
|
|
5353
4680
|
const htmlStore = {};
|
|
5354
4681
|
let htmlIndex = 0;
|
|
5355
4682
|
let lastIndex = 0;
|
|
5356
|
-
const htmlKey =
|
|
4683
|
+
const htmlKey = String.fromCharCode(5);
|
|
5357
4684
|
template.replace(
|
|
5358
4685
|
templateCmdRegExp,
|
|
5359
4686
|
(match, operate, content, offset) => {
|
|
@@ -5657,7 +4984,6 @@ export {
|
|
|
5657
4984
|
Framework,
|
|
5658
4985
|
LARK_VIEW,
|
|
5659
4986
|
Payload,
|
|
5660
|
-
Platform,
|
|
5661
4987
|
RouterEvents as ROUTER_EVENTS,
|
|
5662
4988
|
Router,
|
|
5663
4989
|
SPLITTER,
|
|
@@ -5671,16 +4997,13 @@ export {
|
|
|
5671
4997
|
applyStyle,
|
|
5672
4998
|
applyVdomOps,
|
|
5673
4999
|
assign,
|
|
5674
|
-
|
|
5675
|
-
cloneData,
|
|
5676
|
-
cloneStore,
|
|
5000
|
+
bindStore,
|
|
5677
5001
|
compileTemplate,
|
|
5678
5002
|
computed,
|
|
5679
|
-
|
|
5003
|
+
create,
|
|
5680
5004
|
createVdomRef,
|
|
5681
5005
|
defineStore,
|
|
5682
5006
|
defineView,
|
|
5683
|
-
delStore,
|
|
5684
5007
|
encodeHTML,
|
|
5685
5008
|
encodeQ,
|
|
5686
5009
|
encodeSafe,
|
|
@@ -5692,43 +5015,34 @@ export {
|
|
|
5692
5015
|
generateId,
|
|
5693
5016
|
getAttribute,
|
|
5694
5017
|
getById,
|
|
5695
|
-
|
|
5696
|
-
getStore,
|
|
5697
|
-
getUseStore,
|
|
5018
|
+
getRouteMode,
|
|
5698
5019
|
hasOwnProperty,
|
|
5699
5020
|
installFrameVisualizerBridge,
|
|
5700
5021
|
invalidateViewClass,
|
|
5701
5022
|
isPlainObject,
|
|
5702
5023
|
isPrimitive,
|
|
5703
5024
|
isPrimitiveOrFunc,
|
|
5704
|
-
isState,
|
|
5705
|
-
isStoreActive,
|
|
5706
5025
|
keys,
|
|
5707
|
-
lazySet,
|
|
5708
5026
|
mark,
|
|
5709
5027
|
markBooted,
|
|
5710
5028
|
markRouterBooted,
|
|
5711
|
-
multi,
|
|
5712
5029
|
nextCounter,
|
|
5713
5030
|
nodeInside,
|
|
5714
5031
|
noop,
|
|
5715
5032
|
now,
|
|
5716
|
-
observeCell,
|
|
5717
5033
|
parseUri,
|
|
5718
5034
|
registerViewClass,
|
|
5719
5035
|
resetProjectsMap,
|
|
5720
5036
|
safeguard,
|
|
5721
5037
|
serializeFrameTree,
|
|
5722
5038
|
setData,
|
|
5723
|
-
shallowSet,
|
|
5724
|
-
mark2 as storeMark,
|
|
5725
|
-
unmark2 as storeUnmark,
|
|
5726
5039
|
syncCounter,
|
|
5727
5040
|
toMap,
|
|
5728
5041
|
toUri,
|
|
5729
5042
|
translateData,
|
|
5730
5043
|
unmark,
|
|
5731
5044
|
use,
|
|
5045
|
+
useUrlState,
|
|
5732
5046
|
vdomGetCompareKey,
|
|
5733
5047
|
vdomGetNode,
|
|
5734
5048
|
vdomSetAttributes,
|