@gmod/trix 2.0.1 → 2.0.4
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/CHANGELOG.md +13 -0
- package/dist/index.js +9 -22
- package/dist/index.js.map +1 -1
- package/esm/index.js +8 -8
- package/esm/index.js.map +1 -1
- package/package.json +5 -4
- package/src/index.ts +163 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
# v2.0.4
|
|
2
|
+
|
|
3
|
+
- Fixes the ability to search for the first word in an index
|
|
4
|
+
|
|
5
|
+
# v2.0.3
|
|
6
|
+
|
|
7
|
+
- Better support adjustable prefix sizes by basing the prefix as the remainder
|
|
8
|
+
of the line length - hex address size
|
|
9
|
+
|
|
10
|
+
# v2.0.2
|
|
11
|
+
|
|
12
|
+
- Publish src directory for better source maps
|
|
13
|
+
|
|
1
14
|
# v2.0.1
|
|
2
15
|
|
|
3
16
|
- Redeploy to npm with preversion script added
|
package/dist/index.js
CHANGED
|
@@ -46,25 +46,11 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
46
46
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
47
|
}
|
|
48
48
|
};
|
|
49
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
50
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
51
|
-
if (!m) return o;
|
|
52
|
-
var i = m.call(o), r, ar = [], e;
|
|
53
|
-
try {
|
|
54
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
55
|
-
}
|
|
56
|
-
catch (error) { e = { error: error }; }
|
|
57
|
-
finally {
|
|
58
|
-
try {
|
|
59
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
60
|
-
}
|
|
61
|
-
finally { if (e) throw e.error; }
|
|
62
|
-
}
|
|
63
|
-
return ar;
|
|
64
|
-
};
|
|
65
49
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
66
|
-
var TRIX_PREFIX_SIZE = 5;
|
|
67
50
|
var CHUNK_SIZE = 65536;
|
|
51
|
+
// this is the number of hex characters to use for the address in ixixx, see
|
|
52
|
+
// https://github.com/GMOD/ixixx-js/blob/master/src/index.ts#L182
|
|
53
|
+
var ADDRESS_SIZE = 10;
|
|
68
54
|
// https://stackoverflow.com/a/9229821/2129219
|
|
69
55
|
function uniqBy(a, key) {
|
|
70
56
|
var seen = new Set();
|
|
@@ -124,7 +110,7 @@ var Trix = /** @class */ (function () {
|
|
|
124
110
|
return match;
|
|
125
111
|
})
|
|
126
112
|
.map(function (line) {
|
|
127
|
-
var _a =
|
|
113
|
+
var _a = line.split(' '), term = _a[0], parts = _a.slice(1);
|
|
128
114
|
return parts.map(function (elt) { return [term, elt.split(',')[0]]; });
|
|
129
115
|
})
|
|
130
116
|
.flat();
|
|
@@ -181,8 +167,9 @@ var Trix = /** @class */ (function () {
|
|
|
181
167
|
.split('\n')
|
|
182
168
|
.filter(function (f) { return !!f; })
|
|
183
169
|
.map(function (line) {
|
|
184
|
-
var
|
|
185
|
-
var
|
|
170
|
+
var p = line.length - ADDRESS_SIZE;
|
|
171
|
+
var prefix = line.slice(0, p);
|
|
172
|
+
var posStr = line.slice(p);
|
|
186
173
|
var pos = Number.parseInt(posStr, 16);
|
|
187
174
|
return [prefix, pos];
|
|
188
175
|
})];
|
|
@@ -202,9 +189,9 @@ var Trix = /** @class */ (function () {
|
|
|
202
189
|
case 1:
|
|
203
190
|
indexes = _a.sent();
|
|
204
191
|
indexes.forEach(function (_a) {
|
|
205
|
-
var
|
|
192
|
+
var key = _a[0], value = _a[1];
|
|
206
193
|
var trimmedKey = key.slice(0, searchWord.length);
|
|
207
|
-
if (trimmedKey
|
|
194
|
+
if (trimmedKey <= searchWord) {
|
|
208
195
|
seekPosStart = value;
|
|
209
196
|
seekPosEnd = value + 65536;
|
|
210
197
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/esm/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const TRIX_PREFIX_SIZE = 5;
|
|
4
1
|
const CHUNK_SIZE = 65536;
|
|
2
|
+
// this is the number of hex characters to use for the address in ixixx, see
|
|
3
|
+
// https://github.com/GMOD/ixixx-js/blob/master/src/index.ts#L182
|
|
4
|
+
const ADDRESS_SIZE = 10;
|
|
5
5
|
// https://stackoverflow.com/a/9229821/2129219
|
|
6
6
|
function uniqBy(a, key) {
|
|
7
7
|
const seen = new Set();
|
|
@@ -10,7 +10,7 @@ function uniqBy(a, key) {
|
|
|
10
10
|
return seen.has(k) ? false : seen.add(k);
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
|
-
class Trix {
|
|
13
|
+
export default class Trix {
|
|
14
14
|
constructor(ixxFile, ixFile, maxResults = 20) {
|
|
15
15
|
this.ixFile = ixFile;
|
|
16
16
|
this.ixxFile = ixxFile;
|
|
@@ -88,8 +88,9 @@ class Trix {
|
|
|
88
88
|
.split('\n')
|
|
89
89
|
.filter(f => !!f)
|
|
90
90
|
.map(line => {
|
|
91
|
-
const
|
|
92
|
-
const
|
|
91
|
+
const p = line.length - ADDRESS_SIZE;
|
|
92
|
+
const prefix = line.slice(0, p);
|
|
93
|
+
const posStr = line.slice(p);
|
|
93
94
|
const pos = Number.parseInt(posStr, 16);
|
|
94
95
|
return [prefix, pos];
|
|
95
96
|
});
|
|
@@ -100,7 +101,7 @@ class Trix {
|
|
|
100
101
|
const indexes = await this.getIndex(opts);
|
|
101
102
|
indexes.forEach(([key, value]) => {
|
|
102
103
|
const trimmedKey = key.slice(0, searchWord.length);
|
|
103
|
-
if (trimmedKey
|
|
104
|
+
if (trimmedKey <= searchWord) {
|
|
104
105
|
seekPosStart = value;
|
|
105
106
|
seekPosEnd = value + 65536;
|
|
106
107
|
}
|
|
@@ -117,5 +118,4 @@ class Trix {
|
|
|
117
118
|
};
|
|
118
119
|
}
|
|
119
120
|
}
|
|
120
|
-
exports.default = Trix;
|
|
121
121
|
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.0.
|
|
2
|
+
"version": "2.0.4",
|
|
3
3
|
"license": "Apache-2.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "esm/index.js",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
8
|
-
"esm"
|
|
8
|
+
"esm",
|
|
9
|
+
"src"
|
|
9
10
|
],
|
|
10
11
|
"engines": {
|
|
11
12
|
"node": ">=10"
|
|
@@ -13,8 +14,8 @@
|
|
|
13
14
|
"scripts": {
|
|
14
15
|
"lint": "eslint --report-unused-disable-directives --max-warnings 0 --ext .js,.ts src ",
|
|
15
16
|
"prebuild": "rimraf dist esm",
|
|
16
|
-
"build:esm": "tsc --target es2018 --outDir esm",
|
|
17
|
-
"build:es5": "tsc --target es5 --outDir dist",
|
|
17
|
+
"build:esm": "tsc --target es2018 --outDir esm --module es2020",
|
|
18
|
+
"build:es5": "tsc --target es5 --outDir dist --module commonjs",
|
|
18
19
|
"build": "npm run build:esm && npm run build:es5",
|
|
19
20
|
"preversion": "npm run lint && npm test && npm run build",
|
|
20
21
|
"postversion": "git push --follow-tags",
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import type { GenericFilehandle } from 'generic-filehandle'
|
|
2
|
+
|
|
3
|
+
const CHUNK_SIZE = 65536
|
|
4
|
+
|
|
5
|
+
// this is the number of hex characters to use for the address in ixixx, see
|
|
6
|
+
// https://github.com/GMOD/ixixx-js/blob/master/src/index.ts#L182
|
|
7
|
+
const ADDRESS_SIZE = 10
|
|
8
|
+
|
|
9
|
+
// https://stackoverflow.com/a/9229821/2129219
|
|
10
|
+
function uniqBy(a: [string, string][], key: (elt: [string, string]) => string) {
|
|
11
|
+
const seen = new Set()
|
|
12
|
+
return a.filter(item => {
|
|
13
|
+
const k = key(item)
|
|
14
|
+
return seen.has(k) ? false : seen.add(k)
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default class Trix {
|
|
19
|
+
private ixFile: GenericFilehandle
|
|
20
|
+
|
|
21
|
+
private ixxFile: GenericFilehandle
|
|
22
|
+
|
|
23
|
+
maxResults: number
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
ixxFile: GenericFilehandle,
|
|
27
|
+
ixFile: GenericFilehandle,
|
|
28
|
+
maxResults = 20,
|
|
29
|
+
) {
|
|
30
|
+
this.ixFile = ixFile
|
|
31
|
+
this.ixxFile = ixxFile
|
|
32
|
+
this.maxResults = maxResults
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async search(searchString: string, opts?: { signal?: AbortSignal }) {
|
|
36
|
+
let resultArr = [] as [string, string][]
|
|
37
|
+
const searchWords = searchString.split(' ')
|
|
38
|
+
|
|
39
|
+
// we only search one word at a time
|
|
40
|
+
const searchWord = searchWords[0].toLowerCase()
|
|
41
|
+
const res = await this._getBuffer(searchWord, opts)
|
|
42
|
+
if (!res) {
|
|
43
|
+
return []
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let { seekPosEnd, buffer } = res
|
|
47
|
+
let done = false
|
|
48
|
+
while (!done) {
|
|
49
|
+
let foundSomething = false
|
|
50
|
+
const str = buffer.toString()
|
|
51
|
+
|
|
52
|
+
// slice to lastIndexOf('\n') to make sure we get complete records
|
|
53
|
+
// since the buffer fetch could get halfway into a record
|
|
54
|
+
const lines = str
|
|
55
|
+
.slice(0, str.lastIndexOf('\n'))
|
|
56
|
+
.split('\n')
|
|
57
|
+
.filter(f => !!f)
|
|
58
|
+
|
|
59
|
+
const hits = lines
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-loop-func
|
|
61
|
+
.filter(line => {
|
|
62
|
+
const word = line.split(' ')[0]
|
|
63
|
+
const match = word.startsWith(searchWord)
|
|
64
|
+
if (!foundSomething && match) {
|
|
65
|
+
foundSomething = true
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// we are done scanning if we are lexicographically greater than the
|
|
69
|
+
// search string
|
|
70
|
+
if (word > searchWord) {
|
|
71
|
+
done = true
|
|
72
|
+
}
|
|
73
|
+
return match
|
|
74
|
+
})
|
|
75
|
+
.map(line => {
|
|
76
|
+
const [term, ...parts] = line.split(' ')
|
|
77
|
+
return parts.map(elt => [term, elt.split(',')[0]])
|
|
78
|
+
})
|
|
79
|
+
.flat() as [string, string][]
|
|
80
|
+
|
|
81
|
+
// if we are not done, and we haven't filled up maxResults with hits yet,
|
|
82
|
+
// then refetch
|
|
83
|
+
if (resultArr.length + hits.length < this.maxResults && !done) {
|
|
84
|
+
// eslint-disable-next-line no-await-in-loop
|
|
85
|
+
const res2 = await this.ixFile.read(
|
|
86
|
+
Buffer.alloc(CHUNK_SIZE),
|
|
87
|
+
0,
|
|
88
|
+
CHUNK_SIZE,
|
|
89
|
+
seekPosEnd,
|
|
90
|
+
opts,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
// early break if empty response
|
|
94
|
+
if (!res2.bytesRead) {
|
|
95
|
+
resultArr = resultArr.concat(hits)
|
|
96
|
+
break
|
|
97
|
+
}
|
|
98
|
+
buffer = Buffer.concat([buffer, res2.buffer])
|
|
99
|
+
seekPosEnd += CHUNK_SIZE
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// if we have filled up the hits, or we are detected to be done via the
|
|
103
|
+
// filtering, then return
|
|
104
|
+
else if (resultArr.length + hits.length >= this.maxResults || done) {
|
|
105
|
+
resultArr = resultArr.concat(hits)
|
|
106
|
+
break
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// deduplicate results based on the detail column (resultArr[1])
|
|
111
|
+
return uniqBy(resultArr, elt => elt[1]).slice(0, this.maxResults)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private async getIndex(opts?: { signal?: AbortSignal }) {
|
|
115
|
+
const file = await this.ixxFile.readFile({
|
|
116
|
+
encoding: 'utf8',
|
|
117
|
+
...opts,
|
|
118
|
+
})
|
|
119
|
+
return file
|
|
120
|
+
.split('\n')
|
|
121
|
+
.filter(f => !!f)
|
|
122
|
+
.map(line => {
|
|
123
|
+
const p = line.length - ADDRESS_SIZE
|
|
124
|
+
const prefix = line.slice(0, p)
|
|
125
|
+
const posStr = line.slice(p)
|
|
126
|
+
const pos = Number.parseInt(posStr, 16)
|
|
127
|
+
return [prefix, pos] as [string, number]
|
|
128
|
+
})
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private async _getBuffer(
|
|
132
|
+
searchWord: string,
|
|
133
|
+
opts?: { signal?: AbortSignal },
|
|
134
|
+
) {
|
|
135
|
+
let seekPosStart = 0
|
|
136
|
+
let seekPosEnd = -1
|
|
137
|
+
const indexes = await this.getIndex(opts)
|
|
138
|
+
indexes.forEach(([key, value]) => {
|
|
139
|
+
const trimmedKey = key.slice(0, searchWord.length)
|
|
140
|
+
if (trimmedKey <= searchWord) {
|
|
141
|
+
seekPosStart = value
|
|
142
|
+
seekPosEnd = value + 65536
|
|
143
|
+
}
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
// Return the buffer and its end position in the file.
|
|
147
|
+
const len = seekPosEnd - seekPosStart
|
|
148
|
+
if (len < 0) {
|
|
149
|
+
return undefined
|
|
150
|
+
}
|
|
151
|
+
const res = await this.ixFile.read(
|
|
152
|
+
Buffer.alloc(len),
|
|
153
|
+
0,
|
|
154
|
+
len,
|
|
155
|
+
seekPosStart,
|
|
156
|
+
opts,
|
|
157
|
+
)
|
|
158
|
+
return {
|
|
159
|
+
...res,
|
|
160
|
+
seekPosEnd,
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|