comment-parser 1.4.1 → 1.4.3
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 +56 -2
- package/browser/index.js +31 -10
- package/es6/parser/tokenizers/name.js +11 -3
- package/es6/parser/tokenizers/tag.js +3 -0
- package/es6/parser/tokenizers/type.d.ts +1 -1
- package/es6/parser/tokenizers/type.js +15 -3
- package/es6/primitives.js +1 -1
- package/jest.config.cjs +5 -7
- package/lib/index.cjs +2 -22
- package/lib/index.cjs.map +1 -1
- package/lib/parser/block-parser.cjs +1 -9
- package/lib/parser/block-parser.cjs.map +1 -1
- package/lib/parser/index.cjs +1 -14
- package/lib/parser/index.cjs.map +1 -1
- package/lib/parser/source-parser.cjs +1 -13
- package/lib/parser/source-parser.cjs.map +1 -1
- package/lib/parser/spec-parser.cjs +1 -7
- package/lib/parser/spec-parser.cjs.map +1 -1
- package/lib/parser/tokenizers/description.cjs +8 -19
- package/lib/parser/tokenizers/description.cjs.map +1 -1
- package/lib/parser/tokenizers/index.cjs.map +1 -1
- package/lib/parser/tokenizers/name.cjs +20 -26
- package/lib/parser/tokenizers/name.cjs.map +1 -1
- package/lib/parser/tokenizers/tag.cjs +4 -5
- package/lib/parser/tokenizers/tag.cjs.map +1 -1
- package/lib/parser/tokenizers/type.cjs +16 -20
- package/lib/parser/tokenizers/type.cjs.map +1 -1
- package/lib/parser/tokenizers/type.d.ts +1 -1
- package/lib/primitives.cjs +1 -3
- package/lib/primitives.cjs.map +1 -1
- package/lib/stringifier/index.cjs +1 -4
- package/lib/stringifier/index.cjs.map +1 -1
- package/lib/stringifier/inspect.cjs +1 -17
- package/lib/stringifier/inspect.cjs.map +1 -1
- package/lib/transforms/align.cjs +6 -29
- package/lib/transforms/align.cjs.map +1 -1
- package/lib/transforms/crlf.cjs +4 -13
- package/lib/transforms/crlf.cjs.map +1 -1
- package/lib/transforms/indent.cjs +4 -17
- package/lib/transforms/indent.cjs.map +1 -1
- package/lib/transforms/index.cjs +1 -4
- package/lib/transforms/index.cjs.map +1 -1
- package/lib/util.cjs +10 -33
- package/lib/util.cjs.map +1 -1
- package/package.json +17 -11
- package/src/parser/tokenizers/name.ts +13 -3
- package/src/parser/tokenizers/tag.ts +4 -0
- package/src/parser/tokenizers/type.ts +16 -3
- package/tests/unit/parser.spec.ts +234 -0
- package/tests/unit/spec-tag-tokenizer.spec.ts +30 -0
- package/tsconfig.node.json +0 -1
|
@@ -13,9 +13,19 @@ export default function nameTokenizer(): Tokenizer {
|
|
|
13
13
|
tokens.type === '' ? num : i;
|
|
14
14
|
|
|
15
15
|
return (spec: Spec): Spec => {
|
|
16
|
-
// look for the name in the line where {type} ends
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
// look for the name starting in the line where {type} ends
|
|
17
|
+
let finalTypeLine = spec.source.reduce(typeEnd, 0);
|
|
18
|
+
|
|
19
|
+
let tokens;
|
|
20
|
+
do {
|
|
21
|
+
({ tokens } = spec.source[finalTypeLine]);
|
|
22
|
+
if (tokens.description.trim()) {
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
finalTypeLine++;
|
|
26
|
+
} while (spec.source[finalTypeLine]);
|
|
27
|
+
|
|
28
|
+
const source = tokens.description.trimStart();
|
|
19
29
|
|
|
20
30
|
const quotedGroups = source.split('"');
|
|
21
31
|
|
|
@@ -20,6 +20,10 @@ export default function tagTokenizer(): Tokenizer {
|
|
|
20
20
|
return spec;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
if (match[1].includes('/')) {
|
|
24
|
+
return spec;
|
|
25
|
+
}
|
|
26
|
+
|
|
23
27
|
tokens.tag = match[1];
|
|
24
28
|
tokens.postTag = match[3];
|
|
25
29
|
tokens.description = tokens.description.slice(match[0].length);
|
|
@@ -23,7 +23,7 @@ export type Joiner = (parts: string[]) => string;
|
|
|
23
23
|
export type Spacing = 'compact' | 'preserve' | Joiner;
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
* Sets splits remaining `Spec.lines[].
|
|
26
|
+
* Sets splits remaining `Spec.lines[].tokens.description` into `type` and `description`
|
|
27
27
|
* tokens and populates Spec.type`
|
|
28
28
|
*
|
|
29
29
|
* @param {Spacing} spacing tells how to deal with a whitespace
|
|
@@ -35,9 +35,18 @@ export default function typeTokenizer(spacing: Spacing = 'compact'): Tokenizer {
|
|
|
35
35
|
let curlies = 0;
|
|
36
36
|
let lines: [Tokens, string][] = [];
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
let descriptionBegun = false;
|
|
39
|
+
let firstTypeIteration = true;
|
|
40
|
+
for (const { tokens } of spec.source.values()) {
|
|
39
41
|
let type = '';
|
|
40
|
-
if (
|
|
42
|
+
if (!descriptionBegun && tokens.description.trim()) {
|
|
43
|
+
descriptionBegun = true;
|
|
44
|
+
} else if (!descriptionBegun) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (firstTypeIteration && tokens.description[0] !== '{') return spec;
|
|
49
|
+
firstTypeIteration = false;
|
|
41
50
|
|
|
42
51
|
for (const ch of tokens.description) {
|
|
43
52
|
if (ch === '{') curlies++;
|
|
@@ -50,6 +59,10 @@ export default function typeTokenizer(spacing: Spacing = 'compact'): Tokenizer {
|
|
|
50
59
|
if (curlies === 0) break;
|
|
51
60
|
}
|
|
52
61
|
|
|
62
|
+
if (!descriptionBegun) {
|
|
63
|
+
return spec;
|
|
64
|
+
}
|
|
65
|
+
|
|
53
66
|
if (curlies !== 0) {
|
|
54
67
|
spec.problems.push({
|
|
55
68
|
code: 'spec:type:unpaired-curlies',
|
|
@@ -167,6 +167,240 @@ test('block with tags', () => {
|
|
|
167
167
|
]);
|
|
168
168
|
});
|
|
169
169
|
|
|
170
|
+
test('tag with name and description on second line', () => {
|
|
171
|
+
const parsed = getParser()(`
|
|
172
|
+
/**
|
|
173
|
+
* @param {string}
|
|
174
|
+
* foo The foo.
|
|
175
|
+
*/`);
|
|
176
|
+
expect(parsed).toEqual([
|
|
177
|
+
{
|
|
178
|
+
description: '',
|
|
179
|
+
tags: [
|
|
180
|
+
{
|
|
181
|
+
tag: 'param',
|
|
182
|
+
name: 'foo',
|
|
183
|
+
type: 'string',
|
|
184
|
+
optional: false,
|
|
185
|
+
description: 'The foo.',
|
|
186
|
+
problems: [],
|
|
187
|
+
source: [
|
|
188
|
+
{
|
|
189
|
+
number: 2,
|
|
190
|
+
source: ' * @param {string}',
|
|
191
|
+
tokens: seedTokens({
|
|
192
|
+
start: ' ',
|
|
193
|
+
delimiter: '*',
|
|
194
|
+
postDelimiter: ' ',
|
|
195
|
+
tag: '@param',
|
|
196
|
+
postTag: ' ',
|
|
197
|
+
type: '{string}',
|
|
198
|
+
}),
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
number: 3,
|
|
202
|
+
source: ' * foo The foo.',
|
|
203
|
+
tokens: seedTokens({
|
|
204
|
+
start: ' ',
|
|
205
|
+
delimiter: '*',
|
|
206
|
+
postDelimiter: ' ',
|
|
207
|
+
name: 'foo',
|
|
208
|
+
postName: ' ',
|
|
209
|
+
description: 'The foo.',
|
|
210
|
+
}),
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
number: 4,
|
|
214
|
+
source: ' */',
|
|
215
|
+
tokens: seedTokens({
|
|
216
|
+
start: ' ',
|
|
217
|
+
end: '*/',
|
|
218
|
+
}),
|
|
219
|
+
},
|
|
220
|
+
],
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
source: [
|
|
224
|
+
{
|
|
225
|
+
number: 1,
|
|
226
|
+
source: ' /**',
|
|
227
|
+
tokens: seedTokens({
|
|
228
|
+
delimiter: '/**',
|
|
229
|
+
start: ' ',
|
|
230
|
+
}),
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
number: 2,
|
|
234
|
+
source: ' * @param {string}',
|
|
235
|
+
tokens: seedTokens({
|
|
236
|
+
start: ' ',
|
|
237
|
+
delimiter: '*',
|
|
238
|
+
postDelimiter: ' ',
|
|
239
|
+
tag: '@param',
|
|
240
|
+
postTag: ' ',
|
|
241
|
+
type: '{string}',
|
|
242
|
+
}),
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
number: 3,
|
|
246
|
+
source: ' * foo The foo.',
|
|
247
|
+
tokens: seedTokens({
|
|
248
|
+
start: ' ',
|
|
249
|
+
delimiter: '*',
|
|
250
|
+
postDelimiter: ' ',
|
|
251
|
+
name: 'foo',
|
|
252
|
+
postName: ' ',
|
|
253
|
+
description: 'The foo.',
|
|
254
|
+
}),
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
number: 4,
|
|
258
|
+
source: ' */',
|
|
259
|
+
tokens: seedTokens({
|
|
260
|
+
start: ' ',
|
|
261
|
+
end: '*/',
|
|
262
|
+
}),
|
|
263
|
+
},
|
|
264
|
+
],
|
|
265
|
+
problems: [],
|
|
266
|
+
},
|
|
267
|
+
]);
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
test('tag with type, name and description on subsequent lines', () => {
|
|
271
|
+
const parsed = getParser()(`
|
|
272
|
+
/**
|
|
273
|
+
* @param
|
|
274
|
+
* {string}
|
|
275
|
+
* foo
|
|
276
|
+
* The foo.
|
|
277
|
+
*/`);
|
|
278
|
+
expect(parsed).toEqual([
|
|
279
|
+
{
|
|
280
|
+
description: '',
|
|
281
|
+
tags: [
|
|
282
|
+
{
|
|
283
|
+
tag: 'param',
|
|
284
|
+
name: 'foo',
|
|
285
|
+
type: 'string',
|
|
286
|
+
optional: false,
|
|
287
|
+
description: 'The foo.',
|
|
288
|
+
problems: [],
|
|
289
|
+
source: [
|
|
290
|
+
{
|
|
291
|
+
number: 2,
|
|
292
|
+
source: ' * @param',
|
|
293
|
+
tokens: seedTokens({
|
|
294
|
+
start: ' ',
|
|
295
|
+
delimiter: '*',
|
|
296
|
+
postDelimiter: ' ',
|
|
297
|
+
tag: '@param',
|
|
298
|
+
}),
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
number: 3,
|
|
302
|
+
source: ' * {string}',
|
|
303
|
+
tokens: seedTokens({
|
|
304
|
+
start: ' ',
|
|
305
|
+
delimiter: '*',
|
|
306
|
+
postDelimiter: ' ',
|
|
307
|
+
type: '{string}',
|
|
308
|
+
}),
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
number: 4,
|
|
312
|
+
source: ' * foo',
|
|
313
|
+
tokens: seedTokens({
|
|
314
|
+
start: ' ',
|
|
315
|
+
delimiter: '*',
|
|
316
|
+
postDelimiter: ' ',
|
|
317
|
+
name: 'foo',
|
|
318
|
+
}),
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
number: 5,
|
|
322
|
+
source: ' * The foo.',
|
|
323
|
+
tokens: seedTokens({
|
|
324
|
+
start: ' ',
|
|
325
|
+
delimiter: '*',
|
|
326
|
+
postDelimiter: ' ',
|
|
327
|
+
description: 'The foo.',
|
|
328
|
+
}),
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
number: 6,
|
|
332
|
+
source: ' */',
|
|
333
|
+
tokens: seedTokens({
|
|
334
|
+
start: ' ',
|
|
335
|
+
end: '*/',
|
|
336
|
+
}),
|
|
337
|
+
},
|
|
338
|
+
],
|
|
339
|
+
},
|
|
340
|
+
],
|
|
341
|
+
source: [
|
|
342
|
+
{
|
|
343
|
+
number: 1,
|
|
344
|
+
source: ' /**',
|
|
345
|
+
tokens: seedTokens({
|
|
346
|
+
delimiter: '/**',
|
|
347
|
+
start: ' ',
|
|
348
|
+
}),
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
number: 2,
|
|
352
|
+
source: ' * @param',
|
|
353
|
+
tokens: seedTokens({
|
|
354
|
+
start: ' ',
|
|
355
|
+
delimiter: '*',
|
|
356
|
+
postDelimiter: ' ',
|
|
357
|
+
tag: '@param',
|
|
358
|
+
}),
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
number: 3,
|
|
362
|
+
source: ' * {string}',
|
|
363
|
+
tokens: seedTokens({
|
|
364
|
+
start: ' ',
|
|
365
|
+
delimiter: '*',
|
|
366
|
+
postDelimiter: ' ',
|
|
367
|
+
type: '{string}',
|
|
368
|
+
}),
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
number: 4,
|
|
372
|
+
source: ' * foo',
|
|
373
|
+
tokens: seedTokens({
|
|
374
|
+
start: ' ',
|
|
375
|
+
delimiter: '*',
|
|
376
|
+
postDelimiter: ' ',
|
|
377
|
+
name: 'foo',
|
|
378
|
+
}),
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
number: 5,
|
|
382
|
+
source: ' * The foo.',
|
|
383
|
+
tokens: seedTokens({
|
|
384
|
+
start: ' ',
|
|
385
|
+
delimiter: '*',
|
|
386
|
+
postDelimiter: ' ',
|
|
387
|
+
description: 'The foo.',
|
|
388
|
+
}),
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
number: 6,
|
|
392
|
+
source: ' */',
|
|
393
|
+
tokens: seedTokens({
|
|
394
|
+
start: ' ',
|
|
395
|
+
end: '*/',
|
|
396
|
+
}),
|
|
397
|
+
},
|
|
398
|
+
],
|
|
399
|
+
problems: [],
|
|
400
|
+
},
|
|
401
|
+
]);
|
|
402
|
+
});
|
|
403
|
+
|
|
170
404
|
test('no source cloning', () => {
|
|
171
405
|
const parsed = getParser()(`
|
|
172
406
|
/**
|
|
@@ -74,6 +74,36 @@ test('require @', () => {
|
|
|
74
74
|
);
|
|
75
75
|
});
|
|
76
76
|
|
|
77
|
+
test('disallow @npm/package format', () => {
|
|
78
|
+
expect(
|
|
79
|
+
tokenize(
|
|
80
|
+
seedSpec({
|
|
81
|
+
source: [
|
|
82
|
+
{
|
|
83
|
+
number: 42,
|
|
84
|
+
source: '...',
|
|
85
|
+
tokens: seedTokens({
|
|
86
|
+
description: '@npm/package',
|
|
87
|
+
}),
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
})
|
|
91
|
+
)
|
|
92
|
+
).toEqual(
|
|
93
|
+
seedSpec({
|
|
94
|
+
source: [
|
|
95
|
+
{
|
|
96
|
+
number: 42,
|
|
97
|
+
source: '...',
|
|
98
|
+
tokens: seedTokens({
|
|
99
|
+
description: '@npm/package',
|
|
100
|
+
}),
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
})
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
|
|
77
107
|
test.each([
|
|
78
108
|
['@+tag', '+tag'],
|
|
79
109
|
['@-tag', '-tag'],
|