@appium/docutils 0.1.6 → 0.2.0

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.
Files changed (214) hide show
  1. package/README.md +2 -5
  2. package/build/lib/build/mkdocs.d.ts +58 -0
  3. package/build/lib/build/mkdocs.d.ts.map +1 -0
  4. package/build/lib/build/mkdocs.js +80 -0
  5. package/build/lib/build/mkdocs.js.map +1 -0
  6. package/build/lib/build/typedoc.d.ts +55 -0
  7. package/build/lib/build/typedoc.d.ts.map +1 -0
  8. package/build/lib/build/typedoc.js +120 -0
  9. package/build/lib/build/typedoc.js.map +1 -0
  10. package/build/lib/build-api.d.ts +18 -0
  11. package/build/lib/build-api.d.ts.map +1 -0
  12. package/build/lib/build-api.js +75 -0
  13. package/build/lib/build-api.js.map +1 -0
  14. package/build/lib/build.d.ts +21 -0
  15. package/build/lib/build.d.ts.map +1 -0
  16. package/build/lib/build.js +71 -0
  17. package/build/lib/build.js.map +1 -0
  18. package/build/lib/builder/deploy.d.ts +89 -0
  19. package/build/lib/builder/deploy.d.ts.map +1 -0
  20. package/build/lib/builder/deploy.js +102 -0
  21. package/build/lib/builder/deploy.js.map +1 -0
  22. package/build/lib/builder/index.d.ts +5 -0
  23. package/build/lib/builder/index.d.ts.map +1 -0
  24. package/build/lib/builder/index.js +21 -0
  25. package/build/lib/builder/index.js.map +1 -0
  26. package/build/lib/builder/nav.d.ts +81 -0
  27. package/build/lib/builder/nav.d.ts.map +1 -0
  28. package/build/lib/builder/nav.js +272 -0
  29. package/build/lib/builder/nav.js.map +1 -0
  30. package/build/lib/builder/reference.d.ts +57 -0
  31. package/build/lib/builder/reference.d.ts.map +1 -0
  32. package/build/lib/builder/reference.js +129 -0
  33. package/build/lib/builder/reference.js.map +1 -0
  34. package/build/lib/builder/site.d.ts +55 -0
  35. package/build/lib/builder/site.d.ts.map +1 -0
  36. package/build/lib/builder/site.js +81 -0
  37. package/build/lib/builder/site.js.map +1 -0
  38. package/build/lib/cli/command/build.d.ts +178 -0
  39. package/build/lib/cli/command/build.d.ts.map +1 -0
  40. package/build/lib/cli/command/build.js +223 -0
  41. package/build/lib/cli/command/build.js.map +1 -0
  42. package/build/lib/cli/command/deploy.d.ts +1 -0
  43. package/build/lib/cli/command/deploy.d.ts.map +1 -0
  44. package/build/lib/cli/command/deploy.js +2 -0
  45. package/build/lib/cli/command/deploy.js.map +1 -0
  46. package/build/lib/cli/command/index.d.ts +4 -0
  47. package/build/lib/cli/command/index.d.ts.map +1 -0
  48. package/build/lib/cli/command/index.js +13 -0
  49. package/build/lib/cli/command/index.js.map +1 -0
  50. package/build/lib/cli/command/init.d.ts +143 -0
  51. package/build/lib/cli/command/init.d.ts.map +1 -0
  52. package/build/lib/cli/command/init.js +164 -0
  53. package/build/lib/cli/command/init.js.map +1 -0
  54. package/build/lib/cli/command/validate.d.ts +76 -0
  55. package/build/lib/cli/command/validate.d.ts.map +1 -0
  56. package/build/lib/cli/command/validate.js +115 -0
  57. package/build/lib/cli/command/validate.js.map +1 -0
  58. package/build/lib/cli/command-init.d.ts +143 -0
  59. package/build/lib/cli/command-init.d.ts.map +1 -0
  60. package/build/lib/cli/command-init.js +164 -0
  61. package/build/lib/cli/command-init.js.map +1 -0
  62. package/build/lib/cli/command-validate.d.ts +52 -0
  63. package/build/lib/cli/command-validate.d.ts.map +1 -0
  64. package/build/lib/cli/command-validate.js +66 -0
  65. package/build/lib/cli/command-validate.js.map +1 -0
  66. package/build/lib/cli/config.d.ts +28 -0
  67. package/build/lib/cli/config.d.ts.map +1 -0
  68. package/build/lib/cli/config.js +114 -0
  69. package/build/lib/cli/config.js.map +1 -0
  70. package/build/lib/cli/index.d.ts +13 -0
  71. package/build/lib/cli/index.d.ts.map +1 -0
  72. package/build/lib/cli/index.js +91 -0
  73. package/build/lib/cli/index.js.map +1 -0
  74. package/build/lib/cli/init.d.ts +143 -0
  75. package/build/lib/cli/init.d.ts.map +1 -0
  76. package/build/lib/cli/init.js +164 -0
  77. package/build/lib/cli/init.js.map +1 -0
  78. package/build/lib/cli/options.d.ts +1 -0
  79. package/build/lib/cli/options.d.ts.map +1 -0
  80. package/build/lib/cli/options.js +2 -0
  81. package/build/lib/cli/options.js.map +1 -0
  82. package/build/lib/cli/validate.d.ts +1 -0
  83. package/build/lib/cli/validate.d.ts.map +1 -0
  84. package/build/lib/cli/validate.js +2 -0
  85. package/build/lib/cli/validate.js.map +1 -0
  86. package/build/lib/cli.d.ts +10 -0
  87. package/build/lib/cli.d.ts.map +1 -0
  88. package/build/lib/cli.js +328 -0
  89. package/build/lib/cli.js.map +1 -0
  90. package/build/lib/constants.d.ts +125 -0
  91. package/build/lib/constants.d.ts.map +1 -0
  92. package/build/lib/constants.js +133 -0
  93. package/build/lib/constants.js.map +1 -0
  94. package/build/lib/error.d.ts +3 -0
  95. package/build/lib/error.d.ts.map +1 -0
  96. package/build/lib/error.js +7 -0
  97. package/build/lib/error.js.map +1 -0
  98. package/build/lib/fs.d.ts +142 -0
  99. package/build/lib/fs.d.ts.map +1 -0
  100. package/build/lib/fs.js +237 -0
  101. package/build/lib/fs.js.map +1 -0
  102. package/build/lib/index.d.ts +5 -2
  103. package/build/lib/index.d.ts.map +1 -1
  104. package/build/lib/index.js +4 -1
  105. package/build/lib/index.js.map +1 -1
  106. package/build/lib/init-task.d.ts +49 -0
  107. package/build/lib/init-task.d.ts.map +1 -0
  108. package/build/lib/init-task.js +95 -0
  109. package/build/lib/init-task.js.map +1 -0
  110. package/build/lib/init.d.ts +202 -0
  111. package/build/lib/init.d.ts.map +1 -0
  112. package/build/lib/init.js +225 -0
  113. package/build/lib/init.js.map +1 -0
  114. package/build/lib/io.d.ts +1 -0
  115. package/build/lib/io.d.ts.map +1 -0
  116. package/build/lib/io.js +2 -0
  117. package/build/lib/io.js.map +1 -0
  118. package/build/lib/logger.d.ts +17 -2
  119. package/build/lib/logger.d.ts.map +1 -1
  120. package/build/lib/logger.js +187 -2
  121. package/build/lib/logger.js.map +1 -1
  122. package/build/lib/mike.d.ts +3 -0
  123. package/build/lib/mike.d.ts.map +1 -1
  124. package/build/lib/mike.js +4 -0
  125. package/build/lib/mike.js.map +1 -1
  126. package/build/lib/mkdocs.d.ts +51 -12
  127. package/build/lib/mkdocs.d.ts.map +1 -1
  128. package/build/lib/mkdocs.js +64 -32
  129. package/build/lib/mkdocs.js.map +1 -1
  130. package/build/lib/model.d.ts +80 -0
  131. package/build/lib/model.d.ts.map +1 -0
  132. package/build/lib/model.js +8 -0
  133. package/build/lib/model.js.map +1 -0
  134. package/build/lib/nav.d.ts +47 -0
  135. package/build/lib/nav.d.ts.map +1 -0
  136. package/build/lib/nav.js +132 -0
  137. package/build/lib/nav.js.map +1 -0
  138. package/build/lib/scaffold.d.ts +95 -0
  139. package/build/lib/scaffold.d.ts.map +1 -0
  140. package/build/lib/scaffold.js +103 -0
  141. package/build/lib/scaffold.js.map +1 -0
  142. package/build/lib/test.d.ts +9 -0
  143. package/build/lib/test.d.ts.map +1 -0
  144. package/build/lib/test.js +2 -0
  145. package/build/lib/test.js.map +1 -0
  146. package/build/lib/typedoc.d.ts +55 -0
  147. package/build/lib/typedoc.d.ts.map +1 -0
  148. package/build/lib/typedoc.js +122 -0
  149. package/build/lib/typedoc.js.map +1 -0
  150. package/build/lib/types.d.ts +52 -0
  151. package/build/lib/types.d.ts.map +1 -0
  152. package/build/lib/types.js +7 -0
  153. package/build/lib/types.js.map +1 -0
  154. package/build/lib/util.d.ts +42 -0
  155. package/build/lib/util.d.ts.map +1 -0
  156. package/build/lib/util.js +56 -0
  157. package/build/lib/util.js.map +1 -0
  158. package/build/lib/validate.d.ts +218 -0
  159. package/build/lib/validate.d.ts.map +1 -0
  160. package/build/lib/validate.js +501 -0
  161. package/build/lib/validate.js.map +1 -0
  162. package/build/lib/validation/base-validator.d.ts +218 -0
  163. package/build/lib/validation/base-validator.d.ts.map +1 -0
  164. package/build/lib/validation/base-validator.js +453 -0
  165. package/build/lib/validation/base-validator.js.map +1 -0
  166. package/build/lib/validation/mkdocs-validator.d.ts +5 -0
  167. package/build/lib/validation/mkdocs-validator.d.ts.map +1 -0
  168. package/build/lib/validation/mkdocs-validator.js +54 -0
  169. package/build/lib/validation/mkdocs-validator.js.map +1 -0
  170. package/build/lib/validation/python-validator.d.ts +1 -0
  171. package/build/lib/validation/python-validator.d.ts.map +1 -0
  172. package/build/lib/validation/python-validator.js +2 -0
  173. package/build/lib/validation/python-validator.js.map +1 -0
  174. package/build/lib/validation/python.d.ts +1 -0
  175. package/build/lib/validation/python.d.ts.map +1 -0
  176. package/build/lib/validation/python.js +2 -0
  177. package/build/lib/validation/python.js.map +1 -0
  178. package/build/lib/validation/validate.d.ts +221 -0
  179. package/build/lib/validation/validate.d.ts.map +1 -0
  180. package/build/lib/validation/validate.js +508 -0
  181. package/build/lib/validation/validate.js.map +1 -0
  182. package/build/lib/validation/validator.d.ts +220 -0
  183. package/build/lib/validation/validator.d.ts.map +1 -0
  184. package/build/lib/validation/validator.js +470 -0
  185. package/build/lib/validation/validator.js.map +1 -0
  186. package/lib/builder/deploy.ts +217 -0
  187. package/lib/builder/index.ts +4 -0
  188. package/lib/builder/nav.ts +393 -0
  189. package/lib/builder/reference.ts +191 -0
  190. package/lib/builder/site.ts +143 -0
  191. package/lib/cli/command/build.ts +229 -0
  192. package/lib/cli/command/index.ts +3 -0
  193. package/lib/cli/command/init.ts +166 -0
  194. package/lib/cli/command/validate.ts +122 -0
  195. package/lib/cli/config.ts +89 -0
  196. package/lib/cli/index.ts +88 -0
  197. package/lib/constants.ts +150 -0
  198. package/lib/error.ts +1 -0
  199. package/lib/fs.ts +274 -0
  200. package/lib/index.ts +5 -0
  201. package/lib/init.ts +319 -0
  202. package/lib/logger.ts +198 -0
  203. package/lib/mike.js +4 -0
  204. package/lib/model.ts +92 -0
  205. package/lib/scaffold.ts +225 -0
  206. package/lib/util.ts +76 -0
  207. package/lib/validate.ts +728 -0
  208. package/package.json +38 -6
  209. package/requirements.txt +4 -0
  210. package/tsconfig.json +2 -1
  211. package/build/tsconfig.tsbuildinfo +0 -1
  212. package/lib/index.js +0 -2
  213. package/lib/logger.js +0 -3
  214. 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;
@@ -0,0 +1,3 @@
1
+ export {default as init} from './init';
2
+ export {default as validate} from './validate';
3
+ export {default as build} from './build';