Skip to content

Commit 6eb5773

Browse files
committed
feat(tsdocs): make it possible to run api-extractor on a package
Use --package-only flag
1 parent ed588b6 commit 6eb5773

File tree

6 files changed

+84
-12
lines changed

6 files changed

+84
-12
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ benchmark/dist
1212
.sandbox
1313
packages/cli/generators/datasource/connectors.json
1414
packages/tsdocs/fixtures/monorepo/docs
15+
packages/tsdocs/fixtures/monorepo/packages/pkg1/docs
1516
/docs/site/readmes
1617
/docs/apidocs/reports-temp
1718
/docs/apidocs/models

packages/tsdocs/bin/extract-apis.js

100644100755
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,23 @@
77
/**
88
* Run api-extractor against the monorepo
99
*/
10-
const runExtractorForMonorepo = require('..').runExtractorForMonorepo;
10+
const {runExtractorForMonorepo, runExtractorForPackage} = require('..');
1111

1212
const silent = process.argv.includes('--silent');
1313
const dryRun = process.argv.includes('--dry-run');
1414

15+
const pkgOnly = process.argv.includes('--package-only');
16+
1517
/**
1618
* The option to control if reports are generated by api-extractor
1719
*/
1820
const apiReportEnabled = process.argv.includes('--report');
1921

2022
async function main() {
23+
if (pkgOnly) {
24+
runExtractorForPackage({silent, dryRun});
25+
return;
26+
}
2127
await runExtractorForMonorepo({silent, dryRun, apiReportEnabled});
2228
}
2329

packages/tsdocs/bin/update-apidocs.js

100644100755
File mode changed.

packages/tsdocs/src/__tests__/acceptance/tsdocs.acceptance.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import * as fs from 'fs-extra';
88
import pEvent from 'p-event';
99
import * as path from 'path';
1010
import {runExtractorForMonorepo, updateApiDocs} from '../..';
11+
import {runExtractorForPackage} from '../../monorepo-api-extractor';
1112
import {fixConstructorName} from '../../update-api-md-docs';
1213

1314
const runCLI = require('@loopback/build').runCLI;
@@ -35,6 +36,7 @@ describe('tsdocs', function() {
3536
before('remove apidocs', () => {
3637
fs.emptyDirSync(APIDOCS_ROOT);
3738
fs.emptyDirSync(SITE_APIDOCS_ROOT);
39+
fs.emptyDirSync(path.join(MONOREPO_ROOT, 'packages/pkg1/docs'));
3840
});
3941

4042
it('runs api-extractor', async () => {
@@ -55,6 +57,26 @@ describe('tsdocs', function() {
5557
expect(reports.sort()).to.eql(['pkg1.api.md', 'pkg2.api.md']);
5658
});
5759

60+
it('runs api-extractor on package only', async () => {
61+
const pkgDir = path.join(MONOREPO_ROOT, 'packages/pkg1');
62+
const apidocsRootDir = path.join(pkgDir, 'docs/apidocs');
63+
64+
runExtractorForPackage(pkgDir, {
65+
silent: true,
66+
apiDocsGenerationPath: 'docs/apidocs',
67+
apiReportEnabled: true,
68+
});
69+
70+
const dirs = await fs.readdir(apidocsRootDir);
71+
expect(dirs.sort()).eql(['models', 'reports', 'reports-temp']);
72+
73+
const models = await fs.readdir(path.join(apidocsRootDir, 'models'));
74+
expect(models.sort()).to.eql(['pkg1.api.json']);
75+
76+
const reports = await fs.readdir(path.join(apidocsRootDir, 'reports'));
77+
expect(reports.sort()).to.eql(['pkg1.api.md']);
78+
});
79+
5880
it('runs api-documenter', async () => {
5981
const args = [
6082
'markdown',

packages/tsdocs/src/monorepo-api-extractor.ts

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,53 @@ export async function runExtractorForMonorepo(options: ExtractorOptions = {}) {
6565

6666
for (const pkg of packages) {
6767
/* istanbul ignore if */
68-
if (!options.silent) {
69-
console.log('> %s', pkg.name);
70-
}
71-
debug('Package: %s (%s)', pkg.name, pkg.location);
72-
73-
process.chdir(pkg.location);
68+
invokeExtractorForPackage(pkg, options);
69+
}
70+
}
7471

75-
const extractorConfig = buildExtractorConfig(pkg, options);
72+
export function runExtractorForPackage(
73+
pkgDir: string = process.cwd(),
74+
options: ExtractorOptions = {},
75+
) {
76+
options = Object.assign(
77+
{
78+
rootDir: pkgDir,
79+
apiDocsExtractionPath: DEFAULT_APIDOCS_EXTRACTION_PATH,
80+
typescriptCompilerFolder: typeScriptPath,
81+
tsconfigFilePath: 'tsconfig.build.json',
82+
mainEntryPointFilePath: 'dist/index.d.ts',
83+
},
84+
options,
85+
);
86+
const pkgJson = require(path.join(pkgDir, 'package.json'));
87+
setupApiDocsDirs(pkgDir, options);
88+
const pkg: LernaPackage = {
89+
private: pkgJson.private,
90+
name: pkgJson.name,
91+
location: pkgDir,
92+
manifestLocation: path.join(pkgDir, 'package.json'),
93+
rootPath: pkgDir,
94+
};
95+
invokeExtractorForPackage(pkg, options);
96+
}
7697

77-
debug('Resolved extractor config:', extractorConfig);
78-
invokeExtractor(extractorConfig, options);
98+
/**
99+
* Run `api-extractor` on a given package
100+
* @param pkg - Package descriptor
101+
* @param options - Options for api extraction
102+
*/
103+
function invokeExtractorForPackage(
104+
pkg: LernaPackage,
105+
options: ExtractorOptions,
106+
) {
107+
if (!options.silent) {
108+
console.log('> %s', pkg.name);
79109
}
110+
debug('Package: %s (%s)', pkg.name, pkg.location);
111+
process.chdir(pkg.location);
112+
const extractorConfig = buildExtractorConfig(pkg, options);
113+
debug('Resolved extractor config:', extractorConfig);
114+
invokeExtractor(extractorConfig, options);
80115
}
81116

82117
/**

packages/tsdocs/src/update-api-md-docs.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@ export async function updateApiDocs(options: ApiDocsOptions = {}) {
3838
/* istanbul ignore if */
3939
if (!packages.length) return;
4040

41-
await addJekyllMetadata(packages[0].rootPath, options);
42-
await generateIndex(packages, options);
41+
const found = await addJekyllMetadata(packages[0].rootPath, options);
42+
if (found) {
43+
await generateIndex(packages, options);
44+
}
4345
}
4446

4547
/**
@@ -103,6 +105,11 @@ async function addJekyllMetadata(
103105
options: ApiDocsOptions,
104106
) {
105107
const apiDocsRoot = path.join(lernaRootDir, options.apiDocsGenerationPath!);
108+
const exists = await fs.pathExists(apiDocsRoot);
109+
if (!exists) {
110+
console.error('No API docs found at %s.', apiDocsRoot);
111+
return false;
112+
}
106113
const apiFiles = await fs.readdir(apiDocsRoot);
107114
for (const f of apiFiles) {
108115
/* istanbul ignore if */
@@ -170,6 +177,7 @@ ${doc}
170177
}
171178
}
172179
}
180+
return true;
173181
}
174182

175183
// Fix `*.(constructor)`

0 commit comments

Comments
 (0)