@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/dist/index.cjs CHANGED
@@ -31,7 +31,6 @@ __export(index_exports, {
31
31
  Framework: () => Framework,
32
32
  LARK_VIEW: () => LARK_VIEW,
33
33
  Payload: () => Payload,
34
- Platform: () => Platform,
35
34
  ROUTER_EVENTS: () => RouterEvents,
36
35
  Router: () => Router,
37
36
  SPLITTER: () => SPLITTER,
@@ -45,16 +44,13 @@ __export(index_exports, {
45
44
  applyStyle: () => applyStyle,
46
45
  applyVdomOps: () => applyVdomOps,
47
46
  assign: () => assign,
48
- cell: () => cell,
49
- cloneData: () => cloneData,
50
- cloneStore: () => cloneStore,
47
+ bindStore: () => bindStore,
51
48
  compileTemplate: () => compileTemplate,
52
49
  computed: () => computed,
53
- createState: () => createState,
50
+ create: () => create,
54
51
  createVdomRef: () => createVdomRef,
55
52
  defineStore: () => defineStore,
56
53
  defineView: () => defineView,
57
- delStore: () => delStore,
58
54
  encodeHTML: () => encodeHTML,
59
55
  encodeQ: () => encodeQ,
60
56
  encodeSafe: () => encodeSafe,
@@ -66,43 +62,34 @@ __export(index_exports, {
66
62
  generateId: () => generateId,
67
63
  getAttribute: () => getAttribute,
68
64
  getById: () => getById,
69
- getPlatform: () => getPlatform,
70
- getStore: () => getStore,
71
- getUseStore: () => getUseStore,
65
+ getRouteMode: () => getRouteMode,
72
66
  hasOwnProperty: () => hasOwnProperty,
73
67
  installFrameVisualizerBridge: () => installFrameVisualizerBridge,
74
68
  invalidateViewClass: () => invalidateViewClass,
75
69
  isPlainObject: () => isPlainObject,
76
70
  isPrimitive: () => isPrimitive,
77
71
  isPrimitiveOrFunc: () => isPrimitiveOrFunc,
78
- isState: () => isState,
79
- isStoreActive: () => isStoreActive,
80
72
  keys: () => keys,
81
- lazySet: () => lazySet,
82
73
  mark: () => mark,
83
74
  markBooted: () => markBooted,
84
75
  markRouterBooted: () => markRouterBooted,
85
- multi: () => multi,
86
76
  nextCounter: () => nextCounter,
87
77
  nodeInside: () => nodeInside,
88
78
  noop: () => noop,
89
79
  now: () => now,
90
- observeCell: () => observeCell,
91
80
  parseUri: () => parseUri,
92
81
  registerViewClass: () => registerViewClass,
93
82
  resetProjectsMap: () => resetProjectsMap,
94
83
  safeguard: () => safeguard,
95
84
  serializeFrameTree: () => serializeFrameTree,
96
85
  setData: () => setData,
97
- shallowSet: () => shallowSet,
98
- storeMark: () => mark2,
99
- storeUnmark: () => unmark2,
100
86
  syncCounter: () => syncCounter,
101
87
  toMap: () => toMap,
102
88
  toUri: () => toUri,
103
89
  translateData: () => translateData,
104
90
  unmark: () => unmark,
105
91
  use: () => use,
92
+ useUrlState: () => useUrlState,
106
93
  vdomGetCompareKey: () => vdomGetCompareKey,
107
94
  vdomGetNode: () => vdomGetNode,
108
95
  vdomSetAttributes: () => vdomSetAttributes,
@@ -115,7 +102,7 @@ module.exports = __toCommonJS(index_exports);
115
102
 
116
103
  // src/constants.ts
117
104
  var globalCounter = 0;
118
- var SPLITTER = "";
105
+ var SPLITTER = String.fromCharCode(30);
119
106
  var RouterEvents = {
120
107
  CHANGE: "change",
121
108
  CHANGED: "changed",
@@ -420,7 +407,7 @@ function safeguard(data, getter, setter, isRoot) {
420
407
  set(target, property, value) {
421
408
  if (!setter && !prefix) {
422
409
  throw new Error(
423
- "Avoid write back, key: " + prefix + property + " value:" + value + " more: https://github.com/hangtiancheng/h"
410
+ "Avoid write back, key: " + prefix + property + " value:" + value + " more: https://github.com/hangtiancheng/lark"
424
411
  );
425
412
  }
426
413
  Reflect.set(target, property, value);
@@ -882,6 +869,7 @@ var cachedDefaultPath;
882
869
  var cachedRewrite;
883
870
  var defaultTitle;
884
871
  var frameworkConfig;
872
+ var routeMode = "history";
885
873
  var beforeEachGuards = [];
886
874
  function createEmptyLocation() {
887
875
  return {
@@ -907,7 +895,8 @@ function attachViewAndPath(loc) {
907
895
  cachedRewrite = frameworkConfig.rewrite;
908
896
  }
909
897
  if (!loc.view) {
910
- let path = loc.hash["path"] || cachedDefaultPath || "/";
898
+ const rawPath = routeMode === "history" ? loc.query["path"] || loc.hash["path"] : loc.hash["path"];
899
+ let path = rawPath || cachedDefaultPath || "/";
911
900
  if (cachedRewrite) {
912
901
  path = cachedRewrite(
913
902
  path,
@@ -973,7 +962,16 @@ function getChanged(oldLoc, newLoc) {
973
962
  changedCache.set(tKey, finalResult);
974
963
  return finalResult;
975
964
  }
976
- function updateHash(path, replace) {
965
+ function updateBrowserUrl(path, replace) {
966
+ if (routeMode === "history") {
967
+ const url = path || "/";
968
+ if (replace) {
969
+ window.history.replaceState(null, "", url);
970
+ } else {
971
+ window.history.pushState(null, "", url);
972
+ }
973
+ return;
974
+ }
977
975
  const hashbang = frameworkConfig?.hashbang || "#!";
978
976
  const fullPath = path === "" ? "" : hashbang + path;
979
977
  if (replace) {
@@ -984,9 +982,10 @@ function updateHash(path, replace) {
984
982
  }
985
983
  function updateUrl(path, params, loc, replace, silentFlag, lQuery) {
986
984
  path = toUri(path, params, lQuery);
987
- if (path !== loc.srcHash) {
985
+ const currentSrc = routeMode === "history" ? loc.srcQuery : loc.srcHash;
986
+ if (path !== currentSrc) {
988
987
  silent = silentFlag ? 1 : 0;
989
- updateHash(path, replace);
988
+ updateBrowserUrl(path, replace);
990
989
  }
991
990
  }
992
991
  var Router = {
@@ -1000,10 +999,29 @@ var Router = {
1000
999
  if (cached) {
1001
1000
  return cached;
1002
1001
  }
1003
- const srcQuery = href.replace(URL_TRIM_HASH_REGEXP, "");
1004
- const srcHash = href.replace(URL_TRIM_QUERY_REGEXP, "");
1005
- const query = parseUri(srcQuery);
1006
- const hash = parseUri(srcHash);
1002
+ let srcQuery;
1003
+ let srcHash;
1004
+ let query;
1005
+ let hash;
1006
+ if (routeMode === "history") {
1007
+ try {
1008
+ const urlObj = new URL(href, window.location.origin);
1009
+ srcQuery = urlObj.pathname + urlObj.search;
1010
+ srcHash = urlObj.hash ? urlObj.hash.replace(/^#!?/, "") : "";
1011
+ query = parseUri(srcQuery);
1012
+ hash = srcHash ? parseUri(srcHash) : { path: "", params: {} };
1013
+ } catch {
1014
+ srcQuery = href.replace(URL_TRIM_HASH_REGEXP, "");
1015
+ srcHash = href.replace(URL_TRIM_QUERY_REGEXP, "");
1016
+ query = parseUri(srcQuery);
1017
+ hash = parseUri(srcHash);
1018
+ }
1019
+ } else {
1020
+ srcQuery = href.replace(URL_TRIM_HASH_REGEXP, "");
1021
+ srcHash = href.replace(URL_TRIM_QUERY_REGEXP, "");
1022
+ query = parseUri(srcQuery);
1023
+ hash = parseUri(srcHash);
1024
+ }
1007
1025
  const params = assign({}, query["params"], hash["params"]);
1008
1026
  const location = {
1009
1027
  href,
@@ -1077,7 +1095,7 @@ var Router = {
1077
1095
  }
1078
1096
  }
1079
1097
  if (tPath) {
1080
- if (!hasOwnProperty(window, "history")) {
1098
+ if (routeMode === "hash" && !hasOwnProperty(window, "history")) {
1081
1099
  for (const qKey of lQuery) {
1082
1100
  if (!hasOwnProperty(tParams, qKey)) {
1083
1101
  tParams[qKey] = "";
@@ -1129,32 +1147,41 @@ var Router = {
1129
1147
  return Router;
1130
1148
  },
1131
1149
  /**
1132
- * Internal: bind hashchange and beforeunload events.
1150
+ * Internal: bind routing events and beforeunload.
1133
1151
  * Called by Framework.boot().
1152
+ * In hash mode, listens to hashchange + popstate.
1153
+ * In history mode, listens to popstate only.
1134
1154
  */
1135
1155
  _bind() {
1136
1156
  defaultTitle = document.title;
1137
- let lastHash = Router.parse().srcHash;
1157
+ const getLocationKey = () => {
1158
+ if (routeMode === "history") {
1159
+ return window.location.pathname + window.location.search;
1160
+ }
1161
+ return Router.parse().srcHash;
1162
+ };
1163
+ let lastKey = getLocationKey();
1138
1164
  let suspend;
1139
1165
  const watchChange = () => {
1140
1166
  if (suspend) {
1141
1167
  return;
1142
1168
  }
1169
+ hrefCache.clear();
1143
1170
  const loc = Router.parse();
1144
- const newHash = loc.srcHash;
1145
- if (newHash !== lastHash) {
1171
+ const newKey = routeMode === "history" ? loc.srcQuery : loc.srcHash;
1172
+ if (newKey !== lastKey) {
1146
1173
  const changeEvent = {
1147
1174
  p: 0,
1148
1175
  reject: () => {
1149
1176
  changeEvent.p = 1;
1150
1177
  suspend = "";
1151
- updateHash(lastHash);
1178
+ updateBrowserUrl(lastKey);
1152
1179
  },
1153
1180
  resolve: () => {
1154
1181
  changeEvent.p = 1;
1155
- lastHash = newHash;
1182
+ lastKey = newKey;
1156
1183
  suspend = "";
1157
- updateHash(newHash);
1184
+ updateBrowserUrl(newKey);
1158
1185
  Router.diff();
1159
1186
  },
1160
1187
  prevent: () => {
@@ -1198,8 +1225,12 @@ var Router = {
1198
1225
  }
1199
1226
  };
1200
1227
  Router.notify = watchChange;
1201
- window.addEventListener("hashchange", watchChange);
1202
- window.addEventListener("popstate", watchChange);
1228
+ if (routeMode === "history") {
1229
+ window.addEventListener("popstate", watchChange);
1230
+ } else {
1231
+ window.addEventListener("hashchange", watchChange);
1232
+ window.addEventListener("popstate", watchChange);
1233
+ }
1203
1234
  window.addEventListener("beforeunload", (domEvent) => {
1204
1235
  const data = {};
1205
1236
  Router.fire(RouterEvents.PAGE_UNLOAD, data);
@@ -1215,11 +1246,15 @@ var Router = {
1215
1246
  */
1216
1247
  _setConfig(cfg) {
1217
1248
  frameworkConfig = cfg;
1249
+ routeMode = cfg.routeMode || "history";
1218
1250
  }
1219
1251
  };
1220
1252
  function markRouterBooted() {
1221
1253
  booted2 = true;
1222
1254
  }
1255
+ function getRouteMode() {
1256
+ return routeMode;
1257
+ }
1223
1258
 
1224
1259
  // src/event-delegator.ts
1225
1260
  var rootEvents = {};
@@ -2558,6 +2593,7 @@ function defineView(props, statics) {
2558
2593
  // src/module-loader.ts
2559
2594
  var config = {
2560
2595
  rootId: "root",
2596
+ routeMode: "history",
2561
2597
  hashbang: "#!",
2562
2598
  error: (error) => {
2563
2599
  throw error;
@@ -3669,6 +3705,23 @@ var FrameVisualBridge = {
3669
3705
  MSG_TREE_DELTA: "LARK_VIS_TREE_DELTA"
3670
3706
  };
3671
3707
  function serializeView(view) {
3708
+ const evtMap = view.eventObjectMap;
3709
+ const eventMethodKeys = evtMap ? Object.keys(evtMap) : [];
3710
+ const resourceKeys = view.resources ? Object.keys(view.resources) : [];
3711
+ const lookup = view;
3712
+ const hasAssign = typeof lookup["assign"] === "function";
3713
+ let updaterData = null;
3714
+ try {
3715
+ const ref = view.updater?.refData;
3716
+ if (ref && typeof ref === "object") {
3717
+ updaterData = {};
3718
+ for (const k of Object.keys(ref)) {
3719
+ const v = ref[k];
3720
+ updaterData[k] = v === null || typeof v !== "object" ? v : `[${typeof v}]`;
3721
+ }
3722
+ }
3723
+ } catch {
3724
+ }
3672
3725
  return {
3673
3726
  id: view.id,
3674
3727
  rendered: !!view.rendered,
@@ -3679,7 +3732,11 @@ function serializeView(view) {
3679
3732
  keys: view.locationObserved.keys,
3680
3733
  observePath: view.locationObserved.observePath
3681
3734
  },
3682
- hasTemplate: !!view.template
3735
+ hasTemplate: !!view.template,
3736
+ eventMethodKeys,
3737
+ resourceKeys,
3738
+ hasAssign,
3739
+ updaterData
3683
3740
  };
3684
3741
  }
3685
3742
  function serializeFrame(frameId) {
@@ -4118,904 +4175,161 @@ if (typeof window !== "undefined") {
4118
4175
  window.__lark_registerViewClass = registerViewClass;
4119
4176
  }
4120
4177
 
4121
- // src/store.ts
4122
- var LARK_GLOBAL = "lark-global";
4123
- var Platform = /* @__PURE__ */ ((Platform2) => {
4124
- Platform2["Lark"] = "lark";
4125
- Platform2["React"] = "react";
4126
- Platform2["Node"] = "node";
4127
- return Platform2;
4128
- })(Platform || {});
4129
- var isFunction = (val) => typeof val === "function";
4130
- var isObject = (val) => val !== null && typeof val === "object";
4131
- var isPromise = (val) => isObject(val) && isFunction(val["then"]);
4132
- var hasOwnProperty2 = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);
4133
- var hasStructuredClone = typeof globalThis !== "undefined" && typeof globalThis.structuredClone === "function";
4134
- var deepCloneFallback = (obj) => {
4135
- if (!obj || !isObject(obj)) return {};
4136
- const newData = Array.isArray(obj) ? [] : {};
4137
- for (const key in obj) {
4138
- if (hasOwnProperty2(obj, key)) {
4139
- const value = obj[key];
4140
- newData[key] = isObject(value) ? deepCloneFallback(value) : value;
4141
- }
4142
- }
4143
- return newData;
4144
- };
4145
- var deepClone = (obj) => {
4146
- if (hasStructuredClone) {
4147
- try {
4148
- return structuredClone(obj);
4149
- } catch {
4150
- return deepCloneFallback(obj);
4151
- }
4152
- }
4153
- return deepCloneFallback(obj);
4154
- };
4155
- var cloneData = (data) => isObject(data) ? deepClone(data) : data;
4156
- var getDataByKey = (target, key) => {
4157
- if (!key.includes(".")) {
4158
- return target[key];
4159
- }
4160
- let data = target;
4161
- for (const k of key.split(".")) {
4162
- if (!isObject(data)) return void 0;
4163
- data = data[k];
4164
- }
4165
- return data;
4166
- };
4167
- var Queue = class {
4168
- pendingTasks = /* @__PURE__ */ new Set();
4169
- queue = [];
4170
- flushTasks() {
4171
- const { pendingTasks, queue } = this;
4172
- const flushTickTask = () => {
4173
- while (queue.length > 0) {
4174
- const task2 = queue.shift();
4175
- if (task2) {
4176
- pendingTasks.delete(task2);
4177
- runTask(task2);
4178
- }
4179
- }
4180
- };
4181
- Promise.resolve().then(flushTickTask);
4182
- }
4183
- add(tasks) {
4184
- const isQueueEmpty = this.queue.length === 0;
4185
- for (const { cb, params } of tasks) {
4186
- addParams2Callback(cb, params);
4187
- if (!this.pendingTasks.has(cb)) {
4188
- this.queue.push(cb);
4189
- this.pendingTasks.add(cb);
4190
- }
4191
- }
4192
- if (isQueueEmpty) this.flushTasks();
4193
- }
4194
- delete(tasks) {
4195
- if (this.pendingTasks.size === 0) return;
4196
- for (const { cb } of tasks) {
4197
- if (this.pendingTasks.has(cb)) {
4198
- this.pendingTasks.delete(cb);
4199
- const index = this.queue.findIndex((item) => item === cb);
4200
- if (index !== -1) this.queue.splice(index, 1);
4201
- }
4202
- }
4203
- }
4204
- clear() {
4205
- this.queue = [];
4206
- this.pendingTasks.clear();
4207
- }
4208
- };
4209
- var addParams2Callback = (cb, params) => {
4210
- if (!cb || !params) return;
4211
- const tagged = cb;
4212
- const existing = tagged.params;
4213
- if (isObject(existing)) {
4214
- Object.assign(existing, params);
4215
- } else {
4216
- tagged.params = params;
4217
- }
4218
- };
4219
- var runTask = (cb) => {
4220
- const tagged = cb;
4221
- const params = tagged.params;
4222
- delete tagged.params;
4223
- try {
4224
- cb(params);
4225
- } catch {
4226
- }
4227
- };
4228
- var getDefScheduler = () => new Queue();
4229
- var run = (tasks, scheduler) => {
4230
- if (scheduler) {
4231
- if (isFunction(scheduler)) {
4232
- for (const { cb, params } of tasks) scheduler(cb, params);
4233
- } else {
4234
- scheduler.add(tasks);
4178
+ // src/url-state.ts
4179
+ function useUrlState(view, initialState) {
4180
+ const keys2 = initialState ? Object.keys(initialState) : [];
4181
+ if (keys2.length > 0) {
4182
+ view.observeLocation(keys2);
4183
+ }
4184
+ const getState = () => {
4185
+ const loc = Router.parse();
4186
+ const result = { ...initialState || {} };
4187
+ for (const key of keys2) {
4188
+ const val = loc.get(key);
4189
+ if (val) result[key] = val;
4235
4190
  }
4236
- } else {
4237
- for (const { cb, params } of tasks) cb(params);
4238
- }
4239
- };
4240
- var ArrMethods = {};
4241
- ["indexOf", "lastIndexOf", "includes"].forEach((key) => {
4242
- const rawMethod = Array.prototype[key];
4243
- ArrMethods[key] = function(...args) {
4244
- let res = rawMethod.apply(this, args);
4245
- if (res === -1 || res === false) {
4246
- res = rawMethod.apply(
4247
- this,
4248
- args.map(
4249
- (item) => isObject(item) ? ProxyCache.get(item) ?? item : item
4250
- )
4251
- );
4252
- }
4253
- return res;
4254
- };
4255
- });
4256
- var inArrUpdate = false;
4257
- ["unshift", "shift", "push", "pop", "splice"].forEach((key) => {
4258
- const rawMethod = Array.prototype[key];
4259
- ArrMethods[key] = function(...args) {
4260
- inArrUpdate = true;
4261
- const result = rawMethod.apply(this, args);
4262
- inArrUpdate = false;
4263
4191
  return result;
4264
4192
  };
4265
- });
4266
- function needKeepArrItem(target, newVal, key) {
4267
- if (!Array.isArray(target) || !inArrUpdate) return false;
4268
- if (!isObject(newVal)) return false;
4269
- return getLinkKeys(newVal) === createLinkKeys(target, key);
4270
- }
4271
- var defStateConfig = {
4272
- belong: LARK_GLOBAL,
4273
- linkKeys: "",
4274
- shallow: false
4275
- };
4276
- var StateConfigMap = /* @__PURE__ */ new WeakMap();
4277
- var setStateConfig = (target, config2) => {
4278
- if (target && isObject(config2)) StateConfigMap.set(target, config2);
4279
- };
4280
- function getStateConfig(target, key) {
4281
- if (!StateConfigMap.has(target)) {
4282
- return void 0;
4283
- }
4284
- const config2 = StateConfigMap.get(target);
4285
- return key ? config2?.[key] : config2;
4286
- }
4287
- var isState = (target) => isObject(target) && StateConfigMap.has(target);
4288
- var createLinkKeys = (target, property) => {
4289
- if (!hasLinkKeys(target)) return property;
4290
- if (Array.isArray(target)) return getLinkKeys(target) ?? property;
4291
- return `${getLinkKeys(target)}.${property}`;
4292
- };
4293
- var formatLinkKeys = (target, key) => {
4294
- const originKeysStr = getLinkKeys(target);
4295
- if (!originKeysStr) return null;
4296
- const linkKeys = [];
4297
- const originKeys = originKeysStr.split(".");
4298
- let pre = "";
4299
- for (const k of originKeys) {
4300
- const curr = pre ? `${pre}.${k}` : k;
4301
- linkKeys.push(curr);
4302
- pre = curr;
4303
- }
4304
- linkKeys.push(`${originKeysStr}.${key}`);
4305
- return linkKeys;
4306
- };
4307
- var getLinkKeys = (target) => getStateConfig(target, "linkKeys");
4308
- var hasLinkKeys = (target) => !!getLinkKeys(target);
4309
- var ProxyCache = /* @__PURE__ */ new WeakMap();
4310
- var keepKey = null;
4311
- var keep = (key) => {
4312
- if (keepKey) throw new Error("[lark-store] keepKey is not null");
4313
- keepKey = key;
4314
- };
4315
- var needKeep = (key) => {
4316
- if (keepKey === key) {
4317
- keepKey = null;
4318
- return true;
4319
- }
4320
- return false;
4321
- };
4322
- var canSetNewVal = (params) => {
4323
- const { property, newVal, oldVal } = params;
4324
- if (hasOwnProperty2(params.target, property) && newVal === oldVal)
4325
- return false;
4326
- return true;
4327
- };
4328
- var getNewVal = (params) => {
4329
- const { target, newVal, property, needKeepVal = false } = params;
4330
- const config2 = getStateConfig(target);
4331
- if (!isObject(newVal)) return newVal;
4332
- if (needKeepArrItem(target, newVal, property)) return newVal;
4333
- if (config2?.shallow) return newVal;
4334
- if (needKeepVal) return newVal;
4335
- const linkKeys = createLinkKeys(target, property);
4336
- const newState = createState(newVal, { ...config2, linkKeys });
4337
- if (isPromise(newVal)) handlePromise(newVal, target, property);
4338
- return newState;
4339
- };
4340
- var genPayload = (params) => {
4341
- const { target, property, newVal, oldVal } = params;
4342
- const config2 = getStateConfig(target) ?? defStateConfig;
4343
- return {
4344
- belong: config2.belong || LARK_GLOBAL,
4345
- target,
4346
- keys: formatLinkKeys(target, property) || [property],
4347
- newVal,
4348
- oldVal
4193
+ const setState = (patch) => {
4194
+ const current = getState();
4195
+ const resolved = typeof patch === "function" ? patch(current) : patch;
4196
+ Router.to(resolved);
4349
4197
  };
4350
- };
4351
- var handlePromise = (child, parent, key) => {
4352
- const childObj = child;
4353
- child.then((res) => {
4354
- const parentProxy = ProxyCache.get(parent);
4355
- if (parentProxy) {
4356
- const oldVal = parentProxy[key];
4357
- if (ProxyCache.get(childObj) === oldVal) {
4358
- parentProxy[key] = res;
4359
- }
4360
- }
4361
- }).catch((err) => {
4362
- const parentProxy = ProxyCache.get(parent);
4363
- if (parentProxy) {
4364
- const oldVal = parentProxy[key];
4365
- if (ProxyCache.get(childObj) === oldVal) {
4366
- parentProxy[key] = err;
4367
- }
4368
- }
4369
- });
4370
- };
4371
- var _deleteKey = "_delete";
4372
- var _markObjKey = "_markObj";
4373
- var mark2 = (host, key) => {
4374
- let sign;
4375
- if (!host[_deleteKey]) {
4376
- const markHost = host[_markObjKey] || (host[_markObjKey] = {});
4377
- if (!hasOwnProperty2(markHost, key)) {
4378
- markHost[key] = 0;
4379
- }
4380
- sign = ++markHost[key];
4381
- }
4382
- return () => {
4383
- const temp = host[_markObjKey];
4384
- return !!temp && sign === temp[key];
4385
- };
4386
- };
4387
- var unmark2 = (host) => {
4388
- host[_deleteKey] = 1;
4389
- host[_markObjKey] = 0;
4390
- };
4391
- function createState(initialData, config2) {
4392
- if (!isObject(initialData)) return initialData;
4393
- const mergedConfig = Object.assign({ ...defStateConfig }, config2);
4394
- const data = Array.isArray(initialData) ? [] : Object.create(Object.getPrototypeOf(initialData));
4395
- const handler = {
4396
- get(target, property, _receiver) {
4397
- if (Array.isArray(target) && property in ArrMethods) {
4398
- return ArrMethods[property];
4399
- }
4400
- return Reflect.get(target, property);
4401
- },
4402
- set(target, property, newVal, receiver) {
4403
- const strProp = property;
4404
- const oldVal = Reflect.get(target, property);
4405
- const preventTrigger = isLazySet(strProp);
4406
- const needKeepVal = needKeep(strProp);
4407
- const canSet = canSetNewVal({
4408
- target,
4409
- property: strProp,
4410
- newVal,
4411
- oldVal
4412
- });
4413
- if (!canSet) return true;
4414
- const proxyTarget = isObject(receiver) && receiver !== null ? receiver : state;
4415
- newVal = getNewVal({
4416
- target: proxyTarget,
4417
- property: strProp,
4418
- newVal,
4419
- needKeepVal
4420
- });
4421
- Reflect.set(target, property, newVal, receiver);
4422
- if (preventTrigger) return true;
4423
- const payload = genPayload({
4424
- target: proxyTarget,
4425
- property: strProp,
4426
- newVal,
4427
- oldVal
4428
- });
4429
- trigger(payload);
4430
- return true;
4431
- },
4432
- deleteProperty(target, property) {
4433
- const strProp = property;
4434
- if (!hasOwnProperty2(target, strProp)) return true;
4435
- const oldVal = Reflect.get(target, property);
4436
- Reflect.deleteProperty(target, property);
4437
- const payload = genPayload({
4438
- target: state,
4439
- property: strProp,
4440
- newVal: null,
4441
- oldVal
4442
- });
4443
- trigger(payload);
4444
- return true;
4445
- }
4446
- };
4447
- const state = new Proxy(data, handler);
4448
- ProxyCache.set(initialData, state);
4449
- setStateConfig(state, mergedConfig);
4450
- lazySet(state, initialData);
4451
- return state;
4452
- }
4453
- var curLazySetKey = null;
4454
- function lazySet(target, data) {
4455
- if (isObject(data)) {
4456
- Reflect.ownKeys(data).forEach((key) => {
4457
- const strKey = key;
4458
- if (curLazySetKey) throw new Error("[lark-store] lazy set key conflict");
4459
- curLazySetKey = strKey;
4460
- target[strKey] = data[strKey];
4461
- });
4462
- }
4463
- }
4464
- function isLazySet(property) {
4465
- if (curLazySetKey === property) {
4466
- curLazySetKey = "";
4467
- return true;
4468
- }
4469
- return false;
4470
- }
4471
- function shallowSet(target, key, data) {
4472
- if (!isState(target))
4473
- throw new Error("[lark-store] shallowSet only supports state objects");
4474
- if (!isObject(data)) return target[key] = data;
4475
- keep(key);
4476
- const config2 = getStateConfig(target);
4477
- const linkKeys = createLinkKeys(target, key);
4478
- target[key] = createState(data, { ...config2, linkKeys, shallow: true });
4479
- return target[key];
4198
+ return [getState(), setState];
4480
4199
  }
4481
- var GlobalDeps = /* @__PURE__ */ new Map();
4482
- function track(payload) {
4483
- const { belong, trackList = [] } = payload;
4484
- let deps = GlobalDeps.get(belong);
4485
- if (!deps) GlobalDeps.set(belong, deps = /* @__PURE__ */ new Map());
4486
- for (const { key, cb } of trackList) {
4487
- if (isFunction(cb)) {
4488
- let callbacks = deps.get(key);
4489
- if (!callbacks) deps.set(key, callbacks = /* @__PURE__ */ new Set());
4490
- callbacks.add(cb);
4491
- }
4492
- }
4493
- }
4494
- function trigger(payload) {
4495
- const { belong, keys: keys2 } = payload;
4496
- const store = getStore(belong);
4497
- if (store && store.status !== 2 /* ACTIVE */ && belong !== LARK_GLOBAL)
4498
- return;
4499
- const deps = GlobalDeps.get(belong);
4500
- if (!deps) return;
4501
- const tasks = /* @__PURE__ */ new Set();
4502
- for (const key of keys2) {
4503
- const callbacks = deps.get(key);
4504
- if (callbacks) {
4505
- for (const cb of callbacks) {
4506
- tasks.add({ cb, params: { [key]: true } });
4507
- }
4508
- }
4509
- }
4510
- if (tasks.size === 0) return;
4511
- const scheduler = store?.scheduler;
4512
- run(Array.from(tasks), scheduler);
4200
+
4201
+ // src/store.ts
4202
+ var COMPUTED_BRAND = /* @__PURE__ */ Symbol("lark-store-computed");
4203
+ function isComputedMarker(val) {
4204
+ return val !== null && typeof val === "object" && val[COMPUTED_BRAND] === true;
4513
4205
  }
4514
- function clear(payload) {
4515
- if (!payload) {
4516
- GlobalDeps.clear();
4517
- return;
4518
- }
4519
- const { belong, clearList } = payload;
4520
- const deps = GlobalDeps.get(belong);
4521
- if (!deps) return;
4522
- const store = getStore(belong);
4523
- const scheduler = store?.scheduler;
4524
- if (clearList) {
4525
- for (const { key, cb } of clearList) {
4526
- const callbacks = deps.get(key);
4527
- if (callbacks) {
4528
- if (!cb) {
4529
- deps.delete(key);
4530
- } else if (callbacks.has(cb)) {
4531
- callbacks.delete(cb);
4532
- if (scheduler && !isFunction(scheduler)) {
4533
- scheduler.delete([{ cb }]);
4534
- }
4535
- if (callbacks.size === 0) deps.delete(key);
4206
+ function computed(deps, fn) {
4207
+ return { [COMPUTED_BRAND]: true, deps, fn };
4208
+ }
4209
+ var storeRegistry = /* @__PURE__ */ new Map();
4210
+ function create(name, creator) {
4211
+ const listeners = /* @__PURE__ */ new Set();
4212
+ const computedDefs = /* @__PURE__ */ new Map();
4213
+ const computedKeys = /* @__PURE__ */ new Set();
4214
+ const actionKeys = /* @__PURE__ */ new Set();
4215
+ let state;
4216
+ let destroyed = false;
4217
+ const getState = () => state;
4218
+ const setState = (partial) => {
4219
+ if (destroyed) return;
4220
+ const prevState = state;
4221
+ const resolved = typeof partial === "function" ? partial(prevState) : partial;
4222
+ const nextState = { ...prevState };
4223
+ let changed = false;
4224
+ for (const key in resolved) {
4225
+ if (Object.prototype.hasOwnProperty.call(resolved, key) && !computedKeys.has(key) && !actionKeys.has(key)) {
4226
+ const newVal = resolved[key];
4227
+ if (!Object.is(prevState[key], newVal)) {
4228
+ nextState[key] = newVal;
4229
+ changed = true;
4536
4230
  }
4537
4231
  }
4538
4232
  }
4539
- } else {
4540
- deps.clear();
4541
- GlobalDeps.delete(belong);
4542
- if (scheduler && !isFunction(scheduler)) {
4543
- scheduler.clear();
4233
+ if (!changed) return;
4234
+ state = nextState;
4235
+ recomputeIfNeeded(prevState);
4236
+ for (const listener of listeners) {
4237
+ listener(state, prevState);
4544
4238
  }
4545
- }
4546
- }
4547
- var _storeName = /* @__PURE__ */ Symbol("store-name");
4548
- var _storeStatus = /* @__PURE__ */ Symbol("store-status");
4549
- var _storeScheduler = /* @__PURE__ */ Symbol("store-scheduler");
4550
- var _storeCreate = /* @__PURE__ */ Symbol("fn:store-create");
4551
- var _storeBoot = /* @__PURE__ */ Symbol("fn:store-boot");
4552
- var _storeDestroy = /* @__PURE__ */ Symbol("fn:store-destroy");
4553
- var _innerStore = /* @__PURE__ */ Symbol("inner-store");
4554
- var _outerStore = /* @__PURE__ */ Symbol("outer-store");
4555
- var _originState = /* @__PURE__ */ Symbol("origin-state");
4556
- var _stateKeys = /* @__PURE__ */ Symbol("state-keys");
4557
- var _storeState = /* @__PURE__ */ Symbol("store-state");
4558
- var _storeDefScheduler = /* @__PURE__ */ Symbol("store-def-scheduler");
4559
- var _storeProxy = /* @__PURE__ */ Symbol("fn:store-proxy");
4560
- var _computedKeys = /* @__PURE__ */ Symbol("store-computed-keys");
4561
- var COMPUTED_BRAND = /* @__PURE__ */ Symbol("store-computed-brand");
4562
- function computed(deps, fn) {
4563
- const marker = {
4564
- [COMPUTED_BRAND]: true,
4565
- deps,
4566
- fn
4567
4239
  };
4568
- return marker;
4569
- }
4570
- function isComputedMarker(val) {
4571
- return isObject(val) && val[COMPUTED_BRAND] === true;
4572
- }
4573
- var BaseStore = class {
4574
- [_storeStatus] = 0 /* BEFORE_CREATE */;
4575
- [_computedKeys] = /* @__PURE__ */ new Set();
4576
- [_storeDefScheduler] = getDefScheduler;
4577
- [_storeBoot]() {
4578
- this[_storeStatus] = 2 /* ACTIVE */;
4579
- return this[_storeProxy](true);
4580
- }
4581
- [_storeDestroy]() {
4582
- clear({ belong: this[_storeName] });
4583
- this[_storeState] = createState(this[_originState], {
4584
- belong: this[_storeName]
4585
- });
4586
- this[_storeStatus] = 3 /* DESTROYED */;
4587
- }
4588
- /**
4589
- *
4590
- * @param body - The object returned by the creator function
4591
- * @param excludeFns - Function keys to exclude from handlers (e.g. ['observe'])
4592
- */
4593
- [_storeCreate](body, excludeFns = ["observe"]) {
4594
- this[_storeStatus] = 1 /* CREATED */;
4595
- if (isObject(body)) {
4596
- const state = {};
4597
- const handlers = {};
4598
- const computedDefs = {};
4599
- const computedKeys = this[_computedKeys];
4600
- Reflect.ownKeys(body).forEach((key) => {
4601
- const strKey = key;
4602
- const val = body[strKey];
4603
- if (isComputedMarker(val)) {
4604
- computedDefs[strKey] = val;
4605
- state[strKey] = void 0;
4606
- computedKeys.add(strKey);
4607
- } else if (isFunction(val)) {
4608
- if (!excludeFns.includes(strKey)) handlers[strKey] = val;
4609
- } else {
4610
- state[strKey] = val;
4611
- }
4612
- });
4613
- Object.assign(this, handlers);
4614
- this[_originState] = cloneData(state);
4615
- this[_stateKeys] = Object.keys(state);
4616
- this[_storeState] = createState(state, { belong: this[_storeName] });
4617
- if (Object.keys(computedDefs).length > 0) {
4618
- const belong = this[_storeName];
4619
- const storeState = this[_storeState];
4620
- for (const key of Object.keys(computedDefs)) {
4621
- const def = computedDefs[key];
4622
- const recompute = () => {
4623
- storeState[key] = def.fn();
4624
- };
4625
- recompute();
4626
- const trackList = def.deps.map((depKey) => ({
4627
- key: depKey,
4628
- cb: recompute
4629
- }));
4630
- if (trackList.length > 0) track({ belong, trackList });
4240
+ const recomputeIfNeeded = (prevState) => {
4241
+ if (computedDefs.size === 0) return;
4242
+ const changedKeys2 = /* @__PURE__ */ new Set();
4243
+ for (const key of Object.keys(state)) {
4244
+ if (!Object.is(
4245
+ state[key],
4246
+ prevState[key]
4247
+ )) {
4248
+ changedKeys2.add(key);
4249
+ }
4250
+ }
4251
+ let recomputed = false;
4252
+ for (const [key, def] of computedDefs) {
4253
+ if (def.deps.some((dep) => changedKeys2.has(dep))) {
4254
+ const newVal = def.fn();
4255
+ if (!Object.is(state[key], newVal)) {
4256
+ state[key] = newVal;
4257
+ recomputed = true;
4631
4258
  }
4632
4259
  }
4633
4260
  }
4634
- }
4635
- constructor(name, config2) {
4636
- this[_storeName] = name;
4637
- this[_storeScheduler] = config2?.scheduler || this[_storeDefScheduler]();
4638
- this[_outerStore] = this[_storeProxy](true);
4639
- }
4640
- [_innerStore]() {
4641
- return this[_storeProxy]();
4642
- }
4643
- get status() {
4644
- return this[_storeStatus];
4645
- }
4646
- get storeName() {
4647
- return this[_storeName];
4648
- }
4649
- get scheduler() {
4650
- return this[_storeScheduler];
4651
- }
4652
- [_storeProxy](toOut = false) {
4653
- const self = this;
4654
- const proxy = new Proxy(self, {
4655
- get(target, property) {
4656
- const strProp = property;
4657
- if (self[_stateKeys].includes(strProp)) {
4658
- const val = self[_storeState][strProp];
4659
- return toOut ? cloneData(val) : val;
4660
- }
4661
- return Reflect.get(target, property);
4662
- },
4663
- set(_target, property, val) {
4664
- if (toOut) return true;
4665
- const strProp = property;
4666
- if (self[_computedKeys].has(strProp)) return true;
4667
- if (self[_stateKeys].includes(strProp)) {
4668
- self[_storeState][strProp] = val;
4669
- }
4670
- return true;
4671
- },
4672
- has(target, property) {
4673
- return Reflect.has(target, property) || self[_stateKeys].includes(property);
4674
- }
4675
- });
4676
- return proxy;
4677
- }
4678
- };
4679
- var LarkUtils = {
4680
- isLarkView(instance) {
4681
- if (!isObject(instance)) return false;
4682
- const updater = instance["updater"];
4683
- return isObject(updater) && isFunction(updater["set"]) && isFunction(updater["digest"]);
4684
- },
4685
- getRender(view) {
4686
- return view.updater.digest.bind(view.updater);
4687
- },
4688
- getDataSetter(view) {
4689
- return view.updater.set.bind(view.updater);
4690
- },
4691
- onDestroy(view, cb) {
4692
- view.on("destroy", cb);
4693
- }
4694
- };
4695
- var getLarkAdapter = (storeName) => ({
4696
- Store: LarkStore,
4697
- useStore: ((view) => {
4698
- const store = getStore(storeName);
4699
- if (!(store instanceof LarkStore)) return {};
4700
- return store[_storeBoot](view);
4701
- })
4702
- });
4703
- var _innerObserveFlags = /* @__PURE__ */ Symbol("store-inner-observe-flags");
4704
- var _boundViews = /* @__PURE__ */ Symbol("store-bound-views");
4705
- var LarkStore = class extends BaseStore {
4706
- [_boundViews] = /* @__PURE__ */ new Set();
4707
- [_innerObserveFlags] = /* @__PURE__ */ new Set();
4708
- [_storeBoot](view) {
4709
- if (view && LarkUtils.isLarkView(view) && !this[_boundViews].has(view)) {
4710
- this[_boundViews].add(view);
4711
- LarkUtils.onDestroy(view, () => {
4712
- this[_boundViews].delete(view);
4713
- });
4714
- }
4715
- return super[_storeBoot]();
4716
- }
4717
- [_storeDestroy]() {
4718
- this[_boundViews].clear();
4719
- this[_innerObserveFlags].clear();
4720
- super[_storeDestroy]();
4721
- }
4722
- observe(view, keys2, defCallback) {
4723
- if (this[_storeStatus] !== 2 /* ACTIVE */) return noop;
4724
- let observeKeys = Array.isArray(keys2) ? keys2 : [];
4725
- const _view = view;
4726
- const renderFn = _view ? LarkUtils.getRender(_view) : noop;
4727
- const dateSetterFn = _view ? LarkUtils.getDataSetter(_view) : noop;
4728
- const isInnerObserve = !view;
4729
- const innerFlags = /* @__PURE__ */ new Set();
4730
- const storeInnerObserveFlags = this[_innerObserveFlags];
4731
- if (isFunction(keys2)) {
4732
- const res = keys2();
4733
- if (Array.isArray(res)) observeKeys = res;
4734
- }
4735
- if (keys2 === void 0 && _view && observeKeys.length === 0 && Array.isArray(this[_stateKeys])) {
4736
- observeKeys = this[_stateKeys].slice();
4737
- }
4738
- const defSetter = (immediate, key, alias, transform) => () => {
4739
- const stateVal = getDataByKey(this, key);
4740
- let data = { [alias || key]: stateVal };
4741
- if (transform && isFunction(transform)) {
4742
- const newData = transform(stateVal);
4743
- if (isObject(newData)) data = newData;
4744
- }
4745
- if (immediate) dateSetterFn(data);
4746
- else renderFn(data);
4747
- };
4748
- const getList = (immediate = false) => {
4749
- const list = [];
4750
- for (const item of observeKeys) {
4751
- if (!item) continue;
4752
- const payload = typeof item === "string" ? { key: item } : item;
4753
- const { cb: cbDefault = defCallback, key } = payload;
4754
- let cb = cbDefault;
4755
- const { alias, lazy = true, transform } = payload;
4756
- if (!key) continue;
4757
- const c1 = !immediate;
4758
- const c2 = !cb && !!_view;
4759
- const c3 = !!cb && String(lazy) === "false";
4760
- if (!(c1 || c2 || c3)) continue;
4761
- if (isInnerObserve && cb) {
4762
- const flag = `storeInner_${key}_${observeKeys.join("-")}_${cb.toString()}`;
4763
- if (!storeInnerObserveFlags.has(flag)) {
4764
- storeInnerObserveFlags.add(flag);
4765
- innerFlags.add(flag);
4766
- }
4767
- }
4768
- if (c2) cb = defSetter(immediate, key, alias, transform);
4769
- if (cb) list.push({ key, cb });
4770
- }
4771
- return list;
4772
- };
4773
- const trackList = getList();
4774
- track({ belong: this[_storeName], trackList });
4775
- if (_view) {
4776
- LarkUtils.onDestroy(
4777
- _view,
4778
- () => clear({ belong: this[_storeName], clearList: trackList })
4779
- );
4261
+ if (recomputed) {
4780
4262
  }
4781
- if (!isInnerObserve) run(getList(true));
4263
+ };
4264
+ const subscribe = (listener) => {
4265
+ listeners.add(listener);
4782
4266
  return () => {
4783
- clear({ belong: this[_storeName], clearList: trackList });
4784
- innerFlags.forEach((flag) => storeInnerObserveFlags.delete(flag));
4267
+ listeners.delete(listener);
4785
4268
  };
4786
- }
4787
- };
4788
- var getReactAdapter = (storeName) => ({
4789
- Store: ReactStore,
4790
- useStore: (() => {
4791
- const store = getStore(storeName);
4792
- if (!(store instanceof ReactStore)) return {};
4793
- return store[_storeBoot]();
4794
- })
4795
- });
4796
- var _observe = /* @__PURE__ */ Symbol("store-observe");
4797
- var _getLastState = /* @__PURE__ */ Symbol("store-get-last-state");
4798
- var ReactStore = class extends BaseStore {
4799
- stateChangeCount = 0;
4800
- lastCount = 0;
4801
- lastState = null;
4802
- constructor(name, config2) {
4803
- const effectiveConfig = config2 && !config2.scheduler ? {
4804
- ...config2,
4805
- scheduler: (cb, params) => cb(params)
4806
- } : config2;
4807
- super(name, effectiveConfig);
4808
- }
4809
- [_storeCreate](body) {
4810
- super[_storeCreate](body);
4811
- this[_observe](() => {
4812
- this.stateChangeCount += 1;
4813
- });
4814
- }
4815
- isStateChanged() {
4816
- const currCount = this.stateChangeCount;
4817
- const changed = this.lastCount !== currCount;
4818
- this.lastCount = currCount;
4819
- return changed;
4820
- }
4821
- [_getLastState](handlers) {
4822
- if (this.isStateChanged() || !this.lastState) {
4823
- const state = this[_storeState];
4824
- const immutableState = freezeData(state);
4825
- this.lastState = Object.assign({}, handlers, immutableState);
4826
- }
4827
- return this.lastState;
4828
- }
4829
- [_observe](cb) {
4830
- const tasks = this[_stateKeys].map((key) => ({ key, cb }));
4831
- track({ belong: this[_storeName], trackList: tasks });
4832
- return () => clear({ belong: this[_storeName], clearList: tasks });
4833
- }
4834
- };
4835
- var freezeData = (target) => {
4836
- const data = {};
4837
- const keys2 = Object.keys(target);
4838
- for (const key of keys2) {
4839
- const value = target[key];
4840
- if (Array.isArray(value)) {
4841
- data[key] = value.map(
4842
- (item) => isObject(item) ? freezeData(item) : item
4843
- );
4844
- } else if (isObject(value)) {
4845
- data[key] = freezeData(value);
4269
+ };
4270
+ const destroy = () => {
4271
+ destroyed = true;
4272
+ listeners.clear();
4273
+ storeRegistry.delete(name);
4274
+ };
4275
+ const api = { getState, setState, subscribe, destroy };
4276
+ const body = creator(setState, getState);
4277
+ const initialState = {};
4278
+ const actions = {};
4279
+ for (const key of Object.keys(body)) {
4280
+ const val = body[key];
4281
+ if (isComputedMarker(val)) {
4282
+ computedDefs.set(key, val);
4283
+ computedKeys.add(key);
4284
+ initialState[key] = void 0;
4285
+ } else if (typeof val === "function") {
4286
+ actions[key] = val;
4287
+ actionKeys.add(key);
4846
4288
  } else {
4847
- data[key] = value;
4289
+ initialState[key] = val;
4848
4290
  }
4849
4291
  }
4850
- return data;
4851
- };
4852
- var getNodeAdapter = (storeName) => ({
4853
- Store: NodeStore,
4854
- useStore: (() => {
4855
- const store = getStore(storeName);
4856
- if (!(store instanceof NodeStore)) return {};
4857
- return store[_storeBoot]();
4858
- })
4859
- });
4860
- var NodeStore = class extends BaseStore {
4861
- observe(key, callback, immediate = true) {
4862
- const tasks = [{ key, cb: callback }];
4863
- track({ belong: this[_storeName], trackList: tasks });
4864
- if (immediate) run(tasks);
4865
- return () => clear({ belong: this[_storeName], clearList: tasks });
4292
+ state = { ...initialState, ...actions };
4293
+ for (const [key, def] of computedDefs) {
4294
+ state[key] = def.fn();
4866
4295
  }
4867
- };
4868
- var getAdapter = (platform, storeName) => {
4869
- switch (platform) {
4870
- case "react" /* React */:
4871
- return getReactAdapter(storeName);
4872
- case "node" /* Node */:
4873
- return getNodeAdapter(storeName);
4874
- case "lark" /* Lark */:
4875
- default:
4876
- return getLarkAdapter(storeName);
4877
- }
4878
- };
4879
- var getPlatform = (comp) => {
4880
- if (LarkUtils.isLarkView(comp)) return "lark" /* Lark */;
4881
- return void 0;
4882
- };
4883
- var extendApis = { lazySet, shallowSet, computed };
4884
- var StoreCache = /* @__PURE__ */ new Map();
4885
- function defineStore(name, creator, config2) {
4886
- if (StoreCache.has(name)) {
4887
- name = name + "_copy";
4888
- }
4889
- const { platform = "lark" /* Lark */ } = config2 || {};
4890
- const adapter = getAdapter(platform, name);
4891
- const StoreClass = adapter.Store;
4892
- const useStore = adapter.useStore;
4893
- const store = new StoreClass(name, config2);
4894
- const innerProxy = store[_innerStore]();
4895
- const body = creator(innerProxy, extendApis);
4896
- store[_storeCreate](body);
4897
- Object.defineProperties(useStore, {
4898
- $storeName: { value: name, configurable: true },
4899
- $destroyFn: { value: () => store[_storeDestroy](), configurable: true }
4900
- });
4901
- if (!StoreCache.has(name)) {
4902
- StoreCache.set(name, {
4903
- store,
4904
- creator,
4905
- config: config2,
4906
- useStore
4907
- });
4908
- }
4909
- return useStore;
4296
+ storeRegistry.set(name, api);
4297
+ return api;
4910
4298
  }
4911
- function getStore(name) {
4912
- if (name && StoreCache.has(name)) {
4913
- const entry = StoreCache.get(name);
4914
- return entry ? entry.store : void 0;
4915
- }
4916
- return void 0;
4917
- }
4918
- function delStore(name) {
4919
- if (name && StoreCache.has(name)) StoreCache.delete(name);
4920
- }
4921
- function getUseStore(name) {
4922
- if (name && StoreCache.has(name)) {
4923
- const entry = StoreCache.get(name);
4924
- return entry ? entry.useStore : void 0;
4925
- }
4926
- return void 0;
4927
- }
4928
- function cloneStore(name, useStore, config2) {
4929
- const oldStoreName = useStore.$storeName ?? "";
4930
- const cached = StoreCache.get(oldStoreName);
4931
- const oldStoreCreator = cached?.creator;
4932
- const oldConfig = cached?.config || {};
4933
- if (!name || !oldStoreCreator) return;
4934
- const mergedConfig = { ...oldConfig, ...config2 || {} };
4935
- return defineStore(
4936
- name,
4937
- oldStoreCreator,
4938
- mergedConfig
4939
- );
4299
+ function isLarkView(instance) {
4300
+ if (!instance || typeof instance !== "object") return false;
4301
+ const obj = instance;
4302
+ const updater = obj["updater"];
4303
+ return updater !== null && typeof updater === "object" && typeof updater["set"] === "function" && typeof updater["digest"] === "function";
4940
4304
  }
4941
- function isStoreActive(name) {
4942
- if (name && StoreCache.has(name)) {
4943
- const entry = StoreCache.get(name);
4944
- return entry ? entry.store.status === 2 /* ACTIVE */ : false;
4945
- }
4946
- return false;
4947
- }
4948
- var cellCount = 0;
4949
- function cell(data) {
4950
- const linkKeys = `${LARK_GLOBAL}_${cellCount++}`;
4951
- return createState(data, { belong: LARK_GLOBAL, linkKeys });
4952
- }
4953
- function observeCell(state, cb, immediate = true) {
4954
- const linkKeys = getLinkKeys(state);
4955
- if (!linkKeys) return noop;
4956
- const keys2 = linkKeys.split(".");
4957
- const key = keys2[keys2.length - 1];
4958
- const list = [{ key, cb }];
4959
- track({ belong: LARK_GLOBAL, trackList: list });
4960
- if (immediate) cb();
4961
- return () => clear({ belong: LARK_GLOBAL, clearList: list });
4962
- }
4963
- function multi(useStore) {
4964
- const storeName = useStore.$storeName ?? "";
4965
- const flagSym = `lark-comp-${storeName}`;
4966
- const map = /* @__PURE__ */ new Map();
4967
- let rootViewPath;
4968
- const getFlag = (viewContext) => {
4969
- const owner = viewContext.owner;
4970
- const viewPath = owner?.path ?? "";
4971
- const viewId = owner?.id ?? "";
4972
- let flag;
4973
- if (viewPath === rootViewPath) {
4974
- flag = `${flagSym}-${viewId}`;
4975
- } else {
4976
- const initParams = owner?.viewInitParams;
4977
- const candidate = initParams?.[flagSym];
4978
- flag = typeof candidate === "string" ? candidate : void 0;
4979
- }
4980
- if (owner && isFunction(owner.mountFrame)) {
4981
- const rawMountFrame = owner.mountFrame;
4982
- owner.mountFrame = (frameId, viewPath2, viewInitParams = {}) => rawMountFrame.call(
4983
- owner,
4984
- frameId,
4985
- viewPath2,
4986
- Object.assign(viewInitParams, { [flagSym]: flag })
4987
- );
4988
- }
4989
- return flag ?? "";
4305
+ function bindStore(view, store, selector) {
4306
+ if (!isLarkView(view)) return () => {
4990
4307
  };
4991
- const useFn = ((view) => {
4992
- if (!view)
4993
- throw new Error(
4994
- "[@lark.js/mvc error] multi: cannot find the view instance"
4995
- );
4996
- const viewCtx = view;
4997
- const tag = viewCtx[flagSym];
4998
- const flag = typeof tag === "string" ? tag : "";
4999
- if (map.has(flag)) return map.get(flag);
5000
- const newFn = cloneStore(flag, useStore);
5001
- map.set(flag, newFn);
5002
- return useFn(view);
5003
- });
5004
- const mixinObj = {
5005
- make() {
5006
- if (!rootViewPath) {
5007
- rootViewPath = this.owner?.path ?? "";
4308
+ const extract = (s) => {
4309
+ if (selector) return selector(s);
4310
+ const result = {};
4311
+ for (const key in s) {
4312
+ if (Object.prototype.hasOwnProperty.call(s, key) && typeof s[key] !== "function") {
4313
+ result[key] = s[key];
5008
4314
  }
5009
- this[flagSym] = getFlag(this);
5010
4315
  }
4316
+ return result;
5011
4317
  };
5012
- return [useFn, mixinObj];
4318
+ view.updater.set(extract(store.getState()));
4319
+ view.updater.digest();
4320
+ const off = store.subscribe((state) => {
4321
+ view.updater.set(extract(state));
4322
+ view.updater.digest();
4323
+ });
4324
+ view.on("destroy", off);
4325
+ return off;
5013
4326
  }
4327
+ var defineStore = create;
5014
4328
 
5015
4329
  // src/compiler.ts
5016
4330
  var import_parser = require("@babel/parser");
5017
- var SPLITTER2 = "";
5018
- var VIEW_ID_PLACEHOLDER = "";
4331
+ var SPLITTER2 = String.fromCharCode(30);
4332
+ var VIEW_ID_PLACEHOLDER = String.fromCharCode(31);
5019
4333
  function jsObjectToUrlParams(paramsStr) {
5020
4334
  const trimmed = paramsStr.trim();
5021
4335
  if (!/^[{[]/.test(trimmed) && /=/.test(trimmed)) {
@@ -5075,7 +4389,7 @@ function addLineMarkers(source) {
5075
4389
  if (parts.length > 1) {
5076
4390
  const reconstructed = parts.map((part, i) => {
5077
4391
  if (i === 0) return part;
5078
- return openTag + SPLITTER2 + ++lineNo;
4392
+ return openTag + SPLITTER2 + ++lineNo + part;
5079
4393
  }).join("");
5080
4394
  result.push(reconstructed);
5081
4395
  } else {
@@ -5468,7 +4782,7 @@ function extractGlobalVars(source) {
5468
4782
  const htmlStore = {};
5469
4783
  let htmlIndex = 0;
5470
4784
  let lastIndex = 0;
5471
- const htmlKey = "";
4785
+ const htmlKey = String.fromCharCode(5);
5472
4786
  template.replace(
5473
4787
  templateCmdRegExp,
5474
4788
  (match, operate, content, offset) => {
@@ -5773,7 +5087,6 @@ var BUILTIN_GLOBAL_SET = new Set(Object.keys(BUILTIN_GLOBALS));
5773
5087
  Framework,
5774
5088
  LARK_VIEW,
5775
5089
  Payload,
5776
- Platform,
5777
5090
  ROUTER_EVENTS,
5778
5091
  Router,
5779
5092
  SPLITTER,
@@ -5787,16 +5100,13 @@ var BUILTIN_GLOBAL_SET = new Set(Object.keys(BUILTIN_GLOBALS));
5787
5100
  applyStyle,
5788
5101
  applyVdomOps,
5789
5102
  assign,
5790
- cell,
5791
- cloneData,
5792
- cloneStore,
5103
+ bindStore,
5793
5104
  compileTemplate,
5794
5105
  computed,
5795
- createState,
5106
+ create,
5796
5107
  createVdomRef,
5797
5108
  defineStore,
5798
5109
  defineView,
5799
- delStore,
5800
5110
  encodeHTML,
5801
5111
  encodeQ,
5802
5112
  encodeSafe,
@@ -5808,43 +5118,34 @@ var BUILTIN_GLOBAL_SET = new Set(Object.keys(BUILTIN_GLOBALS));
5808
5118
  generateId,
5809
5119
  getAttribute,
5810
5120
  getById,
5811
- getPlatform,
5812
- getStore,
5813
- getUseStore,
5121
+ getRouteMode,
5814
5122
  hasOwnProperty,
5815
5123
  installFrameVisualizerBridge,
5816
5124
  invalidateViewClass,
5817
5125
  isPlainObject,
5818
5126
  isPrimitive,
5819
5127
  isPrimitiveOrFunc,
5820
- isState,
5821
- isStoreActive,
5822
5128
  keys,
5823
- lazySet,
5824
5129
  mark,
5825
5130
  markBooted,
5826
5131
  markRouterBooted,
5827
- multi,
5828
5132
  nextCounter,
5829
5133
  nodeInside,
5830
5134
  noop,
5831
5135
  now,
5832
- observeCell,
5833
5136
  parseUri,
5834
5137
  registerViewClass,
5835
5138
  resetProjectsMap,
5836
5139
  safeguard,
5837
5140
  serializeFrameTree,
5838
5141
  setData,
5839
- shallowSet,
5840
- storeMark,
5841
- storeUnmark,
5842
5142
  syncCounter,
5843
5143
  toMap,
5844
5144
  toUri,
5845
5145
  translateData,
5846
5146
  unmark,
5847
5147
  use,
5148
+ useUrlState,
5848
5149
  vdomGetCompareKey,
5849
5150
  vdomGetNode,
5850
5151
  vdomSetAttributes,