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.
Files changed (51) hide show
  1. package/CHANGELOG.md +56 -2
  2. package/browser/index.js +31 -10
  3. package/es6/parser/tokenizers/name.js +11 -3
  4. package/es6/parser/tokenizers/tag.js +3 -0
  5. package/es6/parser/tokenizers/type.d.ts +1 -1
  6. package/es6/parser/tokenizers/type.js +15 -3
  7. package/es6/primitives.js +1 -1
  8. package/jest.config.cjs +5 -7
  9. package/lib/index.cjs +2 -22
  10. package/lib/index.cjs.map +1 -1
  11. package/lib/parser/block-parser.cjs +1 -9
  12. package/lib/parser/block-parser.cjs.map +1 -1
  13. package/lib/parser/index.cjs +1 -14
  14. package/lib/parser/index.cjs.map +1 -1
  15. package/lib/parser/source-parser.cjs +1 -13
  16. package/lib/parser/source-parser.cjs.map +1 -1
  17. package/lib/parser/spec-parser.cjs +1 -7
  18. package/lib/parser/spec-parser.cjs.map +1 -1
  19. package/lib/parser/tokenizers/description.cjs +8 -19
  20. package/lib/parser/tokenizers/description.cjs.map +1 -1
  21. package/lib/parser/tokenizers/index.cjs.map +1 -1
  22. package/lib/parser/tokenizers/name.cjs +20 -26
  23. package/lib/parser/tokenizers/name.cjs.map +1 -1
  24. package/lib/parser/tokenizers/tag.cjs +4 -5
  25. package/lib/parser/tokenizers/tag.cjs.map +1 -1
  26. package/lib/parser/tokenizers/type.cjs +16 -20
  27. package/lib/parser/tokenizers/type.cjs.map +1 -1
  28. package/lib/parser/tokenizers/type.d.ts +1 -1
  29. package/lib/primitives.cjs +1 -3
  30. package/lib/primitives.cjs.map +1 -1
  31. package/lib/stringifier/index.cjs +1 -4
  32. package/lib/stringifier/index.cjs.map +1 -1
  33. package/lib/stringifier/inspect.cjs +1 -17
  34. package/lib/stringifier/inspect.cjs.map +1 -1
  35. package/lib/transforms/align.cjs +6 -29
  36. package/lib/transforms/align.cjs.map +1 -1
  37. package/lib/transforms/crlf.cjs +4 -13
  38. package/lib/transforms/crlf.cjs.map +1 -1
  39. package/lib/transforms/indent.cjs +4 -17
  40. package/lib/transforms/indent.cjs.map +1 -1
  41. package/lib/transforms/index.cjs +1 -4
  42. package/lib/transforms/index.cjs.map +1 -1
  43. package/lib/util.cjs +10 -33
  44. package/lib/util.cjs.map +1 -1
  45. package/package.json +17 -11
  46. package/src/parser/tokenizers/name.ts +13 -3
  47. package/src/parser/tokenizers/tag.ts +4 -0
  48. package/src/parser/tokenizers/type.ts +16 -3
  49. package/tests/unit/parser.spec.ts +234 -0
  50. package/tests/unit/spec-tag-tokenizer.spec.ts +30 -0
  51. 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
- const { tokens } = spec.source[spec.source.reduce(typeEnd, 0)];
18
- const source = tokens.description.trimLeft();
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[].tokes.description` into `type` and `description`
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
- for (const [i, { tokens }] of spec.source.entries()) {
38
+ let descriptionBegun = false;
39
+ let firstTypeIteration = true;
40
+ for (const { tokens } of spec.source.values()) {
39
41
  let type = '';
40
- if (i === 0 && tokens.description[0] !== '{') return spec;
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'],
@@ -2,7 +2,6 @@
2
2
  "compilerOptions": {
3
3
  "target": "es2015",
4
4
  "module": "commonjs",
5
- "moduleResolution": "node16",
6
5
  "declaration": true,
7
6
  "outDir": "./lib",
8
7
  "lib": ["es2016", "es5"]