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.
@@ -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
- \tjson2hex '[json input]'
49
- \tjson2diag '[json input]'
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
- \tjson2hex '[json input]'
71
- \tjson2diag '[json input]'
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
- \tjson2hex '[json input]'
89
- \tjson2diag '[json input]'
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
- it(`hex2json${ stdin ? ' (stdin)' : '' }`, async () => {
99
- const {stdout, stderr} = stdin ? await execBin('hex2json a3616101616282020365736d696c6564f09f9880') : await execBin('hex2json', 'a3616101616282020365736d696c6564f09f9880');
100
- assert.strictEqual(stderr, '');
101
- assert.strictEqual(stdout, '{"a":1,"b":[2,3],"smile":"\uD83D\uDE00"}\n');
102
- });
103
- it(`hex2json pretty${ stdin ? ' (stdin)' : '' }`, async () => {
104
- const {stdout, stderr} = stdin ? await execBin('hex2json --pretty a3616101616282020365736d696c6564f09f9880') : await execBin('hex2json --pretty', 'a3616101616282020365736d696c6564f09f9880');
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('hex2diag a4616101616282020363627566440102036165736d696c6564f09f9880') : await execBin('hex2diag', 'a4616101616282020363627566440102036165736d696c6564f09f9880');
202
+ const {stdout, stderr} = !stdin ? await execBin(`hex2diag ${ fixture2HexString }`) : await execBin('hex2diag', fixture2HexString);
118
203
  assert.strictEqual(stderr, '');
119
- assert.strictEqual(stdout, `a4 # map(4)
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(`hex2bin${ stdin ? ' (stdin)' : '' }`, async () => {
139
- const {stdout, stderr} = stdin ? await execBin('hex2bin a3616101616282020365736d696c6564f09f9880') : await execBin('hex2bin', 'a3616101616282020365736d696c6564f09f9880');
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, new TextDecoder().decode(fromHex('a3616101616282020365736d696c6564f09f9880')));
209
+ assert.strictEqual(stdout, `${ fixture1JsonString }\n`);
142
210
  });
143
- it(`json2hex${ stdin ? ' (stdin)' : '' }`, async () => {
144
- const {stdout, stderr} = stdin ? await execBin('json2hex "{\\"a\\":1,\\"b\\":[2,3],\\"smile\\":\\"\uD83D\uDE00\\"}"') : await execBin('json2hex', '{"a":1,"b":[2,3],"smile":"\uD83D\uDE00"}');
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, 'a3616101616282020365736d696c6564f09f9880\n');
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', '{"a":1,"b":[2,3],"smile":"\uD83D\uDE00"}');
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, new TextDecoder().decode(fromHex('a3616101616282020365736d696c6564f09f9880')));
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', '{"a":1,"b":[2,3],"smile":"\uD83D\uDE00"}');
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, `a3 # map(3)
157
- 61 # string(1)
158
- 61 # "a"
159
- 01 # uint(1)
160
- 61 # string(1)
161
- 62 # "b"
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
@@ -39,6 +39,7 @@ export interface DecodeOptions {
39
39
  allowBigInt?: boolean
40
40
  strict?: boolean
41
41
  useMaps?: boolean
42
+ retainStringBytes?: boolean
42
43
  tags?: TagDecoder[],
43
44
  tokenizer?: DecodeTokenizer
44
45
  }
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
- return new Token(Type.string, toString(data, pos + prefix, pos + totLength), totLength)
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} _options
34
+ * @param {DecodeOptions} options
30
35
  * @returns {Token}
31
36
  */
32
- export function decodeStringCompact (data, pos, minor, _options) {
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('\tjson2hex \'[json input]\'')
21
- console.error('\tjson2diag \'[json input]\'')
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 'hex2json': {
63
- const { argv, pretty } = argvPretty()
64
- const bin = fromHex(argv.length < 4 ? (await fromStdin()).toString() : argv[3])
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 'bin2diag': {
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()) : new TextEncoder().encode(process.argv[3])
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 'json2hex': {
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 console.log(toHex(encode(obj)))
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 'json2bin': {
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 process.stdout.write(encode(obj))
148
+ return console.log(toHex(encode(obj)))
124
149
  }
125
150
 
126
151
  default: { // no, or unknown cmd