@wxn0brp/db-core 0.12.1 → 0.12.2
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/base/actions.d.ts +1 -4
- package/dist/base/actions.js +2 -12
- package/dist/customFileCpu.js +11 -3
- package/dist/helpers/gen.d.ts +4 -0
- package/dist/helpers/gen.js +6 -7
- package/dist/utils/action.js +96 -47
- package/dist/utils/compare.js +1 -1
- package/dist/utils/hasFieldsAdvanced.js +9 -5
- package/dist/utils/merge.js +13 -1
- package/dist/utils/updateFindObject.js +24 -37
- package/dist/utils/updateObject.js +20 -8
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/dist/base/actions.d.ts
CHANGED
|
@@ -6,10 +6,7 @@ export declare abstract class ActionsBase implements ActionsBaseInterface {
|
|
|
6
6
|
_inited: boolean;
|
|
7
7
|
adapterOpts: AdapterOpts;
|
|
8
8
|
smartExecutor: boolean;
|
|
9
|
-
|
|
10
|
-
set numberId(value: boolean);
|
|
11
|
-
get idKey(): string;
|
|
12
|
-
set idKey(value: string);
|
|
9
|
+
version: string;
|
|
13
10
|
init(...args: any[]): Promise<void>;
|
|
14
11
|
close(...args: any[]): Promise<void>;
|
|
15
12
|
abstract getCollections(): Promise<string[]>;
|
package/dist/base/actions.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { setDataForToggleOne, setDataForUpdateOneOrAdd, } from "../helpers/assignDataPush.js";
|
|
2
|
+
import { version } from "../version.js";
|
|
2
3
|
export class ActionsBase {
|
|
3
4
|
_inited = true;
|
|
4
5
|
adapterOpts = {
|
|
@@ -6,18 +7,7 @@ export class ActionsBase {
|
|
|
6
7
|
idKey: "_id",
|
|
7
8
|
};
|
|
8
9
|
smartExecutor = false;
|
|
9
|
-
|
|
10
|
-
return this.adapterOpts.numberId ?? false;
|
|
11
|
-
}
|
|
12
|
-
set numberId(value) {
|
|
13
|
-
this.adapterOpts.numberId = value;
|
|
14
|
-
}
|
|
15
|
-
get idKey() {
|
|
16
|
-
return this.adapterOpts.idKey ?? "_id";
|
|
17
|
-
}
|
|
18
|
-
set idKey(value) {
|
|
19
|
-
this.adapterOpts.idKey = value;
|
|
20
|
-
}
|
|
10
|
+
version = "ActionsBase-core-" + version;
|
|
21
11
|
async init(...args) { }
|
|
22
12
|
async close(...args) { }
|
|
23
13
|
async updateOneOrAdd(config) {
|
package/dist/customFileCpu.js
CHANGED
|
@@ -21,9 +21,17 @@ export class CustomFileCpu {
|
|
|
21
21
|
async find(file, config) {
|
|
22
22
|
file = pathRepair(file);
|
|
23
23
|
const entries = await this._readFile(file);
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
|
|
24
|
+
const findOpts = config.findOpts || {};
|
|
25
|
+
const result = [];
|
|
26
|
+
for (let i = 0; i < entries.length; i++) {
|
|
27
|
+
if (matchObj(config, entries[i])) {
|
|
28
|
+
const obj = this.requireClone
|
|
29
|
+
? structuredClone(entries[i])
|
|
30
|
+
: entries[i];
|
|
31
|
+
result.push(updateFindObject(obj, findOpts));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
27
35
|
}
|
|
28
36
|
async findOne(file, config) {
|
|
29
37
|
file = pathRepair(file);
|
package/dist/helpers/gen.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { Id } from "../types/Id.js";
|
|
|
2
2
|
export declare function getIdData(): {
|
|
3
3
|
usedIds: Map<any, any>;
|
|
4
4
|
lastId: Id;
|
|
5
|
+
lastTimeStr: string;
|
|
6
|
+
lastCounter: number;
|
|
5
7
|
recentIdsTimestamps: number[];
|
|
6
8
|
startIndex: number;
|
|
7
9
|
lastGeneratedMs: number;
|
|
@@ -17,6 +19,8 @@ export type IdData = ReturnType<typeof getIdData>;
|
|
|
17
19
|
export declare function genId(parts?: number[], idData?: {
|
|
18
20
|
usedIds: Map<any, any>;
|
|
19
21
|
lastId: Id;
|
|
22
|
+
lastTimeStr: string;
|
|
23
|
+
lastCounter: number;
|
|
20
24
|
recentIdsTimestamps: number[];
|
|
21
25
|
startIndex: number;
|
|
22
26
|
lastGeneratedMs: number;
|
package/dist/helpers/gen.js
CHANGED
|
@@ -2,6 +2,8 @@ export function getIdData() {
|
|
|
2
2
|
return {
|
|
3
3
|
usedIds: new Map(),
|
|
4
4
|
lastId: undefined,
|
|
5
|
+
lastTimeStr: "",
|
|
6
|
+
lastCounter: 0,
|
|
5
7
|
recentIdsTimestamps: [],
|
|
6
8
|
startIndex: 0,
|
|
7
9
|
lastGeneratedMs: 0,
|
|
@@ -35,13 +37,8 @@ export function genId(parts = null, idData = defaultIdData) {
|
|
|
35
37
|
function getUniqueRandom(opts, idData) {
|
|
36
38
|
while (true) {
|
|
37
39
|
let minValue = 0;
|
|
38
|
-
if (idData.
|
|
39
|
-
|
|
40
|
-
const lastTime = parts.shift();
|
|
41
|
-
if (lastTime === opts.time) {
|
|
42
|
-
const int36 = parts.join("");
|
|
43
|
-
minValue = parseInt(int36, 36) + 1;
|
|
44
|
-
}
|
|
40
|
+
if (idData.lastTimeStr === opts.time) {
|
|
41
|
+
minValue = idData.lastCounter + 1;
|
|
45
42
|
}
|
|
46
43
|
const partsLengthSum = opts.partsSchema.reduce((acc, num) => acc + num, 0);
|
|
47
44
|
const partsData = generateBase36InRange(minValue, partsLengthSum, idData);
|
|
@@ -54,6 +51,8 @@ function getUniqueRandom(opts, idData) {
|
|
|
54
51
|
idData.usedIds.set(id, true);
|
|
55
52
|
setTimeout(() => idData.usedIds.delete(id), 1000);
|
|
56
53
|
idData.lastId = id;
|
|
54
|
+
idData.lastTimeStr = opts.time;
|
|
55
|
+
idData.lastCounter = idData.lastRandomValue;
|
|
57
56
|
return id;
|
|
58
57
|
}
|
|
59
58
|
opts.s++;
|
package/dist/utils/action.js
CHANGED
|
@@ -9,11 +9,16 @@ export async function findUtil(query, fileCpuOrData, files, fileCpuOpts) {
|
|
|
9
9
|
let datas = [];
|
|
10
10
|
let skippedEntries = 0;
|
|
11
11
|
if (Array.isArray(fileCpuOrData)) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
const src = fileCpuOrData;
|
|
13
|
+
const len = src.length;
|
|
14
|
+
if (reverse && !sortBy) {
|
|
15
|
+
datas = new Array(len);
|
|
16
|
+
for (let i = 0; i < len; i++)
|
|
17
|
+
datas[i] = src[len - 1 - i];
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
datas = src.slice();
|
|
21
|
+
}
|
|
17
22
|
if (!needsAllData) {
|
|
18
23
|
if (offset > 0 || limit !== -1) {
|
|
19
24
|
const start = offset;
|
|
@@ -33,7 +38,8 @@ export async function findUtil(query, fileCpuOrData, files, fileCpuOpts) {
|
|
|
33
38
|
if (reverse && !sortBy)
|
|
34
39
|
entries.reverse();
|
|
35
40
|
if (needsAllData) {
|
|
36
|
-
|
|
41
|
+
for (let i = 0; i < entries.length; i++)
|
|
42
|
+
datas.push(entries[i]);
|
|
37
43
|
continue;
|
|
38
44
|
}
|
|
39
45
|
if (offset > skippedEntries) {
|
|
@@ -50,7 +56,8 @@ export async function findUtil(query, fileCpuOrData, files, fileCpuOpts) {
|
|
|
50
56
|
if (entries.length > remaining)
|
|
51
57
|
entries = entries.slice(0, remaining);
|
|
52
58
|
}
|
|
53
|
-
|
|
59
|
+
for (let i = 0; i < entries.length; i++)
|
|
60
|
+
datas.push(entries[i]);
|
|
54
61
|
if (limit !== -1 && datas.length >= limit)
|
|
55
62
|
return datas;
|
|
56
63
|
}
|
|
@@ -71,18 +78,20 @@ export async function findUtil(query, fileCpuOrData, files, fileCpuOpts) {
|
|
|
71
78
|
: [];
|
|
72
79
|
if (groupKeys.length) {
|
|
73
80
|
for (const data of datas) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
let key = String(data[groupKeys[0]] ?? "");
|
|
82
|
+
for (let i = 1; i < groupKeys.length; i++) {
|
|
83
|
+
key += "|" + String(data[groupKeys[i]] ?? "");
|
|
84
|
+
}
|
|
85
|
+
let group = groups.get(key);
|
|
86
|
+
if (!group) {
|
|
87
|
+
group = [];
|
|
88
|
+
groups.set(key, group);
|
|
89
|
+
}
|
|
90
|
+
group.push(data);
|
|
80
91
|
}
|
|
81
92
|
}
|
|
82
93
|
else {
|
|
83
|
-
groups.set("all",
|
|
84
|
-
...datas,
|
|
85
|
-
]);
|
|
94
|
+
groups.set("all", datas.slice());
|
|
86
95
|
}
|
|
87
96
|
const aggregated = [];
|
|
88
97
|
for (const [, groupItems] of groups) {
|
|
@@ -94,34 +103,72 @@ export async function findUtil(query, fileCpuOrData, files, fileCpuOpts) {
|
|
|
94
103
|
}
|
|
95
104
|
if (count) {
|
|
96
105
|
for (const [outKey, srcKey] of Object.entries(count)) {
|
|
97
|
-
|
|
106
|
+
let c = 0;
|
|
107
|
+
for (let i = 0; i < groupItems.length; i++) {
|
|
108
|
+
const v = groupItems[i][srcKey];
|
|
109
|
+
if (v !== undefined && v !== null)
|
|
110
|
+
c++;
|
|
111
|
+
}
|
|
112
|
+
result[outKey] = c;
|
|
98
113
|
}
|
|
99
114
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
115
|
+
const minEntries = min ? Object.entries(min) : null;
|
|
116
|
+
const maxEntries = max ? Object.entries(max) : null;
|
|
117
|
+
const avgEntries = avg ? Object.entries(avg) : null;
|
|
118
|
+
const sumEntries = sum ? Object.entries(sum) : null;
|
|
119
|
+
if (minEntries) {
|
|
120
|
+
for (const [outKey, srcField] of minEntries) {
|
|
121
|
+
let best = null;
|
|
122
|
+
for (let i = 0; i < groupItems.length; i++) {
|
|
123
|
+
const v = groupItems[i][srcField];
|
|
124
|
+
if (typeof v === "number") {
|
|
125
|
+
if (best === null || v < best)
|
|
126
|
+
best = v;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
result[outKey] = best;
|
|
130
|
+
}
|
|
105
131
|
}
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
132
|
+
if (maxEntries) {
|
|
133
|
+
for (const [outKey, srcField] of maxEntries) {
|
|
134
|
+
let best = null;
|
|
135
|
+
for (let i = 0; i < groupItems.length; i++) {
|
|
136
|
+
const v = groupItems[i][srcField];
|
|
137
|
+
if (typeof v === "number") {
|
|
138
|
+
if (best === null || v > best)
|
|
139
|
+
best = v;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
result[outKey] = best;
|
|
143
|
+
}
|
|
111
144
|
}
|
|
112
|
-
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
145
|
+
if (avgEntries) {
|
|
146
|
+
for (const [outKey, srcField] of avgEntries) {
|
|
147
|
+
let total = 0;
|
|
148
|
+
let c = 0;
|
|
149
|
+
for (let i = 0; i < groupItems.length; i++) {
|
|
150
|
+
const v = groupItems[i][srcField];
|
|
151
|
+
if (typeof v === "number") {
|
|
152
|
+
total += v;
|
|
153
|
+
c++;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
result[outKey] = c > 0 ? total / c : null;
|
|
157
|
+
}
|
|
119
158
|
}
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
159
|
+
if (sumEntries) {
|
|
160
|
+
for (const [outKey, srcField] of sumEntries) {
|
|
161
|
+
let total = 0;
|
|
162
|
+
let c = 0;
|
|
163
|
+
for (let i = 0; i < groupItems.length; i++) {
|
|
164
|
+
const v = groupItems[i][srcField];
|
|
165
|
+
if (typeof v === "number") {
|
|
166
|
+
total += v;
|
|
167
|
+
c++;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
result[outKey] = c > 0 ? total : null;
|
|
171
|
+
}
|
|
125
172
|
}
|
|
126
173
|
aggregated.push(result);
|
|
127
174
|
}
|
|
@@ -129,14 +176,16 @@ export async function findUtil(query, fileCpuOrData, files, fileCpuOpts) {
|
|
|
129
176
|
}
|
|
130
177
|
if (distinct) {
|
|
131
178
|
const seen = new Set();
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
179
|
+
const result = [];
|
|
180
|
+
for (let i = 0; i < datas.length; i++) {
|
|
181
|
+
const val = datas[i][distinct];
|
|
182
|
+
const key = typeof val === "object" && val !== null ? JSON.stringify(val) : val;
|
|
183
|
+
if (!seen.has(key)) {
|
|
184
|
+
seen.add(key);
|
|
185
|
+
result.push(datas[i]);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
datas = result;
|
|
140
189
|
}
|
|
141
190
|
if (sortBy) {
|
|
142
191
|
if (sortBy === "random()") {
|
package/dist/utils/compare.js
CHANGED
|
@@ -10,7 +10,7 @@ export function compareSafe(a, b) {
|
|
|
10
10
|
const typeA = typeof a;
|
|
11
11
|
const typeB = typeof b;
|
|
12
12
|
if (typeA === "string" && typeB === "string") {
|
|
13
|
-
return
|
|
13
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
14
14
|
}
|
|
15
15
|
if ((typeA === "number" || a instanceof Date) &&
|
|
16
16
|
(typeB === "number" || b instanceof Date)) {
|
|
@@ -11,14 +11,18 @@ export function hasFieldsAdvanced(obj, fields) {
|
|
|
11
11
|
return true;
|
|
12
12
|
const $fields = {};
|
|
13
13
|
const subsetFields = {};
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
let hasSubset = false;
|
|
15
|
+
for (const key in fields) {
|
|
16
|
+
if (key.charCodeAt(0) === 36) {
|
|
16
17
|
$fields[key.toLowerCase()] = fields[key];
|
|
17
|
-
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
18
20
|
subsetFields[key] = fields[key];
|
|
19
|
-
|
|
21
|
+
hasSubset = true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
20
24
|
// Shallow fields first
|
|
21
|
-
if (
|
|
25
|
+
if (hasSubset && !hasFields(obj, subsetFields))
|
|
22
26
|
return false;
|
|
23
27
|
// Direct fields only
|
|
24
28
|
if (Object.keys($fields).length === 0)
|
package/dist/utils/merge.js
CHANGED
|
@@ -22,8 +22,20 @@ export function _deepMerge(target, ...sources) {
|
|
|
22
22
|
}
|
|
23
23
|
return _deepMerge(target, ...sources);
|
|
24
24
|
}
|
|
25
|
+
function fastClone(obj) {
|
|
26
|
+
if (obj === null || typeof obj !== "object")
|
|
27
|
+
return obj;
|
|
28
|
+
if (Array.isArray(obj))
|
|
29
|
+
return obj.map(fastClone);
|
|
30
|
+
if (obj instanceof Date)
|
|
31
|
+
return new Date(obj.getTime());
|
|
32
|
+
const result = {};
|
|
33
|
+
for (const key in obj)
|
|
34
|
+
result[key] = fastClone(obj[key]);
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
25
37
|
export function deepMerge(target, ...sources) {
|
|
26
|
-
return _deepMerge(
|
|
38
|
+
return _deepMerge(fastClone(target), ...sources.map(fastClone));
|
|
27
39
|
}
|
|
28
40
|
function isObject(item) {
|
|
29
41
|
return item && typeof item === "object" && !Array.isArray(item);
|
|
@@ -1,40 +1,6 @@
|
|
|
1
1
|
function resolvePath(path) {
|
|
2
2
|
return Array.isArray(path) ? path : path.split(".");
|
|
3
3
|
}
|
|
4
|
-
function pathExists(obj, path) {
|
|
5
|
-
const segs = resolvePath(path);
|
|
6
|
-
if (segs.length === 0)
|
|
7
|
-
return false;
|
|
8
|
-
let cur = obj;
|
|
9
|
-
for (const s of segs) {
|
|
10
|
-
if (cur == null || typeof cur !== "object" || !(s in cur))
|
|
11
|
-
return false;
|
|
12
|
-
cur = cur[s];
|
|
13
|
-
}
|
|
14
|
-
return true;
|
|
15
|
-
}
|
|
16
|
-
function getValueAt(obj, path) {
|
|
17
|
-
const segs = resolvePath(path);
|
|
18
|
-
let cur = obj;
|
|
19
|
-
for (const s of segs) {
|
|
20
|
-
if (cur == null || typeof cur !== "object")
|
|
21
|
-
return undefined;
|
|
22
|
-
cur = cur[s];
|
|
23
|
-
}
|
|
24
|
-
return cur;
|
|
25
|
-
}
|
|
26
|
-
function setNested(obj, path, value) {
|
|
27
|
-
const segs = resolvePath(path);
|
|
28
|
-
let cur = obj;
|
|
29
|
-
for (let i = 0; i < segs.length - 1; i++) {
|
|
30
|
-
const s = segs[i];
|
|
31
|
-
if (!(s in cur) || typeof cur[s] !== "object" || Array.isArray(cur[s])) {
|
|
32
|
-
cur[s] = {};
|
|
33
|
-
}
|
|
34
|
-
cur = cur[s];
|
|
35
|
-
}
|
|
36
|
-
cur[segs[segs.length - 1]] = value;
|
|
37
|
-
}
|
|
38
4
|
function deleteNested(obj, path) {
|
|
39
5
|
const segs = resolvePath(path);
|
|
40
6
|
if (segs.length === 0)
|
|
@@ -72,9 +38,30 @@ export function updateFindObject(obj, findOpts) {
|
|
|
72
38
|
if (Array.isArray(select)) {
|
|
73
39
|
const result = {};
|
|
74
40
|
for (const field of select) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
41
|
+
const segs = typeof field === "string" ? field.split(".") : field;
|
|
42
|
+
if (!segs.length)
|
|
43
|
+
continue;
|
|
44
|
+
let src = obj;
|
|
45
|
+
let found = true;
|
|
46
|
+
for (let i = 0; i < segs.length; i++) {
|
|
47
|
+
if (src == null || typeof src !== "object" || !(segs[i] in src)) {
|
|
48
|
+
found = false;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
src = src[segs[i]];
|
|
52
|
+
}
|
|
53
|
+
if (found) {
|
|
54
|
+
let dst = result;
|
|
55
|
+
for (let i = 0; i < segs.length - 1; i++) {
|
|
56
|
+
const s = segs[i];
|
|
57
|
+
if (!(s in dst) ||
|
|
58
|
+
typeof dst[s] !== "object" ||
|
|
59
|
+
Array.isArray(dst[s])) {
|
|
60
|
+
dst[s] = {};
|
|
61
|
+
}
|
|
62
|
+
dst = dst[s];
|
|
63
|
+
}
|
|
64
|
+
dst[segs[segs.length - 1]] = src;
|
|
78
65
|
}
|
|
79
66
|
}
|
|
80
67
|
obj = result;
|
|
@@ -11,15 +11,24 @@ export function updateObjectAdvanced(obj, field) {
|
|
|
11
11
|
return;
|
|
12
12
|
const $fields = {};
|
|
13
13
|
const subsetFields = {};
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
let hasDollar = false;
|
|
15
|
+
let hasSubset = false;
|
|
16
|
+
for (const key in field) {
|
|
17
|
+
if (key.charCodeAt(0) === 36) {
|
|
16
18
|
$fields[key.toLowerCase()] = field[key];
|
|
17
|
-
|
|
19
|
+
hasDollar = true;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
18
22
|
subsetFields[key] = field[key];
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
hasSubset = true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (hasDollar) {
|
|
27
|
+
mainUpdate(obj, $fields);
|
|
28
|
+
deepMerge(obj, $fields);
|
|
29
|
+
}
|
|
30
|
+
if (hasSubset)
|
|
31
|
+
updateObject(obj, subsetFields);
|
|
23
32
|
}
|
|
24
33
|
function deepMerge(obj, fields) {
|
|
25
34
|
if (!("$deepmerge" in fields))
|
|
@@ -68,7 +77,10 @@ function mainUpdate(obj, fields) {
|
|
|
68
77
|
},
|
|
69
78
|
merge: (item, updater) => {
|
|
70
79
|
if (Array.isArray(item) && Array.isArray(updater)) {
|
|
71
|
-
return [
|
|
80
|
+
return [
|
|
81
|
+
...item,
|
|
82
|
+
...updater,
|
|
83
|
+
];
|
|
72
84
|
}
|
|
73
85
|
if (typeof item === "object" &&
|
|
74
86
|
typeof updater === "object" &&
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "0.
|
|
1
|
+
export declare const version = "0.12.2";
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = "0.12.
|
|
1
|
+
export const version = "0.12.2";
|