datafolder 1.0.5 → 1.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.
Files changed (70) hide show
  1. package/README.md +4 -1
  2. package/data/sampleDataFolder/qykv/history/acl/1_acl.txt +1 -0
  3. package/data/sampleDataFolder/qykv/history/acl/2_acl.txt +1 -0
  4. package/data/sampleDataFolder/qykv/history/acl/3_acl.txt +1 -0
  5. package/data/sampleDataFolder/qykv/history/acl/4_acl.txt +1 -0
  6. package/data/sampleDataFolder/qykv/history/acl/5_acl.txt +1 -0
  7. package/data/sampleDataFolder/qykv/snapshot/1/1_pM.txt +0 -0
  8. package/data/sampleDataFolder/qykv/snapshot/1/1_prefixPM.txt +0 -0
  9. package/data/sampleDataFolder/qykv/snapshot/1/1_vL.txt +10 -0
  10. package/data/sampleDataFolder/qykv/snapshot/2/1_pM.txt +0 -0
  11. package/data/sampleDataFolder/qykv/snapshot/2/1_prefixPM.txt +0 -0
  12. package/data/sampleDataFolder/qykv/snapshot/2/1_vL.txt +1 -0
  13. package/data/sampleDataFolder/qykv/snapshot/3/1_pM.txt +0 -0
  14. package/data/sampleDataFolder/qykv/snapshot/3/1_prefixPM.txt +0 -0
  15. package/data/sampleDataFolder/qykv/snapshot/3/1_vL.txt +1 -0
  16. package/data/sampleDataFolder/qykv/snapshot/4/1_pM.txt +0 -0
  17. package/data/sampleDataFolder/qykv/snapshot/4/1_prefixPM.txt +0 -0
  18. package/data/sampleDataFolder/qykv/snapshot/4/1_vL.txt +1 -0
  19. package/data/sampleDataFolder/qykv/snapshot/4/2_pM.txt +0 -0
  20. package/data/sampleDataFolder/qykv/snapshot/4/2_prefixPM.txt +0 -0
  21. package/data/sampleDataFolder/qykv/snapshot/4/2_vL.txt +9 -0
  22. package/data/sampleDataFolder/qykv/snapshot/5/1_pM.txt +0 -0
  23. package/data/sampleDataFolder/qykv/snapshot/5/1_prefixPM.txt +0 -0
  24. package/data/sampleDataFolder/qykv/snapshot/5/1_vL.txt +55 -0
  25. package/data/sampleDataFolder/qykv/snapshot/info/1.json +1 -0
  26. package/data/sampleDataFolder/qykv/snapshot/info/2.json +1 -0
  27. package/data/sampleDataFolder/qykv/snapshot/info/3.json +1 -0
  28. package/data/sampleDataFolder/qykv/snapshot/info/4.json +1 -0
  29. package/data/sampleDataFolder/qykv/snapshot/info/5.json +1 -0
  30. package/data/sampleDataFolder/qylog/2026/02/15/08/change.txt +58 -0
  31. package/data/sampleDataFolder/qylog/2026/02/15/08/stderr.txt +11 -0
  32. package/data/sampleDataFolder/qylog/2026/02/15/08/stdout.txt +36 -0
  33. package/package.json +1 -1
  34. package/sample.js +19 -19
  35. package/src/QyAcl.js +44 -44
  36. package/src/QyAclSaver_Worker.js +2 -2
  37. package/src/QyAclWriter.js +1 -1
  38. package/src/QyBatch.js +1 -3
  39. package/src/QyBinWriter.js +65 -66
  40. package/src/QyCD.js +63 -27
  41. package/src/QyCache.js +33 -33
  42. package/src/QyDB.js +4 -30
  43. package/src/QyDefaultOptions.js +2 -1
  44. package/src/QyFetch.js +4 -22
  45. package/src/QyFileLogger.js +2 -2
  46. package/src/QyKVData.js +159 -183
  47. package/src/QyKVDataCleaner_Worker.js +15 -14
  48. package/src/QyKVDataSaver_Worker.js +16 -16
  49. package/src/QyLogFileSaver.js +1 -1
  50. package/src/QyLogFileSaver_Worker.js +2 -2
  51. package/src/QyMod.js +7 -7
  52. package/src/QyOpRunner.js +19 -16
  53. package/src/QySnapshotCompactor_Worker.js +37 -36
  54. package/src/QySnapshotSaver_Worker.js +2 -2
  55. package/src/QySnapshots.js +141 -139
  56. package/src/QyUnionNode.js +2 -2
  57. package/src/rpc/evalCode.js +4 -4
  58. package/src/rpc/getFileContent.js +4 -4
  59. package/src/rpc/getSubItems.js +12 -12
  60. package/src/rpc/queryFiles.js +1 -1
  61. package/static/codemirror.bundle/editor.bundle.js +27906 -0
  62. package/static/datafolderui/QyUIFolderTree.js +121 -145
  63. package/static/datafolderui/QyUIUtils.js +9 -4
  64. package/static/datafolderui/code-mirror.js +35 -0
  65. package/static/datafolderui/display-tree.js +52 -86
  66. package/static/datafolderui/explore-tree.js +66 -81
  67. package/static/datafolderui/index.css +7 -0
  68. package/static/datafolderui/index.html +1 -0
  69. package/static/datafolderui/main-page.js +34 -55
  70. package/static/datafolderui/query-editor.js +178 -198
@@ -1,234 +1,214 @@
1
1
  import {
2
- w2popup
2
+ w2popup as o
3
3
  } from "../w2ui/src/w2compat.js";
4
4
 
5
5
  import {
6
- h
6
+ h as n
7
7
  } from "./hscrpt.js";
8
8
 
9
9
  import {
10
- rpc
10
+ rpc as i
11
11
  } from "./QyUIUtils.js";
12
12
 
13
- import {} from "./list-input.js";
14
-
15
- import {} from "./kv-input.js";
16
-
17
13
  import {
18
- setWidth
14
+ setWidth as s
19
15
  } from "./QyUIUtils.js";
20
16
 
21
- import {} from "./display-tree.js";
17
+ import "./display-tree.js";
18
+
19
+ let a = "localStorage_queryFun_map", u = new Event("run");
20
+
21
+ async function l(t, e) {
22
+ var {
23
+ queryId: r,
24
+ displayTree: o
25
+ } = t, {
26
+ tree: e,
27
+ count: n,
28
+ error: s
29
+ } = (++t.queryId, await i("evalCode", e));
30
+ r + 1 == t.queryId && (s ? o.showMsg(s) : o.showTree(e, n));
31
+ }
32
+
33
+ function c(s) {
34
+ return s.body = n("div", {
35
+ classList: "container-fluid",
36
+ style: "margin-top:1px;"
37
+ }, [ s.codemirror = n("code-mirror", {
38
+ changeCallback: t => {
39
+ var e = s, {
40
+ titleSet: r,
41
+ funName: o,
42
+ queryFunctions: n
43
+ } = e;
44
+ r && t.docChanged && (r = t.state.doc.toString(), t = e.textChanged = r != n[o],
45
+ p(b(r) + (t ? "*" : "")));
46
+ }
47
+ }) ]);
48
+ }
49
+
50
+ function d(t, e) {
51
+ var {
52
+ queryInput: r,
53
+ codemirror: o,
54
+ queryFunctions: n
55
+ } = t, n = n[t.funName = e] ?? "";
56
+ r.value = n, t.titleSet = !1, o.text = n, p(e), o.clearHistory(), Object.assign(t, {
57
+ titleSet: !0,
58
+ textChanged: !1
59
+ });
60
+ }
61
+
62
+ function p(t) {
63
+ var e = document.querySelector("#w2ui-popup .w2ui-popup-title");
64
+ e && (e.innerText = t);
65
+ }
66
+
67
+ function m(t, e) {
68
+ var {
69
+ dropDownUL: r,
70
+ dropdownItemMap: o
71
+ } = t;
72
+ e in o || (o = o[e] = n("li", [ n("span", {
73
+ classList: "dropdown-item",
74
+ style: "cursor:pointer;",
75
+ onclick: () => d(t, e)
76
+ }, [ e ]) ]), r.append(o));
77
+ }
22
78
 
23
- import {} from "./num-input.js";
79
+ function g(t) {
80
+ localStorage.setItem(a, JSON.stringify(t));
81
+ }
24
82
 
25
- let historyQueryList = [ {
26
- folder: [ '"flights"', '"*"', 1, "(x) => x >= 5 && x <= 7" ],
27
- value: {
28
- $or: '[{ _from: "airports/BIS" }, { _to: "airports/BIS" }]'
29
- },
30
- view: [ '"**"' ]
31
- }, {
32
- folder: [ '"flights"', '"*"', 1, "(x) => x >= 1 && x <= 7" ],
33
- value: {
34
- $or: '[{ _from: "airports/BIS" }, { _to: "airports/BIS" }]'
35
- },
36
- view: [ '"Distance"' ]
37
- }, {
38
- folder: [ '"airbnb"', '"Loft"', '"Entire home/apt"', '"Real Bed"' ],
39
- value: {
40
- address: '{ street: "Porto, Porto, Portugal" }'
41
- },
42
- view: [ '"name"' ],
43
- limit: 9,
44
- cursor: 9
45
- } ], eventRun = new Event("run");
83
+ function y(t) {
84
+ var {
85
+ queryFunctions: e,
86
+ codemirror: r,
87
+ textChanged: o
88
+ } = t;
89
+ o && (o = r.text, o) && (m(t, r = b(o)), e[r] = o, g(e), d(t, r));
90
+ }
91
+
92
+ function f(t) {
93
+ var e, r, o, {
94
+ queryFunctions: n,
95
+ codemirror: s
96
+ } = t, s = s.text;
97
+ s && (s = b(s), r = s, (o = (e = (e = t).dropdownItemMap)[r]) && (o.remove(),
98
+ delete e[r]), delete n[s], g(n), d(t, Object.keys(n)[0]));
99
+ }
100
+
101
+ function b(t) {
102
+ t = /^\s*function\s+(\w+)\(/.exec(t);
103
+ return t ? t[1] : void 0;
104
+ }
46
105
 
47
106
  customElements.define("query-editor", class extends HTMLElement {
48
107
  constructor() {
49
108
  super();
50
109
  }
51
110
  compose() {
52
- this.append(this._createEditor(), h("div", {
111
+ var t = this, e = {
112
+ getFlightsByDate: `function getFlightsByDate() {
113
+ return dataFolder.queryTree(["flights", "*", 1, (x) => x >= 5 && x <= 7], {
114
+ $or: [{ _from: "airports/BIS" }, { _to: "airports/BIS" }],
115
+ });
116
+ }`,
117
+ getFlightDistances: `function getFlightDistances() {
118
+ return dataFolder.queryTree(
119
+ ["flights", "*", 1, (x) => x >= 1 && x <= 7],
120
+ {
121
+ $or: [{ _from: "airports/BIS" }, { _to: "airports/BIS" }],
122
+ },
123
+ ["Distance"],
124
+ );
125
+ }
126
+ `,
127
+ getHotels: `function getHotels() {
128
+ return dataFolder.queryTree(
129
+ ["airbnb", "Loft", "Entire home/apt", "Real Bed"],
130
+ {
131
+ address: { street: "Porto, Porto, Portugal" },
132
+ },
133
+ ["name"],
134
+ 9,
135
+ 9,
136
+ );
137
+ }`
138
+ }, r = localStorage.getItem(a);
139
+ r && Object.assign(e, JSON.parse(r)), Object.assign(t, {
140
+ queryFunctions: e,
141
+ queryId: 0,
142
+ funName: "getFlightsByDate",
143
+ dropdownItemMap: {}
144
+ }), this.append(n("div", {
53
145
  classList: "btn-toolbar",
54
146
  role: "toolbar",
55
147
  style: {
56
148
  "border-bottom": "1px solid #e4e4e4"
57
149
  }
58
- }, [ this._createDropDownButton(), this._createQueryInput(), this._createEditButton(), this._createRunButton(), this._createSaveButton() ]), this._createDisplayTree()),
59
- this._createBody(), Object.assign(this, {
60
- queryId: 0
61
- });
62
- }
63
- onSizeChange() {
64
- setWidth(this.queryInput, this.editButton.parentElement.offsetLeft - this.queryInput.parentElement.offsetLeft),
65
- this.displayTree.onSizeChange();
66
- }
67
- get queryText() {
68
- var {
69
- folderList: t,
70
- matchKVList: e,
71
- viewList: r,
72
- limitInput: s,
73
- cursorInput: i
74
- } = this;
75
- return `{folder:${t.text},value:${e.text},view:${r.text} ${s.text} ${i.text}}`;
76
- }
77
- _createDisplayTree() {
78
- return h("div", [ this.displayTree = h("display-tree") ]);
79
- }
80
- _createSaveButton() {
81
- return h("div", {
82
- classList: "btn-group btn-group-sm me-2",
83
- role: "group"
84
- }, [ h("button", {
85
- classList: "btn btn-primary",
86
- type: "button",
87
- onclick: () => {
88
- console.log("Save");
89
- }
90
- }, [ "Save" ]) ]);
91
- }
92
- _createEditButton() {
93
- return h("div", {
94
- classList: "btn-group btn-group-sm me-2",
95
- role: "group"
96
- }, [ this.editButton = h("button", {
97
- classList: "btn btn-primary",
98
- type: "button",
99
- onclick: () => this._toggleEditor()
100
- }, [ "Edit" ]) ]);
101
- }
102
- _createRunButton() {
103
- return h("div", {
104
- classList: "btn-group btn-group-sm me-2",
105
- role: "group"
106
- }, [ h("button", {
107
- classList: "btn btn-primary",
108
- type: "button",
109
- onclick: () => this._queryFiles()
110
- }, [ "Run" ]) ]);
111
- }
112
- _createQueryInput() {
113
- return h("div", {
150
+ }, [ (t => {
151
+ var e, r = t.dropDownUL = n("ul", {
152
+ classList: "dropdown-menu"
153
+ }), o = t;
154
+ for (e in o.queryFunctions) m(o, e);
155
+ return n("div", {
156
+ classList: "btn-group btn-grou-sm"
157
+ }, [ n("button", {
158
+ classList: "btn btn-success dropdown-toggle",
159
+ type: "button",
160
+ "data-bs-toggle": "dropdown"
161
+ }, [ n("i", {
162
+ classList: "bi bi-clock"
163
+ }) ]), r ]);
164
+ })(r = this), (t => n("div", {
114
165
  classList: "input-group me-auto"
115
- }, [ this.queryInput = h("input", {
166
+ }, [ t.queryInput = n("input", {
116
167
  id: "queryInput",
117
168
  type: "text",
118
169
  classList: "form-control",
119
170
  attrs: {
120
171
  readonly: !0
121
172
  }
122
- }) ]);
123
- }
124
- _createEditor() {
125
- return h("textarea", {
126
- style: "height:50px;width:100%"
127
- });
128
- }
129
- _createDropDownButton() {
130
- return h("div", {
131
- classList: "btn-group btn-grou-sm"
132
- }, [ h("button", {
133
- classList: "btn btn-success dropdown-toggle",
134
- type: "button",
135
- "data-bs-toggle": "dropdown"
136
- }, [ h("i", {
137
- classList: "bi bi-clock"
138
- }) ]), h("ul", {
139
- classList: "dropdown-menu"
140
- }, this._createHistoryDropDownList()) ]);
141
- }
142
- _createHistoryDropDownList() {
143
- return historyQueryList.map(t => h("li", [ h("span", {
144
- classList: "dropdown-item",
145
- style: "cursor:pointer;",
146
- onclick: () => this._setQueryFromHistory(t)
147
- }, [ JSON.stringify(t) ]) ]));
148
- }
149
- async _queryFiles() {
150
- let {
151
- queryText,
152
- queryId,
153
- displayTree
154
- } = this;
155
- try {
156
- eval("((x)=>x)(" + queryText + ")");
157
- } catch (exception) {
158
- return void displayTree.showMsg(exception.message);
159
- }
160
- ++this.queryId;
161
- let {
162
- tree,
163
- count
164
- } = await rpc("queryFiles", queryText);
165
- queryId + 1 == this.queryId && displayTree.showTree(tree, count);
166
- }
167
- _toggleEditor() {
168
- "closed" == w2popup.status ? w2popup.open({
169
- title: "Edit Query",
170
- body: this._getPopupBody(),
171
- blockPage: !1,
172
- resizable: !0,
173
- width: 700,
174
- height: 290,
175
- actions: {
176
- Run: () => {
177
- this.dispatchEvent(eventRun), this._queryFiles();
178
- },
179
- Save: () => {}
180
- }
181
- }) : w2popup.close();
182
- }
183
- _createBody() {
184
- var {
185
- folder: t,
186
- value: e,
187
- view: r
188
- } = historyQueryList[0], s = this.body = h("div", {
189
- classList: "container-fluid"
190
- }), i = {
191
- input: () => this._updateQueryText()
192
- }, t = h("list-input", {
193
- label: "folder",
194
- on: i
195
- }).set(t), e = h("kv-input", {
196
- label: "value",
197
- on: i
198
- }).set(e), r = h("list-input", {
199
- label: "view",
200
- on: i
201
- }).set(r), i = h("div", {
202
- classList: "row align-items-center p-1"
203
- }, [ this.limitInput = h("num-input", {
204
- label: "limit",
205
- on: i
206
- }), this.cursorInput = h("num-input", {
207
- label: "cursor",
208
- on: i
209
- }) ]);
210
- return s.append(t, e, r, i), Object.assign(this, {
211
- folderList: t,
212
- matchKVList: e,
213
- viewList: r
214
- }), this._updateQueryText(), s;
173
+ }) ]))(r), ...(r => {
174
+ var t = [ [ "Edit", () => {
175
+ var t, e = r;
176
+ "closed" == o.status ? (t = {
177
+ Run: () => {
178
+ e.dispatchEvent(u), l(e, e.codemirror.text);
179
+ },
180
+ Save: () => y(e),
181
+ Delete: () => f(e)
182
+ }, o.open({
183
+ title: e.funName,
184
+ body: (t => t.body || c(t))(e),
185
+ blockPage: !1,
186
+ resizable: !0,
187
+ width: 800,
188
+ height: 400,
189
+ actions: t
190
+ })) : o.close();
191
+ } ], [ "Run", () => l(r, r.queryInput.value) ], [ "Save", () => y(r) ], [ "Delete", () => f(r) ] ].map(([ t, e ]) => n("div", {
192
+ classList: "btn-group btn-group-sm me-2",
193
+ role: "group"
194
+ }, [ n("button", {
195
+ classList: "btn btn-primary",
196
+ type: "button",
197
+ onclick: e
198
+ }, [ t ]) ]));
199
+ return r.firstButton = t[0], t.map(t => n("div", {
200
+ classList: "btn-group btn-group-sm me-2",
201
+ role: "group"
202
+ }, [ t ]));
203
+ })(r) ]), n("div", [ this.displayTree = n("display-tree") ])), c(this),
204
+ d(this, this.funName);
215
205
  }
216
- _getPopupBody() {
217
- return this.body || this._createBody();
218
- }
219
- _updateQueryText() {
220
- this.queryInput.value = this.queryText;
221
- }
222
- _setQueryFromHistory(t) {
206
+ onSizeChange() {
223
207
  var {
224
- folderList: e,
225
- matchKVList: r,
226
- viewList: s
227
- } = this, {
228
- folder: t,
229
- value: i,
230
- view: o
231
- } = t;
232
- e.set(t), r.set(i), s.set(o), this._updateQueryText();
208
+ queryInput: t,
209
+ firstButton: e,
210
+ displayTree: r
211
+ } = this;
212
+ s(t, e.parentElement.offsetLeft - t.parentElement.offsetLeft), r.onSizeChange();
233
213
  }
234
214
  });