datafolder 1.0.14 → 1.0.16

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 (43) hide show
  1. package/README.md +4 -0
  2. package/package.json +3 -2
  3. package/src/QyAcl.d.ts +4 -4
  4. package/src/QyAcl.js +92 -93
  5. package/src/QyAclSaver_Worker.d.ts +2 -2
  6. package/src/QyAclWriter.d.ts +3 -2
  7. package/src/QyAclWriter.js +14 -5
  8. package/src/QyBatch.js +0 -2
  9. package/src/QyBinWriter.js +0 -2
  10. package/src/QyCD.d.ts +1 -1
  11. package/src/QyCache.d.ts +1 -1
  12. package/src/QyCache.js +25 -23
  13. package/src/QyDefaultOptions.js +3 -2
  14. package/src/QyExpire.js +1 -3
  15. package/src/QyFileLogger.js +6 -7
  16. package/src/QyItem.js +1 -1
  17. package/src/QyKVData.d.ts +2 -2
  18. package/src/QyKVData.js +2 -2
  19. package/src/QyKVDataCleaner_Worker.js +49 -49
  20. package/src/QyKVDataLoader.d.ts +1 -1
  21. package/src/QyKVDataLoader.js +18 -18
  22. package/src/QyKVDataSaver_Worker.d.ts +2 -2
  23. package/src/QyKVDataSaver_Worker.js +5 -14
  24. package/src/QyMessageWorker.js +24 -25
  25. package/src/QyMessager.d.ts +3 -3
  26. package/src/QyMessager.js +29 -29
  27. package/src/QyMod.d.ts +1 -1
  28. package/src/QyMod.js +6 -6
  29. package/src/QyOpRunner.d.ts +1 -1
  30. package/src/QyOpRunner.js +3 -2
  31. package/src/QyQueue.d.ts +1 -1
  32. package/src/QyQueue.js +5 -5
  33. package/src/QySaver.d.ts +1 -1
  34. package/src/QySaver.js +1 -1
  35. package/src/QySnapshotCompactor_Worker.js +5 -5
  36. package/src/QySnapshotSaver_Worker.d.ts +1 -1
  37. package/src/QySnapshotSaver_Worker.js +2 -2
  38. package/src/QySnapshots.d.ts +1 -1
  39. package/src/QySnapshots.js +6 -6
  40. package/src/QyUnionNode.d.ts +1 -1
  41. package/src/QyUnionNode.js +1 -1
  42. package/static/codemirror.bundle/editor.bundle.js +155 -87
  43. package/test/testQyGraphQL.js +198 -0
@@ -0,0 +1,198 @@
1
+ import test from "node:test";
2
+ import { deepEqual } from "node:assert/strict";
3
+ import { QyDB } from "../src/QyDB.js";
4
+ import { logger } from "../src/QyLogger.js";
5
+ logger.level = "warn";
6
+ const graphQLData = {
7
+ Characters: {
8
+ luke: {
9
+ type: "Human",
10
+ id: "1000",
11
+ name: "Luke Skywalker",
12
+ friends: ["1002", "1003", "2000", "2001"],
13
+ appearsIn: [4, 5, 6],
14
+ homePlanet: "Tatooine",
15
+ },
16
+ vader: {
17
+ type: "Human",
18
+ id: "1001",
19
+ name: "Darth Vader",
20
+ friends: ["1004"],
21
+ appearsIn: [4, 5, 6],
22
+ homePlanet: "Tatooine",
23
+ },
24
+ han: {
25
+ type: "Human",
26
+ id: "1002",
27
+ name: "Han Solo",
28
+ friends: ["1000", "1003", "2001"],
29
+ appearsIn: [4, 5, 6],
30
+ },
31
+ leia: {
32
+ type: "Human",
33
+ id: "1003",
34
+ name: "Leia Organa",
35
+ friends: ["1000", "1002", "2000", "2001"],
36
+ appearsIn: [4, 5, 6],
37
+ homePlanet: "Alderaan",
38
+ },
39
+ tarkin: {
40
+ type: "Human",
41
+ id: "1004",
42
+ name: "Wilhuff Tarkin",
43
+ friends: ["1001"],
44
+ appearsIn: [4],
45
+ },
46
+ threepio: {
47
+ type: "Droid",
48
+ id: "2000",
49
+ name: "C-3PO",
50
+ friends: ["1000", "1002", "1003", "2001"],
51
+ appearsIn: [4, 5, 6],
52
+ primaryFunction: "Protocol",
53
+ },
54
+ artoo: {
55
+ type: "Droid",
56
+ id: "2001",
57
+ name: "R2-D2",
58
+ friends: ["1000", "1002", "1003"],
59
+ appearsIn: [4, 5],
60
+ primaryFunction: "Astromech",
61
+ },
62
+ },
63
+ };
64
+ function insertData(qyDB) {
65
+ const { batch } = qyDB;
66
+ const { Characters } = graphQLData;
67
+ for (const key in Characters) {
68
+ const character = Characters[key];
69
+ const { id } = character;
70
+ batch.put(["Characters", id], character);
71
+ }
72
+ batch.run();
73
+ }
74
+ function query1(qyDB) {
75
+ deepEqual(qyDB.queryFiles("Characters", { friends: { $or: ["1000", "1004"] } }).map((x) => x.view(["id", "name"])), [
76
+ { id: "1002", name: "Han Solo" },
77
+ { id: "1003", name: "Leia Organa" },
78
+ { id: "2000", name: "C-3PO" },
79
+ { id: "2001", name: "R2-D2" },
80
+ { id: "1001", name: "Darth Vader" },
81
+ ]);
82
+ deepEqual(qyDB.queryFiles("Characters", { friends: { $and: ["1002", "2001"] } }).map((x) => x.view(["id", "name"])), [
83
+ { id: "1000", name: "Luke Skywalker" },
84
+ { id: "1003", name: "Leia Organa" },
85
+ { id: "2000", name: "C-3PO" },
86
+ ]);
87
+ deepEqual(qyDB.queryFiles("Characters", { friends: ["1002", "2001"] }).map((x) => x.view(["id", "name"])), [
88
+ { id: "1000", name: "Luke Skywalker" },
89
+ { id: "1003", name: "Leia Organa" },
90
+ { id: "2000", name: "C-3PO" },
91
+ ]);
92
+ }
93
+ function query2(qyDB) {
94
+ deepEqual(qyDB.queryFiles("Characters", { friends: { $or: ["1000"] } }).map((x) => x.view(["id", "name"])), [
95
+ { id: "1002", name: "Han Solo" },
96
+ { id: "1003", name: "Leia Organa" },
97
+ { id: "2000", name: "C-3PO" },
98
+ { id: "2001", name: "R2-D2" },
99
+ ]);
100
+ deepEqual(qyDB.queryFiles("Characters", { friends: { $or: ["1002", "1003"] } }).map((x) => x.view(["id", "name"])), [
101
+ { id: "1000", name: "Luke Skywalker" },
102
+ { id: "1003", name: "Leia Organa" },
103
+ { id: "2000", name: "C-3PO" },
104
+ { id: "2001", name: "R2-D2" },
105
+ { id: "1002", name: "Han Solo" },
106
+ ]);
107
+ deepEqual(qyDB
108
+ .queryFiles("Characters", {
109
+ friends: { $link: "Characters", $spec: { friends: { $link: "Characters", $spec: { friends: "1003" } } } },
110
+ })
111
+ .map((x) => x.view(["id", "name"])), [
112
+ { id: "1002", name: "Han Solo" },
113
+ { id: "1003", name: "Leia Organa" },
114
+ { id: "2000", name: "C-3PO" },
115
+ { id: "2001", name: "R2-D2" },
116
+ { id: "1000", name: "Luke Skywalker" },
117
+ ]);
118
+ deepEqual(qyDB
119
+ .queryFiles("Characters", {
120
+ friends: { $link: "Characters", $spec: { friends: [{ $link: "Characters", $spec: { friends: "1003" } }] } },
121
+ })
122
+ .map((x) => x.view(["id", "name"])), [
123
+ { id: "1002", name: "Han Solo" },
124
+ { id: "1003", name: "Leia Organa" },
125
+ { id: "2000", name: "C-3PO" },
126
+ { id: "2001", name: "R2-D2" },
127
+ { id: "1000", name: "Luke Skywalker" },
128
+ ]);
129
+ }
130
+ function query3(qyDB) {
131
+ deepEqual(qyDB.queryFiles("Characters", { friends: { $or: ["1000"] } }).map((x) => x.view(["id", "name"])), [
132
+ { id: "1002", name: "Han Solo" },
133
+ { id: "1003", name: "Leia Organa" },
134
+ { id: "2000", name: "C-3PO" },
135
+ { id: "2001", name: "R2-D2" },
136
+ ]);
137
+ deepEqual(qyDB
138
+ .queryFiles("Characters", { friends: (x) => x.includes("1002") || x.includes("1003") })
139
+ .map((x) => x.view(["id", "name"])), [
140
+ { id: "1000", name: "Luke Skywalker" },
141
+ { id: "1003", name: "Leia Organa" },
142
+ { id: "2000", name: "C-3PO" },
143
+ { id: "2001", name: "R2-D2" },
144
+ { id: "1002", name: "Han Solo" },
145
+ ]);
146
+ deepEqual(qyDB
147
+ .queryFiles("Characters", {
148
+ appearsIn: 6,
149
+ friends: {
150
+ $link: "Characters",
151
+ $spec: {
152
+ friends: {
153
+ $link: "Characters",
154
+ $spec: { friends: (x) => x.includes("1003"), appearsIn: (x) => x.includes(6) },
155
+ },
156
+ },
157
+ },
158
+ })
159
+ .map((x) => x.view(["id", "name"])), [
160
+ { id: "1000", name: "Luke Skywalker" },
161
+ { id: "1002", name: "Han Solo" },
162
+ { id: "1003", name: "Leia Organa" },
163
+ { id: "2000", name: "C-3PO" },
164
+ ]);
165
+ deepEqual(qyDB
166
+ .queryFiles("Characters", {
167
+ appearsIn: 6,
168
+ type: "Droid",
169
+ friends: {
170
+ $link: "Characters",
171
+ $spec: {
172
+ type: "Droid",
173
+ friends: {
174
+ $link: "Characters",
175
+ $spec: { friends: (x) => x.includes("1003"), appearsIn: (x) => x.includes(6) },
176
+ },
177
+ },
178
+ },
179
+ })
180
+ .map((x) => x.view(["id", "name"])), [{ id: "2000", name: "C-3PO" }]);
181
+ }
182
+ test("test QyGraphQL", { skip: false }, async (context) => {
183
+ context.after(async (t) => {
184
+ await qyDB.stop();
185
+ });
186
+ const dataFolder = "./tmp/QyGraphQL/1";
187
+ const qyDB = new QyDB(dataFolder);
188
+ await qyDB.start();
189
+ insertData(qyDB);
190
+ query1(qyDB);
191
+ query2(qyDB);
192
+ query3(qyDB);
193
+ await qyDB.stop();
194
+ await qyDB.start();
195
+ query1(qyDB);
196
+ query2(qyDB);
197
+ query3(qyDB);
198
+ });