diff --git a/package-lock.json b/package-lock.json index 2fd9bbd7..211bbd6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8521,7 +8521,7 @@ "marked": "^4.0.12", "rimraf": "^3.0.2", "ts-jest": "^27.1.3", - "typedoc": "^0.22.12", + "typedoc": "^0.22.13", "typescript": "^4.5.5" }, "peerDependencies": { @@ -8775,6 +8775,7 @@ }, "devDependencies": { "@knodes/eslint-config": "^1.6.3", + "@knodes/typedoc-plugintestbed": "^0.22.2", "@testing-library/jest-dom": "^5.16.2", "@types/jest": "^27.4.1", "@types/jsdom": "^16.2.14", @@ -8795,7 +8796,7 @@ "jsdom": "^19.0.0", "rimraf": "^3.0.2", "ts-jest": "^27.1.3", - "typedoc": "^0.22.12", + "typedoc": "^0.22.13", "typescript": "^4.5.5" }, "peerDependencies": { @@ -9074,7 +9075,7 @@ "serve-static": "^1.14.2", "ts-jest": "^27.1.3", "type-fest": "^2.12.0", - "typedoc": "^0.22.12", + "typedoc": "^0.22.13", "typescript": "^4.5.5" }, "peerDependencies": { @@ -9364,7 +9365,7 @@ "jsdom": "^19.0.0", "rimraf": "^3.0.2", "ts-jest": "^27.1.3", - "typedoc": "^0.22.12", + "typedoc": "^0.22.13", "typescript": "^4.5.5" }, "peerDependencies": { @@ -9646,7 +9647,7 @@ "tmp": "^0.2.1", "ts-jest": "^27.1.3", "type-fest": "^2.12.0", - "typedoc": "^0.22.12", + "typedoc": "^0.22.13", "typescript": "^4.5.5" }, "peerDependencies": { @@ -10876,7 +10877,7 @@ "marked": "^4.0.12", "rimraf": "^3.0.2", "ts-jest": "^27.1.3", - "typedoc": "^0.22.12", + "typedoc": "^0.22.13", "typescript": "^4.5.5" }, "dependencies": { @@ -11055,6 +11056,7 @@ "version": "file:packages/plugin-monorepo-readmes", "requires": { "@knodes/eslint-config": "^1.6.3", + "@knodes/typedoc-plugintestbed": "*", "@knodes/typedoc-pluginutils": "~0.22.2", "@testing-library/jest-dom": "^5.16.2", "@types/jest": "^27.4.1", @@ -11077,7 +11079,7 @@ "pkg-up": "^3.1.0", "rimraf": "^3.0.2", "ts-jest": "^27.1.3", - "typedoc": "^0.22.12", + "typedoc": "^0.22.13", "typescript": "^4.5.5" }, "dependencies": { @@ -11283,7 +11285,7 @@ "serve-static": "^1.14.2", "ts-jest": "^27.1.3", "type-fest": "^2.12.0", - "typedoc": "^0.22.12", + "typedoc": "^0.22.13", "typescript": "^4.5.5" }, "dependencies": { @@ -11492,7 +11494,7 @@ "memfs": "^3.4.1", "rimraf": "^3.0.2", "ts-jest": "^27.1.3", - "typedoc": "^0.22.12", + "typedoc": "^0.22.13", "typescript": "^4.5.5", "unionfs": "^4.4.0" }, @@ -11701,7 +11703,7 @@ "tmp": "^0.2.1", "ts-jest": "^27.1.3", "type-fest": "^2.12.0", - "typedoc": "^0.22.12", + "typedoc": "^0.22.13", "typescript": "^4.5.5" }, "dependencies": { diff --git a/packages/plugin-monorepo-readmes/__tests__/helpers.ts b/packages/plugin-monorepo-readmes/__tests__/helpers.ts new file mode 100644 index 00000000..ca2b7b7a --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/helpers.ts @@ -0,0 +1,9 @@ +import { readFile } from 'fs/promises'; +import { resolve } from 'path'; + +export const checkFile = async ( ...args: [...paths: string[], withContent: ( text: string ) => Promise | void] ) => { + const fullPath = resolve( ...args.slice( 0, -1 ) as string[] ); + const content = await readFile( fullPath, 'utf-8' ); + const cb = args[args.length - 1] as ( text: string ) => Promise | void; + await cb( content ); +}; diff --git a/packages/plugin-monorepo-readmes/__tests__/integration/__snapshots__/simple.spec.ts.snap b/packages/plugin-monorepo-readmes/__tests__/integration/__snapshots__/simple.spec.ts.snap new file mode 100644 index 00000000..b52888eb --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/integration/__snapshots__/simple.spec.ts.snap @@ -0,0 +1,373 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Root module \`index.html\` should be correct 1`] = ` +" + + + + + + @example/my-packages + + + + + + + + + +
+
+
+
+
+
+
    +
  • Preparing search index...
  • +
  • The search index is not available
  • +
@example/my-packages +
+
+
Options +
+
All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+
+
Menu +
+
+
+
+
+
+

@example/my-packages

+
+
+
+ +
+
+

Legend

+
+
    +
  • Variable
  • +
+
+

Settings

+

Theme

+
+
+
+

Generated using TypeDoc

+
+
+ + + +" +`; + +exports[`packages/a module \`modules/_example_package_a.html\` should be correct 1`] = ` +" + + + + + + @example/package-a | @example/my-packages + + + + + + + + + +
+
+
+
+
+
+
    +
  • Preparing search index...
  • +
  • The search index is not available
  • +
@example/my-packages +
+
+
Options +
+
All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+
+
Menu +
+
+
+
+
+
+ +

Module @example/package-a

+
+
+
+
+
+
+ +
+
+

Index

+
+
+
+

Variables

+
    +
  • A
  • +
+
+
+
+
+
+

Variables

+
+

Const A + + + +

+
A: "a" = 'a'
+ +
+
+
+
+ + +
+
+
+
+
+

Legend

+
+
    +
  • Variable
  • +
+
+

Settings

+

Theme

+
+
+
+

Generated using TypeDoc

+
+
+ + + +" +`; + +exports[`packages/b module \`modules/_example_package_b.html\` should be correct 1`] = ` +" + + + + + + @example/package-b | @example/my-packages + + + + + + + + + +
+
+
+
+
+
+
    +
  • Preparing search index...
  • +
  • The search index is not available
  • +
@example/my-packages +
+
+
Options +
+
All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+
+
Menu +
+
+
+
+
+
+ +

Module @example/package-b

+
+
+
+
+
+
+ +
+
+

Index

+
+
+
+

Variables

+
    +
  • B
  • +
+
+
+
+
+
+

Variables

+
+

Const B + + + +

+
B: "b" = 'b'
+ +
+
+
+
+ + +
+
+
+
+
+

Legend

+
+
    +
  • Variable
  • +
+
+

Settings

+

Theme

+
+
+
+

Generated using TypeDoc

+
+
+ + + +" +`; diff --git a/packages/plugin-monorepo-readmes/__tests__/integration/simple.spec.ts b/packages/plugin-monorepo-readmes/__tests__/integration/simple.spec.ts new file mode 100644 index 00000000..7f395c73 --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/integration/simple.spec.ts @@ -0,0 +1,40 @@ +import { resolve } from 'path'; + +import { JSDOM } from 'jsdom'; + +import { formatHtml, runPlugin } from '@knodes/typedoc-plugintestbed'; + +import { checkFile } from '../helpers'; + +const rootDir = resolve( __dirname, '../mock-fs/simple' ); +const docsDir = resolve( rootDir, './docs' ); +process.chdir( rootDir ); +jest.setTimeout( process.env.CI === 'true' ? 60000 : 30000 ); +beforeAll( () => runPlugin( rootDir, resolve( __dirname, '../../src/index' ) ) ); +describe( 'Root module', () => { + it( '`index.html` should be correct', () => checkFile( docsDir, 'index.html', c => { + const dom = new JSDOM( c ); + const heading = dom.window.document.querySelectorAll( '.tsd-panel h1' ); + expect( heading ).toHaveLength( 1 ); + expect( heading[0] ).toHaveTextContent( 'Root readme' ); + expect( formatHtml( c ) ).toMatchSnapshot(); + } ) ); +} ); +describe( 'packages/a module', () => { + it( '`modules/_example_package_a.html` should be correct', () => checkFile( docsDir, 'modules/_example_package_a.html', c => { + const dom = new JSDOM( c ); + const heading = dom.window.document.querySelectorAll( '.tsd-panel h1' ); + expect( heading ).toHaveLength( 1 ); + expect( heading[0] ).toHaveTextContent( 'Readme of A' ); + expect( formatHtml( c ) ).toMatchSnapshot(); + } ) ); +} ); +describe( 'packages/b module', () => { + it( '`modules/_example_package_b.html` should be correct', () => checkFile( docsDir, 'modules/_example_package_b.html', c => { + const dom = new JSDOM( c ); + const heading = dom.window.document.querySelectorAll( '.tsd-panel h1' ); + expect( heading ).toHaveLength( 1 ); + expect( heading[0] ).toHaveTextContent( 'Readme of B' ); + expect( formatHtml( c ) ).toMatchSnapshot(); + } ) ); +} ); diff --git a/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/README.md b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/README.md new file mode 100644 index 00000000..b627745a --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/README.md @@ -0,0 +1 @@ +# Root readme diff --git a/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/package.json b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/package.json new file mode 100644 index 00000000..d4e6d503 --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/package.json @@ -0,0 +1,4 @@ +{ + "name": "@example/my-packages", + "private": true +} \ No newline at end of file diff --git a/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/a/README.md b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/a/README.md new file mode 100644 index 00000000..5ac24731 --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/a/README.md @@ -0,0 +1 @@ +# Readme of A \ No newline at end of file diff --git a/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/a/index.ts b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/a/index.ts new file mode 100644 index 00000000..80e9f227 --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/a/index.ts @@ -0,0 +1 @@ +export const A = 'a'; diff --git a/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/a/package.json b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/a/package.json new file mode 100644 index 00000000..8f2d01f7 --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/a/package.json @@ -0,0 +1,4 @@ +{ + "name": "@example/package-a", + "typedocMain": "./index.ts" +} \ No newline at end of file diff --git a/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/b/README.md b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/b/README.md new file mode 100644 index 00000000..8e31d2c1 --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/b/README.md @@ -0,0 +1 @@ +# Readme of B \ No newline at end of file diff --git a/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/b/index.ts b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/b/index.ts new file mode 100644 index 00000000..28c4501e --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/b/index.ts @@ -0,0 +1 @@ +export const B = 'b'; diff --git a/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/b/package.json b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/b/package.json new file mode 100644 index 00000000..6d2538f1 --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/packages/b/package.json @@ -0,0 +1,4 @@ +{ + "name": "@example/package-b", + "typedocMain": "./index.ts" +} \ No newline at end of file diff --git a/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/tsconfig.json b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/tsconfig.json new file mode 100644 index 00000000..2436591d --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "CommonJS" + }, + "include": ["**/*.ts"] +} \ No newline at end of file diff --git a/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/typedoc.js b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/typedoc.js new file mode 100644 index 00000000..130c563d --- /dev/null +++ b/packages/plugin-monorepo-readmes/__tests__/mock-fs/simple/typedoc.js @@ -0,0 +1,6 @@ +module.exports = { + entryPoints: [ + 'packages/*', + ], + entryPointStrategy: 'packages', +}; diff --git a/packages/plugin-monorepo-readmes/package.json b/packages/plugin-monorepo-readmes/package.json index 4ecc8380..8cae234b 100644 --- a/packages/plugin-monorepo-readmes/package.json +++ b/packages/plugin-monorepo-readmes/package.json @@ -44,6 +44,7 @@ }, "devDependencies": { "@knodes/eslint-config": "^1.6.3", + "@knodes/typedoc-plugintestbed": "^0.22.2", "@testing-library/jest-dom": "^5.16.2", "@types/jest": "^27.4.1", "@types/jsdom": "^16.2.14", diff --git a/packages/plugin-monorepo-readmes/src/plugin.ts b/packages/plugin-monorepo-readmes/src/plugin.ts index 0da0427a..01f8be28 100644 --- a/packages/plugin-monorepo-readmes/src/plugin.ts +++ b/packages/plugin-monorepo-readmes/src/plugin.ts @@ -7,6 +7,15 @@ import { Application, DeclarationReflection, DefaultTheme, JSX, PageEvent, Proje import { ABasePlugin } from '@knodes/typedoc-pluginutils'; +const getModuleReflectionSource = ( reflection: DeclarationReflection ) => { + for( const source of reflection.sources ?? [] ) { + if( source.file ){ + return source.file?.fullFileName; + } + } + return undefined; +}; + export class MonorepoReadmePlugin extends ABasePlugin { public constructor( application: Application ){ super( application, __filename ); @@ -25,7 +34,7 @@ export class MonorepoReadmePlugin extends ABasePlugin { const theme = this.application.renderer.theme; const modulesUrls = event.urls.filter( ( u ): u is UrlMapping => u.model instanceof DeclarationReflection && u.model.kindOf( ReflectionKind.Module ) ); modulesUrls.forEach( u => { - const src = u.model.sources?.[0].fileName; + const src = getModuleReflectionSource( u.model ); if( !src ){ return; }