docs(nxdev): consolidate document metadata interface (#12561)

This commit is contained in:
Benjamin Cabanes 2022-10-13 10:16:28 -04:00 committed by GitHub
parent 04d9d9813c
commit e88f6ac768
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 157 additions and 72 deletions

View File

@ -1,4 +1,8 @@
import { DocumentData, DocumentMetadata } from '@nrwl/nx-dev/models-document'; import {
createDocumentMetadata,
DocumentData,
DocumentMetadata,
} from '@nrwl/nx-dev/models-document';
import { MenuItem } from '@nrwl/nx-dev/models-menu'; import { MenuItem } from '@nrwl/nx-dev/models-menu';
import { parseMarkdown } from '@nrwl/nx-dev/ui-markdoc'; import { parseMarkdown } from '@nrwl/nx-dev/ui-markdoc';
import { readFileSync } from 'fs'; import { readFileSync } from 'fs';
@ -30,19 +34,19 @@ export class DocumentsApi {
(x) => x.itemList (x) => x.itemList
) as DocumentMetadata[]; ) as DocumentMetadata[];
this.documents = { this.documents = createDocumentMetadata({
id: 'documents', id: 'documents',
name: 'documents', name: 'documents',
itemList: !!this.options.addAncestor itemList: !!this.options.addAncestor
? [ ? [
{ createDocumentMetadata({
id: this.options.addAncestor.id, id: this.options.addAncestor.id,
name: this.options.addAncestor.name, name: this.options.addAncestor.name,
itemList, itemList,
}, }),
] ]
: itemList, : itemList,
}; });
// this.allDocuments = options.allDocuments; // this.allDocuments = options.allDocuments;
} }

View File

@ -45,6 +45,12 @@ export class MenuApi {
id: 'packages', id: 'packages',
name: 'Packages', name: 'Packages',
itemList: packageDocuments, itemList: packageDocuments,
path: '',
packageName: '',
isExternal: false,
description: '',
file: '',
tags: [],
}; };
const items = createMenuItems(documents); const items = createMenuItems(documents);

View File

@ -16,7 +16,10 @@ export function createMenuItems(root: DocumentMetadata): MenuItem[] {
); );
} }
return pathData; return {
...pathData,
disableCollapsible: false,
} as MenuItem;
}; };
return items?.map((item) => createPathMetadata(item)) ?? []; return items?.map((item) => createPathMetadata(item)) ?? [];
} }
@ -65,6 +68,7 @@ export function getDeepDiveSection(items: MenuItem[]): MenuSection {
return { return {
id: 'deep-dive', id: 'deep-dive',
name: 'Deep Dive', name: 'Deep Dive',
hideSectionHeader: false,
itemList: items itemList: items
.filter( .filter(
(m) => (m) =>
@ -104,6 +108,7 @@ export function getPackageApiSection(items: MenuItem[]): MenuSection {
return { return {
id: 'official-packages', id: 'official-packages',
name: 'Reference', name: 'Reference',
hideSectionHeader: false,
itemList: items itemList: items
.filter( .filter(
(m) => (m) =>
@ -116,6 +121,7 @@ export function getPackageApiSection(items: MenuItem[]): MenuSection {
) )
.map((m) => ({ .map((m) => ({
...m, ...m,
disableCollapsible: true,
itemList: [ itemList: [
{ {
id: m.id + '-guides', id: m.id + '-guides',
@ -159,6 +165,7 @@ export function getDeepDiveNxCloudSection(items: MenuItem[]): MenuSection {
return { return {
id: 'deep-dive', id: 'deep-dive',
name: 'Deep Dive', name: 'Deep Dive',
hideSectionHeader: false,
itemList: items itemList: items
.filter((m) => m.id === 'private-cloud' || m.id === 'reference') .filter((m) => m.id === 'private-cloud' || m.id === 'reference')
.map((m) => ({ .map((m) => ({

View File

@ -1,4 +1,7 @@
import { DocumentMetadata } from '@nrwl/nx-dev/models-document'; import {
createDocumentMetadata,
DocumentMetadata,
} from '@nrwl/nx-dev/models-document';
import { PackageMetadata, SchemaMetadata } from '@nrwl/nx-dev/models-package'; import { PackageMetadata, SchemaMetadata } from '@nrwl/nx-dev/models-package';
import { readFileSync } from 'fs'; import { readFileSync } from 'fs';
@ -81,43 +84,46 @@ export class PackagesApi {
// For production build, the packages files are missing so need this try-catch. // For production build, the packages files are missing so need this try-catch.
// TODO(jack): Look at handling this without try-catch. // TODO(jack): Look at handling this without try-catch.
try { try {
return { return createDocumentMetadata({
id: 'packages', id: 'packages',
name: 'packages', name: 'packages',
itemList: this.options.packagesIndex.map((p) => ({ itemList: this.options.packagesIndex.map((p) =>
id: p.name, createDocumentMetadata({
name: p.name.replace(/-/gi, ' '), id: p.name,
description: p.description, name: p.name.replace(/-/gi, ' '),
packageName: p.packageName, description: p.description,
path: `/packages/${p.name}`, packageName: p.packageName,
itemList: this.getPackage(p.name) path: `/packages/${p.name}`,
.documentation.map((d) => ({ itemList: this.getPackage(p.name)
id: d.id, .documentation.map((d) => ({
name: d.name, id: d.id,
path: d.path, name: d.name,
})) path: d.path,
.concat(
p.schemas.executors.map((e) => ({
id: e,
name: e,
path: `/packages/${p.name}/executors/${e}`,
})) }))
) .concat(
.concat( p.schemas.executors.map((e) => ({
p.schemas.generators.map((g) => ({ id: e,
id: g, name: e,
name: g, path: `/packages/${p.name}/executors/${e}`,
path: `/packages/${p.name}/generators/${g}`, }))
})) )
), .concat(
})), p.schemas.generators.map((g) => ({
}; id: g,
name: g,
path: `/packages/${p.name}/generators/${g}`,
}))
)
.map((x) => createDocumentMetadata(x)),
})
),
});
} catch { } catch {
return { return createDocumentMetadata({
id: 'packages', id: 'packages',
name: 'packages', name: 'packages',
itemList: [], itemList: [],
}; });
} }
} }

View File

@ -1 +1,2 @@
export * from './lib/documents.models'; export * from './lib/documents.models';
export * from './lib/documents.transformers';

View File

@ -6,12 +6,12 @@ export interface DocumentData {
export interface DocumentMetadata { export interface DocumentMetadata {
id: string; id: string;
name?: string; name: string;
description?: string; description: string;
packageName?: string; packageName: string;
file?: string; file: string;
path?: string; path: string;
isExternal?: boolean; isExternal: boolean;
itemList?: DocumentMetadata[]; itemList: DocumentMetadata[];
tags?: string[]; tags: string[];
} }

View File

@ -0,0 +1,44 @@
import { DocumentMetadata } from './documents.models';
export function createDocumentMetadata(
defaults: Partial<DocumentMetadata> = {}
): DocumentMetadata {
if (!defaults.id) throw new Error('A document entry requires an "id".');
return Object.assign(
{},
{
id: 'fake-id',
name: '',
description: '',
file: '',
itemList: [],
isExternal: false,
packageName: '',
path: '',
tags: [],
},
defaults
);
}
export function convertToDocumentMetadata(
target: Partial<DocumentMetadata>
): DocumentMetadata {
if (!target.id) throw new Error('A document entry requires an "id".');
if (target.itemList)
target.itemList.map((item) => convertToDocumentMetadata(item));
return {
id: target.id,
name: target.name ?? '',
description: target.description ?? '',
file: target.file ?? '',
itemList: target.itemList ?? [],
isExternal: target.isExternal ?? false,
packageName: target.packageName ?? '',
path: target.path ?? '',
tags: target.tags ?? [],
};
}

View File

@ -8,11 +8,11 @@ export interface MenuSection {
id: string; id: string;
name: string; name: string;
itemList: MenuItem[]; itemList: MenuItem[];
hideSectionHeader?: boolean; hideSectionHeader: boolean;
} }
export interface MenuItem extends DocumentMetadata { export interface MenuItem extends DocumentMetadata {
path?: string; path: string;
itemList?: MenuItem[]; itemList: MenuItem[];
disableCollapsible?: boolean; disableCollapsible: boolean;
} }

View File

@ -1,7 +1,10 @@
import { DocumentsApi } from '@nrwl/nx-dev/data-access-documents/node-only'; import { DocumentsApi } from '@nrwl/nx-dev/data-access-documents/node-only';
import { MenuApi } from '@nrwl/nx-dev/data-access-menu'; import { MenuApi } from '@nrwl/nx-dev/data-access-menu';
import { PackagesApi } from '@nrwl/nx-dev/data-access-packages/node-only'; import { PackagesApi } from '@nrwl/nx-dev/data-access-packages/node-only';
import { DocumentMetadata } from '@nrwl/nx-dev/models-document'; import {
convertToDocumentMetadata,
DocumentMetadata,
} from '@nrwl/nx-dev/models-document';
import { import {
getBasicNxCloudSection, getBasicNxCloudSection,
getBasicSection, getBasicSection,
@ -21,9 +24,15 @@ export const packagesApi = new PackagesApi({
export const nxDocumentsApi = new DocumentsApi({ export const nxDocumentsApi = new DocumentsApi({
publicDocsRoot: 'nx-dev/nx-dev/public/documentation', publicDocsRoot: 'nx-dev/nx-dev/public/documentation',
documentSources: [ documentSources: [
documents.find((x) => x.id === 'nx-documentation'), documents.find(
documents.find((x) => x.id === 'additional-api-references'), (x) => x.id === 'nx-documentation'
].filter((x) => !!x) as DocumentMetadata[], ) as Partial<DocumentMetadata>,
documents.find(
(x) => x.id === 'additional-api-references'
) as Partial<DocumentMetadata>,
]
.filter((x) => !!x)
.map((x) => convertToDocumentMetadata(x)),
addAncestor: null, addAncestor: null,
}); });
export const nxRecipesApi = new DocumentsApi({ export const nxRecipesApi = new DocumentsApi({
@ -36,14 +45,18 @@ export const nxRecipesApi = new DocumentsApi({
export const nxCloudDocumentsApi = new DocumentsApi({ export const nxCloudDocumentsApi = new DocumentsApi({
publicDocsRoot: 'nx-dev/nx-dev/public/documentation', publicDocsRoot: 'nx-dev/nx-dev/public/documentation',
documentSources: [ documentSources: [
documents.find((x) => x.id === 'nx-cloud-documentation'), documents.find(
].filter((x) => !!x) as DocumentMetadata[], (x) => x.id === 'nx-cloud-documentation'
) as Partial<DocumentMetadata>,
]
.filter((x) => !!x)
.map((x) => convertToDocumentMetadata(x)),
addAncestor: { id: 'nx-cloud', name: 'Nx Cloud' }, addAncestor: { id: 'nx-cloud', name: 'Nx Cloud' },
}); });
export const nxMenuApi = new MenuApi( export const nxMenuApi = new MenuApi(
nxDocumentsApi.getDocuments(), nxDocumentsApi.getDocuments(),
packagesApi.getPackageDocuments().itemList as DocumentMetadata[], packagesApi.getPackageDocuments().itemList,
[getBasicSection] [getBasicSection]
); );
export const nxRecipesMenuApi = new MenuApi( export const nxRecipesMenuApi = new MenuApi(

View File

@ -5,7 +5,7 @@ import {
import { sortCorePackagesFirst } from '@nrwl/nx-dev/data-access-packages'; import { sortCorePackagesFirst } from '@nrwl/nx-dev/data-access-packages';
import { DocViewer } from '@nrwl/nx-dev/feature-doc-viewer'; import { DocViewer } from '@nrwl/nx-dev/feature-doc-viewer';
import { DocumentData } from '@nrwl/nx-dev/models-document'; import { DocumentData } from '@nrwl/nx-dev/models-document';
import { Menu, MenuItem } from '@nrwl/nx-dev/models-menu'; import { Menu, MenuItem, MenuSection } from '@nrwl/nx-dev/models-menu';
import { PackageMetadata } from '@nrwl/nx-dev/models-package'; import { PackageMetadata } from '@nrwl/nx-dev/models-package';
import { DocumentationHeader, SidebarContainer } from '@nrwl/nx-dev/ui-common'; import { DocumentationHeader, SidebarContainer } from '@nrwl/nx-dev/ui-common';
import type { GetStaticPaths, GetStaticProps } from 'next'; import type { GetStaticPaths, GetStaticProps } from 'next';
@ -65,7 +65,7 @@ export default function DocumentationPage(
const { menu, document, pkg, schemaRequest } = props; const { menu, document, pkg, schemaRequest } = props;
const vm: { entryComponent: JSX.Element; menu: { sections: MenuItem[] } } = { const vm: { entryComponent: JSX.Element; menu: Menu } = {
entryComponent: <DocViewer document={document || ({} as any)} toc={null} />, entryComponent: <DocViewer document={document || ({} as any)} toc={null} />,
menu: { menu: {
sections: menu.sections.filter((x) => x.id !== 'official-packages'), sections: menu.sections.filter((x) => x.id !== 'official-packages'),
@ -73,23 +73,17 @@ export default function DocumentationPage(
}; };
if (!!pkg) { if (!!pkg) {
const reference: MenuSection | null =
menu.sections.find((x) => x.id === 'official-packages') ?? null;
if (!reference)
throw new Error('Could not find menu section for "official-packages".');
vm.menu = { vm.menu = {
sections: sortCorePackagesFirst<MenuItem>( sections: sortCorePackagesFirst<MenuItem>(reference.itemList).map(
menu.sections.filter((x) => x.id === 'official-packages')[0]?.itemList (x) => ({ ...x, hideSectionHeader: false })
), ),
}; };
vm.entryComponent = (
<PackageSchemaList navIsOpen={navIsOpen} menu={vm.menu} pkg={pkg} />
);
}
if (!!pkg && !!schemaRequest) { vm.entryComponent = !!schemaRequest ? (
vm.menu = {
sections: sortCorePackagesFirst<MenuItem>(
menu.sections.filter((x) => x.id === 'official-packages')[0]?.itemList
),
};
vm.entryComponent = (
<PackageSchemaViewer <PackageSchemaViewer
menu={vm.menu} menu={vm.menu}
schemaRequest={{ schemaRequest={{
@ -97,6 +91,8 @@ export default function DocumentationPage(
pkg, pkg,
}} }}
/> />
) : (
<PackageSchemaList navIsOpen={navIsOpen} menu={vm.menu} pkg={pkg} />
); );
} }

View File

@ -1,6 +1,13 @@
import { Menu } from '@nrwl/nx-dev/models-menu';
import { Sidebar, SidebarMobile } from '@nrwl/nx-dev/ui-common'; import { Sidebar, SidebarMobile } from '@nrwl/nx-dev/ui-common';
export function SidebarContainer({ menu, navIsOpen }: any): JSX.Element { export function SidebarContainer({
menu,
navIsOpen,
}: {
menu: Menu;
navIsOpen: boolean;
}): JSX.Element {
return ( return (
<div id="sidebar" data-testid="sidebar"> <div id="sidebar" data-testid="sidebar">
<SidebarMobile menu={menu} navIsOpen={navIsOpen} /> <SidebarMobile menu={menu} navIsOpen={navIsOpen} />

View File

@ -97,6 +97,7 @@ function SidebarSectionItems({ item }: { item: MenuItem }): JSX.Element {
if (isActiveLink && collapsed) { if (isActiveLink && collapsed) {
handleCollapseToggle(); handleCollapseToggle();
} }
return ( return (
<li <li
key={subItem.id + '-' + index} key={subItem.id + '-' + index}