diff --git a/aio/package.json b/aio/package.json index e7f1a02e78..a9d0d17e50 100644 --- a/aio/package.json +++ b/aio/package.json @@ -107,7 +107,7 @@ "cross-spawn": "^5.1.0", "css-selector-parser": "^1.3.0", "dgeni": "^0.4.7", - "dgeni-packages": "^0.24.0", + "dgeni-packages": "^0.25.0", "entities": "^1.1.1", "eslint": "^3.19.0", "eslint-plugin-jasmine": "^2.2.0", diff --git a/aio/tools/transforms/angular-api-package/index.js b/aio/tools/transforms/angular-api-package/index.js index 26a6e6e220..0c5b2365ac 100644 --- a/aio/tools/transforms/angular-api-package/index.js +++ b/aio/tools/transforms/angular-api-package/index.js @@ -131,6 +131,6 @@ module.exports = new Package('angular-api', [basePackage, typeScriptPackage]) ]); convertToJsonProcessor.docTypes = convertToJsonProcessor.docTypes.concat(DOCS_TO_CONVERT); postProcessHtml.docTypes = convertToJsonProcessor.docTypes.concat(DOCS_TO_CONVERT); - autoLinkCode.docTypes = DOCS_TO_CONVERT; + autoLinkCode.docTypes = DOCS_TO_CONVERT.concat(['member']); autoLinkCode.codeElements = ['code', 'code-example', 'code-pane']; }); diff --git a/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.js b/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.js index 2519d22870..f36a8d4809 100644 --- a/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.js +++ b/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.js @@ -5,15 +5,21 @@ */ module.exports = function simplifyMemberAnchors() { return { - $runAfter: ['extra-docs-added'], - $runBefore: ['computing-paths'], + $runAfter: ['paths-computed'], + $runBefore: ['rendering-docs'], $process: function(docs) { return docs.forEach(doc => { if (doc.members) { - doc.members.forEach(member => member.anchor = computeAnchor(member)); + doc.members.forEach(member => { + member.anchor = computeAnchor(member); + member.path = doc.path + '#' + member.anchor; + }); } if (doc.statics) { - doc.statics.forEach(member => member.anchor = computeAnchor(member)); + doc.statics.forEach(member => { + member.anchor = computeAnchor(member); + member.path = doc.path + '#' + member.anchor; + }); } }); } diff --git a/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.spec.js b/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.spec.js new file mode 100644 index 0000000000..b857af196d --- /dev/null +++ b/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.spec.js @@ -0,0 +1,72 @@ +const testPackage = require('../../helpers/test-package'); +const processorFactory = require('./simplifyMemberAnchors'); +const Dgeni = require('dgeni'); + +describe('simplifyMemberAnchors processor', () => { + + it('should be available on the injector', () => { + const dgeni = new Dgeni([testPackage('angular-api-package')]); + const injector = dgeni.configureInjector(); + const processor = injector.get('simplifyMemberAnchors'); + expect(processor.$process).toBeDefined(); + expect(processor.$runAfter).toEqual(['paths-computed']); + expect(processor.$runBefore).toEqual(['rendering-docs']); + }); + + describe('$process', () => { + describe('docs without members', () => { + it('should ignore the docs', () => { + const processor = processorFactory(); + const docs = [ + { id: 'some-doc' }, + { id: 'some-other' } + ]; + processor.$process(docs); + expect(docs).toEqual([ + { id: 'some-doc' }, + { id: 'some-other' } + ]); + }); + }); + + describe('docs with members', () => { + it('should compute an anchor for each instance member', () => { + const processor = processorFactory(); + const docs = [ + { id: 'some-doc', members: [ { name: 'foo' }, { name: 'new' }, { name: '' } ] } + ]; + processor.$process(docs); + expect(docs[0].members.map(member => member.anchor)).toEqual(['foo', 'new', 'call']); + }); + + it('should compute a path for each instance member', () => { + const processor = processorFactory(); + const docs = [ + { id: 'some-doc', path: 'a/b/c', members: [ { name: 'foo' }, { name: 'new' }, { name: '' } ] } + ]; + processor.$process(docs); + expect(docs[0].members.map(member => member.path)).toEqual(['a/b/c#foo', 'a/b/c#new', 'a/b/c#call']); + }); + }); + + describe('docs with static members', () => { + it('should compute an anchor for each static member', () => { + const processor = processorFactory(); + const docs = [ + { id: 'some-doc', statics: [ { name: 'foo' }, { name: 'new' }, { name: '' } ] } + ]; + processor.$process(docs); + expect(docs[0].statics.map(member => member.anchor)).toEqual(['foo', 'new', 'call']); + }); + + it('should compute a path for each static member', () => { + const processor = processorFactory(); + const docs = [ + { id: 'some-doc', path: 'a/b/c', statics: [ { name: 'foo' }, { name: 'new' }, { name: '' } ] } + ]; + processor.$process(docs); + expect(docs[0].statics.map(member => member.path)).toEqual(['a/b/c#foo', 'a/b/c#new', 'a/b/c#call']); + }); + }); + }); +}); diff --git a/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.js b/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.js index baf114aaaa..fae9ba475e 100644 --- a/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.js +++ b/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.js @@ -45,7 +45,7 @@ module.exports = function autoLinkCode(getDocFromAlias) { parent.children.splice(index, 1, createLinkNode(docs[0], node.value)); } else { // Parse the text for words that we can convert to links - const nodes = textContent(node).split(/([A-Za-z0-9_-]+)/) + const nodes = textContent(node).split(/([A-Za-z0-9_.-]+)/) .filter(word => word.length) .map((word, index, words) => { // remove docs that fail the custom filter tests diff --git a/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.spec.js b/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.spec.js index c37b2165df..f300487aed 100644 --- a/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.spec.js +++ b/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.spec.js @@ -9,7 +9,7 @@ describe('autoLinkCode post-processor', () => { const dgeni = new Dgeni([testPackage]); const injector = dgeni.configureInjector(); autoLinkCode = injector.get('autoLinkCode'); - autoLinkCode.docTypes = ['class', 'pipe', 'function', 'const']; + autoLinkCode.docTypes = ['class', 'pipe', 'function', 'const', 'member']; aliasMap = injector.get('aliasMap'); processor = injector.get('postProcessHtml'); processor.docTypes = ['test-doc']; @@ -31,6 +31,13 @@ describe('autoLinkCode post-processor', () => { expect(doc.renderedContent).toEqual('foo.MyClass'); }); + it('should match code items within a block of code that contain a dot in their identifier', () => { + aliasMap.addDoc({ docType: 'member', id: 'MyEnum.Value', aliases: ['Value', 'MyEnum.Value'], path: 'a/b/myenum' }); + const doc = { docType: 'test-doc', renderedContent: 'someFn(): MyEnum.Value' }; + processor.$process([doc]); + expect(doc.renderedContent).toEqual('someFn(): MyEnum.Value'); + }); + it('should ignore code items that do not match a link to an API doc', () => { aliasMap.addDoc({ docType: 'guide', id: 'MyClass', aliases: ['MyClass'], path: 'a/b/myclass' }); const doc = { docType: 'test-doc', renderedContent: 'MyClass' }; diff --git a/aio/yarn.lock b/aio/yarn.lock index 4acead46b1..7545c27601 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -2312,9 +2312,9 @@ devtools-timeline-model@1.1.6: chrome-devtools-frontend "1.0.401423" resolve "1.1.7" -dgeni-packages@^0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/dgeni-packages/-/dgeni-packages-0.24.0.tgz#2f995f78fecd6a9ded72d7bdccbbc4c46360c1ea" +dgeni-packages@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/dgeni-packages/-/dgeni-packages-0.25.0.tgz#380f0b569ae36d82959252604b729e85e0cd7d4a" dependencies: canonical-path "0.0.2" catharsis "^0.8.1"