Skip to content

Commit

Permalink
feat(jsdoc): add support for more jsdoc tags
Browse files Browse the repository at this point in the history
 - Add support for the following jsdoc tags: async, constant, enum, since
 - Improve support for the following jsdoc tags: deprecated, module
 - Add the booleanTagTransform() service for jsdoc tags like '@async' and '@deprecated'
 - Add the moduleTagTransform() service for the jsdoc tag '@module' to cope with jsdoc behaviour when no value is provided (see https://jsdoc.app/tags-module.html)
  • Loading branch information
lmores committed Jan 10, 2021
1 parent 245a02a commit 01cba85
Show file tree
Hide file tree
Showing 12 changed files with 138 additions and 28 deletions.
2 changes: 2 additions & 0 deletions jsdoc/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@ module.exports = new Package('jsdoc', [require('../base')])

.factory(require('./services/code-name-map'))
.factory(require('./services/code-name'))
.factory(require('./services/transforms/boolean-tag'))
.factory(require('./services/transforms/extract-access'))
.factory(require('./services/transforms/extract-name'))
.factory(require('./services/transforms/extract-type'))
.factory(require('./services/transforms/module-tag'))
.factory(require('./services/transforms/unknown-tag'))
.factory(require('./services/transforms/whole-tag'))
.factory(require('./services/transforms/trim-whitespace'))
Expand Down
9 changes: 9 additions & 0 deletions jsdoc/services/transforms/boolean-tag.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/**
* Change the value of a tag to a boolean value (used by jsdoc tags like `@async`).
* @param {Tag} tag The tag to process
*/
module.exports = function booleanTagTransform() {
return function(doc, tag, value) {
return value !== null && value !== undefined;
};
};
32 changes: 32 additions & 0 deletions jsdoc/services/transforms/boolean-tag.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
var transformFactory = require('./boolean-tag');

describe("boolean-tag transform", function() {
var transform;

beforeEach(function() {
transform = transformFactory();
});

it("should transform non-null and non-undefined values to `true`", function() {
var doc = {}, tag = {};

var value = '', newValue = transform(doc, tag, value);
expect(newValue).toEqual(true);

var value = 'some text', newValue = transform(doc, tag, value);
expect(newValue).toEqual(true);

var value = {}, newValue = transform(doc, tag, value);
expect(newValue).toEqual(true);
});

it("should transform null and undefined values to `false`", function() {
var doc = {}, tag = {};

var value = null, newValue = transform(doc, tag, value);
expect(newValue).toEqual(false);

var value = undefined, newValue = transform(doc, tag, value);
expect(newValue).toEqual(false);
});
});
35 changes: 35 additions & 0 deletions jsdoc/services/transforms/module-tag.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/**
* If current tag is a jsdoc `@module` tag without a value, set it to its file projectRelativePath
* without the '.js' extension and replacing '/'s with '.'s
* @param {Tag} tag The tag to process
*/
module.exports = function moduleTagTransform(log, createDocMessage) {
return function(doc, tag, value) {
var filePath = doc.fileInfo.relativePath;

if (tag.name == 'module') {

// JsDoc `@module` tags does not refer to any code node
// TODO: implement this a generic option for any tag to be declared inside tagDefs
// E.g., `{ name: 'module', noCodeNode: true, transforms: [ ... ] }`
doc.codeNode = null;
doc.codeAncestors = null;

// Provide default module name if none is already set
if (!value && filePath) {
value = filePath;

if (value.endsWith('.js')) {
value = value.substring(0, value.length - 3);
}
value = value.replace(/\//g, '.');

log.debug(createDocMessage(`Module name automatically set to ${value}`, doc));
}
} else {
log.warn(createDocMessage(`moduleTagTransform() has been called with a non-module jsdoc tag: '${tag.tagName}'`, doc))
}

return value;
};
};
6 changes: 6 additions & 0 deletions jsdoc/tag-defs/async.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = function(booleanTagTransform) {
return {
name: 'async',
transforms: [ booleanTagTransform ]
};
};
7 changes: 7 additions & 0 deletions jsdoc/tag-defs/constant.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module.exports = function(extractTypeTransform, extractNameTransform, wholeTagTransform) {
return {
name: 'constant',
aliases: ['const'],
transforms: [ extractTypeTransform, extractNameTransform, wholeTagTransform ]
};
};
9 changes: 6 additions & 3 deletions jsdoc/tag-defs/deprecated.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
module.exports = function() {
return { name: 'deprecated' };
};
module.exports = function(booleanTagTransform) {
return {
name: 'deprecated',
transforms: [ booleanTagTransform ]
};
};
6 changes: 6 additions & 0 deletions jsdoc/tag-defs/enum.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = function(extractTypeTransform) {
return {
name: 'enum',
transforms: [ extractTypeTransform ]
};
};
44 changes: 24 additions & 20 deletions jsdoc/tag-defs/index.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,34 @@

module.exports = [
require('./access'),
require('./private'),
require('./protected'),
require('./public'),
require('./name'),
require('./memberof'),
require('./param'),
require('./property'),
require('./propertyof'),
require('./returns'),
require('./type'),
require('./requires'),
require('./module'),
require('./description'),
require('./deprecated'),
require('./see'),
require('./usage'),
require('./animations'),
require('./constructor'),
require('./async'),
require('./class'),
require('./classdesc'),
require('./constant'),
require('./constructor'),
require('./deprecated'),
require('./description'),
require('./enum'),
require('./function'),
require('./global'),
require('./namespace'),
require('./kind'),
require('./function'),
require('./license'),
require('./memberof'),
require('./method'),
require('./license')
require('./module'),
require('./name'),
require('./namespace'),
require('./param'),
require('./private'),
require('./property'),
require('./propertyof'),
require('./protected'),
require('./public'),
require('./requires'),
require('./returns'),
require('./see'),
require('./since'),
require('./type'),
require('./usage')
];
4 changes: 2 additions & 2 deletions jsdoc/tag-defs/index.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ var tagDefFactories = require('./');
describe("jsdoc tagdefs", function() {
it("should contain an array of tagDef factory functions", function() {
expect(tagDefFactories).toEqual(jasmine.any(Array));
expect(tagDefFactories.length).toEqual(27);
expect(tagDefFactories.length).toEqual(31);
tagDefFactories.forEach(function(factory) {
expect(factory).toEqual(jasmine.any(Function));
});
});
});
});
9 changes: 6 additions & 3 deletions jsdoc/tag-defs/module.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
module.exports = function() {
return { name: 'module' };
};
module.exports = function(moduleTagTransform) {
return {
name: 'module',
transforms: [ moduleTagTransform ]
};
};
3 changes: 3 additions & 0 deletions jsdoc/tag-defs/since.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = function() {
return { name: 'since' };
};

0 comments on commit 01cba85

Please sign in to comment.