cborg 1.6.2 → 1.8.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/README.md +108 -11
- package/cjs/browser-test/node-test-bin.js +186 -117
- package/cjs/lib/3string.js +12 -8
- package/cjs/lib/bin.js +39 -23
- package/cjs/lib/diagnostic.js +49 -5
- package/cjs/lib/token.js +1 -0
- package/cjs/node-test/node-test-bin.js +186 -117
- package/esm/browser-test/node-test-bin.js +186 -117
- package/esm/lib/3string.js +16 -9
- package/esm/lib/bin.js +43 -24
- package/esm/lib/diagnostic.js +54 -7
- package/esm/lib/token.js +1 -0
- package/esm/node-test/node-test-bin.js +186 -117
- package/interface.ts +1 -0
- package/lib/3string.js +15 -10
- package/lib/bin.js +52 -27
- package/lib/diagnostic.js +66 -10
- package/lib/token.js +2 -0
- package/package.json +2 -2
- package/test/node-test-bin.js +228 -138
- package/types/interface.d.ts +1 -0
- package/types/interface.d.ts.map +1 -1
- package/types/lib/3string.d.ts +2 -2
- package/types/lib/3string.d.ts.map +1 -1
- package/types/lib/diagnostic.d.ts +6 -0
- package/types/lib/diagnostic.d.ts.map +1 -1
- package/types/lib/token.d.ts +2 -0
- package/types/lib/token.d.ts.map +1 -1
|
@@ -2,9 +2,56 @@ import chai from 'chai';
|
|
|
2
2
|
import { exec } from 'child_process';
|
|
3
3
|
import process from 'process';
|
|
4
4
|
import path from 'path';
|
|
5
|
+
import { platform } from 'os';
|
|
5
6
|
import { fileURLToPath } from 'url';
|
|
6
7
|
import bin from '../lib/bin.js';
|
|
7
8
|
const {assert} = chai;
|
|
9
|
+
const fixture1JsonString = '{"a":1,"b":[2,3],"smile":"\uD83D\uDE00"}';
|
|
10
|
+
const fixture1JsonPrettyString = `{
|
|
11
|
+
"a": 1,
|
|
12
|
+
"b": [
|
|
13
|
+
2,
|
|
14
|
+
3
|
|
15
|
+
],
|
|
16
|
+
"smile": "😀"
|
|
17
|
+
}
|
|
18
|
+
`;
|
|
19
|
+
const fixture1HexString = 'a3616101616282020365736d696c6564f09f9880';
|
|
20
|
+
const fixture1Bin = fromHex(fixture1HexString);
|
|
21
|
+
const fixture1BinString = new TextDecoder().decode(fixture1Bin);
|
|
22
|
+
const fixture1DiagnosticString = `a3 # map(3)
|
|
23
|
+
61 # string(1)
|
|
24
|
+
61 # "a"
|
|
25
|
+
01 # uint(1)
|
|
26
|
+
61 # string(1)
|
|
27
|
+
62 # "b"
|
|
28
|
+
82 # array(2)
|
|
29
|
+
02 # uint(2)
|
|
30
|
+
03 # uint(3)
|
|
31
|
+
65 # string(5)
|
|
32
|
+
736d696c65 # "smile"
|
|
33
|
+
64 # string(2)
|
|
34
|
+
f09f9880 # "😀"
|
|
35
|
+
`;
|
|
36
|
+
const fixture2HexString = 'a4616101616282020363627566440102036165736d696c6564f09f9880';
|
|
37
|
+
const fixture2DiagnosticString = `a4 # map(4)
|
|
38
|
+
61 # string(1)
|
|
39
|
+
61 # "a"
|
|
40
|
+
01 # uint(1)
|
|
41
|
+
61 # string(1)
|
|
42
|
+
62 # "b"
|
|
43
|
+
82 # array(2)
|
|
44
|
+
02 # uint(2)
|
|
45
|
+
03 # uint(3)
|
|
46
|
+
63 # string(3)
|
|
47
|
+
627566 # "buf"
|
|
48
|
+
44 # bytes(4)
|
|
49
|
+
01020361 # "\\x01\\x02\\x03a"
|
|
50
|
+
65 # string(5)
|
|
51
|
+
736d696c65 # "smile"
|
|
52
|
+
64 # string(2)
|
|
53
|
+
f09f9880 # "😀"
|
|
54
|
+
`;
|
|
8
55
|
const binPath = path.join(path.dirname(fileURLToPath(import.meta.url)), '../lib/bin.js');
|
|
9
56
|
function fromHex(hex) {
|
|
10
57
|
return new Uint8Array(hex.split('').map((c, i, d) => i % 2 === 0 ? `0x${ c }${ d[i + 1] }` : '').filter(Boolean).map(e => parseInt(e, 16)));
|
|
@@ -39,15 +86,18 @@ describe('Bin', () => {
|
|
|
39
86
|
assert.strictEqual(e.stdout, '');
|
|
40
87
|
assert.strictEqual(e.stderr, `Usage: cborg <command> <args>
|
|
41
88
|
Valid commands:
|
|
42
|
-
\thex2diag [hex input]
|
|
43
|
-
\thex2bin [hex input]
|
|
44
|
-
\thex2json [--pretty] [hex input]
|
|
45
|
-
\tbin2hex [binary input]
|
|
46
89
|
\tbin2diag [binary input]
|
|
90
|
+
\tbin2hex [binary input]
|
|
47
91
|
\tbin2json [--pretty] [binary input]
|
|
48
|
-
\
|
|
49
|
-
\
|
|
92
|
+
\tdiag2bin [diagnostic input]
|
|
93
|
+
\tdiag2hex [diagnostic input]
|
|
94
|
+
\tdiag2json [--pretty] [diagnostic input]
|
|
95
|
+
\thex2bin [hex input]
|
|
96
|
+
\thex2diag [hex input]
|
|
97
|
+
\thex2json [--pretty] [hex input]
|
|
50
98
|
\tjson2bin '[json input]'
|
|
99
|
+
\tjson2diag '[json input]'
|
|
100
|
+
\tjson2hex '[json input]'
|
|
51
101
|
Input may either be supplied as an argument or piped via stdin
|
|
52
102
|
`);
|
|
53
103
|
}
|
|
@@ -61,15 +111,18 @@ Input may either be supplied as an argument or piped via stdin
|
|
|
61
111
|
assert.strictEqual(e.stderr, `Unknown command: 'blip'
|
|
62
112
|
Usage: cborg <command> <args>
|
|
63
113
|
Valid commands:
|
|
64
|
-
\thex2diag [hex input]
|
|
65
|
-
\thex2bin [hex input]
|
|
66
|
-
\thex2json [--pretty] [hex input]
|
|
67
|
-
\tbin2hex [binary input]
|
|
68
114
|
\tbin2diag [binary input]
|
|
115
|
+
\tbin2hex [binary input]
|
|
69
116
|
\tbin2json [--pretty] [binary input]
|
|
70
|
-
\
|
|
71
|
-
\
|
|
117
|
+
\tdiag2bin [diagnostic input]
|
|
118
|
+
\tdiag2hex [diagnostic input]
|
|
119
|
+
\tdiag2json [--pretty] [diagnostic input]
|
|
120
|
+
\thex2bin [hex input]
|
|
121
|
+
\thex2diag [hex input]
|
|
122
|
+
\thex2json [--pretty] [hex input]
|
|
72
123
|
\tjson2bin '[json input]'
|
|
124
|
+
\tjson2diag '[json input]'
|
|
125
|
+
\tjson2hex '[json input]'
|
|
73
126
|
Input may either be supplied as an argument or piped via stdin
|
|
74
127
|
`);
|
|
75
128
|
}
|
|
@@ -79,137 +132,103 @@ Input may either be supplied as an argument or piped via stdin
|
|
|
79
132
|
assert.strictEqual(stdout, '');
|
|
80
133
|
assert.strictEqual(stderr, `Usage: cborg <command> <args>
|
|
81
134
|
Valid commands:
|
|
82
|
-
\thex2diag [hex input]
|
|
83
|
-
\thex2bin [hex input]
|
|
84
|
-
\thex2json [--pretty] [hex input]
|
|
85
|
-
\tbin2hex [binary input]
|
|
86
135
|
\tbin2diag [binary input]
|
|
136
|
+
\tbin2hex [binary input]
|
|
87
137
|
\tbin2json [--pretty] [binary input]
|
|
88
|
-
\
|
|
89
|
-
\
|
|
138
|
+
\tdiag2bin [diagnostic input]
|
|
139
|
+
\tdiag2hex [diagnostic input]
|
|
140
|
+
\tdiag2json [--pretty] [diagnostic input]
|
|
141
|
+
\thex2bin [hex input]
|
|
142
|
+
\thex2diag [hex input]
|
|
143
|
+
\thex2json [--pretty] [hex input]
|
|
90
144
|
\tjson2bin '[json input]'
|
|
145
|
+
\tjson2diag '[json input]'
|
|
146
|
+
\tjson2hex '[json input]'
|
|
91
147
|
Input may either be supplied as an argument or piped via stdin
|
|
92
148
|
`);
|
|
93
149
|
});
|
|
150
|
+
it('bin2diag (stdin)', async () => {
|
|
151
|
+
const {stdout, stderr} = await execBin('bin2diag', fixture1Bin);
|
|
152
|
+
assert.strictEqual(stderr, '');
|
|
153
|
+
assert.strictEqual(stdout, fixture1DiagnosticString);
|
|
154
|
+
});
|
|
155
|
+
it('bin2hex (stdin)', async () => {
|
|
156
|
+
const {stdout, stderr} = await execBin('bin2hex', fixture1Bin);
|
|
157
|
+
assert.strictEqual(stderr, '');
|
|
158
|
+
assert.strictEqual(stdout, `${ fixture1HexString }\n`);
|
|
159
|
+
});
|
|
160
|
+
it('bin2json (stdin)', async () => {
|
|
161
|
+
const {stdout, stderr} = await execBin('bin2json', fixture1Bin);
|
|
162
|
+
assert.strictEqual(stderr, '');
|
|
163
|
+
assert.strictEqual(stdout, `${ fixture1JsonString }\n`);
|
|
164
|
+
});
|
|
165
|
+
it('bin2json pretty (stdin)', async () => {
|
|
166
|
+
const {stdout, stderr} = await execBin('bin2json --pretty', fixture1Bin);
|
|
167
|
+
assert.strictEqual(stderr, '');
|
|
168
|
+
assert.strictEqual(stdout, fixture1JsonPrettyString);
|
|
169
|
+
});
|
|
94
170
|
for (const stdin of [
|
|
95
171
|
true,
|
|
96
172
|
false
|
|
97
173
|
]) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
174
|
+
if (platform() !== 'win32' || stdin) {
|
|
175
|
+
it(`diag2bin${ stdin ? ' (stdin)' : '' }`, async () => {
|
|
176
|
+
const {stdout, stderr} = !stdin ? await execBin(`diag2bin '${ fixture1DiagnosticString }'`) : await execBin('diag2bin', fixture1DiagnosticString);
|
|
177
|
+
assert.strictEqual(stderr, '');
|
|
178
|
+
assert.strictEqual(stdout, fixture1BinString);
|
|
179
|
+
});
|
|
180
|
+
it(`diag2hex${ stdin ? ' (stdin)' : '' }`, async () => {
|
|
181
|
+
const {stdout, stderr} = !stdin ? await execBin(`diag2hex '${ fixture1DiagnosticString }'`) : await execBin('diag2hex', fixture1DiagnosticString);
|
|
182
|
+
assert.strictEqual(stderr, '');
|
|
183
|
+
assert.strictEqual(stdout, `${ fixture1HexString }\n`);
|
|
184
|
+
});
|
|
185
|
+
it(`diag2json${ stdin ? ' (stdin)' : '' }`, async () => {
|
|
186
|
+
const {stdout, stderr} = !stdin ? await execBin(`diag2json '${ fixture1DiagnosticString }'`) : await execBin('diag2json', fixture1DiagnosticString);
|
|
187
|
+
assert.strictEqual(stderr, '');
|
|
188
|
+
assert.strictEqual(stdout, `${ fixture1JsonString }\n`);
|
|
189
|
+
});
|
|
190
|
+
it(`diag2json pretty${ stdin ? ' (stdin)' : '' }`, async () => {
|
|
191
|
+
const {stdout, stderr} = !stdin ? await execBin(`diag2json --pretty '${ fixture1DiagnosticString }'`) : await execBin('diag2json --pretty', fixture1DiagnosticString);
|
|
192
|
+
assert.strictEqual(stderr, '');
|
|
193
|
+
assert.strictEqual(stdout, fixture1JsonPrettyString);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
it(`hex2bin${ stdin ? ' (stdin)' : '' }`, async () => {
|
|
197
|
+
const {stdout, stderr} = !stdin ? await execBin(`hex2bin ${ fixture1HexString }`) : await execBin('hex2bin', fixture1HexString);
|
|
105
198
|
assert.strictEqual(stderr, '');
|
|
106
|
-
assert.strictEqual(stdout,
|
|
107
|
-
"a": 1,
|
|
108
|
-
"b": [
|
|
109
|
-
2,
|
|
110
|
-
3
|
|
111
|
-
],
|
|
112
|
-
"smile": "😀"
|
|
113
|
-
}
|
|
114
|
-
`);
|
|
199
|
+
assert.strictEqual(stdout, fixture1BinString);
|
|
115
200
|
});
|
|
116
201
|
it(`hex2diag${ stdin ? ' (stdin)' : '' }`, async () => {
|
|
117
|
-
const {stdout, stderr} = stdin ? await execBin(
|
|
202
|
+
const {stdout, stderr} = !stdin ? await execBin(`hex2diag ${ fixture2HexString }`) : await execBin('hex2diag', fixture2HexString);
|
|
118
203
|
assert.strictEqual(stderr, '');
|
|
119
|
-
assert.strictEqual(stdout,
|
|
120
|
-
61 # string(1)
|
|
121
|
-
61 # "a"
|
|
122
|
-
01 # uint(1)
|
|
123
|
-
61 # string(1)
|
|
124
|
-
62 # "b"
|
|
125
|
-
82 # array(2)
|
|
126
|
-
02 # uint(2)
|
|
127
|
-
03 # uint(3)
|
|
128
|
-
63 # string(3)
|
|
129
|
-
627566 # "buf"
|
|
130
|
-
44 # bytes(4)
|
|
131
|
-
01020361 # "\\x01\\x02\\x03a"
|
|
132
|
-
65 # string(5)
|
|
133
|
-
736d696c65 # "smile"
|
|
134
|
-
64 f09f # string(2)
|
|
135
|
-
f09f9880 # "😀"
|
|
136
|
-
`);
|
|
204
|
+
assert.strictEqual(stdout, fixture2DiagnosticString);
|
|
137
205
|
});
|
|
138
|
-
it(`
|
|
139
|
-
const {stdout, stderr} = stdin ? await execBin(
|
|
206
|
+
it(`hex2json${ stdin ? ' (stdin)' : '' }`, async () => {
|
|
207
|
+
const {stdout, stderr} = !stdin ? await execBin(`hex2json ${ fixture1HexString }`) : await execBin('hex2json', fixture1HexString);
|
|
140
208
|
assert.strictEqual(stderr, '');
|
|
141
|
-
assert.strictEqual(stdout,
|
|
209
|
+
assert.strictEqual(stdout, `${ fixture1JsonString }\n`);
|
|
142
210
|
});
|
|
143
|
-
it(`
|
|
144
|
-
const {stdout, stderr} = stdin ? await execBin(
|
|
211
|
+
it(`hex2json pretty${ stdin ? ' (stdin)' : '' }`, async () => {
|
|
212
|
+
const {stdout, stderr} = !stdin ? await execBin(`hex2json --pretty ${ fixture1HexString }`) : await execBin('hex2json --pretty', fixture1HexString);
|
|
145
213
|
assert.strictEqual(stderr, '');
|
|
146
|
-
assert.strictEqual(stdout,
|
|
214
|
+
assert.strictEqual(stdout, fixture1JsonPrettyString);
|
|
147
215
|
});
|
|
148
216
|
it(`json2bin${ stdin ? ' (stdin)' : '' }`, async () => {
|
|
149
|
-
const {stdout, stderr} = stdin ? await execBin('json2bin "{\\"a\\":1,\\"b\\":[2,3],\\"smile\\":\\"\uD83D\uDE00\\"}"') : await execBin('json2bin',
|
|
217
|
+
const {stdout, stderr} = !stdin ? await execBin('json2bin "{\\"a\\":1,\\"b\\":[2,3],\\"smile\\":\\"\uD83D\uDE00\\"}"') : await execBin('json2bin', fixture1JsonString);
|
|
150
218
|
assert.strictEqual(stderr, '');
|
|
151
|
-
assert.strictEqual(stdout,
|
|
219
|
+
assert.strictEqual(stdout, fixture1BinString);
|
|
152
220
|
});
|
|
153
221
|
it(`json2diag${ stdin ? ' (stdin)' : '' }`, async () => {
|
|
154
|
-
const {stdout, stderr} = stdin ? await execBin('json2diag "{\\"a\\":1,\\"b\\":[2,3],\\"smile\\":\\"\uD83D\uDE00\\"}"') : await execBin('json2diag',
|
|
222
|
+
const {stdout, stderr} = !stdin ? await execBin('json2diag "{\\"a\\":1,\\"b\\":[2,3],\\"smile\\":\\"\uD83D\uDE00\\"}"') : await execBin('json2diag', fixture1JsonString);
|
|
155
223
|
assert.strictEqual(stderr, '');
|
|
156
|
-
assert.strictEqual(stdout,
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
82 # array(2)
|
|
163
|
-
02 # uint(2)
|
|
164
|
-
03 # uint(3)
|
|
165
|
-
65 # string(5)
|
|
166
|
-
736d696c65 # "smile"
|
|
167
|
-
64 f09f # string(2)
|
|
168
|
-
f09f9880 # "😀"
|
|
169
|
-
`);
|
|
224
|
+
assert.strictEqual(stdout, fixture1DiagnosticString);
|
|
225
|
+
});
|
|
226
|
+
it(`json2hex${ stdin ? ' (stdin)' : '' }`, async () => {
|
|
227
|
+
const {stdout, stderr} = !stdin ? await execBin(`json2hex "${ fixture1JsonString.replace(/"/g, '\\"') }"`) : await execBin('json2hex', fixture1JsonString);
|
|
228
|
+
assert.strictEqual(stderr, '');
|
|
229
|
+
assert.strictEqual(stdout, `${ fixture1HexString }\n`);
|
|
170
230
|
});
|
|
171
231
|
}
|
|
172
|
-
it('bin2diag (stdin)', async () => {
|
|
173
|
-
const {stdout, stderr} = await execBin('bin2diag', fromHex('a3616101616282020365736d696c6564f09f9880'));
|
|
174
|
-
assert.strictEqual(stderr, '');
|
|
175
|
-
assert.strictEqual(stdout, `a3 # map(3)
|
|
176
|
-
61 # string(1)
|
|
177
|
-
61 # "a"
|
|
178
|
-
01 # uint(1)
|
|
179
|
-
61 # string(1)
|
|
180
|
-
62 # "b"
|
|
181
|
-
82 # array(2)
|
|
182
|
-
02 # uint(2)
|
|
183
|
-
03 # uint(3)
|
|
184
|
-
65 # string(5)
|
|
185
|
-
736d696c65 # "smile"
|
|
186
|
-
64 f09f # string(2)
|
|
187
|
-
f09f9880 # "😀"
|
|
188
|
-
`);
|
|
189
|
-
});
|
|
190
|
-
it('bin2json (stdin)', async () => {
|
|
191
|
-
const {stdout, stderr} = await execBin('bin2json', fromHex('a3616101616282020365736d696c6564f09f9880'));
|
|
192
|
-
assert.strictEqual(stderr, '');
|
|
193
|
-
assert.strictEqual(stdout, '{"a":1,"b":[2,3],"smile":"\uD83D\uDE00"}\n');
|
|
194
|
-
});
|
|
195
|
-
it('bin2json pretty (stdin)', async () => {
|
|
196
|
-
const {stdout, stderr} = await execBin('bin2json --pretty', fromHex('a3616101616282020365736d696c6564f09f9880'));
|
|
197
|
-
assert.strictEqual(stderr, '');
|
|
198
|
-
assert.strictEqual(stdout, `{
|
|
199
|
-
"a": 1,
|
|
200
|
-
"b": [
|
|
201
|
-
2,
|
|
202
|
-
3
|
|
203
|
-
],
|
|
204
|
-
"smile": "😀"
|
|
205
|
-
}
|
|
206
|
-
`);
|
|
207
|
-
});
|
|
208
|
-
it('bin2hex (stdin)', async () => {
|
|
209
|
-
const {stdout, stderr} = await execBin('bin2hex', fromHex('a3616101616282020365736d696c6564f09f9880'));
|
|
210
|
-
assert.strictEqual(stderr, '');
|
|
211
|
-
assert.strictEqual(stdout, 'a3616101616282020365736d696c6564f09f9880\n');
|
|
212
|
-
});
|
|
213
232
|
it('diag indenting', async () => {
|
|
214
233
|
const {stdout, stderr} = await execBin('json2diag', '{"a":[],"b":{},"c":{"a":1,"b":{"a":{"a":{}}}},"d":{"a":{"a":{"a":1},"b":2,"c":[]}},"e":[[[[{"a":{}}]]]],"f":1}');
|
|
215
234
|
assert.strictEqual(stderr, '');
|
|
@@ -268,4 +287,54 @@ Input may either be supplied as an argument or piped via stdin
|
|
|
268
287
|
01 # uint(1)
|
|
269
288
|
`);
|
|
270
289
|
});
|
|
290
|
+
describe('diag length bytes', () => {
|
|
291
|
+
it('compact', async () => {
|
|
292
|
+
const {stdout, stderr} = await execBin('json2diag', '"aaaaaaaaaaaaaaaaaaaaaaa"');
|
|
293
|
+
assert.strictEqual(stderr, '');
|
|
294
|
+
assert.strictEqual(stdout, `77 # string(23)
|
|
295
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
296
|
+
`);
|
|
297
|
+
});
|
|
298
|
+
it('1-byte', async () => {
|
|
299
|
+
const {stdout, stderr} = await execBin('json2diag', '"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"');
|
|
300
|
+
assert.strictEqual(stderr, '');
|
|
301
|
+
assert.strictEqual(stdout, `78 23 # string(35)
|
|
302
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
303
|
+
616161616161616161616161 # "aaaaaaaaaaaa"
|
|
304
|
+
`);
|
|
305
|
+
});
|
|
306
|
+
it('2-byte', async () => {
|
|
307
|
+
const {stdout, stderr} = await execBin('json2diag', '"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"');
|
|
308
|
+
assert.strictEqual(stderr, '');
|
|
309
|
+
assert.strictEqual(stdout, `79 0100 # string(256)
|
|
310
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
311
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
312
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
313
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
314
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
315
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
316
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
317
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
318
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
319
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
320
|
+
6161616161616161616161616161616161616161616161 # "aaaaaaaaaaaaaaaaaaaaaaa"
|
|
321
|
+
616161 # "aaa"
|
|
322
|
+
`);
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
it('diag non-utf8 and non-printable ascii', async () => {
|
|
326
|
+
const input = '7864f55ff8f12508b63ef2bfeca7557ae90df6311a5ec1631b4a1fa843310bd9c3a710eaace5a1bdd72ad0bfe049771c11e756338bd93865e645f1adec9b9c99ef407fbd4fc6859e7904c5ad7dc9bd10a5cc16973d5b28ec1a6dd43d9f82f9f18c3d03418e35';
|
|
327
|
+
let {stdout, stderr} = await execBin(`hex2diag ${ input }`);
|
|
328
|
+
assert.strictEqual(stderr, '');
|
|
329
|
+
assert.strictEqual(stdout, `78 64 # string(86)
|
|
330
|
+
f55ff8f12508b63ef2bfeca7557ae90df6311a5ec1631b # "õ_øñ%\\x08¶>ò¿ì§Uzé\\x0dö1\\x1a^Ác\\x1b"
|
|
331
|
+
4a1fa843310bd9c3a710eaace5a1bdd72ad0bfe049771c # "J\\x1f¨C1\\x0bÙç\\x10ê¬å¡½×*пàIw\\x1c"
|
|
332
|
+
11e756338bd93865e645f1adec9b9c99ef407fbd4fc685 # "\\x11çV3\\x8bÙ8eæEñ\\xadì\\x9b\\x9c\\x99ï@\\x7f½OÆ\\x85"
|
|
333
|
+
9e7904c5ad7dc9bd10a5cc16973d5b28ec1a6dd43d9f82 # "\\x9ey\\x04Å\\xad}ɽ\\x10¥Ì\\x16\\x97=[(ì\\x1amÔ=\\x9f\\x82"
|
|
334
|
+
f9f18c3d03418e35 # "ùñ\\x8c=\\x03A\\x8e5"
|
|
335
|
+
`);
|
|
336
|
+
({stdout, stderr} = await execBin('diag2hex', stdout));
|
|
337
|
+
assert.strictEqual(stderr, '');
|
|
338
|
+
assert.strictEqual(stdout, `${ input }\n`);
|
|
339
|
+
});
|
|
271
340
|
});
|
package/interface.ts
CHANGED
package/lib/3string.js
CHANGED
|
@@ -2,7 +2,7 @@ import { Token, Type } from './token.js'
|
|
|
2
2
|
import { assertEnoughData, decodeErrPrefix } from './common.js'
|
|
3
3
|
import * as uint from './0uint.js'
|
|
4
4
|
import { encodeBytes } from './2bytes.js'
|
|
5
|
-
import { toString } from './byte-utils.js'
|
|
5
|
+
import { toString, slice } from './byte-utils.js'
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* @typedef {import('./bl.js').Bl} Bl
|
|
@@ -14,23 +14,28 @@ import { toString } from './byte-utils.js'
|
|
|
14
14
|
* @param {number} pos
|
|
15
15
|
* @param {number} prefix
|
|
16
16
|
* @param {number} length
|
|
17
|
+
* @param {DecodeOptions} options
|
|
17
18
|
* @returns {Token}
|
|
18
19
|
*/
|
|
19
|
-
function toToken (data, pos, prefix, length) {
|
|
20
|
+
function toToken (data, pos, prefix, length, options) {
|
|
20
21
|
const totLength = prefix + length
|
|
21
22
|
assertEnoughData(data, pos, totLength)
|
|
22
|
-
|
|
23
|
+
const tok = new Token(Type.string, toString(data, pos + prefix, pos + totLength), totLength)
|
|
24
|
+
if (options.retainStringBytes === true) {
|
|
25
|
+
tok.byteValue = slice(data, pos + prefix, pos + totLength)
|
|
26
|
+
}
|
|
27
|
+
return tok
|
|
23
28
|
}
|
|
24
29
|
|
|
25
30
|
/**
|
|
26
31
|
* @param {Uint8Array} data
|
|
27
32
|
* @param {number} pos
|
|
28
33
|
* @param {number} minor
|
|
29
|
-
* @param {DecodeOptions}
|
|
34
|
+
* @param {DecodeOptions} options
|
|
30
35
|
* @returns {Token}
|
|
31
36
|
*/
|
|
32
|
-
export function decodeStringCompact (data, pos, minor,
|
|
33
|
-
return toToken(data, pos, 1, minor)
|
|
37
|
+
export function decodeStringCompact (data, pos, minor, options) {
|
|
38
|
+
return toToken(data, pos, 1, minor, options)
|
|
34
39
|
}
|
|
35
40
|
|
|
36
41
|
/**
|
|
@@ -41,7 +46,7 @@ export function decodeStringCompact (data, pos, minor, _options) {
|
|
|
41
46
|
* @returns {Token}
|
|
42
47
|
*/
|
|
43
48
|
export function decodeString8 (data, pos, _minor, options) {
|
|
44
|
-
return toToken(data, pos, 2, uint.readUint8(data, pos + 1, options))
|
|
49
|
+
return toToken(data, pos, 2, uint.readUint8(data, pos + 1, options), options)
|
|
45
50
|
}
|
|
46
51
|
|
|
47
52
|
/**
|
|
@@ -52,7 +57,7 @@ export function decodeString8 (data, pos, _minor, options) {
|
|
|
52
57
|
* @returns {Token}
|
|
53
58
|
*/
|
|
54
59
|
export function decodeString16 (data, pos, _minor, options) {
|
|
55
|
-
return toToken(data, pos, 3, uint.readUint16(data, pos + 1, options))
|
|
60
|
+
return toToken(data, pos, 3, uint.readUint16(data, pos + 1, options), options)
|
|
56
61
|
}
|
|
57
62
|
|
|
58
63
|
/**
|
|
@@ -63,7 +68,7 @@ export function decodeString16 (data, pos, _minor, options) {
|
|
|
63
68
|
* @returns {Token}
|
|
64
69
|
*/
|
|
65
70
|
export function decodeString32 (data, pos, _minor, options) {
|
|
66
|
-
return toToken(data, pos, 5, uint.readUint32(data, pos + 1, options))
|
|
71
|
+
return toToken(data, pos, 5, uint.readUint32(data, pos + 1, options), options)
|
|
67
72
|
}
|
|
68
73
|
|
|
69
74
|
// TODO: maybe we shouldn't support this ..
|
|
@@ -79,7 +84,7 @@ export function decodeString64 (data, pos, _minor, options) {
|
|
|
79
84
|
if (typeof l === 'bigint') {
|
|
80
85
|
throw new Error(`${decodeErrPrefix} 64-bit integer string lengths not supported`)
|
|
81
86
|
}
|
|
82
|
-
return toToken(data, pos, 9, l)
|
|
87
|
+
return toToken(data, pos, 9, l, options)
|
|
83
88
|
}
|
|
84
89
|
|
|
85
90
|
export const encodeString = encodeBytes
|
package/lib/bin.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import process from 'process'
|
|
4
4
|
import { decode, encode } from '../cborg.js'
|
|
5
|
-
import { tokensToDiagnostic } from './diagnostic.js'
|
|
5
|
+
import { tokensToDiagnostic, fromDiag } from './diagnostic.js'
|
|
6
6
|
import { fromHex as _fromHex, toHex } from './byte-utils.js'
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -11,15 +11,18 @@ import { fromHex as _fromHex, toHex } from './byte-utils.js'
|
|
|
11
11
|
function usage (code) {
|
|
12
12
|
console.error('Usage: cborg <command> <args>')
|
|
13
13
|
console.error('Valid commands:')
|
|
14
|
-
console.error('\thex2diag [hex input]')
|
|
15
|
-
console.error('\thex2bin [hex input]')
|
|
16
|
-
console.error('\thex2json [--pretty] [hex input]')
|
|
17
|
-
console.error('\tbin2hex [binary input]')
|
|
18
14
|
console.error('\tbin2diag [binary input]')
|
|
15
|
+
console.error('\tbin2hex [binary input]')
|
|
19
16
|
console.error('\tbin2json [--pretty] [binary input]')
|
|
20
|
-
console.error('\
|
|
21
|
-
console.error('\
|
|
17
|
+
console.error('\tdiag2bin [diagnostic input]')
|
|
18
|
+
console.error('\tdiag2hex [diagnostic input]')
|
|
19
|
+
console.error('\tdiag2json [--pretty] [diagnostic input]')
|
|
20
|
+
console.error('\thex2bin [hex input]')
|
|
21
|
+
console.error('\thex2diag [hex input]')
|
|
22
|
+
console.error('\thex2json [--pretty] [hex input]')
|
|
22
23
|
console.error('\tjson2bin \'[json input]\'')
|
|
24
|
+
console.error('\tjson2diag \'[json input]\'')
|
|
25
|
+
console.error('\tjson2hex \'[json input]\'')
|
|
23
26
|
console.error('Input may either be supplied as an argument or piped via stdin')
|
|
24
27
|
process.exit(code || 0)
|
|
25
28
|
}
|
|
@@ -59,26 +62,15 @@ async function run () {
|
|
|
59
62
|
return usage(0)
|
|
60
63
|
}
|
|
61
64
|
|
|
62
|
-
case '
|
|
63
|
-
|
|
64
|
-
const bin =
|
|
65
|
-
return console.log(JSON.stringify(decode(bin), undefined, pretty ? 2 : undefined))
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
case 'hex2diag': {
|
|
69
|
-
const bin = fromHex(process.argv.length < 4 ? (await fromStdin()).toString() : process.argv[3])
|
|
65
|
+
case 'bin2diag': {
|
|
66
|
+
/* c8 ignore next 1 */
|
|
67
|
+
const bin = process.argv.length < 4 ? (await fromStdin()) : new TextEncoder().encode(process.argv[3])
|
|
70
68
|
for (const line of tokensToDiagnostic(bin)) {
|
|
71
69
|
console.log(line)
|
|
72
70
|
}
|
|
73
71
|
return
|
|
74
72
|
}
|
|
75
73
|
|
|
76
|
-
case 'hex2bin': {
|
|
77
|
-
// this is really nothing to do with cbor.. just handy
|
|
78
|
-
const bin = fromHex(process.argv.length < 4 ? (await fromStdin()).toString() : process.argv[3])
|
|
79
|
-
return process.stdout.write(bin)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
74
|
case 'bin2hex': {
|
|
83
75
|
// this is really nothing to do with cbor.. just handy
|
|
84
76
|
/* c8 ignore next 1 */
|
|
@@ -93,19 +85,52 @@ async function run () {
|
|
|
93
85
|
return console.log(JSON.stringify(decode(bin), undefined, pretty ? 2 : undefined))
|
|
94
86
|
}
|
|
95
87
|
|
|
96
|
-
case '
|
|
88
|
+
case 'diag2bin': {
|
|
89
|
+
// no coverage on windows for non-stdin input
|
|
97
90
|
/* c8 ignore next 1 */
|
|
98
|
-
const bin = process.argv.length < 4 ? (await fromStdin()) :
|
|
91
|
+
const bin = fromDiag(process.argv.length < 4 ? (await fromStdin()).toString() : process.argv[3])
|
|
92
|
+
return process.stdout.write(bin)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
case 'diag2hex': {
|
|
96
|
+
// no coverage on windows for non-stdin input
|
|
97
|
+
/* c8 ignore next 1 */
|
|
98
|
+
const bin = fromDiag(process.argv.length < 4 ? (await fromStdin()).toString() : process.argv[3])
|
|
99
|
+
return console.log(toHex(bin))
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
case 'diag2json': {
|
|
103
|
+
const { argv, pretty } = argvPretty()
|
|
104
|
+
// no coverage on windows for non-stdin input
|
|
105
|
+
/* c8 ignore next 1 */
|
|
106
|
+
const bin = fromDiag(argv.length < 4 ? (await fromStdin()).toString() : argv[3])
|
|
107
|
+
return console.log(JSON.stringify(decode(bin), undefined, pretty ? 2 : undefined))
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
case 'hex2bin': {
|
|
111
|
+
// this is really nothing to do with cbor.. just handy
|
|
112
|
+
const bin = fromHex(process.argv.length < 4 ? (await fromStdin()).toString() : process.argv[3])
|
|
113
|
+
return process.stdout.write(bin)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
case 'hex2diag': {
|
|
117
|
+
const bin = fromHex(process.argv.length < 4 ? (await fromStdin()).toString() : process.argv[3])
|
|
99
118
|
for (const line of tokensToDiagnostic(bin)) {
|
|
100
119
|
console.log(line)
|
|
101
120
|
}
|
|
102
121
|
return
|
|
103
122
|
}
|
|
104
123
|
|
|
105
|
-
case '
|
|
124
|
+
case 'hex2json': {
|
|
125
|
+
const { argv, pretty } = argvPretty()
|
|
126
|
+
const bin = fromHex(argv.length < 4 ? (await fromStdin()).toString() : argv[3])
|
|
127
|
+
return console.log(JSON.stringify(decode(bin), undefined, pretty ? 2 : undefined))
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
case 'json2bin': {
|
|
106
131
|
const inp = process.argv.length < 4 ? (await fromStdin()).toString() : process.argv[3]
|
|
107
132
|
const obj = JSON.parse(inp)
|
|
108
|
-
return
|
|
133
|
+
return process.stdout.write(encode(obj))
|
|
109
134
|
}
|
|
110
135
|
|
|
111
136
|
case 'json2diag': {
|
|
@@ -117,10 +142,10 @@ async function run () {
|
|
|
117
142
|
return
|
|
118
143
|
}
|
|
119
144
|
|
|
120
|
-
case '
|
|
145
|
+
case 'json2hex': {
|
|
121
146
|
const inp = process.argv.length < 4 ? (await fromStdin()).toString() : process.argv[3]
|
|
122
147
|
const obj = JSON.parse(inp)
|
|
123
|
-
return
|
|
148
|
+
return console.log(toHex(encode(obj)))
|
|
124
149
|
}
|
|
125
150
|
|
|
126
151
|
default: { // no, or unknown cmd
|