@k3000/store 1.4.0 → 1.4.1

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/architect.mjs CHANGED
@@ -811,6 +811,56 @@ export class Entities extends Array {
811
811
 
812
812
  return s2b(value, this.#lengthSet[name])
813
813
  }
814
+
815
+ intToBuffer(value, name) {
816
+
817
+ const size = this.#lengthSet[name]
818
+
819
+ const buffer = Buffer.alloc(size)
820
+
821
+ switch (size) {
822
+
823
+ case 1:
824
+ buffer.writeInt8(value)
825
+ break
826
+ case 2:
827
+ buffer.writeInt16BE(value)
828
+ break
829
+ case 3:
830
+ writeInt24BE(buffer, value)
831
+ break
832
+ case 4:
833
+ buffer.writeInt32BE(value)
834
+ break
835
+ }
836
+
837
+ return buffer
838
+ }
839
+
840
+ uintToBuffer(value, name) {
841
+
842
+ const size = this.#lengthSet[name]
843
+
844
+ const buffer = Buffer.alloc(size)
845
+
846
+ switch (size) {
847
+
848
+ case 1:
849
+ buffer.writeUint8(value)
850
+ break
851
+ case 2:
852
+ buffer.writeUint16BE(value)
853
+ break
854
+ case 3:
855
+ writeUint24BE(buffer, value)
856
+ break
857
+ case 4:
858
+ buffer.writeUint32BE(value)
859
+ break
860
+ }
861
+
862
+ return buffer
863
+ }
814
864
  }
815
865
 
816
866
  const u2o = (url = '') => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@k3000/store",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "description": "storage",
5
5
  "main": "generator.mjs",
6
6
  "scripts": {
package/test/1/data CHANGED
Binary file
package/test/1/index CHANGED
Binary file
package/test/2/data CHANGED
Binary file
package/test/2/index CHANGED
Binary file
package/test/3/data CHANGED
Binary file
package/test/3/index CHANGED
Binary file
package/test/4/data CHANGED
Binary file
package/test/4/index CHANGED
Binary file
package/test/5/data CHANGED
Binary file
package/test/5/index CHANGED
Binary file
package/test/6/data CHANGED
Binary file
package/test/6/index CHANGED
Binary file
package/test/7/data CHANGED
Binary file
package/test/7/index CHANGED
Binary file
package/test/7/index.mjs CHANGED
@@ -132,7 +132,7 @@ class Log extends Entity {
132
132
  enumerable: true,
133
133
  configurable: false,
134
134
  get: () => super.get($type).readUint16BE(0),
135
- set: value => super.set($type, super.uintToBuffer(value, $type)),
135
+ set: value => super.set2($type, super.uintToBuffer(value, $type)),
136
136
  },
137
137
  uid: {
138
138
  enumerable: true,
@@ -301,6 +301,11 @@ class LogSet extends Entities {
301
301
  return super.findByValue($uid, super.s2b(uid, $uid))
302
302
  }
303
303
 
304
+ indexByType(type) {
305
+
306
+ return super.findByValue($type, super.uintToBuffer(type, $type))
307
+ }
308
+
304
309
  indexByTime({after, before} = {}) {
305
310
 
306
311
  return super.findByTime($time, {after, before})
package/test/7/type.ts CHANGED
@@ -83,6 +83,7 @@ interface LogSet extends Array<Log> {
83
83
 
84
84
  indexById(id: Number): Array<Log>
85
85
  indexByUid(uid: String): Array<Log>
86
+ indexByType(type: Number): Array<Log>
86
87
  indexByTime({after, before}): Array<Log>
87
88
  /**
88
89
  * 重写push方法
package/test/8/data ADDED
Binary file
package/test/8/index ADDED
Binary file
@@ -0,0 +1,373 @@
1
+
2
+ import {Entities, Entity, Storage, b2d, d2b, b2s, position, uInt32BEToBuffer, int32BEToBuffer,
3
+ doubleBEToBuffer, bigint32BEToBuffer, bigUint32BEToBuffer, readInt24BE, readUint24BE, Store} from '../../architect.mjs'
4
+ import {struct} from '../../generator.mjs'
5
+
6
+ const storage = new Storage(import.meta.url)
7
+
8
+ const $id = 'id'
9
+ const $uid = 'uid'
10
+ const $pwd = 'pwd'
11
+ const $valid = 'valid'
12
+ const $time = 'time'
13
+ const $type = 'type'
14
+ const $content = 'content'
15
+ const $test = 'test'
16
+ const $str = 'str'
17
+ const $test2 = 'test2'
18
+
19
+ class Admin extends Entity {
20
+
21
+ static name = 'admin'
22
+
23
+ static create(_) {
24
+ _.id = storage.updateValue(_.id, Admin.name, $id)
25
+ _.pwd = _.pwd || '123456'
26
+ _.time = _.time || new Date()
27
+ _.valid = _.valid || 0
28
+ return _
29
+ }
30
+
31
+ constructor(...arg) {
32
+
33
+ super(storage, ...arg)
34
+
35
+ return Object.defineProperties({}, {
36
+ [position]: {
37
+ enumerable: false,
38
+ configurable: false,
39
+ get: () => this[position],
40
+ },
41
+ id: {
42
+ enumerable: true,
43
+ configurable: false,
44
+ get: () => super.get($id).readUInt32BE(0),
45
+ set: value => {
46
+ super.set2($id, uInt32BEToBuffer(value))
47
+ this.#update()
48
+ },
49
+ },
50
+ pwd: {
51
+ enumerable: true,
52
+ configurable: false,
53
+ get: () => b2s(super.get($pwd)),
54
+ set: value => {
55
+ super.set($pwd, super.s2b(value, $pwd))
56
+ this.#update()
57
+ },
58
+ },
59
+ time: {
60
+ enumerable: true,
61
+ configurable: false,
62
+ get: () => b2d(super.get($time)),
63
+ set: value => super.set2($time, d2b(value)),
64
+ },
65
+ uid: {
66
+ enumerable: true,
67
+ configurable: false,
68
+ get: () => b2s(super.get($uid)),
69
+ set: value => {
70
+ super.set2($uid, super.s2b(value, $uid))
71
+ this.#update()
72
+ },
73
+ },
74
+ valid: {
75
+ enumerable: true,
76
+ configurable: false,
77
+ get: () => super.get($valid).readUint8(0),
78
+ set: value => {
79
+ super.set2($valid, super.uintToBuffer(value, $valid))
80
+ this.#update()
81
+ },
82
+ },
83
+ })
84
+ }
85
+
86
+
87
+ #update() {
88
+
89
+ this.time = Date.now()
90
+ }
91
+ }
92
+
93
+ class Log extends Entity {
94
+
95
+ static name = 'log'
96
+
97
+ static create(_) {
98
+ _.id = storage.updateValue(_.id, Log.name, $id)
99
+ _.time = _.time || new Date()
100
+ return _
101
+ }
102
+
103
+ constructor(...arg) {
104
+
105
+ super(storage, ...arg)
106
+
107
+ return Object.defineProperties({}, {
108
+ [position]: {
109
+ enumerable: false,
110
+ configurable: false,
111
+ get: () => this[position],
112
+ },
113
+ content: {
114
+ enumerable: true,
115
+ configurable: false,
116
+ get: () => b2s(super.get($content)),
117
+ set: value => super.set($content, super.s2b(value, $content)),
118
+ },
119
+ id: {
120
+ enumerable: true,
121
+ configurable: false,
122
+ get: () => super.get($id).readUInt32BE(0),
123
+ set: value => super.set2($id, uInt32BEToBuffer(value)),
124
+ },
125
+ time: {
126
+ enumerable: true,
127
+ configurable: false,
128
+ get: () => b2d(super.get($time)),
129
+ set: value => super.set2($time, d2b(value)),
130
+ },
131
+ type: {
132
+ enumerable: true,
133
+ configurable: false,
134
+ get: () => super.get($type).readUint16BE(0),
135
+ set: value => super.set2($type, super.uintToBuffer(value, $type)),
136
+ },
137
+ uid: {
138
+ enumerable: true,
139
+ configurable: false,
140
+ get: () => b2s(super.get($uid)),
141
+ set: value => super.set2($uid, super.s2b(value, $uid)),
142
+ },
143
+ })
144
+ }
145
+
146
+ }
147
+
148
+ class Test3 extends Entity {
149
+
150
+ static name = 'test3'
151
+
152
+ static create(_) {
153
+
154
+ return _
155
+ }
156
+
157
+ constructor(...arg) {
158
+
159
+ super(storage, ...arg)
160
+
161
+ return Object.defineProperties({}, {
162
+ [position]: {
163
+ enumerable: false,
164
+ configurable: false,
165
+ get: () => this[position],
166
+ },
167
+ pwd: {
168
+ enumerable: true,
169
+ configurable: false,
170
+ get: () => b2s(super.get($pwd)),
171
+ set: value => super.set($pwd, super.s2b(value, $pwd)),
172
+ },
173
+ str: {
174
+ enumerable: true,
175
+ configurable: false,
176
+ get: () => b2s(super.get($str)),
177
+ set: value => super.set($str, super.s2b(value, $str)),
178
+ },
179
+ test: {
180
+ enumerable: true,
181
+ configurable: false,
182
+ get: () => b2s(super.get($test)),
183
+ set: value => super.set($test, super.s2b(value, $test)),
184
+ },
185
+ test2: {
186
+ enumerable: true,
187
+ configurable: false,
188
+ get: () => b2s(super.get($test2)),
189
+ set: value => super.set($test2, super.s2b(value, $test2)),
190
+ },
191
+ uid: {
192
+ enumerable: true,
193
+ configurable: false,
194
+ get: () => b2s(super.get($uid)),
195
+ set: value => super.set($uid, super.s2b(value, $uid)),
196
+ },
197
+ })
198
+ }
199
+
200
+ }
201
+
202
+
203
+ class AdminSet extends Entities {
204
+
205
+ constructor() {
206
+
207
+ super(storage, Admin)
208
+ }
209
+ /**
210
+ * 内部方法
211
+ */
212
+ s2b() {
213
+
214
+ throw new TypeError('s2b is not a function')
215
+ }
216
+ /**
217
+ * 内部方法
218
+ */
219
+ findByValue() {
220
+
221
+ throw new TypeError('findByValue is not a function')
222
+ }
223
+ /**
224
+ * 内部方法
225
+ */
226
+ findByTime() {
227
+
228
+ throw new TypeError('findByTime is not a function')
229
+ }
230
+ /**
231
+ * 内部方法
232
+ */
233
+ stringToBuffer() {
234
+
235
+ throw new TypeError('stringToBuffer is not a function')
236
+ }
237
+
238
+ indexById(id) {
239
+
240
+ return super.findByValue($id, uInt32BEToBuffer(id, $id))
241
+ }
242
+
243
+ indexByUid(uid) {
244
+
245
+ return super.findByValue($uid, super.s2b(uid, $uid))
246
+ }
247
+
248
+ indexByValid(valid) {
249
+
250
+ return super.findByValue($valid, super.uintToBuffer(valid, $valid))
251
+ }
252
+
253
+ indexByTime({after, before} = {}) {
254
+
255
+ return super.findByTime($time, {after, before})
256
+ }
257
+ }
258
+
259
+ class LogSet extends Entities {
260
+
261
+ constructor() {
262
+
263
+ super(storage, Log)
264
+ }
265
+ /**
266
+ * 内部方法
267
+ */
268
+ s2b() {
269
+
270
+ throw new TypeError('s2b is not a function')
271
+ }
272
+ /**
273
+ * 内部方法
274
+ */
275
+ findByValue() {
276
+
277
+ throw new TypeError('findByValue is not a function')
278
+ }
279
+ /**
280
+ * 内部方法
281
+ */
282
+ findByTime() {
283
+
284
+ throw new TypeError('findByTime is not a function')
285
+ }
286
+ /**
287
+ * 内部方法
288
+ */
289
+ stringToBuffer() {
290
+
291
+ throw new TypeError('stringToBuffer is not a function')
292
+ }
293
+
294
+ indexById(id) {
295
+
296
+ return super.findByValue($id, uInt32BEToBuffer(id, $id))
297
+ }
298
+
299
+ indexByUid(uid) {
300
+
301
+ return super.findByValue($uid, super.s2b(uid, $uid))
302
+ }
303
+
304
+ indexByType(type) {
305
+
306
+ return super.findByValue($type, super.uintToBuffer(type, $type))
307
+ }
308
+
309
+ indexByTime({after, before} = {}) {
310
+
311
+ return super.findByTime($time, {after, before})
312
+ }
313
+ }
314
+
315
+ class Test3Set extends Entities {
316
+
317
+ constructor() {
318
+
319
+ super(storage, Test3)
320
+ }
321
+ /**
322
+ * 内部方法
323
+ */
324
+ s2b() {
325
+
326
+ throw new TypeError('s2b is not a function')
327
+ }
328
+ /**
329
+ * 内部方法
330
+ */
331
+ findByValue() {
332
+
333
+ throw new TypeError('findByValue is not a function')
334
+ }
335
+ /**
336
+ * 内部方法
337
+ */
338
+ findByTime() {
339
+
340
+ throw new TypeError('findByTime is not a function')
341
+ }
342
+ /**
343
+ * 内部方法
344
+ */
345
+ stringToBuffer() {
346
+
347
+ throw new TypeError('stringToBuffer is not a function')
348
+ }
349
+
350
+ }
351
+
352
+ export const remark = Symbol('remark')
353
+
354
+ export const close = () => storage.close()
355
+
356
+ export const getStruct = name => struct(storage, remark, name)
357
+
358
+ /**
359
+ * @type {import('./type').Storage}
360
+ */
361
+ const store = Object.freeze({
362
+ admin: new Proxy([], {
363
+ get: new AdminSet()
364
+ }),
365
+ log: new Proxy([], {
366
+ get: new LogSet()
367
+ }),
368
+ test3: new Proxy([], {
369
+ get: new Test3Set()
370
+ }),
371
+ })
372
+
373
+ export default store
package/test/8/type.ts ADDED
@@ -0,0 +1,172 @@
1
+
2
+ interface Admin {
3
+
4
+ /**
5
+ *
6
+ */
7
+ id: Number
8
+ /**
9
+ * 账号
10
+ */
11
+ uid: String
12
+ /**
13
+ * 密码
14
+ */
15
+ pwd: String
16
+ /**
17
+ * 是否有效
18
+ */
19
+ valid: Number
20
+ /**
21
+ * 登录时间
22
+ */
23
+ time: Number | Date
24
+ }
25
+
26
+ interface AdminSet extends Array<Admin> {
27
+
28
+ indexById(id: Number): Array<Admin>
29
+ indexByUid(uid: String): Array<Admin>
30
+ indexByValid(valid: Number): Array<Admin>
31
+ indexByTime({after, before}): Array<Admin>
32
+ /**
33
+ * 重写push方法
34
+ */
35
+ push(...item: Array<Admin>): Array<Admin>
36
+ /**
37
+ * 重写unshift方法
38
+ */
39
+ unshift(...item: Array<Admin>): Array<Admin>
40
+ /**
41
+ * 分页查询
42
+ */
43
+ page(predicate: Function, index: Number | String, size: Number | String, params: Object): Array<Admin>
44
+ /**
45
+ * 移除数据
46
+ */
47
+ remove(...items: Array<Admin>): void
48
+ /**
49
+ * 联合查询,类似LEFT JOIN
50
+ */
51
+ eachFlat(array: Array<Object>, predicate: Function | String): Array<Object>
52
+ /**
53
+ * 联合查询,类似INNER JOIN
54
+ */
55
+ filterFlat(array: Array<Object>, predicate: Function | String): Array<Object>
56
+ }
57
+
58
+ interface Log {
59
+
60
+ /**
61
+ *
62
+ */
63
+ id: Number
64
+ /**
65
+ * 账号
66
+ */
67
+ uid: String
68
+ /**
69
+ * 类型
70
+ */
71
+ type: Number
72
+ /**
73
+ * 创建时间
74
+ */
75
+ time: Number | Date
76
+ /**
77
+ * 内容
78
+ */
79
+ content: String
80
+ }
81
+
82
+ interface LogSet extends Array<Log> {
83
+
84
+ indexById(id: Number): Array<Log>
85
+ indexByUid(uid: String): Array<Log>
86
+ indexByType(type: Number): Array<Log>
87
+ indexByTime({after, before}): Array<Log>
88
+ /**
89
+ * 重写push方法
90
+ */
91
+ push(...item: Array<Log>): Array<Log>
92
+ /**
93
+ * 重写unshift方法
94
+ */
95
+ unshift(...item: Array<Log>): Array<Log>
96
+ /**
97
+ * 分页查询
98
+ */
99
+ page(predicate: Function, index: Number | String, size: Number | String, params: Object): Array<Log>
100
+ /**
101
+ * 移除数据
102
+ */
103
+ remove(...items: Array<Log>): void
104
+ /**
105
+ * 联合查询,类似LEFT JOIN
106
+ */
107
+ eachFlat(array: Array<Object>, predicate: Function | String): Array<Object>
108
+ /**
109
+ * 联合查询,类似INNER JOIN
110
+ */
111
+ filterFlat(array: Array<Object>, predicate: Function | String): Array<Object>
112
+ }
113
+
114
+ interface Test3 {
115
+
116
+ /**
117
+ * 账
118
+ * 户
119
+ */
120
+ uid: String
121
+ /**
122
+ *
123
+ */
124
+ pwd: String
125
+ /**
126
+ *
127
+ */
128
+ test: String
129
+ /**
130
+ *
131
+ */
132
+ str: String
133
+ /**
134
+ *
135
+ */
136
+ test2: String
137
+ }
138
+
139
+ interface Test3Set extends Array<Test3> {
140
+
141
+ /**
142
+ * 重写push方法
143
+ */
144
+ push(...item: Array<Test3>): Array<Test3>
145
+ /**
146
+ * 重写unshift方法
147
+ */
148
+ unshift(...item: Array<Test3>): Array<Test3>
149
+ /**
150
+ * 分页查询
151
+ */
152
+ page(predicate: Function, index: Number | String, size: Number | String, params: Object): Array<Test3>
153
+ /**
154
+ * 移除数据
155
+ */
156
+ remove(...items: Array<Test3>): void
157
+ /**
158
+ * 联合查询,类似LEFT JOIN
159
+ */
160
+ eachFlat(array: Array<Object>, predicate: Function | String): Array<Object>
161
+ /**
162
+ * 联合查询,类似INNER JOIN
163
+ */
164
+ filterFlat(array: Array<Object>, predicate: Function | String): Array<Object>
165
+ }
166
+
167
+
168
+ export interface Storage {
169
+ admin: AdminSet,
170
+ log: LogSet,
171
+ test3: Test3Set
172
+ }
package/test/index.mjs CHANGED
@@ -1,15 +1,15 @@
1
1
 
2
2
  const index = import.meta.url.indexOf('?')
3
3
 
4
- export const modules = await import(`./7/index.mjs${index > -1 ? import.meta.url.substring(index) : ''}`)
4
+ export const modules = await import(`./8/index.mjs${index > -1 ? import.meta.url.substring(index) : ''}`)
5
5
 
6
6
  export const close = modules.close
7
7
  export const remark = modules.remark
8
- export const version = 7
8
+ export const version = 8
9
9
  export const getStruct = modules.getStruct
10
10
 
11
11
  /**
12
- * @type {import('./7/type').Storage}
12
+ * @type {import('./8/type').Storage}
13
13
  */
14
14
  export const storage = modules.default
15
15
 
package/test.mjs CHANGED
@@ -594,6 +594,11 @@ test('测试结构操作', async t => {
594
594
  deleteDir('test/7')
595
595
  }
596
596
 
597
+ if (existsSync('test/8')) {
598
+
599
+ deleteDir('test/8')
600
+ }
601
+
597
602
  await new Promise(resolve => {
598
603
 
599
604
  t.test('测试添加操作(appendSet)', _ => {
@@ -743,18 +748,46 @@ test('测试结构操作', async t => {
743
748
  })
744
749
  })
745
750
 
751
+ await new Promise(resolve => {
752
+
753
+ t.test('测试更新索引操作(updateIndex)', _ => {
754
+
755
+ const {updateIndex, submit} = upgrade('test', {version: 7, password: '123123'})
756
+
757
+ updateIndex('log', {
758
+ type: true,
759
+ })
760
+
761
+ submit().then(() => import('./test/7/index.mjs?password=123123')).then(m => {
762
+
763
+ const storage = m.default
764
+
765
+ const result = storage.log.indexByType(0)
766
+
767
+ assert.strictEqual(
768
+ JSON.stringify(result),
769
+ '[{"content":"login","id":2,"time":1640966400000,"type":0,"uid":"test"},{"content":"test","id":1,"time":1641052800000,"type":0,"uid":"test"}]')
770
+
771
+ m.close()
772
+
773
+ resolve()
774
+
775
+ }).catch(e => console.error(e))
776
+ })
777
+ })
778
+
746
779
  await new Promise(resolve => {
747
780
 
748
781
  t.test('测试压缩操作', _ => {
749
782
 
750
783
  const {submit} = upgrade('test', {
751
- version: 7,
784
+ version: 8,
752
785
  prod: true,
753
786
  password: '123123',
754
787
  newPwd: '111111'
755
788
  })
756
789
 
757
- submit().then(() => import('./test/7/index.mjs?password=111111')).then(m => {
790
+ submit().then(() => import('./test/8/index.mjs?password=111111')).then(m => {
758
791
 
759
792
  const storage = m.default
760
793