Loading CHANGELOG.adoc +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ This project utilizes semantic versioning. === Added * *content-classifier*: Allow file to be explicitly marked as private; not private bypasses underscore check (#1153) * *content-classifier*: Assign unique origins as set to `origins` property on component version; use empty set if no origins specified (#995) * *navigation-builder*: Propagate roles and additional link properties on xref to entry in navigation model (#1175) * *page-composer*: Add `file` property to UI model of page that resolves to raw virtual file of page (#1165) * *page-composer*: Add built-in `resolveResource` UI helper to resolve raw virtual file of resource by reference (#1167) Loading packages/content-classifier/lib/content-catalog.js +9 −4 Original line number Diff line number Diff line Loading @@ -60,8 +60,13 @@ class ContentCatalog { * @returns {Object} The constructed component version object. */ registerComponentVersion (name, version, descriptor = {}) { const { asciidoc, displayVersion, prerelease, startPage: startPageSpec, title, versionSegment } = descriptor const componentVersion = { displayVersion: displayVersion || version || 'default', title: title || name, version } const { asciidoc, displayVersion, prerelease, startPage: startPageRef, title, versionSegment, origins } = descriptor const componentVersion = { displayVersion: displayVersion || version || 'default', title: title || name, version, origins: new Set(origins && typeof origins[Symbol.iterator] === 'function' ? origins : []), } if (versionSegment != null) componentVersion.versionSegment = versionSegment Object.defineProperty(componentVersion, 'name', { value: name, enumerable: true }) if (prerelease) { Loading Loading @@ -130,9 +135,9 @@ class ContentCatalog { ) ) } if (startPageSpec) { if (startPageRef) { // @deprecated use separate call to register start page for component version this.registerComponentVersionStartPage(name, componentVersion, startPageSpec === true ? undefined : startPageSpec) this.registerComponentVersionStartPage(name, componentVersion, startPageRef === true ? undefined : startPageRef) } return componentVersion } Loading packages/content-classifier/test/classify-content-test.js +22 −1 Original line number Diff line number Diff line Loading @@ -421,6 +421,27 @@ describe('classifyContent()', () => { expect(versions).to.eql(['', 'v2.0', 'v1.2.3']) }) it('should store unique origins as set on component version', () => { const origins = [ { type: 'git', repo: 'https://githost/repo.git', branch: 'main' }, { type: 'git', repo: 'https://githost/another-repo.git', branch: 'main' }, ] aggregate[0].origins = origins const component = classifyContent(playbook, aggregate).getComponent('the-component') expect(component).to.exist() expect(component.versions).to.have.lengthOf(1) expect(component.versions[0].origins).to.have.lengthOf(2) for (const origin of origins) expect(component.versions[0].origins).to.include(origin) }) it('should allow origins to be added to component version', () => { const component = classifyContent(playbook, aggregate).getComponent('the-component') expect(component).to.exist() expect(component.versions).to.have.lengthOf(1) component.versions[0].origins.add({ type: 'git', url: 'https://githost/repo.git' }) expect(component.versions[0].origins).to.have.lengthOf(1) }) it('should use name as title if title is falsy', () => { aggregate[0].title = undefined const component = classifyContent(playbook, aggregate).getComponent('the-component') Loading Loading @@ -885,7 +906,7 @@ describe('classifyContent()', () => { const otherComponentVersions = otherComponent.versions expect(otherComponentVersions).to.have.lengthOf(1) const componentVersion = contentCatalog.getComponentVersion('the-component', 'v1.2.3') const expectedMembers = ['displayVersion', 'title', 'version', 'name', 'asciidoc', 'nav', 'url'] const expectedMembers = ['displayVersion', 'title', 'version', 'name', 'asciidoc', 'nav', 'url', 'origins'] expect(Object.keys(componentVersion)).to.have.members(expectedMembers) expect(componentVersion.files).to.eql(contentCatalog.findBy({ component: 'the-component', version: 'v1.2.3' })) }) Loading packages/content-classifier/test/content-catalog-test.js +27 −11 Original line number Diff line number Diff line Loading @@ -47,7 +47,7 @@ describe('ContentCatalog', () => { const title = 'The Component' const url = '/the-component/1.0.0/index.html' const contentCatalog = new ContentCatalog() const descriptor = { title, startPage: true } const descriptor = { title, startPage: true, origins: [{ type: 'git', url: 'https://githost/repo.git' }] } expect(contentCatalog.getComponents()).to.be.empty() contentCatalog.addFile({ src: { Loading @@ -58,6 +58,7 @@ describe('ContentCatalog', () => { relative: 'index.adoc', }, }) const expectedOrigins = new Set(descriptor.origins) const componentVersion = contentCatalog.registerComponentVersion(name, version, descriptor) expect(componentVersion).to.exist() const components = contentCatalog.getComponents() Loading @@ -66,9 +67,16 @@ describe('ContentCatalog', () => { name, title, url, versions: [{ name, version, displayVersion: version, title, url }], versions: [{ name, version, displayVersion: version, title, url, origins: expectedOrigins }], }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url, origins: expectedOrigins, }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url }) expect(components[0]).to.not.have.property('latestVersion') expect(components[0].latestPrerelease).to.be.undefined() }) Loading Loading @@ -102,8 +110,8 @@ describe('ContentCatalog', () => { title: title2, url: url2, versions: [ { name, version: version2, displayVersion: version2, title: title2, url: url2 }, { name, version: version1, displayVersion: version1, title: title1, url: url1 }, { name, version: version2, displayVersion: version2, title: title2, url: url2, origins: new Set() }, { name, version: version1, displayVersion: version1, title: title1, url: url1, origins: new Set() }, ], }) expect(component.latest).to.eql({ Loading @@ -112,6 +120,7 @@ describe('ContentCatalog', () => { displayVersion: version2, title: title2, url: url2, origins: new Set(), }) expect(component.latest).to.equal(componentVersion2) }) Loading Loading @@ -181,6 +190,7 @@ describe('ContentCatalog', () => { title: title2, url: url2, prerelease: prerelease2, origins: new Set(), }, { name: componentName, Loading @@ -188,6 +198,7 @@ describe('ContentCatalog', () => { displayVersion: version1, title: title1, url: url1, origins: new Set(), }, ]) expect(component.latest).to.eql({ Loading @@ -196,6 +207,7 @@ describe('ContentCatalog', () => { displayVersion: version1, title: title1, url: url1, origins: new Set(), }) expect(component.latestPrerelease).to.eql({ name: componentName, Loading @@ -204,6 +216,7 @@ describe('ContentCatalog', () => { displayVersion: version2, title: title2, url: url2, origins: new Set(), }) expect(component.name).to.equal(componentName) expect(component.title).to.equal(title1) Loading Loading @@ -245,6 +258,7 @@ describe('ContentCatalog', () => { title: title2, url: url2, prerelease: prerelease2, origins: new Set(), }, { name: componentName, Loading @@ -253,6 +267,7 @@ describe('ContentCatalog', () => { title: title1, url: url1, prerelease: prerelease1, origins: new Set(), }, ]) expect(component.latest).to.eql({ Loading @@ -262,6 +277,7 @@ describe('ContentCatalog', () => { title: title2, url: url2, prerelease: prerelease2, origins: new Set(), }) expect(component.latestPrerelease).to.be.undefined() expect(component.name).to.equal(componentName) Loading Loading @@ -348,9 +364,9 @@ describe('ContentCatalog', () => { name, title, url, versions: [{ name, version, displayVersion: version, title, url }], versions: [{ name, version, displayVersion: version, title, url, origins: new Set() }], }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url, origins: new Set() }) }) it('should not register start page if startPage property in descriptor is absent', () => { Loading @@ -367,7 +383,7 @@ describe('ContentCatalog', () => { expect(components[0]).to.deep.include({ name, title, versions: [{ name, version, displayVersion: version, title }], versions: [{ name, version, displayVersion: version, title, origins: new Set() }], }) }) Loading @@ -385,7 +401,7 @@ describe('ContentCatalog', () => { expect(components[0]).to.deep.include({ name, title, versions: [{ name, version, displayVersion: version, title }], versions: [{ name, version, displayVersion: version, title, origins: new Set() }], }) }) Loading Loading @@ -599,9 +615,9 @@ describe('ContentCatalog', () => { name, title, url, versions: [{ name, version, displayVersion: version, title, url }], versions: [{ name, version, displayVersion: version, title, url, origins: new Set() }], }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url, origins: new Set() }) }) it('should not change url if implicit start page not found and url is already set', () => { Loading Loading
CHANGELOG.adoc +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ This project utilizes semantic versioning. === Added * *content-classifier*: Allow file to be explicitly marked as private; not private bypasses underscore check (#1153) * *content-classifier*: Assign unique origins as set to `origins` property on component version; use empty set if no origins specified (#995) * *navigation-builder*: Propagate roles and additional link properties on xref to entry in navigation model (#1175) * *page-composer*: Add `file` property to UI model of page that resolves to raw virtual file of page (#1165) * *page-composer*: Add built-in `resolveResource` UI helper to resolve raw virtual file of resource by reference (#1167) Loading
packages/content-classifier/lib/content-catalog.js +9 −4 Original line number Diff line number Diff line Loading @@ -60,8 +60,13 @@ class ContentCatalog { * @returns {Object} The constructed component version object. */ registerComponentVersion (name, version, descriptor = {}) { const { asciidoc, displayVersion, prerelease, startPage: startPageSpec, title, versionSegment } = descriptor const componentVersion = { displayVersion: displayVersion || version || 'default', title: title || name, version } const { asciidoc, displayVersion, prerelease, startPage: startPageRef, title, versionSegment, origins } = descriptor const componentVersion = { displayVersion: displayVersion || version || 'default', title: title || name, version, origins: new Set(origins && typeof origins[Symbol.iterator] === 'function' ? origins : []), } if (versionSegment != null) componentVersion.versionSegment = versionSegment Object.defineProperty(componentVersion, 'name', { value: name, enumerable: true }) if (prerelease) { Loading Loading @@ -130,9 +135,9 @@ class ContentCatalog { ) ) } if (startPageSpec) { if (startPageRef) { // @deprecated use separate call to register start page for component version this.registerComponentVersionStartPage(name, componentVersion, startPageSpec === true ? undefined : startPageSpec) this.registerComponentVersionStartPage(name, componentVersion, startPageRef === true ? undefined : startPageRef) } return componentVersion } Loading
packages/content-classifier/test/classify-content-test.js +22 −1 Original line number Diff line number Diff line Loading @@ -421,6 +421,27 @@ describe('classifyContent()', () => { expect(versions).to.eql(['', 'v2.0', 'v1.2.3']) }) it('should store unique origins as set on component version', () => { const origins = [ { type: 'git', repo: 'https://githost/repo.git', branch: 'main' }, { type: 'git', repo: 'https://githost/another-repo.git', branch: 'main' }, ] aggregate[0].origins = origins const component = classifyContent(playbook, aggregate).getComponent('the-component') expect(component).to.exist() expect(component.versions).to.have.lengthOf(1) expect(component.versions[0].origins).to.have.lengthOf(2) for (const origin of origins) expect(component.versions[0].origins).to.include(origin) }) it('should allow origins to be added to component version', () => { const component = classifyContent(playbook, aggregate).getComponent('the-component') expect(component).to.exist() expect(component.versions).to.have.lengthOf(1) component.versions[0].origins.add({ type: 'git', url: 'https://githost/repo.git' }) expect(component.versions[0].origins).to.have.lengthOf(1) }) it('should use name as title if title is falsy', () => { aggregate[0].title = undefined const component = classifyContent(playbook, aggregate).getComponent('the-component') Loading Loading @@ -885,7 +906,7 @@ describe('classifyContent()', () => { const otherComponentVersions = otherComponent.versions expect(otherComponentVersions).to.have.lengthOf(1) const componentVersion = contentCatalog.getComponentVersion('the-component', 'v1.2.3') const expectedMembers = ['displayVersion', 'title', 'version', 'name', 'asciidoc', 'nav', 'url'] const expectedMembers = ['displayVersion', 'title', 'version', 'name', 'asciidoc', 'nav', 'url', 'origins'] expect(Object.keys(componentVersion)).to.have.members(expectedMembers) expect(componentVersion.files).to.eql(contentCatalog.findBy({ component: 'the-component', version: 'v1.2.3' })) }) Loading
packages/content-classifier/test/content-catalog-test.js +27 −11 Original line number Diff line number Diff line Loading @@ -47,7 +47,7 @@ describe('ContentCatalog', () => { const title = 'The Component' const url = '/the-component/1.0.0/index.html' const contentCatalog = new ContentCatalog() const descriptor = { title, startPage: true } const descriptor = { title, startPage: true, origins: [{ type: 'git', url: 'https://githost/repo.git' }] } expect(contentCatalog.getComponents()).to.be.empty() contentCatalog.addFile({ src: { Loading @@ -58,6 +58,7 @@ describe('ContentCatalog', () => { relative: 'index.adoc', }, }) const expectedOrigins = new Set(descriptor.origins) const componentVersion = contentCatalog.registerComponentVersion(name, version, descriptor) expect(componentVersion).to.exist() const components = contentCatalog.getComponents() Loading @@ -66,9 +67,16 @@ describe('ContentCatalog', () => { name, title, url, versions: [{ name, version, displayVersion: version, title, url }], versions: [{ name, version, displayVersion: version, title, url, origins: expectedOrigins }], }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url, origins: expectedOrigins, }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url }) expect(components[0]).to.not.have.property('latestVersion') expect(components[0].latestPrerelease).to.be.undefined() }) Loading Loading @@ -102,8 +110,8 @@ describe('ContentCatalog', () => { title: title2, url: url2, versions: [ { name, version: version2, displayVersion: version2, title: title2, url: url2 }, { name, version: version1, displayVersion: version1, title: title1, url: url1 }, { name, version: version2, displayVersion: version2, title: title2, url: url2, origins: new Set() }, { name, version: version1, displayVersion: version1, title: title1, url: url1, origins: new Set() }, ], }) expect(component.latest).to.eql({ Loading @@ -112,6 +120,7 @@ describe('ContentCatalog', () => { displayVersion: version2, title: title2, url: url2, origins: new Set(), }) expect(component.latest).to.equal(componentVersion2) }) Loading Loading @@ -181,6 +190,7 @@ describe('ContentCatalog', () => { title: title2, url: url2, prerelease: prerelease2, origins: new Set(), }, { name: componentName, Loading @@ -188,6 +198,7 @@ describe('ContentCatalog', () => { displayVersion: version1, title: title1, url: url1, origins: new Set(), }, ]) expect(component.latest).to.eql({ Loading @@ -196,6 +207,7 @@ describe('ContentCatalog', () => { displayVersion: version1, title: title1, url: url1, origins: new Set(), }) expect(component.latestPrerelease).to.eql({ name: componentName, Loading @@ -204,6 +216,7 @@ describe('ContentCatalog', () => { displayVersion: version2, title: title2, url: url2, origins: new Set(), }) expect(component.name).to.equal(componentName) expect(component.title).to.equal(title1) Loading Loading @@ -245,6 +258,7 @@ describe('ContentCatalog', () => { title: title2, url: url2, prerelease: prerelease2, origins: new Set(), }, { name: componentName, Loading @@ -253,6 +267,7 @@ describe('ContentCatalog', () => { title: title1, url: url1, prerelease: prerelease1, origins: new Set(), }, ]) expect(component.latest).to.eql({ Loading @@ -262,6 +277,7 @@ describe('ContentCatalog', () => { title: title2, url: url2, prerelease: prerelease2, origins: new Set(), }) expect(component.latestPrerelease).to.be.undefined() expect(component.name).to.equal(componentName) Loading Loading @@ -348,9 +364,9 @@ describe('ContentCatalog', () => { name, title, url, versions: [{ name, version, displayVersion: version, title, url }], versions: [{ name, version, displayVersion: version, title, url, origins: new Set() }], }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url, origins: new Set() }) }) it('should not register start page if startPage property in descriptor is absent', () => { Loading @@ -367,7 +383,7 @@ describe('ContentCatalog', () => { expect(components[0]).to.deep.include({ name, title, versions: [{ name, version, displayVersion: version, title }], versions: [{ name, version, displayVersion: version, title, origins: new Set() }], }) }) Loading @@ -385,7 +401,7 @@ describe('ContentCatalog', () => { expect(components[0]).to.deep.include({ name, title, versions: [{ name, version, displayVersion: version, title }], versions: [{ name, version, displayVersion: version, title, origins: new Set() }], }) }) Loading Loading @@ -599,9 +615,9 @@ describe('ContentCatalog', () => { name, title, url, versions: [{ name, version, displayVersion: version, title, url }], versions: [{ name, version, displayVersion: version, title, url, origins: new Set() }], }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url }) expect(components[0].latest).to.eql({ name, version, displayVersion: version, title, url, origins: new Set() }) }) it('should not change url if implicit start page not found and url is already set', () => { Loading