typedoc 0.27.5 → 0.27.7

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 (67) hide show
  1. package/bin/typedoc +21 -2
  2. package/dist/index.d.ts +1 -1
  3. package/dist/lib/application.d.ts +30 -1
  4. package/dist/lib/application.js +96 -24
  5. package/dist/lib/cli.js +4 -4
  6. package/dist/lib/converter/comments/declarationReference.d.ts +2 -1
  7. package/dist/lib/converter/comments/declarationReference.js +9 -0
  8. package/dist/lib/converter/comments/linkResolver.js +20 -5
  9. package/dist/lib/converter/converter.d.ts +5 -3
  10. package/dist/lib/converter/converter.js +18 -21
  11. package/dist/lib/converter/factories/signature.js +16 -4
  12. package/dist/lib/converter/plugins/IncludePlugin.d.ts +4 -1
  13. package/dist/lib/converter/plugins/IncludePlugin.js +177 -4
  14. package/dist/lib/converter/plugins/PackagePlugin.js +5 -0
  15. package/dist/lib/converter/symbols.js +22 -8
  16. package/dist/lib/converter/types.d.ts +2 -2
  17. package/dist/lib/converter/types.js +26 -10
  18. package/dist/lib/converter/utils/nodes.d.ts +1 -0
  19. package/dist/lib/converter/utils/nodes.js +4 -0
  20. package/dist/lib/internationalization/internationalization.js +3 -1
  21. package/dist/lib/internationalization/locales/en.cjs +15 -0
  22. package/dist/lib/internationalization/locales/en.d.cts +14 -0
  23. package/dist/lib/internationalization/locales/ja.cjs +321 -0
  24. package/dist/lib/internationalization/locales/ja.d.cts +308 -0
  25. package/dist/lib/internationalization/locales/jp.cjs +2 -320
  26. package/dist/lib/internationalization/locales/jp.d.cts +2 -308
  27. package/dist/lib/internationalization/locales/zh.cjs +6 -3
  28. package/dist/lib/internationalization/locales/zh.d.cts +5 -2
  29. package/dist/lib/internationalization/translatable.d.ts +2 -1
  30. package/dist/lib/output/index.d.ts +1 -0
  31. package/dist/lib/output/plugins/AssetsPlugin.d.ts +1 -7
  32. package/dist/lib/output/plugins/AssetsPlugin.js +18 -7
  33. package/dist/lib/output/renderer.d.ts +1 -0
  34. package/dist/lib/output/renderer.js +10 -2
  35. package/dist/lib/output/themes/default/DefaultTheme.d.ts +3 -39
  36. package/dist/lib/output/themes/default/DefaultTheme.js +19 -10
  37. package/dist/lib/output/themes/default/DefaultThemeRenderContext.d.ts +12 -12
  38. package/dist/lib/output/themes/default/partials/icon.d.ts +17 -2
  39. package/dist/lib/output/themes/default/partials/icon.js +77 -79
  40. package/dist/lib/output/themes/default/partials/member.getterSetter.js +6 -6
  41. package/dist/lib/output/themes/default/partials/member.signatures.js +3 -3
  42. package/dist/lib/output/themes/default/templates/reflection.js +2 -2
  43. package/dist/lib/utils/array.d.ts +1 -0
  44. package/dist/lib/utils/array.js +15 -0
  45. package/dist/lib/utils/fs.d.ts +2 -2
  46. package/dist/lib/utils/fs.js +4 -3
  47. package/dist/lib/utils/general.d.ts +1 -0
  48. package/dist/lib/utils/general.js +11 -0
  49. package/dist/lib/utils/highlighter.d.ts +1 -1
  50. package/dist/lib/utils/highlighter.js +6 -4
  51. package/dist/lib/utils/options/declaration.d.ts +1 -0
  52. package/dist/lib/utils/options/defaults.d.ts +1 -0
  53. package/dist/lib/utils/options/defaults.js +1 -0
  54. package/dist/lib/utils/options/options.d.ts +3 -10
  55. package/dist/lib/utils/options/options.js +2 -20
  56. package/dist/lib/utils/options/readers/package-json.d.ts +1 -1
  57. package/dist/lib/utils/options/readers/package-json.js +2 -2
  58. package/dist/lib/utils/options/readers/tsconfig.d.ts +1 -1
  59. package/dist/lib/utils/options/readers/tsconfig.js +2 -2
  60. package/dist/lib/utils/options/readers/typedoc.d.ts +1 -4
  61. package/dist/lib/utils/options/readers/typedoc.js +6 -7
  62. package/dist/lib/utils/options/sources/typedoc.js +6 -0
  63. package/dist/lib/utils/tsconfig.d.ts +1 -1
  64. package/dist/lib/utils/tsconfig.js +2 -2
  65. package/package.json +1 -1
  66. package/static/main.js +3 -3
  67. package/static/style.css +5 -4
@@ -4,6 +4,7 @@ import { ConverterComponent } from "../components.js";
4
4
  import { ConverterEvents } from "../converter-events.js";
5
5
  import { MinimalSourceFile } from "../../utils/minimalSourceFile.js";
6
6
  import { isFile } from "../../utils/fs.js";
7
+ import { dedent, escapeRegExp } from "../../utils/general.js";
7
8
  /**
8
9
  * Handles `@include` and `@includeCode` within comments/documents.
9
10
  */
@@ -42,14 +43,22 @@ export class IncludePlugin extends ConverterComponent {
42
43
  !["@include", "@includeCode"].includes(part.tag)) {
43
44
  continue;
44
45
  }
45
- const file = path.resolve(relative, part.text.trim());
46
+ const { filename, regionTarget, requestedLines } = parseIncludeCodeTextPart(part.text);
47
+ const file = path.resolve(relative, filename);
48
+ this.application.watchFile(file);
46
49
  if (included.includes(file) && part.tag === "@include") {
47
50
  this.logger.error(this.logger.i18n.include_0_in_1_specified_2_circular_include_3(part.tag, refl.getFriendlyFullName(), part.text, included.join("\n\t")));
48
51
  }
49
52
  else if (isFile(file)) {
50
53
  const text = fs.readFileSync(file, "utf-8");
54
+ const ext = path.extname(file).substring(1);
55
+ const includedText = regionTarget
56
+ ? this.getRegions(refl, file, ext, part.text, text, regionTarget, part.tag, part.tag === "@includeCode")
57
+ : requestedLines
58
+ ? this.getLines(refl, file, part.text, text, requestedLines, part.tag)
59
+ : text;
51
60
  if (part.tag === "@include") {
52
- const sf = new MinimalSourceFile(text, file);
61
+ const sf = new MinimalSourceFile(includedText, file);
53
62
  const { content } = this.owner.parseRawComment(sf, refl.project.files);
54
63
  this.checkIncludeTagsParts(refl, path.dirname(file), content, [...included, file]);
55
64
  parts.splice(i, 1, ...content);
@@ -57,17 +66,181 @@ export class IncludePlugin extends ConverterComponent {
57
66
  else {
58
67
  parts[i] = {
59
68
  kind: "code",
60
- text: makeCodeBlock(path.extname(file).substring(1), text),
69
+ text: makeCodeBlock(ext, includedText),
61
70
  };
62
71
  }
63
72
  }
64
73
  else {
65
- this.logger.warn(this.logger.i18n.include_0_in_1_specified_2_resolved_to_3_does_not_exist(part.tag, refl.getFriendlyFullName(), part.text, file));
74
+ this.logger.error(this.logger.i18n.include_0_in_1_specified_2_resolved_to_3_does_not_exist(part.tag, refl.getFriendlyFullName(), part.text, file));
66
75
  }
67
76
  }
68
77
  }
78
+ getRegions(refl, file, ext, textPart, text, regionTargets, tag, ignoreIndent) {
79
+ const regionTagsList = regionTagREsByExt[ext];
80
+ if (!regionTagsList) {
81
+ this.logger.error(this.logger.i18n.include_0_tag_in_1_region_2_region_not_supported(tag, refl.getFriendlyFullName(), textPart));
82
+ return "";
83
+ }
84
+ const targets = regionTargets.split(",").map((s) => s.trim());
85
+ let content = "";
86
+ for (const target of targets) {
87
+ let found = false;
88
+ for (const [startTag, endTag] of regionTagsList) {
89
+ const safeTarget = escapeRegExp(target);
90
+ const start = text.match(startTag(safeTarget));
91
+ const end = text.match(endTag(safeTarget));
92
+ const foundStart = start && start.length > 0;
93
+ const foundEnd = end && end.length > 0;
94
+ if (foundStart && !foundEnd) {
95
+ this.logger.error(this.logger.i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_close_not_found(tag, refl.getFriendlyFullName(), textPart, file, target));
96
+ return "";
97
+ }
98
+ if (!foundStart && foundEnd) {
99
+ this.logger.error(this.logger.i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_open_not_found(tag, refl.getFriendlyFullName(), textPart, file, target));
100
+ return "";
101
+ }
102
+ if (foundStart && foundEnd) {
103
+ if (start.length > 1) {
104
+ this.logger.error(this.logger.i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_open_found_multiple_times(tag, refl.getFriendlyFullName(), textPart, file, target));
105
+ return "";
106
+ }
107
+ if (end.length > 1) {
108
+ this.logger.error(this.logger.i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_close_found_multiple_times(tag, refl.getFriendlyFullName(), textPart, file, target));
109
+ return "";
110
+ }
111
+ if (found) {
112
+ this.logger.error(this.logger.i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_found_multiple_times(tag, refl.getFriendlyFullName(), textPart, file, target));
113
+ return "";
114
+ }
115
+ found = text.substring(text.indexOf(start[0]) + start[0].length, text.indexOf(end[0]));
116
+ }
117
+ }
118
+ if (found === false) {
119
+ this.logger.error(this.logger.i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_not_found(tag, refl.getFriendlyFullName(), textPart, file, target));
120
+ return "";
121
+ }
122
+ if (found.trim() === "") {
123
+ this.logger.warn(this.logger.i18n.include_0_tag_in_1_specified_2_file_3_region_4_region_empty(tag, refl.getFriendlyFullName(), textPart, file, target));
124
+ }
125
+ content += ignoreIndent ? dedent(found) + "\n" : found;
126
+ }
127
+ return content;
128
+ }
129
+ getLines(refl, file, textPart, text, requestedLines, tag) {
130
+ let output = "";
131
+ const lines = text.split(/\r\n|\r|\n/);
132
+ requestedLines.split(",").forEach((requestedLineString) => {
133
+ if (requestedLineString.includes("-")) {
134
+ const [start, end] = requestedLineString.split("-").map(Number);
135
+ if (start > end) {
136
+ this.logger.error(this.logger.i18n.include_0_tag_in_1_specified_2_file_3_lines_4_invalid_range(tag, refl.getFriendlyFullName(), textPart, file, requestedLines));
137
+ return "";
138
+ }
139
+ if (start > lines.length || end > lines.length) {
140
+ this.logger.error(this.logger.i18n.include_0_tag_in_1_specified_2_file_3_lines_4_but_only_5_lines(tag, refl.getFriendlyFullName(), textPart, file, requestedLines, lines.length.toString()));
141
+ return "";
142
+ }
143
+ output += lines.slice(start - 1, end).join("\n") + "\n";
144
+ }
145
+ else {
146
+ const requestedLine = Number(requestedLineString);
147
+ if (requestedLine > lines.length) {
148
+ this.logger.error(this.logger.i18n.include_0_tag_in_1_specified_2_file_3_lines_4_but_only_5_lines(tag, refl.getFriendlyFullName(), textPart, file, requestedLines, lines.length.toString()));
149
+ return "";
150
+ }
151
+ output += lines[requestedLine - 1] + "\n";
152
+ }
153
+ });
154
+ return output;
155
+ }
69
156
  }
70
157
  function makeCodeBlock(lang, code) {
71
158
  const escaped = code.replace(/`(?=`)/g, "`\u200B");
72
159
  return "\n\n```" + lang + "\n" + escaped.trimEnd() + "\n```";
73
160
  }
161
+ function parseIncludeCodeTextPart(text) {
162
+ let filename = text.trim();
163
+ let regionTarget;
164
+ let requestedLines;
165
+ if (filename.includes("#")) {
166
+ const parsed = filename.split("#");
167
+ filename = parsed[0];
168
+ regionTarget = parsed[1];
169
+ }
170
+ else if (filename.includes(":")) {
171
+ const parsed = filename.split(":");
172
+ filename = parsed[0];
173
+ requestedLines = parsed[1];
174
+ }
175
+ return { filename, regionTarget, requestedLines };
176
+ }
177
+ const regionTagREsByExt = {
178
+ bat: [
179
+ [
180
+ (regionName) => new RegExp(`:: *#region *${regionName} *\n`, "g"),
181
+ (regionName) => new RegExp(`:: *#endregion *${regionName} *\n`, "g"),
182
+ ],
183
+ [
184
+ (regionName) => new RegExp(`REM *#region *${regionName} *\n`, "g"),
185
+ (regionName) => new RegExp(`REM *#endregion *${regionName} *\n`, "g"),
186
+ ],
187
+ ],
188
+ cs: [
189
+ [
190
+ (regionName) => new RegExp(`#region *${regionName} *\n`, "g"),
191
+ (regionName) => new RegExp(`#endregion *${regionName} *\n`, "g"),
192
+ ],
193
+ ],
194
+ c: [
195
+ [
196
+ (regionName) => new RegExp(`#pragma *region *${regionName} *\n`, "g"),
197
+ (regionName) => new RegExp(`#pragma *endregion *${regionName} *\n`, "g"),
198
+ ],
199
+ ],
200
+ css: [
201
+ [
202
+ (regionName) => new RegExp(`/\\* *#region *\\*/ *${regionName} *\n`, "g"),
203
+ (regionName) => new RegExp(`/\\* *#endregion *\\*/ *${regionName} *\n`, "g"),
204
+ ],
205
+ ],
206
+ md: [
207
+ [
208
+ (regionName) => new RegExp(`<!-- *#region *${regionName} *--> *\n`, "g"),
209
+ (regionName) => new RegExp(`<!-- *#endregion *${regionName} *--> *\n`, "g"),
210
+ ],
211
+ ],
212
+ ts: [
213
+ [
214
+ (regionName) => new RegExp(`// *#region *${regionName} *\n`, "g"),
215
+ (regionName) => new RegExp(`// *#endregion *${regionName} *\n`, "g"),
216
+ ],
217
+ ],
218
+ vb: [
219
+ [
220
+ (regionName) => new RegExp(`#Region *${regionName} *\n`, "g"),
221
+ (regionName) => new RegExp(`#End Region *${regionName} *\n`, "g"),
222
+ ],
223
+ ],
224
+ };
225
+ regionTagREsByExt["fs"] = [
226
+ ...regionTagREsByExt["ts"],
227
+ [
228
+ (regionName) => new RegExp(`(#_region) *${regionName} *\n`, "g"),
229
+ (regionName) => new RegExp(`(#_endregion) *${regionName} *\n`, "g"),
230
+ ],
231
+ ];
232
+ regionTagREsByExt["java"] = [
233
+ ...regionTagREsByExt["ts"],
234
+ [
235
+ (regionName) => new RegExp(`// *<editor-fold> *${regionName} *\n`, "g"),
236
+ (regionName) => new RegExp(`// *</editor-fold> *${regionName} *\n`, "g"),
237
+ ],
238
+ ];
239
+ regionTagREsByExt["cpp"] = regionTagREsByExt["c"];
240
+ regionTagREsByExt["less"] = regionTagREsByExt["css"];
241
+ regionTagREsByExt["scss"] = regionTagREsByExt["css"];
242
+ regionTagREsByExt["coffee"] = regionTagREsByExt["cs"];
243
+ regionTagREsByExt["php"] = regionTagREsByExt["cs"];
244
+ regionTagREsByExt["ps1"] = regionTagREsByExt["cs"];
245
+ regionTagREsByExt["py"] = regionTagREsByExt["cs"];
246
+ regionTagREsByExt["js"] = regionTagREsByExt["ts"];
@@ -131,6 +131,7 @@ let PackagePlugin = (() => {
131
131
  }
132
132
  if (this.readme) {
133
133
  // Readme path provided, read only that file.
134
+ this.application.watchFile(this.readme);
134
135
  try {
135
136
  this.readmeContents = readFile(this.readme);
136
137
  this.readmeFile = this.readme;
@@ -145,6 +146,7 @@ let PackagePlugin = (() => {
145
146
  if (result) {
146
147
  this.readmeFile = result.file;
147
148
  this.readmeContents = result.content;
149
+ this.application.watchFile(this.readmeFile);
148
150
  }
149
151
  }
150
152
  }
@@ -155,6 +157,9 @@ let PackagePlugin = (() => {
155
157
  if (this.readmeFile && this.readmeContents) {
156
158
  const { content } = this.application.converter.parseRawComment(new MinimalSourceFile(this.readmeContents, this.readmeFile), project.files);
157
159
  project.readme = content;
160
+ // This isn't ideal, but seems better than figuring out the readme
161
+ // path over in the include plugin...
162
+ this.owner.includePlugin.checkIncludeTagsParts(project, Path.dirname(this.readmeFile), content);
158
163
  }
159
164
  if (this.packageJson) {
160
165
  project.packageName = this.packageJson.name;
@@ -401,8 +401,13 @@ function convertProperty(context, symbol, exportSymbol) {
401
401
  return;
402
402
  }
403
403
  // Special case: We pretend properties are methods if they look like methods.
404
- // This happens with mixins / weird inheritance.
405
- if (declarations.length &&
404
+ // This happens with mixins / weird inheritance. Don't do this if the type
405
+ // doesn't have call signatures to avoid converting non-functions. This can
406
+ // happen if @class is used and functions are converted to their return type
407
+ // with a mapped type (e.g. with Vue's `computed` properties)
408
+ const type = context.checker.getTypeOfSymbol(symbol);
409
+ if (type.getCallSignatures().length &&
410
+ declarations.length &&
406
411
  declarations.every((decl) => ts.isMethodSignature(decl) || ts.isMethodDeclaration(decl))) {
407
412
  return convertFunctionOrMethod(context, symbol, exportSymbol);
408
413
  }
@@ -420,7 +425,7 @@ function convertProperty(context, symbol, exportSymbol) {
420
425
  ? ReflectionKind.Variable
421
426
  : ReflectionKind.Property, symbol, exportSymbol);
422
427
  const declaration = symbol.getDeclarations()?.[0];
423
- let parameterType;
428
+ let parameterTypeNode;
424
429
  if (declaration &&
425
430
  (ts.isPropertyDeclaration(declaration) ||
426
431
  ts.isPropertySignature(declaration) ||
@@ -429,7 +434,7 @@ function convertProperty(context, symbol, exportSymbol) {
429
434
  ts.isPropertyAssignment(declaration))) {
430
435
  if (!ts.isPropertyAccessExpression(declaration) &&
431
436
  !ts.isPropertyAssignment(declaration)) {
432
- parameterType = declaration.type;
437
+ parameterTypeNode = declaration.type;
433
438
  }
434
439
  setModifiers(symbol, declaration, reflection);
435
440
  }
@@ -437,8 +442,12 @@ function convertProperty(context, symbol, exportSymbol) {
437
442
  setSymbolModifiers(symbol, reflection);
438
443
  }
439
444
  reflection.defaultValue = declaration && convertDefaultValue(declaration);
440
- reflection.type = context.converter.convertType(context.withScope(reflection), (context.convertingTypeNode ? parameterType : void 0) ??
441
- context.checker.getTypeOfSymbol(symbol));
445
+ if (context.convertingTypeNode && parameterTypeNode) {
446
+ reflection.type = context.converter.convertType(context.withScope(reflection), parameterTypeNode);
447
+ }
448
+ else {
449
+ reflection.type = context.converter.convertType(context.withScope(reflection), context.checker.getTypeOfSymbol(symbol), parameterTypeNode);
450
+ }
442
451
  if (reflection.flags.isOptional) {
443
452
  reflection.type = removeUndefined(reflection.type);
444
453
  }
@@ -501,7 +510,7 @@ function createAlias(target, context, symbol, exportSymbol) {
501
510
  if (context.converter.excludeReferences)
502
511
  return;
503
512
  // We already have this. Create a reference.
504
- const ref = new ReferenceReflection(exportSymbol?.name ?? symbol.name, target, context.scope);
513
+ const ref = new ReferenceReflection(exportSymbol?.name ?? symbol.name, target.isReference() ? target.getTargetReflection() : target, context.scope);
505
514
  context.postReflectionCreation(ref, symbol, exportSymbol);
506
515
  context.finalizeDeclarationReflection(ref);
507
516
  }
@@ -533,7 +542,12 @@ function convertVariable(context, symbol, exportSymbol) {
533
542
  // Otherwise we might have destructuring
534
543
  typeNode = declaration.type;
535
544
  }
536
- reflection.type = context.converter.convertType(context.withScope(reflection), typeNode ?? type);
545
+ if (typeNode) {
546
+ reflection.type = context.converter.convertType(context.withScope(reflection), typeNode);
547
+ }
548
+ else {
549
+ reflection.type = context.converter.convertType(context.withScope(reflection), type, typeNode);
550
+ }
537
551
  setModifiers(symbol, declaration, reflection);
538
552
  reflection.defaultValue = convertDefaultValue(declaration);
539
553
  context.finalizeDeclarationReflection(reflection);
@@ -4,7 +4,7 @@ import type { Context } from "./context.js";
4
4
  export interface TypeConverter<TNode extends ts.TypeNode = ts.TypeNode, TType extends ts.Type = ts.Type> {
5
5
  kind: TNode["kind"][];
6
6
  convert(context: Context, node: TNode): SomeType;
7
- convertType(context: Context, type: TType, node: TNode): SomeType;
7
+ convertType(context: Context, type: TType, serializedNode: TNode, originalNode: ts.TypeNode | undefined): SomeType;
8
8
  }
9
9
  export declare function loadConverters(): void;
10
- export declare function convertType(context: Context, typeOrNode: ts.Type | ts.TypeNode | undefined): SomeType;
10
+ export declare function convertType(context: Context, typeOrNode: ts.Type | ts.TypeNode | undefined, maybeNode?: ts.TypeNode): SomeType;
@@ -7,7 +7,7 @@ import { ConverterEvents } from "./converter-events.js";
7
7
  import { convertIndexSignatures } from "./factories/index-signature.js";
8
8
  import { convertParameterNodes, convertTypeParameterNodes, createSignature, } from "./factories/signature.js";
9
9
  import { convertSymbol } from "./symbols.js";
10
- import { isObjectType } from "./utils/nodes.js";
10
+ import { isObjectType, isTypeReference } from "./utils/nodes.js";
11
11
  import { removeUndefined } from "./utils/reflections.js";
12
12
  const converters = new Map();
13
13
  export function loadConverters() {
@@ -41,6 +41,7 @@ export function loadConverters() {
41
41
  tupleConverter,
42
42
  typeOperatorConverter,
43
43
  unionConverter,
44
+ jSDocTypeExpressionConverter,
44
45
  // Only used if skipLibCheck: true
45
46
  jsDocNullableTypeConverter,
46
47
  jsDocNonNullableTypeConverter,
@@ -65,7 +66,7 @@ function maybeConvertType(context, typeOrNode) {
65
66
  return convertType(context, typeOrNode);
66
67
  }
67
68
  let typeConversionDepth = 0;
68
- export function convertType(context, typeOrNode) {
69
+ export function convertType(context, typeOrNode, maybeNode) {
69
70
  if (!typeOrNode) {
70
71
  return new IntrinsicType("any");
71
72
  }
@@ -108,7 +109,7 @@ export function convertType(context, typeOrNode) {
108
109
  }
109
110
  seenTypes.add(typeOrNode.id);
110
111
  ++typeConversionDepth;
111
- const result = converter.convertType(context, typeOrNode, node);
112
+ const result = converter.convertType(context, typeOrNode, node, maybeNode);
112
113
  --typeConversionDepth;
113
114
  seenTypes.delete(typeOrNode.id);
114
115
  return result;
@@ -286,8 +287,10 @@ const jsDocVariadicTypeConverter = {
286
287
  convert(context, node) {
287
288
  return new ArrayType(convertType(context, node.type));
288
289
  },
289
- // Should just be an ArrayType
290
- convertType: requestBugReport,
290
+ convertType(context, type, _node, origNode) {
291
+ assert(isTypeReference(type));
292
+ return arrayConverter.convertType(context, type, null, origNode);
293
+ },
291
294
  };
292
295
  const keywordNames = {
293
296
  [ts.SyntaxKind.AnyKeyword]: "any",
@@ -442,14 +445,14 @@ const referenceConverter = {
442
445
  // This might not actually be safe, it appears that it is in the relatively small
443
446
  // amount of testing I've done with it, but I wouldn't be surprised if someone manages
444
447
  // to find a crash.
445
- return typeLiteralConverter.convertType(context, type, null);
448
+ return typeLiteralConverter.convertType(context, type, null, undefined);
446
449
  }
447
450
  const name = node.typeName.getText();
448
451
  const ref = ReferenceType.createSymbolReference(context.resolveAliasedSymbol(symbol), context, name);
449
452
  ref.typeArguments = node.typeArguments?.map((type) => convertType(context, type));
450
453
  return ref;
451
454
  },
452
- convertType(context, type, node) {
455
+ convertType(context, type, node, originalNode) {
453
456
  // typeName.symbol handles the case where this is a union which happens to refer
454
457
  // to an enumeration. TS doesn't put the symbol on the type for some reason, but
455
458
  // does add it to the constructed type node.
@@ -468,7 +471,7 @@ const referenceConverter = {
468
471
  // This might not actually be safe, it appears that it is in the relatively small
469
472
  // amount of testing I've done with it, but I wouldn't be surprised if someone manages
470
473
  // to find a crash.
471
- return typeLiteralConverter.convertType(context, type, null);
474
+ return typeLiteralConverter.convertType(context, type, null, undefined);
472
475
  }
473
476
  let name;
474
477
  if (ts.isIdentifier(node.typeName)) {
@@ -490,9 +493,15 @@ const referenceConverter = {
490
493
  ];
491
494
  }
492
495
  else {
493
- ref.typeArguments = (type.aliasSymbol
496
+ const args = type.aliasSymbol
494
497
  ? type.aliasTypeArguments
495
- : type.typeArguments)?.map((ref) => convertType(context, ref));
498
+ : type.typeArguments;
499
+ const maxArgLength = originalNode && ts.isTypeReferenceNode(originalNode)
500
+ ? (originalNode.typeArguments?.length ?? 0)
501
+ : args?.length;
502
+ ref.typeArguments = args
503
+ ?.slice(0, maxArgLength)
504
+ .map((ref) => convertType(context, ref));
496
505
  }
497
506
  return ref;
498
507
  },
@@ -695,6 +704,13 @@ const unionConverter = {
695
704
  return new UnionType(types);
696
705
  },
697
706
  };
707
+ const jSDocTypeExpressionConverter = {
708
+ kind: [ts.SyntaxKind.JSDocTypeExpression],
709
+ convert(context, node) {
710
+ return convertType(context, node.type);
711
+ },
712
+ convertType: requestBugReport,
713
+ };
698
714
  const jsDocNullableTypeConverter = {
699
715
  kind: [ts.SyntaxKind.JSDocNullableType],
700
716
  convert(context, node) {
@@ -4,3 +4,4 @@ export declare function isNamedNode(node: unknown): node is {
4
4
  };
5
5
  export declare function getHeritageTypes(declarations: readonly (ts.ClassDeclaration | ts.InterfaceDeclaration)[], kind: ts.SyntaxKind.ImplementsKeyword | ts.SyntaxKind.ExtendsKeyword): ts.ExpressionWithTypeArguments[];
6
6
  export declare function isObjectType(type: ts.Type): type is ts.ObjectType;
7
+ export declare function isTypeReference(type: ts.Type): type is ts.TypeReference;
@@ -20,3 +20,7 @@ export function getHeritageTypes(declarations, kind) {
20
20
  export function isObjectType(type) {
21
21
  return typeof type.objectFlags === "number";
22
22
  }
23
+ export function isTypeReference(type) {
24
+ return (isObjectType(type) &&
25
+ (type.objectFlags & ts.ObjectFlags.Reference) !== 0);
26
+ }
@@ -222,7 +222,9 @@ export class Internationalization {
222
222
  */
223
223
  getSupportedLanguages() {
224
224
  return unique([
225
- ...readdirSync(join(fileURLToPath(import.meta.url), "../locales")).map((x) => x.substring(0, x.indexOf("."))),
225
+ ...readdirSync(join(fileURLToPath(import.meta.url), "../locales"))
226
+ .map((x) => x.substring(0, x.indexOf(".")))
227
+ .filter((x) => x !== "jp"),
226
228
  ...this.allTranslations.keys(),
227
229
  ]).sort();
228
230
  }
@@ -8,6 +8,8 @@ module.exports = {
8
8
  loaded_plugin_0: `Loaded plugin {0}`,
9
9
  solution_not_supported_in_watch_mode: "The provided tsconfig file looks like a solution style tsconfig, which is not supported in watch mode",
10
10
  strategy_not_supported_in_watch_mode: "entryPointStrategy must be set to either resolve or expand for watch mode",
11
+ file_0_changed_restarting: "Configuration file {0} changed: full restart required...",
12
+ file_0_changed_rebuilding: "File {0} changed: rebuilding output...",
11
13
  found_0_errors_and_1_warnings: "Found {0} errors and {1} warnings",
12
14
  output_0_could_not_be_generated: "{0} output could not be generated due to the errors above",
13
15
  output_0_generated_at_1: "{0} generated at {1}",
@@ -82,6 +84,16 @@ module.exports = {
82
84
  reflection_0_tried_to_merge_into_child_1: `The reflection {0} tried to use @mergeModuleWith to merge into one of its children: {1}`,
83
85
  include_0_in_1_specified_2_resolved_to_3_does_not_exist: `{0} tag in comment for {1} specified "{2}" to include, which was resolved to "{3}" and does not exist or is not a file.`,
84
86
  include_0_in_1_specified_2_circular_include_3: `{0} tag in comment for {1} specified "{2}" to include, which resulted in a circular include:\n\t{3}`,
87
+ include_0_tag_in_1_specified_2_file_3_region_4_region_not_found: `{0} tag in {1} specified "{2}" to include from file "{3}" the region labeled "{4}", but the region was not found in the file.`,
88
+ include_0_tag_in_1_region_2_region_not_supported: `{0} tag in {1} specified "{2}", but regions are not supported for this file extension.`,
89
+ include_0_tag_in_1_specified_2_file_3_region_4_region_close_not_found: `{0} tag in {1} specified "{2}" to include from file "{3}" the region labeled "{4}", but the region closing comment was not found in the file.`,
90
+ include_0_tag_in_1_specified_2_file_3_region_4_region_open_not_found: `{0} tag in {1} specified "{2}" to include from file "{3}" the region labeled "{4}", but the region opening comment was not found in the file.`,
91
+ include_0_tag_in_1_specified_2_file_3_region_4_region_close_found_multiple_times: `{0} tag in {1} specified "{2}" to include from file "{3}" the region labeled {4}, but the region closing comment was found multiple times in the file.`,
92
+ include_0_tag_in_1_specified_2_file_3_region_4_region_open_found_multiple_times: `{0} tag in {1} specified "{2}" to include from file "{3}" the region labeled {4}, but the region opening comment was found multiple times in the file.`,
93
+ include_0_tag_in_1_specified_2_file_3_region_4_region_found_multiple_times: `{0} tag in {1} specified "{2}" to include from file "{3}" the region labeled {4}, but the region was found multiple times in the file.`,
94
+ include_0_tag_in_1_specified_2_file_3_region_4_region_empty: `{0} tag in {1} specified "{2}" to include from file "{3}" the region labeled {4}. The region was found but it is empty or contains only whitespace.`,
95
+ include_0_tag_in_1_specified_2_file_3_lines_4_invalid_range: `{0} tag in {1} specified "{2}" to include from file "{3}" the lines {4}, but an invalid range was specified.`,
96
+ include_0_tag_in_1_specified_2_file_3_lines_4_but_only_5_lines: `{0} tag in {1} specified "{2}" to include from file "{3}" the lines {4}, but the file only has {5} lines.`,
85
97
  // output plugins
86
98
  custom_css_file_0_does_not_exist: `Custom CSS file at {0} does not exist`,
87
99
  custom_js_file_0_does_not_exist: `Custom JavaScript file at {0} does not exist`,
@@ -160,6 +172,7 @@ module.exports = {
160
172
  help_lightHighlightTheme: "Specify the code highlighting theme in light mode",
161
173
  help_darkHighlightTheme: "Specify the code highlighting theme in dark mode",
162
174
  help_highlightLanguages: "Specify the languages which will be loaded to highlight code when rendering",
175
+ help_ignoredHighlightLanguages: "Specify languages which will be accepted as valid highlight languages, but will not be highlighted at runtime",
163
176
  help_typePrintWidth: "Width at which to wrap code to a new line when rendering a type",
164
177
  help_customCss: "Path to a custom CSS file to for the theme to import",
165
178
  help_customJs: "Path to a custom JS file to import",
@@ -363,9 +376,11 @@ module.exports = {
363
376
  theme_search: "Search",
364
377
  theme_menu: "Menu",
365
378
  theme_permalink: "Permalink",
379
+ theme_folder: "Folder",
366
380
  // Used by the frontend JS
367
381
  // For the English translations only, these should also be added to
368
382
  // src/lib/output/themes/default/assets/typedoc/Application.ts
383
+ // Also uses theme_folder and singular kinds
369
384
  theme_copy: "Copy",
370
385
  theme_copied: "Copied!",
371
386
  theme_normally_hidden: "This member is normally hidden due to your filter settings.",
@@ -5,6 +5,8 @@ declare const _default: {
5
5
  readonly loaded_plugin_0: "Loaded plugin {0}";
6
6
  readonly solution_not_supported_in_watch_mode: "The provided tsconfig file looks like a solution style tsconfig, which is not supported in watch mode";
7
7
  readonly strategy_not_supported_in_watch_mode: "entryPointStrategy must be set to either resolve or expand for watch mode";
8
+ readonly file_0_changed_restarting: "Configuration file {0} changed: full restart required...";
9
+ readonly file_0_changed_rebuilding: "File {0} changed: rebuilding output...";
8
10
  readonly found_0_errors_and_1_warnings: "Found {0} errors and {1} warnings";
9
11
  readonly output_0_could_not_be_generated: "{0} output could not be generated due to the errors above";
10
12
  readonly output_0_generated_at_1: "{0} generated at {1}";
@@ -76,6 +78,16 @@ declare const _default: {
76
78
  readonly reflection_0_tried_to_merge_into_child_1: "The reflection {0} tried to use @mergeModuleWith to merge into one of its children: {1}";
77
79
  readonly include_0_in_1_specified_2_resolved_to_3_does_not_exist: "{0} tag in comment for {1} specified \"{2}\" to include, which was resolved to \"{3}\" and does not exist or is not a file.";
78
80
  readonly include_0_in_1_specified_2_circular_include_3: "{0} tag in comment for {1} specified \"{2}\" to include, which resulted in a circular include:\n\t{3}";
81
+ readonly include_0_tag_in_1_specified_2_file_3_region_4_region_not_found: "{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled \"{4}\", but the region was not found in the file.";
82
+ readonly include_0_tag_in_1_region_2_region_not_supported: "{0} tag in {1} specified \"{2}\", but regions are not supported for this file extension.";
83
+ readonly include_0_tag_in_1_specified_2_file_3_region_4_region_close_not_found: "{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled \"{4}\", but the region closing comment was not found in the file.";
84
+ readonly include_0_tag_in_1_specified_2_file_3_region_4_region_open_not_found: "{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled \"{4}\", but the region opening comment was not found in the file.";
85
+ readonly include_0_tag_in_1_specified_2_file_3_region_4_region_close_found_multiple_times: "{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled {4}, but the region closing comment was found multiple times in the file.";
86
+ readonly include_0_tag_in_1_specified_2_file_3_region_4_region_open_found_multiple_times: "{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled {4}, but the region opening comment was found multiple times in the file.";
87
+ readonly include_0_tag_in_1_specified_2_file_3_region_4_region_found_multiple_times: "{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled {4}, but the region was found multiple times in the file.";
88
+ readonly include_0_tag_in_1_specified_2_file_3_region_4_region_empty: "{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the region labeled {4}. The region was found but it is empty or contains only whitespace.";
89
+ readonly include_0_tag_in_1_specified_2_file_3_lines_4_invalid_range: "{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the lines {4}, but an invalid range was specified.";
90
+ readonly include_0_tag_in_1_specified_2_file_3_lines_4_but_only_5_lines: "{0} tag in {1} specified \"{2}\" to include from file \"{3}\" the lines {4}, but the file only has {5} lines.";
79
91
  readonly custom_css_file_0_does_not_exist: "Custom CSS file at {0} does not exist";
80
92
  readonly custom_js_file_0_does_not_exist: "Custom JavaScript file at {0} does not exist";
81
93
  readonly unsupported_highlight_language_0_not_highlighted_in_comment_for_1: "Unsupported highlight language {0} will not be highlighted in comment for {1}";
@@ -147,6 +159,7 @@ declare const _default: {
147
159
  readonly help_lightHighlightTheme: "Specify the code highlighting theme in light mode";
148
160
  readonly help_darkHighlightTheme: "Specify the code highlighting theme in dark mode";
149
161
  readonly help_highlightLanguages: "Specify the languages which will be loaded to highlight code when rendering";
162
+ readonly help_ignoredHighlightLanguages: "Specify languages which will be accepted as valid highlight languages, but will not be highlighted at runtime";
150
163
  readonly help_typePrintWidth: "Width at which to wrap code to a new line when rendering a type";
151
164
  readonly help_customCss: "Path to a custom CSS file to for the theme to import";
152
165
  readonly help_customJs: "Path to a custom JS file to import";
@@ -335,6 +348,7 @@ declare const _default: {
335
348
  readonly theme_search: "Search";
336
349
  readonly theme_menu: "Menu";
337
350
  readonly theme_permalink: "Permalink";
351
+ readonly theme_folder: "Folder";
338
352
  readonly theme_copy: "Copy";
339
353
  readonly theme_copied: "Copied!";
340
354
  readonly theme_normally_hidden: "This member is normally hidden due to your filter settings.";