@condenast/ember-docs
Advanced tools
Comparing version 0.1.7 to 0.1.8
@@ -22,7 +22,7 @@ const doctrine = require('doctrine'); | ||
} else if (info.type === 'component') { | ||
return component(ast, info, jsdoc); | ||
return component(ast, info, path); | ||
} else if (info.type === 'service') { | ||
return service(ast, info, jsdoc); | ||
return service(ast, info, path); | ||
} | ||
} | ||
} |
{ | ||
"name": "@condenast/ember-docs", | ||
"version": "0.1.7", | ||
"version": "0.1.8", | ||
"description": "Creates documentation from Ember apps / addons", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
const commonmark = require('commonmark'); | ||
const doctrine = require('doctrine'); | ||
const utils = require('./utils'); | ||
const path = require('path'); | ||
const fs = require('fs'); | ||
const syntax = require('@glimmer/syntax'); | ||
@@ -8,3 +11,3 @@ function getPositionalParameters(ast, component) { | ||
let positionalParams = staticProperties.find(property => property.key.name === 'positionalParams'); | ||
if (positionalParams) { | ||
@@ -29,4 +32,4 @@ if (positionalParams.value.type === 'ArrayExpression') { | ||
if (comment == null) return false; | ||
let doc = doctrine.parse(comment.value, { unwrap: false, recoverable: true }); | ||
let doc = doctrine.parse(utils.unindent(comment.value), { unwrap: false, recoverable: true }); | ||
let property = doc.tags.find(tag => tag.title === 'property'); | ||
@@ -38,3 +41,3 @@ return property; | ||
}); | ||
let doc = doctrine.parse(comment.value, { unwrap: false, recoverable: true }); | ||
let doc = doctrine.parse(utils.unindent(comment.value), { unwrap: false, recoverable: true }); | ||
let property = doc.tags.find(tag => tag.title === 'property'); | ||
@@ -65,5 +68,56 @@ let type = property.type; | ||
module.exports = function (ast, info, jsdoc) { | ||
function getYields(ast, filepath) { | ||
let layout = utils.getProperties(ast).find(param => param.key.name === 'layout'); | ||
if (layout && layout.value) { | ||
let template = utils.findImportFromReference(ast, layout.value); | ||
let templatePath = path.normalize(filepath.split('/').slice(0, -1).join('/') + '/' + template.source + '.hbs'); | ||
if (fs.existsSync(templatePath)) { | ||
let params = [] | ||
let hbs = fs.readFileSync(templatePath).toString(); | ||
syntax.traverse(syntax.preprocess(hbs), { | ||
MustacheStatement(node) { | ||
if (node.path.original === 'yield') { | ||
params = params.concat(node.params.map(getValueFromParam)); | ||
} | ||
}, | ||
}); | ||
return params; | ||
} | ||
} | ||
return null; | ||
} | ||
function getValueFromParam(param) { | ||
if (param.type === 'PathExpression') { | ||
return { | ||
type: 'path', | ||
value: param.original | ||
}; | ||
} | ||
if (param.type === 'SubExpression') { | ||
// parsing helpers for array, hash, etc can go here | ||
if (param.path.original === 'hash') { | ||
return { | ||
type: 'hash', | ||
value: param.hash.pairs.reduce((obj, pair) => { | ||
obj[pair.key] = getValueFromParam(pair.value); | ||
return obj; | ||
}, {}) | ||
}; | ||
} | ||
} | ||
return { | ||
type: null, | ||
value: null | ||
} | ||
} | ||
module.exports = function (ast, info, filepath) { | ||
let component = utils.getMain(ast); | ||
let mainComment = (component.leadingComments || []).find((comment) => { | ||
let mainComment = (component && component.leadingComments || []).find((comment) => { | ||
return comment.type === 'CommentBlock'; | ||
@@ -92,2 +146,4 @@ }); | ||
docs.parameters = getParameters(ast, component); | ||
docs.yields = getYields(ast, filepath); | ||
return docs; | ||
@@ -94,0 +150,0 @@ } |
@@ -7,3 +7,3 @@ const commonmark = require('commonmark'); | ||
let service = utils.getMain(ast); | ||
let mainComment = (service.leadingComments || []).find((comment) => { | ||
let mainComment = (service && service.leadingComments || []).find((comment) => { | ||
return comment.type === 'CommentBlock'; | ||
@@ -10,0 +10,0 @@ }); |
@@ -21,3 +21,3 @@ const _ = require('lodash'); | ||
return jsdocType.name; | ||
// Turn an expression back into a normalized TypeScript type | ||
@@ -48,3 +48,3 @@ } else if (jsdocType && jsdocType.expression) { | ||
let indent = text.split('\n').reduce((indentation, line) => { | ||
if (line.length === 0) { | ||
if (line.match(/^\s*$/) || line === '*') { | ||
return indentation; | ||
@@ -209,6 +209,7 @@ } | ||
for (let s = 0, slen = statement.specifiers.length; s < slen; s++) { | ||
if (s.imported.name === reference.name) { | ||
let specifier = statement.specifiers[s]; | ||
if (specifier.local && specifier.local.name === reference.name) { | ||
return { | ||
source: statement.value, | ||
name: s.imported ? s.imported.name : 'default' | ||
source: statement.source.value, | ||
name: specifier.local ? specifier.local.name : 'default' | ||
}; | ||
@@ -288,2 +289,1 @@ } | ||
module.exports = utils; | ||
@@ -79,2 +79,24 @@ const parse = require('../../index'); | ||
test('yield-param', () => { | ||
let component = parse(path.resolve(__dirname, '../fixtures/classic/app/components/yield-param.js'), {}); | ||
expect(component.name).toBe('yield-param'); | ||
expect(component.access).toBe('public'); | ||
expect(component.description).toEqual([ | ||
'<p>This component will test yield blocks</p>\n' | ||
]); | ||
expect(component.parameters).toEqual({ | ||
named: [{ | ||
name: 'first', | ||
description: [''], | ||
type: 'string' | ||
}, { | ||
name: 'second', | ||
description: [''], | ||
type: 'string' | ||
}], | ||
positional: [] | ||
}); | ||
}); | ||
describe('pods', () => { | ||
@@ -81,0 +103,0 @@ test('text-field', () => { |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
56975
33
1591
2