datafolder 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +9 -3
  2. package/index.js +2 -3
  3. package/package.json +3 -2
  4. package/sample.js +37 -37
  5. package/scripts/airbnb.js +10 -11
  6. package/scripts/airbnb2.js +10 -11
  7. package/scripts/airbnb2_queries.js +11 -11
  8. package/scripts/airbnb_queries.js +15 -14
  9. package/scripts/downloadFile.js +29 -31
  10. package/scripts/express.js +5 -4
  11. package/scripts/fastify.js +12 -11
  12. package/scripts/flights.js +8 -8
  13. package/scripts/flights2.js +9 -9
  14. package/scripts/flights2_queries.js +19 -16
  15. package/scripts/flights_queries.js +18 -13
  16. package/src/QyAcl.js +153 -152
  17. package/src/QyAclSaver.js +16 -10
  18. package/src/QyAclSaver_Worker.js +21 -15
  19. package/src/QyAclWriter.js +23 -13
  20. package/src/QyBatch.js +298 -263
  21. package/src/QyBinWriter.js +49 -37
  22. package/src/QyCD.js +13 -14
  23. package/src/QyCache.js +177 -140
  24. package/src/QyCompressor.js +71 -45
  25. package/src/QyCompressor_Worker.js +17 -9
  26. package/src/QyDB.js +41 -12
  27. package/src/QyDefaultOptions.js +13 -10
  28. package/src/QyDir.js +89 -53
  29. package/src/QyFetch.js +27 -24
  30. package/src/QyFile.js +89 -77
  31. package/src/QyFileContentUtils.js +129 -132
  32. package/src/QyFileLogger.js +63 -41
  33. package/src/QyIndex.js +175 -197
  34. package/src/QyIndexPropTree.js +25 -25
  35. package/src/QyIntersectNode.js +34 -31
  36. package/src/QyItem.js +54 -52
  37. package/src/QyJsonSaver.js +12 -6
  38. package/src/QyKVData.js +279 -245
  39. package/src/QyKVDataCleaner.js +12 -6
  40. package/src/QyKVDataCleaner_Worker.js +77 -59
  41. package/src/QyKVDataLoader.js +67 -46
  42. package/src/QyKVDataSaver.js +15 -9
  43. package/src/QyKVDataSaver_Worker.js +83 -60
  44. package/src/QyLogFileSaver.js +12 -6
  45. package/src/QyLogFileSaver_Worker.js +24 -14
  46. package/src/QyLogger.js +51 -40
  47. package/src/QyMessageWorker.js +43 -29
  48. package/src/QyMessager.js +74 -54
  49. package/src/QyMessager_Run.js +20 -7
  50. package/src/QyMod.js +15 -11
  51. package/src/QyOpRunner.js +58 -41
  52. package/src/QyQueue.js +35 -30
  53. package/src/QySaver.js +52 -29
  54. package/src/QySnapshotCompactor.js +15 -9
  55. package/src/QySnapshotCompactor_Worker.js +131 -110
  56. package/src/QySnapshotSaver.js +15 -9
  57. package/src/QySnapshotSaver_Worker.js +125 -110
  58. package/src/QySnapshots.js +260 -241
  59. package/src/QyStructure.js +35 -27
  60. package/src/QyTrigger.js +62 -55
  61. package/src/QyUnionNode.js +54 -56
  62. package/src/QyUtils.js +170 -158
  63. package/src/QyWorker.js +34 -20
  64. package/src/hackernews.js +63 -71
  65. package/src/rpc/getFileContent.js +7 -7
  66. package/src/rpc/getSubItems.js +22 -22
  67. package/src/simulate.js +85 -80
  68. package/src/simulate2.js +77 -78
  69. package/src/soc_pokec.js +44 -32
  70. package/static/datafolderui/QyStyledElement.js +12 -12
  71. package/static/datafolderui/QyUIFolderTree.js +20 -20
  72. package/static/datafolderui/QyUIUtils.js +8 -8
  73. package/static/datafolderui/explore-tree.js +31 -31
  74. package/static/datafolderui/folder-tree.js +2 -2
  75. package/static/datafolderui/hscrpt.js +9 -17
  76. package/static/datafolderui/json-view.js +3 -5
  77. package/static/datafolderui/kv-input.js +15 -15
  78. package/static/datafolderui/list-input.js +17 -17
  79. package/static/datafolderui/main-page.js +18 -18
  80. package/static/datafolderui/num-input.js +5 -5
  81. package/static/datafolderui/querySelectorShadowRoot.js +15 -19
  82. package/static/datafolderui/resizable-input.js +18 -18
@@ -1,50 +1,58 @@
1
- let {
2
- readdir,
3
- rm,
4
- writeFile,
5
- rename
6
- } = require("node:fs/promises"), path = require("node:path"), ensureDir = require("./QyUtils.js").ensureDir;
1
+ import {
2
+ readdir as w,
3
+ rm as v,
4
+ writeFile as g,
5
+ rename as F
6
+ } from "node:fs/promises";
7
7
 
8
- async function dumpStructure(e, r) {
8
+ import {
9
+ join as x
10
+ } from "node:path";
11
+
12
+ import {
13
+ ensureDir as y
14
+ } from "./QyUtils.js";
15
+
16
+ async function P(e, r) {
9
17
  let t = {};
10
18
  for (var i of r.subdirList) {
11
19
  let e = i.name;
12
20
  for (;r.getFile(e); ) e += "_d";
13
- e = cleanName(e), t[e] = {
21
+ e = _(e), t[e] = {
14
22
  x: i,
15
23
  count: 0
16
24
  };
17
25
  }
18
- await ensureDir(e);
19
- var a, n = [], u = [];
20
- let o = {};
21
- for (a of await readdir(e, {
26
+ await y(e);
27
+ var o, a = [], s = [];
28
+ let n = {};
29
+ for (o of await w(e, {
22
30
  withFileTypes: !0
23
31
  })) {
24
- var s = a.name;
25
- a.isFile() ? n.push(s) : (u.push(s), o[s] = 1);
32
+ var u = o.name;
33
+ o.isFile() ? a.push(u) : (s.push(u), n[u] = 1);
26
34
  }
27
- var l, p, m, c, h, f = [];
28
- for (l of u) t[l] || ((p = d((p = l) + "_d") || d(p.replace(/_d$/, ""))) ? (f.push(rename(path.join(e, l), path.join(e, p))),
29
- t[p].count = 1) : f.push(rm(path.join(e, l), {
35
+ var f, l, p, m, c, h = [];
36
+ for (f of s) t[f] || ((l = d((l = f) + "_d") || d(l.replace(/_d$/, ""))) ? (h.push(F(x(e, f), x(e, l))),
37
+ t[l].count = 1) : h.push(v(x(e, f), {
30
38
  recursive: !0
31
39
  })));
32
- for (m of n) r.getFile(m) || f.push(rm(path.join(e, m)));
33
- await Promise.all(f), f.length = 0;
34
- for (c of r.fileList) f.push(writeFile(path.join(e, cleanName(c.name)), c.contentAsText, {
40
+ for (p of a) r.getFile(p) || h.push(v(x(e, p)));
41
+ await Promise.all(h), h.length = 0;
42
+ for (m of r.fileList) h.push(g(x(e, _(m.name)), m.contentAsText, {
35
43
  flush: !0
36
44
  }));
37
- for (h in await Promise.all(f), f.length = 0, t) f.push(dumpStructure(path.join(e, h), t[h].x));
45
+ for (c in await Promise.all(h), h.length = 0, t) h.push(P(x(e, c), t[c].x));
38
46
  function d(e) {
39
- return e && 0 == t[e]?.count && !o[e] ? e : void 0;
47
+ return e && 0 == t[e]?.count && !n[e] ? e : void 0;
40
48
  }
41
- await Promise.all(f);
49
+ await Promise.all(h);
42
50
  }
43
51
 
44
- function cleanName(e) {
52
+ function _(e) {
45
53
  return e.replace(/"/g, "");
46
54
  }
47
55
 
48
- Object.assign(module.exports, {
49
- dumpStructure: dumpStructure
50
- });
56
+ export {
57
+ P as dumpStructure
58
+ };
package/src/QyTrigger.js CHANGED
@@ -1,15 +1,23 @@
1
- let util = require("node:util"), {
2
- getValByNamePath,
3
- setValByNamePath
4
- } = require("./QyFileContentUtils.js"), {
5
- isEmptyObj,
6
- isMatchName,
7
- getMatchParam,
8
- arrayLast,
9
- propNameJoin
10
- } = require("./QyUtils.js"), isArray = Array.isArray;
1
+ import {
2
+ isDeepStrictEqual as p
3
+ } from "node:util";
11
4
 
12
- class QyTriggerNode {
5
+ import {
6
+ getValByNamePath as c,
7
+ setValByNamePath as u
8
+ } from "./QyFileContentUtils.js";
9
+
10
+ import {
11
+ isEmptyObj as e,
12
+ isMatchName as l,
13
+ getMatchParam as d,
14
+ arrayLast as f,
15
+ propNameJoin as N
16
+ } from "./QyUtils.js";
17
+
18
+ let v = Array.isArray;
19
+
20
+ class h {
13
21
  constructor(e, r) {
14
22
  Object.assign(this, {
15
23
  name: e,
@@ -20,27 +28,27 @@ class QyTriggerNode {
20
28
  }
21
29
  insertTrigger(e, r, t, a) {
22
30
  let i = this;
23
- for (var g of r) {
24
- isMatchName(g) && (g = "*");
25
- var s = i.children;
26
- i = s[g] || (s[g] = new QyTriggerNode(g, i));
31
+ for (var s of r) {
32
+ l(s) && (s = "*");
33
+ var o = i.children;
34
+ i = o[s] || (o[s] = new h(s, i));
27
35
  }
28
- var l = i.triggerMap, o = l[e];
29
- o ? Object.assign(o, {
36
+ var n = i.triggerMap, g = n[e];
37
+ g ? Object.assign(g, {
30
38
  triggerName: e,
31
39
  fileNamePath: r,
32
40
  propNamePathList: t,
33
41
  fun: a
34
- }) : l[e] = new QyTrigger(e, r, t, a);
42
+ }) : n[e] = new m(e, r, t, a);
35
43
  }
36
44
  removeTrigger(e, r) {
37
45
  let t = this;
38
- for (var a of r) if (isMatchName(a) && (a = "*"), !(t = t.children[a])) return !1;
46
+ for (var a of r) if (l(a) && (a = "*"), !(t = t.children[a])) return !1;
39
47
  r = t.triggerMap;
40
48
  return !!r[e] && (delete r[e], t.isEmpty && t.removeEmptyNodes(), !0);
41
49
  }
42
50
  get isEmpty() {
43
- return isEmptyObj(this.children) && isEmptyObj(this.triggerMap);
51
+ return e(this.children) && e(this.triggerMap);
44
52
  }
45
53
  removeEmptyNodes() {
46
54
  let e = this;
@@ -60,7 +68,7 @@ class QyTriggerNode {
60
68
  }
61
69
  }
62
70
 
63
- class QyTrigger {
71
+ class m {
64
72
  constructor(e, r, t, a) {
65
73
  Object.assign(this, {
66
74
  triggerName: e,
@@ -73,61 +81,60 @@ class QyTrigger {
73
81
  var t, {
74
82
  triggerName: a,
75
83
  fileNamePath: i,
76
- propNamePathList: g,
77
- fun: s
78
- } = this, l = e.fileContent;
79
- let o;
80
- for (t of g) {
81
- var n = getValByNamePath(r.oldValue, t), h = getValByNamePath(r.newValue, t);
82
- util.isDeepStrictEqual(n, h) || (n = {
83
- oldValue: n,
84
- newValue: h
85
- }, (isArray(h) || isArray(getValByNamePath(l, t))) && (n.isArrayDelta = !0),
86
- (o = o || {
84
+ propNamePathList: s,
85
+ fun: o
86
+ } = this, n = e.fileContent;
87
+ let g;
88
+ for (t of s) {
89
+ var l = c(r.oldValue, t), f = c(r.newValue, t);
90
+ p(l, f) || (l = {
91
+ oldValue: l,
92
+ newValue: f
93
+ }, (v(f) || v(c(n, t))) && (l.isArrayDelta = !0), (g = g || {
87
94
  _file: e,
88
- _fileContent: l
89
- })[propNameJoin(t)] = n, setValByNamePath(o, t, n));
95
+ _fileContent: n
96
+ })[N(t)] = l, u(g, t, l));
90
97
  }
91
- if (o) {
98
+ if (g) {
92
99
  var {
93
- namePath: m,
94
- qyCache: g
100
+ namePath: h,
101
+ qyCache: s
95
102
  } = e;
96
- for (let e = 0; e < m.length; ++e) {
97
- var y = getMatchParam(i[e]);
98
- y && (o[y] = m[e]);
103
+ for (let e = 0; e < h.length; ++e) {
104
+ var m = d(i[e]);
105
+ m && (g[m] = h[e]);
99
106
  }
100
107
  try {
101
- s && s(o), g.emit(a, o);
108
+ o && o(g), s.emit(a, g);
102
109
  } catch (e) {
103
- logger.error(`Running trigger ${a} failed:`, o, e);
110
+ logger.error(`Running trigger ${a} failed:`, g, e);
104
111
  }
105
112
  }
106
113
  }
107
114
  }
108
115
 
109
- let emptyArray = [];
116
+ let t = [];
110
117
 
111
- function _getMatchedSubItems(e, r) {
112
- return e ? isMatchName(r) ? Object.values(e) : (e = e[r]) ? [ e ] : emptyArray : emptyArray;
118
+ function y(e, r) {
119
+ return e ? l(r) ? Object.values(e) : (e = e[r]) ? [ e ] : t : t;
113
120
  }
114
121
 
115
- function updateTriggerNodes(e, a) {
122
+ function r(e, a) {
116
123
  if (0 != a.length) {
117
124
  let r = [ e ], t = [];
118
125
  for (let e = 0; e < a.length - 1; ++e) {
119
- var i, g = a[e];
120
- for (i of r) for (var s of _getMatchedSubItems(i.subdirMap, g)) i.setChildTriggerNodes(s),
121
- t.push(s);
126
+ var i, s = a[e];
127
+ for (i of r) for (var o of y(i.subdirMap, s)) i.setChildTriggerNodes(o),
128
+ t.push(o);
122
129
  if (0 == t.length) return;
123
130
  [ r, t ] = [ t, r ], t.length = 0;
124
131
  }
125
- var l, o = arrayLast(a);
126
- for (l of r) for (var n of _getMatchedSubItems(l.fileMap, o)) l.setChildTriggerNodes(n);
132
+ var n, g = f(a);
133
+ for (n of r) for (var l of y(n.fileMap, g)) n.setChildTriggerNodes(l);
127
134
  }
128
135
  }
129
136
 
130
- Object.assign(module.exports, {
131
- QyTriggerNode: QyTriggerNode,
132
- updateTriggerNodes: updateTriggerNodes
133
- });
137
+ export {
138
+ h as QyTriggerNode,
139
+ r as updateTriggerNodes
140
+ };
@@ -1,8 +1,8 @@
1
- class QueryCounter {
2
- constructor(e = 1 / 0, i = 0) {
1
+ class i {
2
+ constructor(i = 1 / 0, e = 0) {
3
3
  Object.assign(this, {
4
- limit: e,
5
- cursor: i,
4
+ limit: i,
5
+ cursor: e,
6
6
  added: 0,
7
7
  count: 0,
8
8
  encounteredMap: {}
@@ -11,95 +11,93 @@ class QueryCounter {
11
11
  get isFull() {
12
12
  return this.limit <= this.added;
13
13
  }
14
- encounterOne(e) {
14
+ encounterOne(i) {
15
15
  var {
16
- encounteredMap: i,
17
- isFull: r
16
+ encounteredMap: e,
17
+ isFull: t
18
18
  } = this;
19
- if (!r && !i[e]) return i[e] = 1, this.countOne();
19
+ if (!(t || i in e)) return e[i] = 1, this.countOne();
20
20
  }
21
21
  countOne() {
22
22
  if (this.count++ >= this.cursor) return ++this.added, !0;
23
23
  }
24
24
  }
25
25
 
26
- class QyQueryNode {
26
+ class e {
27
27
  constructor() {
28
28
  Object.assign(this, {
29
29
  fileCount: 0,
30
30
  nodeList: []
31
31
  });
32
32
  }
33
- encounterOne(e, i, r) {
34
- if (r) {
35
- if (r.encounterOne(i)) return e[i] = 1, r.isFull;
36
- } else e[i] = 1;
33
+ encounterOne(i, e, t) {
34
+ if (!t || t.encounterOne(e)) return i[e] = 1, !0;
37
35
  }
38
36
  }
39
37
 
40
- class QyUnionNode extends QyQueryNode {
41
- constructor(e) {
38
+ class o extends e {
39
+ constructor(i) {
42
40
  super(), Object.assign(this, {
43
41
  dirMap: {},
44
42
  checkedDirMap: {}
45
- }), e && this.addDir(e);
43
+ }), i && this.addDir(i);
46
44
  }
47
- containsFile(i) {
45
+ containsFile(e) {
48
46
  var {
49
- fileCount: e,
50
- dirMap: r,
51
- nodeList: t
47
+ fileCount: i,
48
+ dirMap: t,
49
+ nodeList: r
52
50
  } = this;
53
- if (0 < e) {
54
- for (var n in r) if (null != r[n].getFile(i)) return !0;
55
- for (let e = 0; e < t.length; ++e) if (t[e].containsFile(i)) return !0;
51
+ if (0 < i) {
52
+ for (var n in t) if (null != t[n].getFile(e)) return !0;
53
+ for (let i = 0; i < r.length; ++i) if (r[i].containsFile(e)) return !0;
56
54
  }
57
55
  return !1;
58
56
  }
59
- getFileMap(e) {
60
- var i, r, t, {
57
+ *getFiles(i, e = {}) {
58
+ var t, r, {
61
59
  dirMap: n,
62
- nodeList: o
63
- } = this, s = {};
64
- for (i in n) {
65
- var u, d = n[i].fileMap;
66
- for (u in d) if (d[u].created && !s[u] && this.encounterOne(s, u, e)) return s;
60
+ nodeList: s
61
+ } = this;
62
+ for (t in n) {
63
+ var o = n[t];
64
+ if (0 != o.fileCount) for (var a of o.fileNameList) if (!(a in e) && this.encounterOne(e, a, i) && (yield a,
65
+ i?.isFull)) return;
67
66
  }
68
- for (r of o) for (t in r.getFileMap()) if (!s[t] && this.encounterOne(s, t, e)) return s;
69
- return s;
67
+ for (r of s) if (yield* r.getFiles(i, e), i?.isFull) return;
70
68
  }
71
- addNode(e) {
72
- if (e) {
69
+ addNode(i) {
70
+ if (i) {
73
71
  var {
74
- dirMap: i,
75
- checkedDirMap: r,
76
- nodeList: t
72
+ dirMap: e,
73
+ checkedDirMap: t,
74
+ nodeList: r
77
75
  } = this;
78
- if (e instanceof QyUnionNode) {
79
- for (var n in e.dirMap) i[n] = e.dirMap[n];
80
- for (var o in t.push(...e.nodeList), e.checkedDirMap) r[o] = 1;
81
- } else t.push(e);
82
- this.fileCount += e.fileCount;
76
+ if (i instanceof o) {
77
+ for (var n in i.dirMap) e[n] = i.dirMap[n];
78
+ for (var s in r.push(...i.nodeList), i.checkedDirMap) t[s] = 1;
79
+ } else r.push(i);
80
+ this.fileCount += i.fileCount;
83
81
  }
84
82
  }
85
- addDir(e) {
83
+ addDir(i) {
86
84
  var {
87
- dirMap: i,
88
- checkedDirMap: r
85
+ dirMap: e,
86
+ checkedDirMap: t
89
87
  } = this, {
90
- fileCount: t,
88
+ fileCount: r,
91
89
  subdirCount: n,
92
- fullPathHash: o
93
- } = e;
94
- if (!i[o] && !r[o]) {
95
- if (0 < n) for (var s of e.subdirList) this.addDir(s);
96
- 0 < t ? (i[o] = e, this.fileCount += t) : r[o] = 1;
90
+ fullPathHash: s
91
+ } = i;
92
+ if (!(s in e || s in t)) {
93
+ if (0 < n) for (var o of i.subdirList) this.addDir(o);
94
+ 0 < r ? (e[s] = i, this.fileCount += r) : t[s] = 1;
97
95
  }
98
96
  }
99
97
  }
100
98
 
101
- Object.assign(module.exports, {
102
- QyUnionNode: QyUnionNode,
103
- QyQueryNode: QyQueryNode,
104
- QueryCounter: QueryCounter
105
- });
99
+ export {
100
+ o as QyUnionNode,
101
+ e as QyQueryNode,
102
+ i as QueryCounter
103
+ };