comment-parser 1.2.3 → 1.3.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/CHANGELOG.md +10 -0
- package/browser/index.js +39 -40
- package/es6/parser/index.d.ts +3 -2
- package/es6/parser/index.js +4 -6
- package/es6/parser/source-parser.d.ts +3 -2
- package/es6/parser/source-parser.js +12 -12
- package/es6/parser/tokenizers/description.d.ts +4 -3
- package/es6/parser/tokenizers/description.js +7 -6
- package/es6/parser/tokenizers/tag.d.ts +1 -1
- package/es6/parser/tokenizers/tag.js +1 -1
- package/es6/primitives.d.ts +7 -0
- package/es6/primitives.js +1 -0
- package/es6/transforms/align.d.ts +2 -1
- package/es6/transforms/align.js +7 -7
- package/lib/parser/index.cjs +6 -6
- package/lib/parser/index.cjs.map +1 -1
- package/lib/parser/index.d.ts +3 -2
- package/lib/parser/source-parser.cjs +11 -10
- package/lib/parser/source-parser.cjs.map +1 -1
- package/lib/parser/source-parser.d.ts +3 -2
- package/lib/parser/tokenizers/description.cjs +7 -6
- package/lib/parser/tokenizers/description.cjs.map +1 -1
- package/lib/parser/tokenizers/description.d.ts +4 -3
- package/lib/parser/tokenizers/tag.cjs +1 -1
- package/lib/parser/tokenizers/tag.cjs.map +1 -1
- package/lib/parser/tokenizers/tag.d.ts +1 -1
- package/lib/primitives.cjs +2 -0
- package/lib/primitives.cjs.map +1 -1
- package/lib/primitives.d.ts +7 -0
- package/lib/transforms/align.cjs +7 -7
- package/lib/transforms/align.cjs.map +1 -1
- package/lib/transforms/align.d.ts +2 -1
- package/package.json +6 -6
- package/src/parser/index.ts +6 -7
- package/src/parser/source-parser.ts +14 -12
- package/src/parser/tokenizers/description.ts +11 -8
- package/src/parser/tokenizers/tag.ts +1 -1
- package/src/primitives.ts +8 -0
- package/src/transforms/align.ts +14 -12
- package/tests/e2e/examples.js +1 -1
- package/tests/e2e/parse.spec.js +0 -9
- package/tests/unit/parser.spec.ts +105 -5
- package/tests/unit/source-parser.spec.ts +150 -0
- package/tests/unit/util.spec.ts +10 -0
package/src/transforms/align.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Transform } from './index';
|
|
2
|
-
import {
|
|
2
|
+
import { BlockMarkers, Block, Line, Markers } from '../primitives';
|
|
3
3
|
import { rewireSource } from '../util';
|
|
4
4
|
|
|
5
5
|
interface Width {
|
|
@@ -16,16 +16,18 @@ const zeroWidth = {
|
|
|
16
16
|
name: 0,
|
|
17
17
|
};
|
|
18
18
|
|
|
19
|
-
const getWidth =
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
const getWidth =
|
|
20
|
+
(markers = Markers) =>
|
|
21
|
+
(w: Width, { tokens: t }: Line) => ({
|
|
22
|
+
start: t.delimiter === markers.start ? t.start.length : w.start,
|
|
23
|
+
tag: Math.max(w.tag, t.tag.length),
|
|
24
|
+
type: Math.max(w.type, t.type.length),
|
|
25
|
+
name: Math.max(w.name, t.name.length),
|
|
26
|
+
});
|
|
25
27
|
|
|
26
28
|
const space = (len: number) => ''.padStart(len, ' ');
|
|
27
29
|
|
|
28
|
-
export default function align(): Transform {
|
|
30
|
+
export default function align(markers = Markers): Transform {
|
|
29
31
|
let intoTags = false;
|
|
30
32
|
let w: Width;
|
|
31
33
|
|
|
@@ -40,16 +42,16 @@ export default function align(): Transform {
|
|
|
40
42
|
tokens.description === '';
|
|
41
43
|
|
|
42
44
|
// dangling '*/'
|
|
43
|
-
if (tokens.end ===
|
|
45
|
+
if (tokens.end === markers.end && isEmpty) {
|
|
44
46
|
tokens.start = space(w.start + 1);
|
|
45
47
|
return { ...line, tokens };
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
switch (tokens.delimiter) {
|
|
49
|
-
case
|
|
51
|
+
case markers.start:
|
|
50
52
|
tokens.start = space(w.start);
|
|
51
53
|
break;
|
|
52
|
-
case
|
|
54
|
+
case markers.delim:
|
|
53
55
|
tokens.start = space(w.start + 1);
|
|
54
56
|
break;
|
|
55
57
|
default:
|
|
@@ -101,7 +103,7 @@ export default function align(): Transform {
|
|
|
101
103
|
}
|
|
102
104
|
|
|
103
105
|
return ({ source, ...fields }: Block): Block => {
|
|
104
|
-
w = source.reduce(getWidth, { ...zeroWidth });
|
|
106
|
+
w = source.reduce(getWidth(markers), { ...zeroWidth });
|
|
105
107
|
return rewireSource({ ...fields, source: source.map(update) });
|
|
106
108
|
};
|
|
107
109
|
}
|
package/tests/e2e/examples.js
CHANGED
package/tests/e2e/parse.spec.js
CHANGED
|
@@ -480,15 +480,6 @@ test('description on the first line', () => {
|
|
|
480
480
|
]);
|
|
481
481
|
});
|
|
482
482
|
|
|
483
|
-
test('skip empty blocks', () => {
|
|
484
|
-
const parsed = parse(`
|
|
485
|
-
/**
|
|
486
|
-
*
|
|
487
|
-
*/
|
|
488
|
-
var a`);
|
|
489
|
-
expect(parsed).toHaveLength(0);
|
|
490
|
-
});
|
|
491
|
-
|
|
492
483
|
test('multiple blocks', () => {
|
|
493
484
|
const parsed = parse(`
|
|
494
485
|
/**
|
|
@@ -4,7 +4,7 @@ import { seedTokens } from '../../src/util';
|
|
|
4
4
|
test('block with tags', () => {
|
|
5
5
|
const parsed = getParser()(`
|
|
6
6
|
/**
|
|
7
|
-
* Description may go
|
|
7
|
+
* Description may go\x20
|
|
8
8
|
* over few lines followed by @tags
|
|
9
9
|
* @param {string} name name parameter
|
|
10
10
|
*
|
|
@@ -167,10 +167,10 @@ test('block with tags', () => {
|
|
|
167
167
|
]);
|
|
168
168
|
});
|
|
169
169
|
|
|
170
|
-
test('no source
|
|
170
|
+
test('no source cloning', () => {
|
|
171
171
|
const parsed = getParser()(`
|
|
172
172
|
/**
|
|
173
|
-
* Description may go
|
|
173
|
+
* Description may go\x20
|
|
174
174
|
* over few lines followed by @tags
|
|
175
175
|
* @param {string} name name parameter
|
|
176
176
|
*
|
|
@@ -179,11 +179,111 @@ test('no source clonning', () => {
|
|
|
179
179
|
expect(parsed[0].tags[0].source[0] === parsed[0].source[3]).toBe(true);
|
|
180
180
|
});
|
|
181
181
|
|
|
182
|
+
test('empty multi-line block', () => {
|
|
183
|
+
const parsed = getParser()(`
|
|
184
|
+
/**
|
|
185
|
+
*
|
|
186
|
+
*/`);
|
|
187
|
+
expect(parsed).toEqual([
|
|
188
|
+
{
|
|
189
|
+
description: '',
|
|
190
|
+
tags: [],
|
|
191
|
+
source: [
|
|
192
|
+
{
|
|
193
|
+
number: 1,
|
|
194
|
+
source: ' /**',
|
|
195
|
+
tokens: {
|
|
196
|
+
delimiter: '/**',
|
|
197
|
+
description: '',
|
|
198
|
+
end: '',
|
|
199
|
+
lineEnd: '',
|
|
200
|
+
name: '',
|
|
201
|
+
postDelimiter: '',
|
|
202
|
+
postName: '',
|
|
203
|
+
postTag: '',
|
|
204
|
+
postType: '',
|
|
205
|
+
start: ' ',
|
|
206
|
+
tag: '',
|
|
207
|
+
type: '',
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
number: 2,
|
|
212
|
+
source: ' *',
|
|
213
|
+
tokens: {
|
|
214
|
+
delimiter: '*',
|
|
215
|
+
description: '',
|
|
216
|
+
end: '',
|
|
217
|
+
lineEnd: '',
|
|
218
|
+
name: '',
|
|
219
|
+
postDelimiter: '',
|
|
220
|
+
postName: '',
|
|
221
|
+
postTag: '',
|
|
222
|
+
postType: '',
|
|
223
|
+
start: ' ',
|
|
224
|
+
tag: '',
|
|
225
|
+
type: '',
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
number: 3,
|
|
230
|
+
source: ' */',
|
|
231
|
+
tokens: {
|
|
232
|
+
delimiter: '',
|
|
233
|
+
description: '',
|
|
234
|
+
end: '*/',
|
|
235
|
+
lineEnd: '',
|
|
236
|
+
name: '',
|
|
237
|
+
postDelimiter: '',
|
|
238
|
+
postName: '',
|
|
239
|
+
postTag: '',
|
|
240
|
+
postType: '',
|
|
241
|
+
start: ' ',
|
|
242
|
+
tag: '',
|
|
243
|
+
type: '',
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
problems: [],
|
|
248
|
+
},
|
|
249
|
+
]);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
test('empty one-line block', () => {
|
|
253
|
+
const parsed = getParser()(`
|
|
254
|
+
/** */`);
|
|
255
|
+
expect(parsed).toEqual([
|
|
256
|
+
{
|
|
257
|
+
description: '',
|
|
258
|
+
tags: [],
|
|
259
|
+
source: [
|
|
260
|
+
{
|
|
261
|
+
number: 1,
|
|
262
|
+
source: ' /** */',
|
|
263
|
+
tokens: {
|
|
264
|
+
delimiter: '/**',
|
|
265
|
+
description: '',
|
|
266
|
+
end: '*/',
|
|
267
|
+
lineEnd: '',
|
|
268
|
+
name: '',
|
|
269
|
+
postDelimiter: ' ',
|
|
270
|
+
postName: '',
|
|
271
|
+
postTag: '',
|
|
272
|
+
postType: '',
|
|
273
|
+
start: ' ',
|
|
274
|
+
tag: '',
|
|
275
|
+
type: '',
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
],
|
|
279
|
+
problems: [],
|
|
280
|
+
},
|
|
281
|
+
]);
|
|
282
|
+
});
|
|
283
|
+
|
|
182
284
|
test.each([
|
|
183
|
-
['empty', '/**\n*\n*/'],
|
|
184
285
|
['one-star', '/*\n*\n*/'],
|
|
185
286
|
['three-star', '/***\n*\n*/'],
|
|
186
|
-
['empty one-liner', '/** */'],
|
|
187
287
|
['one-star oneliner', '/* */'],
|
|
188
288
|
['three-star oneliner', '/*** */'],
|
|
189
289
|
])('skip block - %s', (name, source) => {
|
|
@@ -286,3 +286,153 @@ test('carriage returns', () => {
|
|
|
286
286
|
|
|
287
287
|
expect(parsed).toEqual([...nulls(3), block, null]);
|
|
288
288
|
});
|
|
289
|
+
|
|
290
|
+
test('custom markers', () => {
|
|
291
|
+
_parse = getParser({
|
|
292
|
+
markers: {
|
|
293
|
+
start: '////',
|
|
294
|
+
nostart: '// ',
|
|
295
|
+
delim: '///',
|
|
296
|
+
end: '////',
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
const parsed = parse(`
|
|
301
|
+
////
|
|
302
|
+
/// description 0
|
|
303
|
+
///
|
|
304
|
+
/// description 1
|
|
305
|
+
///
|
|
306
|
+
/// @param {string} value value description 0
|
|
307
|
+
\`\`\`
|
|
308
|
+
@sample code
|
|
309
|
+
\`\`\`
|
|
310
|
+
/// description 1
|
|
311
|
+
////`);
|
|
312
|
+
|
|
313
|
+
const block = [
|
|
314
|
+
{
|
|
315
|
+
number: 1,
|
|
316
|
+
source: ' ////',
|
|
317
|
+
tokens: seedTokens({
|
|
318
|
+
start: ' ',
|
|
319
|
+
delimiter: '////',
|
|
320
|
+
postDelimiter: '',
|
|
321
|
+
description: '',
|
|
322
|
+
end: '',
|
|
323
|
+
}),
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
number: 2,
|
|
327
|
+
source: ' /// description 0',
|
|
328
|
+
tokens: seedTokens({
|
|
329
|
+
start: ' ',
|
|
330
|
+
delimiter: '///',
|
|
331
|
+
postDelimiter: ' ',
|
|
332
|
+
description: 'description 0',
|
|
333
|
+
end: '',
|
|
334
|
+
}),
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
number: 3,
|
|
338
|
+
source: ' ///',
|
|
339
|
+
tokens: seedTokens({
|
|
340
|
+
start: ' ',
|
|
341
|
+
delimiter: '///',
|
|
342
|
+
postDelimiter: '',
|
|
343
|
+
description: '',
|
|
344
|
+
end: '',
|
|
345
|
+
}),
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
number: 4,
|
|
349
|
+
source: ' /// description 1',
|
|
350
|
+
tokens: seedTokens({
|
|
351
|
+
start: ' ',
|
|
352
|
+
delimiter: '///',
|
|
353
|
+
postDelimiter: ' ',
|
|
354
|
+
description: 'description 1',
|
|
355
|
+
end: '',
|
|
356
|
+
}),
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
number: 5,
|
|
360
|
+
source: ' ///',
|
|
361
|
+
tokens: seedTokens({
|
|
362
|
+
start: ' ',
|
|
363
|
+
delimiter: '///',
|
|
364
|
+
postDelimiter: '',
|
|
365
|
+
description: '',
|
|
366
|
+
end: '',
|
|
367
|
+
}),
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
number: 6,
|
|
371
|
+
source: ' /// @param {string} value value description 0',
|
|
372
|
+
tokens: seedTokens({
|
|
373
|
+
start: ' ',
|
|
374
|
+
delimiter: '///',
|
|
375
|
+
postDelimiter: ' ',
|
|
376
|
+
description: '@param {string} value value description 0',
|
|
377
|
+
end: '',
|
|
378
|
+
}),
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
number: 7,
|
|
382
|
+
source: ' ```',
|
|
383
|
+
tokens: seedTokens({
|
|
384
|
+
start: ' ',
|
|
385
|
+
delimiter: '',
|
|
386
|
+
postDelimiter: '',
|
|
387
|
+
description: '```',
|
|
388
|
+
end: '',
|
|
389
|
+
}),
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
number: 8,
|
|
393
|
+
source: ' @sample code',
|
|
394
|
+
tokens: seedTokens({
|
|
395
|
+
start: ' ',
|
|
396
|
+
delimiter: '',
|
|
397
|
+
postDelimiter: '',
|
|
398
|
+
description: '@sample code',
|
|
399
|
+
end: '',
|
|
400
|
+
}),
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
number: 9,
|
|
404
|
+
source: ' ```',
|
|
405
|
+
tokens: seedTokens({
|
|
406
|
+
start: ' ',
|
|
407
|
+
delimiter: '',
|
|
408
|
+
postDelimiter: '',
|
|
409
|
+
description: '```',
|
|
410
|
+
end: '',
|
|
411
|
+
}),
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
number: 10,
|
|
415
|
+
source: ' /// description 1',
|
|
416
|
+
tokens: seedTokens({
|
|
417
|
+
start: ' ',
|
|
418
|
+
delimiter: '///',
|
|
419
|
+
postDelimiter: ' ',
|
|
420
|
+
description: 'description 1',
|
|
421
|
+
end: '',
|
|
422
|
+
}),
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
number: 11,
|
|
426
|
+
source: ' ////',
|
|
427
|
+
tokens: seedTokens({
|
|
428
|
+
start: ' ',
|
|
429
|
+
delimiter: '',
|
|
430
|
+
postDelimiter: '',
|
|
431
|
+
description: '',
|
|
432
|
+
end: '////',
|
|
433
|
+
}),
|
|
434
|
+
},
|
|
435
|
+
];
|
|
436
|
+
|
|
437
|
+
expect(parsed).toEqual([...nulls(11), block]);
|
|
438
|
+
});
|
package/tests/unit/util.spec.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
hasCR,
|
|
2
3
|
isSpace,
|
|
3
4
|
seedTokens,
|
|
4
5
|
seedBlock,
|
|
@@ -7,6 +8,15 @@ import {
|
|
|
7
8
|
seedSpec,
|
|
8
9
|
} from '../../src/util';
|
|
9
10
|
|
|
11
|
+
test.each([
|
|
12
|
+
['beginning', '\r to end', false],
|
|
13
|
+
['middle', 'has \r in middle', false],
|
|
14
|
+
['ending', 'only at end \r', true],
|
|
15
|
+
['none', 'no carriage returns', false],
|
|
16
|
+
])('carriage returns - %s', (name, source, boolResult) => {
|
|
17
|
+
expect(hasCR(source)).toEqual(boolResult);
|
|
18
|
+
});
|
|
19
|
+
|
|
10
20
|
test.each([
|
|
11
21
|
['win', 'a\r\nb\r\nc', ['a\r', 'b\r', 'c']],
|
|
12
22
|
['unix', 'a\nb\nc', ['a', 'b', 'c']],
|