@appium/docutils 0.1.6 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -5
- package/build/lib/build/mkdocs.d.ts +58 -0
- package/build/lib/build/mkdocs.d.ts.map +1 -0
- package/build/lib/build/mkdocs.js +80 -0
- package/build/lib/build/mkdocs.js.map +1 -0
- package/build/lib/build/typedoc.d.ts +55 -0
- package/build/lib/build/typedoc.d.ts.map +1 -0
- package/build/lib/build/typedoc.js +120 -0
- package/build/lib/build/typedoc.js.map +1 -0
- package/build/lib/build-api.d.ts +18 -0
- package/build/lib/build-api.d.ts.map +1 -0
- package/build/lib/build-api.js +75 -0
- package/build/lib/build-api.js.map +1 -0
- package/build/lib/build.d.ts +21 -0
- package/build/lib/build.d.ts.map +1 -0
- package/build/lib/build.js +71 -0
- package/build/lib/build.js.map +1 -0
- package/build/lib/builder/deploy.d.ts +89 -0
- package/build/lib/builder/deploy.d.ts.map +1 -0
- package/build/lib/builder/deploy.js +105 -0
- package/build/lib/builder/deploy.js.map +1 -0
- package/build/lib/builder/index.d.ts +5 -0
- package/build/lib/builder/index.d.ts.map +1 -0
- package/build/lib/builder/index.js +21 -0
- package/build/lib/builder/index.js.map +1 -0
- package/build/lib/builder/nav.d.ts +81 -0
- package/build/lib/builder/nav.d.ts.map +1 -0
- package/build/lib/builder/nav.js +280 -0
- package/build/lib/builder/nav.js.map +1 -0
- package/build/lib/builder/reference.d.ts +57 -0
- package/build/lib/builder/reference.d.ts.map +1 -0
- package/build/lib/builder/reference.js +129 -0
- package/build/lib/builder/reference.js.map +1 -0
- package/build/lib/builder/site.d.ts +55 -0
- package/build/lib/builder/site.d.ts.map +1 -0
- package/build/lib/builder/site.js +81 -0
- package/build/lib/builder/site.js.map +1 -0
- package/build/lib/cli/command/build.d.ts +178 -0
- package/build/lib/cli/command/build.d.ts.map +1 -0
- package/build/lib/cli/command/build.js +223 -0
- package/build/lib/cli/command/build.js.map +1 -0
- package/build/lib/cli/command/deploy.d.ts +1 -0
- package/build/lib/cli/command/deploy.d.ts.map +1 -0
- package/build/lib/cli/command/deploy.js +2 -0
- package/build/lib/cli/command/deploy.js.map +1 -0
- package/build/lib/cli/command/index.d.ts +4 -0
- package/build/lib/cli/command/index.d.ts.map +1 -0
- package/build/lib/cli/command/index.js +13 -0
- package/build/lib/cli/command/index.js.map +1 -0
- package/build/lib/cli/command/init.d.ts +143 -0
- package/build/lib/cli/command/init.d.ts.map +1 -0
- package/build/lib/cli/command/init.js +164 -0
- package/build/lib/cli/command/init.js.map +1 -0
- package/build/lib/cli/command/validate.d.ts +76 -0
- package/build/lib/cli/command/validate.d.ts.map +1 -0
- package/build/lib/cli/command/validate.js +115 -0
- package/build/lib/cli/command/validate.js.map +1 -0
- package/build/lib/cli/command-init.d.ts +143 -0
- package/build/lib/cli/command-init.d.ts.map +1 -0
- package/build/lib/cli/command-init.js +164 -0
- package/build/lib/cli/command-init.js.map +1 -0
- package/build/lib/cli/command-validate.d.ts +52 -0
- package/build/lib/cli/command-validate.d.ts.map +1 -0
- package/build/lib/cli/command-validate.js +66 -0
- package/build/lib/cli/command-validate.js.map +1 -0
- package/build/lib/cli/config.d.ts +28 -0
- package/build/lib/cli/config.d.ts.map +1 -0
- package/build/lib/cli/config.js +114 -0
- package/build/lib/cli/config.js.map +1 -0
- package/build/lib/cli/index.d.ts +13 -0
- package/build/lib/cli/index.d.ts.map +1 -0
- package/build/lib/cli/index.js +91 -0
- package/build/lib/cli/index.js.map +1 -0
- package/build/lib/cli/init.d.ts +143 -0
- package/build/lib/cli/init.d.ts.map +1 -0
- package/build/lib/cli/init.js +164 -0
- package/build/lib/cli/init.js.map +1 -0
- package/build/lib/cli/options.d.ts +1 -0
- package/build/lib/cli/options.d.ts.map +1 -0
- package/build/lib/cli/options.js +2 -0
- package/build/lib/cli/options.js.map +1 -0
- package/build/lib/cli/validate.d.ts +1 -0
- package/build/lib/cli/validate.d.ts.map +1 -0
- package/build/lib/cli/validate.js +2 -0
- package/build/lib/cli/validate.js.map +1 -0
- package/build/lib/cli.d.ts +10 -0
- package/build/lib/cli.d.ts.map +1 -0
- package/build/lib/cli.js +328 -0
- package/build/lib/cli.js.map +1 -0
- package/build/lib/constants.d.ts +125 -0
- package/build/lib/constants.d.ts.map +1 -0
- package/build/lib/constants.js +133 -0
- package/build/lib/constants.js.map +1 -0
- package/build/lib/error.d.ts +3 -0
- package/build/lib/error.d.ts.map +1 -0
- package/build/lib/error.js +7 -0
- package/build/lib/error.js.map +1 -0
- package/build/lib/fs.d.ts +142 -0
- package/build/lib/fs.d.ts.map +1 -0
- package/build/lib/fs.js +237 -0
- package/build/lib/fs.js.map +1 -0
- package/build/lib/index.d.ts +5 -2
- package/build/lib/index.d.ts.map +1 -1
- package/build/lib/index.js +4 -1
- package/build/lib/index.js.map +1 -1
- package/build/lib/init-task.d.ts +49 -0
- package/build/lib/init-task.d.ts.map +1 -0
- package/build/lib/init-task.js +95 -0
- package/build/lib/init-task.js.map +1 -0
- package/build/lib/init.d.ts +202 -0
- package/build/lib/init.d.ts.map +1 -0
- package/build/lib/init.js +225 -0
- package/build/lib/init.js.map +1 -0
- package/build/lib/io.d.ts +1 -0
- package/build/lib/io.d.ts.map +1 -0
- package/build/lib/io.js +2 -0
- package/build/lib/io.js.map +1 -0
- package/build/lib/logger.d.ts +17 -2
- package/build/lib/logger.d.ts.map +1 -1
- package/build/lib/logger.js +187 -2
- package/build/lib/logger.js.map +1 -1
- package/build/lib/mike.d.ts +3 -0
- package/build/lib/mike.d.ts.map +1 -1
- package/build/lib/mike.js +4 -0
- package/build/lib/mike.js.map +1 -1
- package/build/lib/mkdocs.d.ts +51 -12
- package/build/lib/mkdocs.d.ts.map +1 -1
- package/build/lib/mkdocs.js +64 -32
- package/build/lib/mkdocs.js.map +1 -1
- package/build/lib/model.d.ts +80 -0
- package/build/lib/model.d.ts.map +1 -0
- package/build/lib/model.js +8 -0
- package/build/lib/model.js.map +1 -0
- package/build/lib/nav.d.ts +47 -0
- package/build/lib/nav.d.ts.map +1 -0
- package/build/lib/nav.js +132 -0
- package/build/lib/nav.js.map +1 -0
- package/build/lib/scaffold.d.ts +95 -0
- package/build/lib/scaffold.d.ts.map +1 -0
- package/build/lib/scaffold.js +103 -0
- package/build/lib/scaffold.js.map +1 -0
- package/build/lib/test.d.ts +9 -0
- package/build/lib/test.d.ts.map +1 -0
- package/build/lib/test.js +2 -0
- package/build/lib/test.js.map +1 -0
- package/build/lib/typedoc.d.ts +55 -0
- package/build/lib/typedoc.d.ts.map +1 -0
- package/build/lib/typedoc.js +122 -0
- package/build/lib/typedoc.js.map +1 -0
- package/build/lib/types.d.ts +52 -0
- package/build/lib/types.d.ts.map +1 -0
- package/build/lib/types.js +7 -0
- package/build/lib/types.js.map +1 -0
- package/build/lib/util.d.ts +42 -0
- package/build/lib/util.d.ts.map +1 -0
- package/build/lib/util.js +56 -0
- package/build/lib/util.js.map +1 -0
- package/build/lib/validate.d.ts +218 -0
- package/build/lib/validate.d.ts.map +1 -0
- package/build/lib/validate.js +501 -0
- package/build/lib/validate.js.map +1 -0
- package/build/lib/validation/base-validator.d.ts +218 -0
- package/build/lib/validation/base-validator.d.ts.map +1 -0
- package/build/lib/validation/base-validator.js +453 -0
- package/build/lib/validation/base-validator.js.map +1 -0
- package/build/lib/validation/mkdocs-validator.d.ts +5 -0
- package/build/lib/validation/mkdocs-validator.d.ts.map +1 -0
- package/build/lib/validation/mkdocs-validator.js +54 -0
- package/build/lib/validation/mkdocs-validator.js.map +1 -0
- package/build/lib/validation/python-validator.d.ts +1 -0
- package/build/lib/validation/python-validator.d.ts.map +1 -0
- package/build/lib/validation/python-validator.js +2 -0
- package/build/lib/validation/python-validator.js.map +1 -0
- package/build/lib/validation/python.d.ts +1 -0
- package/build/lib/validation/python.d.ts.map +1 -0
- package/build/lib/validation/python.js +2 -0
- package/build/lib/validation/python.js.map +1 -0
- package/build/lib/validation/validate.d.ts +221 -0
- package/build/lib/validation/validate.d.ts.map +1 -0
- package/build/lib/validation/validate.js +508 -0
- package/build/lib/validation/validate.js.map +1 -0
- package/build/lib/validation/validator.d.ts +220 -0
- package/build/lib/validation/validator.d.ts.map +1 -0
- package/build/lib/validation/validator.js +470 -0
- package/build/lib/validation/validator.js.map +1 -0
- package/lib/builder/deploy.ts +223 -0
- package/lib/builder/index.ts +4 -0
- package/lib/builder/nav.ts +399 -0
- package/lib/builder/reference.ts +191 -0
- package/lib/builder/site.ts +143 -0
- package/lib/cli/command/build.ts +229 -0
- package/lib/cli/command/index.ts +3 -0
- package/lib/cli/command/init.ts +166 -0
- package/lib/cli/command/validate.ts +122 -0
- package/lib/cli/config.ts +89 -0
- package/lib/cli/index.ts +88 -0
- package/lib/constants.ts +150 -0
- package/lib/error.ts +1 -0
- package/lib/fs.ts +274 -0
- package/lib/index.ts +5 -0
- package/lib/init.ts +319 -0
- package/lib/logger.ts +198 -0
- package/lib/mike.js +4 -0
- package/lib/model.ts +92 -0
- package/lib/scaffold.ts +225 -0
- package/lib/util.ts +76 -0
- package/lib/validate.ts +728 -0
- package/package.json +38 -6
- package/requirements.txt +4 -0
- package/tsconfig.json +2 -1
- package/build/tsconfig.tsbuildinfo +0 -1
- package/lib/index.js +0 -2
- package/lib/logger.js +0 -3
- package/lib/mkdocs.js +0 -43
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds reference documentation via TypeDoc. The output is _markdown_, intended to be imported into MkDocs.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {fs} from '@appium/support';
|
|
8
|
+
import glob from 'glob';
|
|
9
|
+
import _ from 'lodash';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import {Application, ArgumentsReader, TypeDocOptions, TypeDocReader} from 'typedoc';
|
|
12
|
+
import {
|
|
13
|
+
DEFAULT_LOG_LEVEL,
|
|
14
|
+
DEFAULT_REL_TYPEDOC_OUT_PATH,
|
|
15
|
+
NAME_BIN,
|
|
16
|
+
NAME_TYPEDOC_JSON,
|
|
17
|
+
} from '../constants';
|
|
18
|
+
import {DocutilsError} from '../error';
|
|
19
|
+
import {findPkgDir, findTypeDocJsonPath, readTypedocJson} from '../fs';
|
|
20
|
+
import logger from '../logger';
|
|
21
|
+
import {argify, relative, stopwatch} from '../util';
|
|
22
|
+
|
|
23
|
+
const log = logger.withTag('builder:reference');
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Replaces TypeDoc's homebrew "glob" implementation with a real one
|
|
27
|
+
*
|
|
28
|
+
* This cannot be done via `require('typedoc')` or `import` due to the file being excluded
|
|
29
|
+
* from the export map in its `package.json`.
|
|
30
|
+
* @see https://github.com/TypeStrong/typedoc/issues/2151
|
|
31
|
+
*/
|
|
32
|
+
const monkeyPatchTypedoc = _.once(async () => {
|
|
33
|
+
const typedocDir = await findPkgDir(require.resolve('typedoc'));
|
|
34
|
+
if (!typedocDir) {
|
|
35
|
+
throw new DocutilsError('Could not find TypeDoc package directory; is it installed?');
|
|
36
|
+
}
|
|
37
|
+
const tdFs = require(path.join(typedocDir, 'dist', 'lib', 'utils', 'fs.js'));
|
|
38
|
+
tdFs.glob = glob.sync;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Executes TypeDoc _in the current process_
|
|
43
|
+
*
|
|
44
|
+
* You will probably want to run `updateNav()` after this.
|
|
45
|
+
*
|
|
46
|
+
* @privateRemarks Monkeypatches TypeDoc's homebrew "glob" implementation because it is broken
|
|
47
|
+
* @parma typeDocJsonPath - Path to `typedoc.json`
|
|
48
|
+
* @param opts - TypeDoc options
|
|
49
|
+
*/
|
|
50
|
+
export async function runTypedoc(typeDocJsonPath: string, opts: Record<string, string>) {
|
|
51
|
+
await monkeyPatchTypedoc();
|
|
52
|
+
log.debug('Monkeypatched TypeDoc');
|
|
53
|
+
|
|
54
|
+
const args = argify(opts);
|
|
55
|
+
log.debug('TypeDoc args:', args);
|
|
56
|
+
const app = new Application();
|
|
57
|
+
app.options.setValue('plugin', [
|
|
58
|
+
'typedoc-plugin-markdown',
|
|
59
|
+
'typedoc-plugin-resolve-crossmodule-references',
|
|
60
|
+
'@appium/typedoc-plugin-appium',
|
|
61
|
+
]);
|
|
62
|
+
app.options.addReader(new TypeDocReader());
|
|
63
|
+
app.options.addReader(new ArgumentsReader(100, args));
|
|
64
|
+
app.bootstrap({options: path.dirname(typeDocJsonPath)});
|
|
65
|
+
const out = app.options.getValue('out');
|
|
66
|
+
const project = app.convert();
|
|
67
|
+
if (project) {
|
|
68
|
+
return await app.generateDocs(project, out);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
throw new DocutilsError('TypeDoc found nothing to document. Is your package empty?');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Options for {@linkcode buildReferenceDocs}
|
|
76
|
+
*/
|
|
77
|
+
export interface BuildReferenceOptions {
|
|
78
|
+
/**
|
|
79
|
+
* Path to `typedoc.json`
|
|
80
|
+
*/
|
|
81
|
+
typedocJson?: string;
|
|
82
|
+
/**
|
|
83
|
+
* Current working directory
|
|
84
|
+
*/
|
|
85
|
+
cwd?: string;
|
|
86
|
+
/**
|
|
87
|
+
* Path to `package.json`
|
|
88
|
+
*/
|
|
89
|
+
packageJson?: string;
|
|
90
|
+
/**
|
|
91
|
+
* Path to `tsconfig.json`
|
|
92
|
+
*/
|
|
93
|
+
tsconfigJson?: string;
|
|
94
|
+
/**
|
|
95
|
+
* "Title" for generated docs; this corresponds to {@linkcode typedoc.TypeDocOptionMap.name}
|
|
96
|
+
*/
|
|
97
|
+
title?: string;
|
|
98
|
+
/**
|
|
99
|
+
* This is here because we pass it thru to TypeDoc
|
|
100
|
+
*/
|
|
101
|
+
logLevel?: LogLevelName;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Log level names as supported by this package
|
|
106
|
+
*
|
|
107
|
+
* Used to convert our log level to TypeDoc's
|
|
108
|
+
*/
|
|
109
|
+
type LogLevelName = 'debug' | 'info' | 'error' | 'warn';
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Mapping of whatever our log level is to whatever TypeDoc's should be.
|
|
113
|
+
*
|
|
114
|
+
* TypeDoc's "info" is too verbose for our needs, and it's our default, so
|
|
115
|
+
* we map it to "warn".
|
|
116
|
+
*/
|
|
117
|
+
const TypeDocLogLevelMap: Record<LogLevelName, string> = {
|
|
118
|
+
debug: 'Verbose',
|
|
119
|
+
info: 'Warn',
|
|
120
|
+
warn: 'Warn',
|
|
121
|
+
error: 'Error',
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Build reference documentation via TypeDoc
|
|
126
|
+
* @param opts - Options
|
|
127
|
+
*/
|
|
128
|
+
export async function buildReferenceDocs({
|
|
129
|
+
typedocJson: typeDocJsonPath,
|
|
130
|
+
cwd = process.cwd(),
|
|
131
|
+
tsconfigJson: tsconfig,
|
|
132
|
+
logLevel = DEFAULT_LOG_LEVEL,
|
|
133
|
+
title,
|
|
134
|
+
}: BuildReferenceOptions = {}) {
|
|
135
|
+
const stop = stopwatch('buildReferenceDocs');
|
|
136
|
+
typeDocJsonPath = typeDocJsonPath
|
|
137
|
+
? path.resolve(cwd, typeDocJsonPath)
|
|
138
|
+
: await findTypeDocJsonPath(cwd);
|
|
139
|
+
if (!typeDocJsonPath) {
|
|
140
|
+
throw new DocutilsError(
|
|
141
|
+
`Could not find ${NAME_TYPEDOC_JSON} from ${cwd}; run "${NAME_BIN}" to create it`
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
const pkgRoot = fs.findRoot(cwd);
|
|
145
|
+
const relativePath = relative(cwd);
|
|
146
|
+
const relativeTypeDocJsonPath = relativePath(typeDocJsonPath);
|
|
147
|
+
log.debug(`Using ${relativeTypeDocJsonPath} as typedoc.json`);
|
|
148
|
+
|
|
149
|
+
let typeDocJson: Readonly<Partial<TypeDocOptions>>;
|
|
150
|
+
// we only need typedoc.json to make sure we have a custom "out" path.
|
|
151
|
+
try {
|
|
152
|
+
typeDocJson = readTypedocJson(typeDocJsonPath);
|
|
153
|
+
log.debug('Contents of %s: %O', relativeTypeDocJsonPath, typeDocJson);
|
|
154
|
+
} catch (err) {
|
|
155
|
+
log.error(err);
|
|
156
|
+
throw new DocutilsError(
|
|
157
|
+
`Could not read ${relativeTypeDocJsonPath}; run "${NAME_BIN} init" to create it`
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// if for some reason "out" is not in typedoc.json, we want to use our default path.
|
|
162
|
+
// otherwise, typedoc's default behavior is to write to the "docs" dir, which is the same dir that
|
|
163
|
+
// we use (by default) as a source dir for the mkdocs site--which might contain files under vcs.
|
|
164
|
+
let out: string | undefined;
|
|
165
|
+
if (typeDocJson.out) {
|
|
166
|
+
log.debug(`Found "out" option in ${NAME_TYPEDOC_JSON}: ${typeDocJson.out}`);
|
|
167
|
+
} else {
|
|
168
|
+
out = path.relative(
|
|
169
|
+
path.dirname(typeDocJsonPath),
|
|
170
|
+
path.join(pkgRoot, DEFAULT_REL_TYPEDOC_OUT_PATH)
|
|
171
|
+
);
|
|
172
|
+
log.debug('Setting "out" option to %s', out);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const extraTypedocOpts = _.pickBy(
|
|
176
|
+
{tsconfig, name: title, out, logLevel: TypeDocLogLevelMap[logLevel]},
|
|
177
|
+
Boolean
|
|
178
|
+
) as Record<string, string>;
|
|
179
|
+
|
|
180
|
+
try {
|
|
181
|
+
await runTypedoc(typeDocJsonPath, extraTypedocOpts);
|
|
182
|
+
let finalOut = (typeDocJson.out ?? out) as string;
|
|
183
|
+
log.success(
|
|
184
|
+
'Reference docs built at %s (%dms)',
|
|
185
|
+
path.isAbsolute(finalOut) ? relativePath(finalOut) : finalOut,
|
|
186
|
+
stop()
|
|
187
|
+
);
|
|
188
|
+
} catch (err) {
|
|
189
|
+
log.error(err);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs `mkdocs`, pulling in reference markdown from TypeDoc and any other documentation from the
|
|
3
|
+
* `docs_dir` directory (as configured in `mkdocs.yml`).
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import {exec, SubProcess, TeenProcessExecOptions} from 'teen_process';
|
|
10
|
+
import {NAME_BIN, NAME_MKDOCS, NAME_MKDOCS_YML} from '../constants';
|
|
11
|
+
import {DocutilsError} from '../error';
|
|
12
|
+
import {findMkDocsYml, readMkDocsYml, whichMkDocs} from '../fs';
|
|
13
|
+
import logger from '../logger';
|
|
14
|
+
import {relative, stopwatch, TeenProcessSubprocessStartOpts} from '../util';
|
|
15
|
+
|
|
16
|
+
const log = logger.withTag('mkdocs');
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Runs `mkdocs serve`
|
|
20
|
+
* @param args Extra args to `mkdocs build`
|
|
21
|
+
* @param opts Extra options for `teen_process.Subprocess.start`
|
|
22
|
+
* @param mkDocsPath Path to `mkdocs` executable
|
|
23
|
+
*/
|
|
24
|
+
async function doServe(
|
|
25
|
+
args: string[] = [],
|
|
26
|
+
{startDetector, detach, timeoutMs}: TeenProcessSubprocessStartOpts = {},
|
|
27
|
+
mkDocsPath?: string
|
|
28
|
+
) {
|
|
29
|
+
mkDocsPath = mkDocsPath ?? (await whichMkDocs());
|
|
30
|
+
const finalArgs = ['serve', ...args];
|
|
31
|
+
log.debug('Launching %s with args: %O', mkDocsPath, finalArgs);
|
|
32
|
+
const proc = new SubProcess(mkDocsPath, finalArgs);
|
|
33
|
+
return await proc.start(startDetector, detach, timeoutMs);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Runs `mkdocs build`
|
|
38
|
+
* @param args Extra args to `mkdocs build`
|
|
39
|
+
* @param opts Extra options to `teen_process.exec`
|
|
40
|
+
* @param mkDocsPath Path to `mkdocs` executable
|
|
41
|
+
*/
|
|
42
|
+
async function doBuild(
|
|
43
|
+
args: string[] = [],
|
|
44
|
+
opts: TeenProcessExecOptions = {},
|
|
45
|
+
mkDocsPath?: string
|
|
46
|
+
) {
|
|
47
|
+
mkDocsPath = mkDocsPath ?? (await whichMkDocs());
|
|
48
|
+
const finalArgs = ['build', ...args];
|
|
49
|
+
log.debug('Launching %s with args: %O', mkDocsPath, finalArgs);
|
|
50
|
+
return await exec(mkDocsPath, finalArgs, opts);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Runs `mkdocs build` or `mkdocs serve`
|
|
55
|
+
* @param opts
|
|
56
|
+
*/
|
|
57
|
+
export async function buildSite({
|
|
58
|
+
mkdocsYml: mkDocsYmlPath,
|
|
59
|
+
siteDir,
|
|
60
|
+
theme = NAME_MKDOCS,
|
|
61
|
+
cwd = process.cwd(),
|
|
62
|
+
serve = false,
|
|
63
|
+
serveOpts,
|
|
64
|
+
execOpts,
|
|
65
|
+
}: BuildMkDocsOpts = {}) {
|
|
66
|
+
const stop = stopwatch('build-mkdocs');
|
|
67
|
+
mkDocsYmlPath = mkDocsYmlPath
|
|
68
|
+
? path.resolve(process.cwd(), mkDocsYmlPath)
|
|
69
|
+
: await findMkDocsYml(cwd);
|
|
70
|
+
if (!mkDocsYmlPath) {
|
|
71
|
+
throw new DocutilsError(
|
|
72
|
+
`Could not find ${NAME_MKDOCS_YML} from ${cwd}; run "${NAME_BIN} init" to create it`
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
const mkdocsArgs = ['-f', mkDocsYmlPath, '-t', theme];
|
|
76
|
+
if (siteDir) {
|
|
77
|
+
mkdocsArgs.push('-d', siteDir);
|
|
78
|
+
}
|
|
79
|
+
if (serve) {
|
|
80
|
+
// unsure about how SIGHUP is handled here
|
|
81
|
+
await doServe(mkdocsArgs, serveOpts);
|
|
82
|
+
} else {
|
|
83
|
+
await doBuild(mkdocsArgs, execOpts);
|
|
84
|
+
let relSiteDir;
|
|
85
|
+
if (siteDir) {
|
|
86
|
+
relSiteDir = relative(cwd, siteDir);
|
|
87
|
+
} else {
|
|
88
|
+
({site_dir: siteDir} = await readMkDocsYml(mkDocsYmlPath));
|
|
89
|
+
log.debug('Found site_dir %s', siteDir);
|
|
90
|
+
relSiteDir = relative(path.dirname(mkDocsYmlPath), siteDir!);
|
|
91
|
+
}
|
|
92
|
+
log.success('MkDocs finished building into %s (%dms)', relSiteDir, stop());
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Options for {@linkcode buildSite}.
|
|
98
|
+
*/
|
|
99
|
+
export interface BuildMkDocsOpts {
|
|
100
|
+
/**
|
|
101
|
+
* Path to `mkdocs.yml`
|
|
102
|
+
*/
|
|
103
|
+
mkdocsYml?: string;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Path to output directory
|
|
107
|
+
*/
|
|
108
|
+
siteDir?: string;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* MkDocs theme to use
|
|
112
|
+
* @defaultValue 'mkdocs'
|
|
113
|
+
*/
|
|
114
|
+
theme?: string;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Current working directory
|
|
118
|
+
* @defaultValue `process.cwd()`
|
|
119
|
+
*/
|
|
120
|
+
cwd?: string;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Path to `package.json`
|
|
124
|
+
*
|
|
125
|
+
* Used to find `mkdocs.yml` if unspecified.
|
|
126
|
+
*/
|
|
127
|
+
packageJson?: string;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* If `true`, run `mkdocs serve` instead of `mkdocs build`
|
|
131
|
+
*/
|
|
132
|
+
serve?: boolean;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Extra options for {@linkcode teen_process.exec}
|
|
136
|
+
*/
|
|
137
|
+
execOpts?: TeenProcessExecOptions;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Extra options for {@linkcode teen_process.Subprocess.start}
|
|
141
|
+
*/
|
|
142
|
+
serveOpts?: TeenProcessSubprocessStartOpts;
|
|
143
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import {CommandModule, InferredOptionTypes, Options} from 'yargs';
|
|
2
|
+
import {buildReferenceDocs, buildSite, deploy, updateNav} from '../../builder';
|
|
3
|
+
import {NAME_BIN} from '../../constants';
|
|
4
|
+
import logger from '../../logger';
|
|
5
|
+
import {stopwatch} from '../../util';
|
|
6
|
+
|
|
7
|
+
const log = logger.withTag('build');
|
|
8
|
+
|
|
9
|
+
const NAME_GROUP_BUILD = 'Build Options:';
|
|
10
|
+
const NAME_GROUP_DEPLOY = 'Deployment Options:';
|
|
11
|
+
const NAME_GROUP_SERVE = 'Serve Options:';
|
|
12
|
+
const NAME_GROUP_BUILD_PATHS = 'Paths:';
|
|
13
|
+
|
|
14
|
+
const opts = {
|
|
15
|
+
reference: {
|
|
16
|
+
describe: 'Run TypeDoc command API reference build (Markdown)',
|
|
17
|
+
group: NAME_GROUP_BUILD,
|
|
18
|
+
type: 'boolean',
|
|
19
|
+
default: true,
|
|
20
|
+
},
|
|
21
|
+
site: {
|
|
22
|
+
describe: 'Run MkDocs build (HTML)',
|
|
23
|
+
group: NAME_GROUP_BUILD,
|
|
24
|
+
type: 'boolean',
|
|
25
|
+
default: true,
|
|
26
|
+
},
|
|
27
|
+
'site-dir': {
|
|
28
|
+
alias: 'd',
|
|
29
|
+
describe: 'HTML output directory',
|
|
30
|
+
group: NAME_GROUP_BUILD_PATHS,
|
|
31
|
+
nargs: 1,
|
|
32
|
+
requiresArg: true,
|
|
33
|
+
type: 'string',
|
|
34
|
+
normalize: true,
|
|
35
|
+
implies: 'site',
|
|
36
|
+
defaultDescription: '(from mkdocs.yml)',
|
|
37
|
+
},
|
|
38
|
+
'package-json': {
|
|
39
|
+
defaultDescription: './package.json',
|
|
40
|
+
describe: 'Path to package.json',
|
|
41
|
+
group: NAME_GROUP_BUILD_PATHS,
|
|
42
|
+
nargs: 1,
|
|
43
|
+
normalize: true,
|
|
44
|
+
requiresArg: true,
|
|
45
|
+
type: 'string',
|
|
46
|
+
},
|
|
47
|
+
title: {
|
|
48
|
+
defaultDescription: '(extension package name)',
|
|
49
|
+
describe: 'Title of the API reference',
|
|
50
|
+
group: NAME_GROUP_BUILD,
|
|
51
|
+
nargs: 1,
|
|
52
|
+
requiresArg: true,
|
|
53
|
+
type: 'string',
|
|
54
|
+
},
|
|
55
|
+
'tsconfig-json': {
|
|
56
|
+
defaultDescription: './tsconfig.json',
|
|
57
|
+
describe: 'Path to tsconfig.json',
|
|
58
|
+
group: NAME_GROUP_BUILD_PATHS,
|
|
59
|
+
nargs: 1,
|
|
60
|
+
normalize: true,
|
|
61
|
+
requiresArg: true,
|
|
62
|
+
type: 'string',
|
|
63
|
+
},
|
|
64
|
+
'mkdocs-yml': {
|
|
65
|
+
defaultDescription: './mkdocs.yml',
|
|
66
|
+
description: 'Path to mkdocs.yml',
|
|
67
|
+
group: NAME_GROUP_BUILD_PATHS,
|
|
68
|
+
nargs: 1,
|
|
69
|
+
normalize: true,
|
|
70
|
+
requiresArg: true,
|
|
71
|
+
type: 'string',
|
|
72
|
+
},
|
|
73
|
+
'typedoc-json': {
|
|
74
|
+
defaultDescription: './typedoc.json',
|
|
75
|
+
describe: 'Path to typedoc.json',
|
|
76
|
+
group: NAME_GROUP_BUILD_PATHS,
|
|
77
|
+
nargs: 1,
|
|
78
|
+
normalize: true,
|
|
79
|
+
requiresArg: true,
|
|
80
|
+
type: 'string',
|
|
81
|
+
},
|
|
82
|
+
all: {
|
|
83
|
+
describe: 'Output all reference docs (not just Appium comands)',
|
|
84
|
+
group: NAME_GROUP_BUILD,
|
|
85
|
+
implies: 'site',
|
|
86
|
+
type: 'boolean',
|
|
87
|
+
},
|
|
88
|
+
deploy: {
|
|
89
|
+
describe: 'Commit HTML output',
|
|
90
|
+
group: NAME_GROUP_DEPLOY,
|
|
91
|
+
type: 'boolean',
|
|
92
|
+
implies: 'site',
|
|
93
|
+
},
|
|
94
|
+
push: {
|
|
95
|
+
describe: 'Push after deploy',
|
|
96
|
+
group: NAME_GROUP_DEPLOY,
|
|
97
|
+
type: 'boolean',
|
|
98
|
+
implies: 'deploy',
|
|
99
|
+
},
|
|
100
|
+
branch: {
|
|
101
|
+
alias: 'b',
|
|
102
|
+
describe: 'Branch to commit to',
|
|
103
|
+
implies: 'deploy',
|
|
104
|
+
group: NAME_GROUP_DEPLOY,
|
|
105
|
+
type: 'string',
|
|
106
|
+
requiresArg: true,
|
|
107
|
+
nargs: 1,
|
|
108
|
+
defaultDescription: 'gh-pages',
|
|
109
|
+
},
|
|
110
|
+
remote: {
|
|
111
|
+
alias: 'r',
|
|
112
|
+
describe: 'Remote to push to',
|
|
113
|
+
implies: ['deploy', 'push'],
|
|
114
|
+
group: NAME_GROUP_DEPLOY,
|
|
115
|
+
type: 'string',
|
|
116
|
+
requiresArg: true,
|
|
117
|
+
nargs: 1,
|
|
118
|
+
defaultDescription: 'origin',
|
|
119
|
+
},
|
|
120
|
+
prefix: {
|
|
121
|
+
describe: 'Subdirectory within <branch> to commit to',
|
|
122
|
+
implies: ['deploy', 'branch'],
|
|
123
|
+
group: NAME_GROUP_DEPLOY,
|
|
124
|
+
type: 'string',
|
|
125
|
+
nargs: 1,
|
|
126
|
+
requiresArg: true,
|
|
127
|
+
},
|
|
128
|
+
message: {
|
|
129
|
+
alias: 'm',
|
|
130
|
+
describe: 'Commit message',
|
|
131
|
+
implies: 'deploy',
|
|
132
|
+
group: NAME_GROUP_DEPLOY,
|
|
133
|
+
type: 'string',
|
|
134
|
+
nargs: 1,
|
|
135
|
+
requiresArg: true,
|
|
136
|
+
},
|
|
137
|
+
'deploy-version': {
|
|
138
|
+
describe: 'Version (directory) to deploy build to',
|
|
139
|
+
implies: 'deploy',
|
|
140
|
+
group: NAME_GROUP_DEPLOY,
|
|
141
|
+
type: 'string',
|
|
142
|
+
nargs: 1,
|
|
143
|
+
requiresArg: true,
|
|
144
|
+
defaultDescription: '(derived from package.json)',
|
|
145
|
+
},
|
|
146
|
+
alias: {
|
|
147
|
+
describe: 'Alias for the build (e.g., "latest"); triggers alias update',
|
|
148
|
+
implies: 'deploy',
|
|
149
|
+
group: NAME_GROUP_DEPLOY,
|
|
150
|
+
type: 'string',
|
|
151
|
+
nargs: 1,
|
|
152
|
+
requiresArg: true,
|
|
153
|
+
defaultDescription: 'latest',
|
|
154
|
+
},
|
|
155
|
+
rebase: {
|
|
156
|
+
describe: 'Rebase <branch> with remote before deploy',
|
|
157
|
+
implies: ['deploy', 'branch', 'remote'],
|
|
158
|
+
group: NAME_GROUP_DEPLOY,
|
|
159
|
+
type: 'boolean',
|
|
160
|
+
},
|
|
161
|
+
serve: {
|
|
162
|
+
describe: 'Start development server',
|
|
163
|
+
group: NAME_GROUP_SERVE,
|
|
164
|
+
type: 'boolean',
|
|
165
|
+
},
|
|
166
|
+
port: {
|
|
167
|
+
alias: 'p',
|
|
168
|
+
describe: 'Development server port',
|
|
169
|
+
group: NAME_GROUP_SERVE,
|
|
170
|
+
type: 'number',
|
|
171
|
+
defaultDescription: '8000',
|
|
172
|
+
implies: 'serve',
|
|
173
|
+
nargs: 1,
|
|
174
|
+
requiresArg: true,
|
|
175
|
+
},
|
|
176
|
+
host: {
|
|
177
|
+
alias: 'h',
|
|
178
|
+
describe: 'Development server host',
|
|
179
|
+
group: NAME_GROUP_SERVE,
|
|
180
|
+
type: 'string',
|
|
181
|
+
nargs: 1,
|
|
182
|
+
requiresArg: true,
|
|
183
|
+
implies: 'serve',
|
|
184
|
+
defaultDescription: 'localhost',
|
|
185
|
+
},
|
|
186
|
+
} as const;
|
|
187
|
+
|
|
188
|
+
opts as Record<string, Options>;
|
|
189
|
+
type BuildOptions = InferredOptionTypes<typeof opts>;
|
|
190
|
+
|
|
191
|
+
const buildCommand: CommandModule<{}, BuildOptions> = {
|
|
192
|
+
command: 'build',
|
|
193
|
+
describe: 'Build Appium extension documentation',
|
|
194
|
+
builder: (yargs) =>
|
|
195
|
+
yargs.options(opts).check((argv) => {
|
|
196
|
+
// either this method doesn't provide camel-cased props, or the types are wrong.
|
|
197
|
+
if (argv.deploy === true && argv['site-dir']) {
|
|
198
|
+
log.error(
|
|
199
|
+
`--site-dir is unsupported when running "${NAME_BIN} deploy"; use --prefix if needd, but remember that the default behavior is to deploy to the root of the branch (${argv.branch}) instead of a subdirectory`
|
|
200
|
+
);
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
return true;
|
|
204
|
+
}),
|
|
205
|
+
async handler(args) {
|
|
206
|
+
const stop = stopwatch('build');
|
|
207
|
+
log.debug('Build command called with args: %O', args);
|
|
208
|
+
if (!args.site && !args.reference) {
|
|
209
|
+
// specifically not a DocUtils error
|
|
210
|
+
throw new Error(
|
|
211
|
+
'Cannot use both --no-site (--site=false) and --no-reference (--reference=false)'
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
if (args.reference) {
|
|
215
|
+
await buildReferenceDocs(args);
|
|
216
|
+
}
|
|
217
|
+
if (args.site) {
|
|
218
|
+
await updateNav(args);
|
|
219
|
+
if (args.deploy) {
|
|
220
|
+
await deploy(args);
|
|
221
|
+
} else {
|
|
222
|
+
await buildSite(args);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
log.success('Done! (total: %dms)', stop());
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
export default buildCommand;
|