docs: generate medusa-react reference (#6004)
* add new plugin for better organization * added handling in theme for mutations and query types * added tsdoc to hooks * added tsdocs to utility functions * added tsdoc to providers * generated reference * general fixes for generated reference * generated api reference specs + general fixes * add missing import react * split utilities into different directories * added overview page * added link to customer authentication section * fix lint errors * added changeset * fix readme * fixed build error * added expand fields + other sections to overview * updated what's new section * general refactoring * remove unnecessary query field * fix links * added ignoreApi option
This commit is contained in:
1 parent
6fc6a9de6a
commit
7d650771d1
2811 files changed
+231856
-455063
No files matched your search
@@ -128,10 +128,10 @@ export default class TypedocManager {
|
||||
const signature = mappedSignature.signatures[0]
|
||||
// get the props of the component from the
|
||||
// first parameter in the signature.
|
||||
const props = getTypeChildren(
|
||||
signature.parameters![0].type!,
|
||||
this.project
|
||||
)
|
||||
const props = getTypeChildren({
|
||||
reflectionType: signature.parameters![0].type!,
|
||||
project: this.project,
|
||||
})
|
||||
|
||||
// this stores props that should be removed from the
|
||||
// spec
|
||||
@@ -482,7 +482,10 @@ export default class TypedocManager {
|
||||
childName
|
||||
) as DeclarationReflection
|
||||
} else if (reflection.type) {
|
||||
getTypeChildren(reflection.type, this.project).some((child) => {
|
||||
getTypeChildren({
|
||||
reflectionType: reflection.type,
|
||||
project: this.project,
|
||||
}).some((child) => {
|
||||
if (child.name === childName) {
|
||||
childReflection = child
|
||||
return true
|
||||
|
||||
@@ -61,6 +61,7 @@ export function generateReference(referenceName: string) {
|
||||
formatColoredLog(colorLog, referenceName, chunk.trim())
|
||||
})
|
||||
typedocProcess.on("exit", (code) => {
|
||||
formatColoredLog(colorLog, referenceName, "Finished Generating reference.")
|
||||
generatedCount++
|
||||
if (generatedCount >= totalCount && !ranMerger && code !== 1) {
|
||||
runMerger()
|
||||
@@ -81,7 +82,6 @@ export function generateReference(referenceName: string) {
|
||||
)
|
||||
})
|
||||
})
|
||||
formatColoredLog(colorLog, referenceName, "Finished Generating reference.")
|
||||
}
|
||||
|
||||
function formatColoredLog(
|
||||
|
||||
@@ -64,6 +64,7 @@ module.exports = {
|
||||
"stock-location",
|
||||
"workflows",
|
||||
],
|
||||
allReflectionsHaveOwnDocumentInNamespace: ["Utilities"],
|
||||
formatting: {
|
||||
"*": {
|
||||
showCommentsAsHeader: true,
|
||||
@@ -131,7 +132,7 @@ module.exports = {
|
||||
displayed_sidebar: "inventoryReference",
|
||||
},
|
||||
},
|
||||
"^IInventoryService/methods": {
|
||||
"^inventory/IInventoryService/methods": {
|
||||
reflectionDescription:
|
||||
"This documentation provides a reference to the `{{alias}}` {{kind}}. This belongs to the Inventory Module.",
|
||||
frontmatterData: {
|
||||
@@ -189,29 +190,118 @@ module.exports = {
|
||||
"^js_client/.*LineItemsResource": {
|
||||
maxLevel: 3,
|
||||
},
|
||||
"^(js_client/.*modules/.*internal|internal.*/modules)": {
|
||||
reflectionGroups: {
|
||||
Constructors: false,
|
||||
"Type Aliases": false,
|
||||
Enumerations: false,
|
||||
"Enumeration Members": false,
|
||||
Classes: false,
|
||||
Functions: false,
|
||||
Interfaces: false,
|
||||
References: false,
|
||||
|
||||
// MEDUSA REACT CONFIG
|
||||
"^medusa_react": {
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "medusaReactSidebar",
|
||||
},
|
||||
parameterComponentExtraProps: {
|
||||
expandUrl:
|
||||
"https://docs.medusajs.com/medusa-react/overview#expanding-fields",
|
||||
},
|
||||
},
|
||||
"^internal.*/.*js_client.*": {
|
||||
reflectionGroups: {
|
||||
Constructors: false,
|
||||
},
|
||||
"^modules/medusa_react\\.mdx": {
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "jsClientSidebar",
|
||||
displayed_sidebar: "medusaReactSidebar",
|
||||
},
|
||||
reflectionGroups: {
|
||||
Variables: false,
|
||||
Functions: false,
|
||||
},
|
||||
reflectionCategories: {
|
||||
Mutations: false,
|
||||
Queries: false,
|
||||
Other: false,
|
||||
},
|
||||
},
|
||||
"^medusa_react/(medusa_react\\.Hooks\\.mdx|.*medusa_react\\.Hooks\\.Admin\\.mdx|.*medusa_react\\.Hooks\\.Store\\.mdx|medusa_react\\.Providers\\.mdx)":
|
||||
{
|
||||
reflectionGroups: {
|
||||
Functions: false,
|
||||
},
|
||||
},
|
||||
"^medusa_react/Providers/.*": {
|
||||
expandMembers: true,
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "medusaReactSidebar",
|
||||
slug: "/references/medusa-react/providers/{{alias-lower}}",
|
||||
sidebar_label: "{{alias}}",
|
||||
},
|
||||
reflectionTitle: {
|
||||
suffix: " Provider Overview",
|
||||
},
|
||||
},
|
||||
"^medusa_react/medusa_react\\.Utilities": {
|
||||
expandMembers: true,
|
||||
reflectionTitle: {
|
||||
prefix: "Medusa React ",
|
||||
},
|
||||
},
|
||||
"^medusa_react/Utilities/.*": {
|
||||
expandMembers: true,
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "medusaReactSidebar",
|
||||
slug: "/references/medusa-react/utilities/{{alias}}",
|
||||
},
|
||||
},
|
||||
"^medusa_react/medusa_react\\.Hooks\\.mdx": {
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "medusaReactSidebar",
|
||||
slug: "/references/medusa-react/hooks",
|
||||
},
|
||||
},
|
||||
"^medusa_react/Hooks/Admin/.*Admin\\.mdx": {
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "medusaReactSidebar",
|
||||
slug: "/references/medusa-react/hooks/admin",
|
||||
},
|
||||
},
|
||||
"^medusa_react/Hooks/Admin/.*": {
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "medusaReactSidebar",
|
||||
slug: "/references/medusa-react/hooks/admin/{{alias-lower}}",
|
||||
},
|
||||
},
|
||||
"^medusa_react/Hooks/Store/.*Store\\.mdx": {
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "medusaReactSidebar",
|
||||
slug: "/references/medusa-react/hooks/store",
|
||||
},
|
||||
},
|
||||
"^medusa_react/Hooks/Store/.*": {
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "medusaReactSidebar",
|
||||
slug: "/references/medusa-react/hooks/store/{{alias-lower}}",
|
||||
},
|
||||
},
|
||||
"^medusa_react/medusa_react\\.Providers\\.mdx": {
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "medusaReactSidebar",
|
||||
slug: "/references/medusa-react/providers",
|
||||
},
|
||||
},
|
||||
"^medusa_react/medusa_react\\.Utilities\\.mdx": {
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "medusaReactSidebar",
|
||||
slug: "/references/medusa-react/utilities",
|
||||
},
|
||||
},
|
||||
"^medusa_react/Hooks/.*Admin\\.Inventory_Items": {
|
||||
maxLevel: 4,
|
||||
},
|
||||
"^medusa_react/Hooks/.*Admin\\.Products": {
|
||||
maxLevel: 4,
|
||||
},
|
||||
"^medusa_react/Hooks/.*Admin\\.Stock_Locations": {
|
||||
maxLevel: 5,
|
||||
},
|
||||
"^medusa_react/Hooks/.*Admin\\.Users": {
|
||||
maxLevel: 5,
|
||||
},
|
||||
|
||||
// MEDUSA CONFIG
|
||||
"^medusa": {
|
||||
"^medusa/": {
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "homepage",
|
||||
},
|
||||
@@ -249,13 +339,13 @@ module.exports = {
|
||||
},
|
||||
|
||||
// PRICING CONFIG
|
||||
"^(pricing|IPricingModuleService)": {
|
||||
"^pricing": {
|
||||
...modulesOptions,
|
||||
frontmatterData: {
|
||||
displayed_sidebar: "pricingReference",
|
||||
},
|
||||
},
|
||||
"^IPricingModuleService/methods": {
|
||||
"^pricing/IPricingModuleService/methods": {
|
||||
reflectionDescription:
|
||||
"This documentation provides a reference to the `{{alias}}` {{kind}}. This belongs to the Pricing Module.",
|
||||
frontmatterData: {
|
||||
@@ -298,7 +388,7 @@ module.exports = {
|
||||
displayed_sidebar: "productReference",
|
||||
},
|
||||
},
|
||||
"^IProductModuleService/methods": {
|
||||
"^product/IProductModuleService/methods": {
|
||||
reflectionDescription:
|
||||
"This documentation provides a reference to the {{alias}} {{kind}}. This belongs to the Product Module.",
|
||||
frontmatterData: {
|
||||
@@ -349,7 +439,7 @@ module.exports = {
|
||||
displayed_sidebar: "stockLocationReference",
|
||||
},
|
||||
},
|
||||
"^IStockLocationService/methods": {
|
||||
"^stock-location/IStockLocationService/methods": {
|
||||
reflectionDescription:
|
||||
"This documentation provides a reference to the `{{alias}}` {{kind}}. This belongs to the Stock Location Module.",
|
||||
frontmatterData: {
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"$schema": "http://json.schemastore.org/tsconfig",
|
||||
"extends": [
|
||||
"../../../../packages/medusa-react/tsconfig.json"
|
||||
],
|
||||
"compilerOptions": {
|
||||
"noImplicitReturns": false,
|
||||
}
|
||||
}
|
||||
@@ -33,6 +33,18 @@
|
||||
{
|
||||
"tagName": "@excludeExternal",
|
||||
"syntaxKind": "modifier"
|
||||
},
|
||||
{
|
||||
"tagName": "@customNamespace",
|
||||
"syntaxKind": "block"
|
||||
},
|
||||
{
|
||||
"tagName": "@namespaceMember",
|
||||
"syntaxKind": "modifier"
|
||||
},
|
||||
{
|
||||
"tagName": "@typeParamDefinition",
|
||||
"syntaxKind": "block"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||
const getConfig = require("./utils/get-config")
|
||||
|
||||
module.exports = getConfig({
|
||||
entryPointPath: "packages/medusa-react/src/index.ts",
|
||||
tsConfigName: "medusa-react.json",
|
||||
name: "medusa-react",
|
||||
generateNamespaces: true,
|
||||
ignoreApi: true,
|
||||
})
|
||||
@@ -35,6 +35,15 @@ The following options are useful for linting:
|
||||
- `eslintPathName`: The path to the ESLint configuration file.
|
||||
- `pluginsResolvePath`: The path to resolve plugins used in the ESLint configuration files.
|
||||
|
||||
### Generate Namespace Plugin
|
||||
|
||||
If the `generateNamespaces` option is enabled, Namespaces are created from reflections having the `@customNamespace` tag. It also attaches categories (using the `@category` tag) of the same reflection to its generated parent namespace.
|
||||
|
||||
It also accepts the following options:
|
||||
|
||||
- `parentNamespace`: The name of a parent namespace to make the generated namespaces as its children.
|
||||
- `namePrefix`: A prefix to add to the name of the generated namespaces.
|
||||
|
||||
---
|
||||
|
||||
## Build the Plugin
|
||||
|
||||
@@ -0,0 +1,258 @@
|
||||
import {
|
||||
Application,
|
||||
Comment,
|
||||
CommentDisplayPart,
|
||||
CommentTag,
|
||||
Context,
|
||||
Converter,
|
||||
DeclarationReflection,
|
||||
ParameterType,
|
||||
ReflectionCategory,
|
||||
ReflectionKind,
|
||||
} from "typedoc"
|
||||
|
||||
type PluginOptions = {
|
||||
generateNamespaces: boolean
|
||||
parentNamespace: string
|
||||
namePrefix: string
|
||||
}
|
||||
|
||||
export class GenerateNamespacePlugin {
|
||||
private options?: PluginOptions
|
||||
private app: Application
|
||||
private parentNamespace?: DeclarationReflection
|
||||
private currentNamespaceHeirarchy: DeclarationReflection[]
|
||||
private currentContext?: Context
|
||||
private scannedComments = false
|
||||
|
||||
constructor(app: Application) {
|
||||
this.app = app
|
||||
this.currentNamespaceHeirarchy = []
|
||||
this.declareOptions()
|
||||
|
||||
this.app.converter.on(
|
||||
Converter.EVENT_CREATE_DECLARATION,
|
||||
this.handleCreateDeclarationEvent.bind(this)
|
||||
)
|
||||
this.app.converter.on(
|
||||
Converter.EVENT_CREATE_DECLARATION,
|
||||
this.scanComments.bind(this)
|
||||
)
|
||||
}
|
||||
|
||||
declareOptions() {
|
||||
this.app.options.addDeclaration({
|
||||
name: "generateNamespaces",
|
||||
type: ParameterType.Boolean,
|
||||
defaultValue: false,
|
||||
help: "Whether to enable conversion of categories to namespaces.",
|
||||
})
|
||||
this.app.options.addDeclaration({
|
||||
name: "parentNamespace",
|
||||
type: ParameterType.String,
|
||||
defaultValue: "",
|
||||
help: "Optionally specify a parent namespace to place all generated namespaces in.",
|
||||
})
|
||||
this.app.options.addDeclaration({
|
||||
name: "namePrefix",
|
||||
type: ParameterType.String,
|
||||
defaultValue: "",
|
||||
help: "Optionally specify a name prefix for all namespaces.",
|
||||
})
|
||||
}
|
||||
|
||||
readOptions() {
|
||||
if (this.options) {
|
||||
return
|
||||
}
|
||||
|
||||
this.options = {
|
||||
generateNamespaces: this.app.options.getValue("generateNamespaces"),
|
||||
parentNamespace: this.app.options.getValue("parentNamespace"),
|
||||
namePrefix: this.app.options.getValue("namePrefix"),
|
||||
}
|
||||
}
|
||||
|
||||
loadNamespace(namespaceName: string): DeclarationReflection {
|
||||
const formattedName = this.formatName(namespaceName)
|
||||
return this.currentContext?.project
|
||||
.getReflectionsByKind(ReflectionKind.Namespace)
|
||||
.find(
|
||||
(m) =>
|
||||
m.name === formattedName &&
|
||||
(!this.currentNamespaceHeirarchy.length ||
|
||||
m.parent?.id ===
|
||||
this.currentNamespaceHeirarchy[
|
||||
this.currentNamespaceHeirarchy.length - 1
|
||||
].id)
|
||||
) as DeclarationReflection
|
||||
}
|
||||
|
||||
createNamespace(namespaceName: string): DeclarationReflection | undefined {
|
||||
if (!this.currentContext) {
|
||||
return
|
||||
}
|
||||
const formattedName = this.formatName(namespaceName)
|
||||
const namespace = this.currentContext?.createDeclarationReflection(
|
||||
ReflectionKind.Namespace,
|
||||
void 0,
|
||||
void 0,
|
||||
formattedName
|
||||
)
|
||||
|
||||
namespace.children = []
|
||||
|
||||
return namespace
|
||||
}
|
||||
|
||||
formatName(namespaceName: string): string {
|
||||
return `${this.options?.namePrefix}${namespaceName}`
|
||||
}
|
||||
|
||||
generateNamespaceFromTag({
|
||||
tag,
|
||||
summary,
|
||||
}: {
|
||||
tag: CommentTag
|
||||
reflection?: DeclarationReflection
|
||||
summary?: CommentDisplayPart[]
|
||||
}) {
|
||||
const categoryHeirarchy = tag.content[0].text.split(".")
|
||||
categoryHeirarchy.forEach((cat, index) => {
|
||||
// check whether a namespace exists with the category name.
|
||||
let namespace = this.loadNamespace(cat)
|
||||
|
||||
if (!namespace) {
|
||||
// add a namespace for this category
|
||||
namespace = this.createNamespace(cat) || namespace
|
||||
|
||||
namespace.comment = new Comment()
|
||||
if (this.currentNamespaceHeirarchy.length) {
|
||||
namespace.comment.modifierTags.add("@namespaceMember")
|
||||
}
|
||||
if (summary && index === categoryHeirarchy.length - 1) {
|
||||
namespace.comment.summary = summary
|
||||
}
|
||||
}
|
||||
this.currentContext =
|
||||
this.currentContext?.withScope(namespace) || this.currentContext
|
||||
|
||||
this.currentNamespaceHeirarchy.push(namespace)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* create categories in the last namespace if the
|
||||
* reflection has a category
|
||||
*/
|
||||
attachCategories(reflection: DeclarationReflection) {
|
||||
if (!this.currentNamespaceHeirarchy.length) {
|
||||
return
|
||||
}
|
||||
|
||||
const parentNamespace =
|
||||
this.currentNamespaceHeirarchy[this.currentNamespaceHeirarchy.length - 1]
|
||||
reflection.comment?.blockTags
|
||||
.filter((tag) => tag.tag === "@category")
|
||||
.forEach((tag) => {
|
||||
const categoryName = tag.content[0].text
|
||||
if (!parentNamespace.categories) {
|
||||
parentNamespace.categories = []
|
||||
}
|
||||
let category = parentNamespace.categories.find(
|
||||
(category) => category.title === categoryName
|
||||
)
|
||||
if (!category) {
|
||||
category = new ReflectionCategory(categoryName)
|
||||
parentNamespace.categories.push(category)
|
||||
}
|
||||
category.children.push(reflection)
|
||||
})
|
||||
}
|
||||
|
||||
handleCreateDeclarationEvent(
|
||||
context: Context,
|
||||
reflection: DeclarationReflection
|
||||
) {
|
||||
this.readOptions()
|
||||
if (this.options?.parentNamespace && !this.parentNamespace) {
|
||||
this.parentNamespace =
|
||||
this.loadNamespace(this.options.parentNamespace) ||
|
||||
this.createNamespace(this.options.parentNamespace)
|
||||
}
|
||||
this.currentNamespaceHeirarchy = []
|
||||
if (this.parentNamespace) {
|
||||
this.currentNamespaceHeirarchy.push(this.parentNamespace)
|
||||
}
|
||||
this.currentContext = context
|
||||
reflection.comment?.blockTags
|
||||
.filter((tag) => tag.tag === "@customNamespace")
|
||||
.forEach((tag) => {
|
||||
this.generateNamespaceFromTag({
|
||||
tag,
|
||||
})
|
||||
if (
|
||||
reflection.parent instanceof DeclarationReflection ||
|
||||
reflection.parent?.isProject()
|
||||
) {
|
||||
reflection.parent.children = reflection.parent.children?.filter(
|
||||
(child) => child.id !== reflection.id
|
||||
)
|
||||
}
|
||||
this.currentContext?.addChild(reflection)
|
||||
})
|
||||
|
||||
reflection.comment?.removeTags("@customNamespace")
|
||||
this.attachCategories(reflection)
|
||||
this.currentContext = undefined
|
||||
this.currentNamespaceHeirarchy = []
|
||||
}
|
||||
|
||||
/**
|
||||
* Scan all source files for `@customNamespace` tag to generate namespaces
|
||||
* This is mainly helpful to pull summaries of the namespaces.
|
||||
*/
|
||||
scanComments(context: Context) {
|
||||
if (this.scannedComments) {
|
||||
return
|
||||
}
|
||||
this.currentContext = context
|
||||
const fileNames = context.program.getRootFileNames()
|
||||
|
||||
fileNames.forEach((fileName) => {
|
||||
const sourceFile = context.program.getSourceFile(fileName)
|
||||
if (!sourceFile) {
|
||||
return
|
||||
}
|
||||
|
||||
const comments = context.getFileComment(sourceFile)
|
||||
comments?.blockTags
|
||||
.filter((tag) => tag.tag === "@customNamespace")
|
||||
.forEach((tag) => {
|
||||
this.generateNamespaceFromTag({ tag, summary: comments.summary })
|
||||
if (this.currentNamespaceHeirarchy.length) {
|
||||
// add comments of the file to the last created namespace
|
||||
this.currentNamespaceHeirarchy[
|
||||
this.currentNamespaceHeirarchy.length - 1
|
||||
].comment = comments
|
||||
|
||||
this.currentNamespaceHeirarchy[
|
||||
this.currentNamespaceHeirarchy.length - 1
|
||||
].comment!.blockTags = this.currentNamespaceHeirarchy[
|
||||
this.currentNamespaceHeirarchy.length - 1
|
||||
].comment!.blockTags.filter((tag) => tag.tag !== "@customNamespace")
|
||||
}
|
||||
// reset values
|
||||
this.currentNamespaceHeirarchy = []
|
||||
this.currentContext = context
|
||||
})
|
||||
})
|
||||
|
||||
this.scannedComments = true
|
||||
}
|
||||
|
||||
// for debugging
|
||||
printCurrentHeirarchy() {
|
||||
return this.currentNamespaceHeirarchy.map((heirarchy) => heirarchy.name)
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import { load as parseOasSchemaPlugin } from "./parse-oas-schema-plugin"
|
||||
import { load as apiIgnorePlugin } from "./api-ignore"
|
||||
import { load as eslintExamplePlugin } from "./eslint-example"
|
||||
import { load as signatureModifierPlugin } from "./signature-modifier"
|
||||
import { GenerateNamespacePlugin } from "./generate-namespace"
|
||||
|
||||
export function load(app: Application) {
|
||||
resolveReferencesPluginLoad(app)
|
||||
@@ -13,4 +14,6 @@ export function load(app: Application) {
|
||||
apiIgnorePlugin(app)
|
||||
eslintExamplePlugin(app)
|
||||
signatureModifierPlugin(app)
|
||||
|
||||
new GenerateNamespacePlugin(app)
|
||||
}
|
||||
@@ -178,7 +178,10 @@ function addComments(schema: Schema, reflection: Reflection) {
|
||||
}
|
||||
const children =
|
||||
"type" in reflection
|
||||
? getTypeChildren(reflection.type as SomeType, reflection.project)
|
||||
? getTypeChildren({
|
||||
reflectionType: reflection.type as SomeType,
|
||||
project: reflection.project,
|
||||
})
|
||||
: "children" in reflection
|
||||
? (reflection.children as DeclarationReflection[])
|
||||
: []
|
||||
|
||||
@@ -6,6 +6,7 @@ A plugin that forks and customizes the [typedoc-plugin-markdown](https://github.
|
||||
|
||||
Aside from the options detailed in [typedoc-plugin-markdown](https://github.com/tgreyuk/typedoc-plugin-markdown/tree/master/packages/typedoc-plugin-markdown#options), the following options are accepted:
|
||||
|
||||
- `allReflectionsHaveOwnDocumentInNamespace`: An array of namespace names whose child members should have their own documents.
|
||||
- `mdxImports`: A boolean value indicating whether the outputted files should be MDX files with the `.mdx` extension.
|
||||
- `formatting`: An object whose keys are string patterns used to target specific files. You can also use the string `*` to target all files. The values are objects having the following properties:
|
||||
- `sections`: (optional) an object whose keys are of type [`SectionKey`](./src/types.ts#L19) and values are boolean. This property is used to enable/disable certain sections in the outputted generated docs.
|
||||
|
||||
@@ -40,6 +40,13 @@ export function load(app: Application) {
|
||||
defaultValue: [],
|
||||
})
|
||||
|
||||
app.options.addDeclaration({
|
||||
help: "[Markdown Plugin] Specify namespace names where all reflections are outputted into seperate files.",
|
||||
name: "allReflectionsHaveOwnDocumentInNamespace",
|
||||
type: ParameterType.Array,
|
||||
defaultValue: [],
|
||||
})
|
||||
|
||||
app.options.addDeclaration({
|
||||
help: "[Markdown Plugin] Separator used to format filenames.",
|
||||
name: "filenameSeparator",
|
||||
|
||||
@@ -49,10 +49,17 @@ import decrementCurrentTitleLevelHelper from "./resources/helpers/decrement-curr
|
||||
import incrementCurrentTitleLevelHelper from "./resources/helpers/increment-current-title-level"
|
||||
import hasMoreThanOneSignatureHelper from "./resources/helpers/has-more-than-one-signature"
|
||||
import ifCanShowConstructorsTitleHelper from "./resources/helpers/if-can-show-constructors-title"
|
||||
import ifReactQueryTypeHelper from "./resources/helpers/if-react-query-type"
|
||||
import ifHasHookParamsHelper from "./resources/helpers/if-has-hook-params"
|
||||
import reactQueryHookParamsHelper from "./resources/helpers/react-query-hook-params"
|
||||
import ifHasMutationParamsHelper from "./resources/helpers/if-has-mutation-params"
|
||||
import reactQueryMutationParamsHelper from "./resources/helpers/react-query-mutation-params"
|
||||
import ifHasMutationReturnHelper from "./resources/helpers/if-has-mutation-return"
|
||||
import reactQueryMutationReturnHelper from "./resources/helpers/react-query-mutation-return"
|
||||
import ifHasQueryReturnHelper from "./resources/helpers/if-has-query-return"
|
||||
import reactQueryQueryReturnHelper from "./resources/helpers/react-query-query-return"
|
||||
import { MarkdownTheme } from "./theme"
|
||||
|
||||
// test
|
||||
|
||||
const TEMPLATE_PATH = path.join(__dirname, "resources", "templates")
|
||||
|
||||
export const indexTemplate = Handlebars.compile(
|
||||
@@ -128,4 +135,13 @@ export function registerHelpers(theme: MarkdownTheme) {
|
||||
incrementCurrentTitleLevelHelper(theme)
|
||||
hasMoreThanOneSignatureHelper(theme)
|
||||
ifCanShowConstructorsTitleHelper()
|
||||
ifReactQueryTypeHelper()
|
||||
ifHasHookParamsHelper()
|
||||
reactQueryHookParamsHelper()
|
||||
ifHasMutationParamsHelper(theme)
|
||||
reactQueryMutationParamsHelper(theme)
|
||||
ifHasMutationReturnHelper(theme)
|
||||
reactQueryMutationReturnHelper(theme)
|
||||
ifHasQueryReturnHelper(theme)
|
||||
reactQueryQueryReturnHelper(theme)
|
||||
}
|
||||
@@ -1,7 +1,13 @@
|
||||
import * as Handlebars from "handlebars"
|
||||
import { Comment } from "typedoc"
|
||||
|
||||
const EXCLUDED_TAGS = ["@returns", "@example", "@featureFlag"]
|
||||
const EXCLUDED_TAGS = [
|
||||
"@returns",
|
||||
"@example",
|
||||
"@featureFlag",
|
||||
"@category",
|
||||
"@typeParamDefinition",
|
||||
]
|
||||
|
||||
export default function () {
|
||||
Handlebars.registerHelper(
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
import * as Handlebars from "handlebars"
|
||||
import { SignatureReflection } from "typedoc"
|
||||
import { getHookParams } from "../../utils/react-query-utils"
|
||||
|
||||
export default function () {
|
||||
Handlebars.registerHelper(
|
||||
"ifHasHookParams",
|
||||
function (this: SignatureReflection, options: Handlebars.HelperOptions) {
|
||||
return getHookParams(this).length
|
||||
? options.fn(this)
|
||||
: options.inverse(this)
|
||||
}
|
||||
)
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
import * as Handlebars from "handlebars"
|
||||
import { SignatureReflection } from "typedoc"
|
||||
import { getMutationParams } from "../../utils/react-query-utils"
|
||||
import { MarkdownTheme } from "../../theme"
|
||||
|
||||
export default function (theme: MarkdownTheme) {
|
||||
Handlebars.registerHelper(
|
||||
"ifHasMutationParams",
|
||||
function (this: SignatureReflection, options: Handlebars.HelperOptions) {
|
||||
return getMutationParams({
|
||||
signatureReflection: this,
|
||||
project: theme.project || this.project,
|
||||
reflectionTypeGetterOptions: {
|
||||
// we only need to check if there are mutation parameters,
|
||||
// so no need to get all the children
|
||||
maxLevel: 1,
|
||||
},
|
||||
}).length
|
||||
? options.fn(this)
|
||||
: options.inverse(this)
|
||||
}
|
||||
)
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
import * as Handlebars from "handlebars"
|
||||
import { SignatureReflection } from "typedoc"
|
||||
import { getMutationReturn } from "../../utils/react-query-utils"
|
||||
import { MarkdownTheme } from "../../theme"
|
||||
|
||||
export default function (theme: MarkdownTheme) {
|
||||
Handlebars.registerHelper(
|
||||
"ifHasMutationReturn",
|
||||
function (this: SignatureReflection, options: Handlebars.HelperOptions) {
|
||||
return getMutationReturn({
|
||||
signatureReflection: this,
|
||||
project: theme.project || this.project,
|
||||
reflectionTypeGetterOptions: {
|
||||
// we only need to check if there are mutation returns,
|
||||
// so no need to get all the children
|
||||
maxLevel: 1,
|
||||
},
|
||||
}).length
|
||||
? options.fn(this)
|
||||
: options.inverse(this)
|
||||
}
|
||||
)
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
import * as Handlebars from "handlebars"
|
||||
import { SignatureReflection } from "typedoc"
|
||||
import { getQueryReturn } from "../../utils/react-query-utils"
|
||||
import { MarkdownTheme } from "../../theme"
|
||||
|
||||
export default function (theme: MarkdownTheme) {
|
||||
Handlebars.registerHelper(
|
||||
"ifHasQueryReturn",
|
||||
function (this: SignatureReflection, options: Handlebars.HelperOptions) {
|
||||
return getQueryReturn({
|
||||
signatureReflection: this,
|
||||
project: theme.project || this.project,
|
||||
reflectionTypeGetterOptions: {
|
||||
// we only need to check if there are query returns,
|
||||
// so no need to get all the children
|
||||
maxLevel: 1,
|
||||
},
|
||||
}).length
|
||||
? options.fn(this)
|
||||
: options.inverse(this)
|
||||
}
|
||||
)
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
import * as Handlebars from "handlebars"
|
||||
import { SignatureReflection } from "typedoc"
|
||||
import {
|
||||
isReactQueryMutation,
|
||||
isReactQueryQuery,
|
||||
} from "../../utils/react-query-utils"
|
||||
|
||||
export default function () {
|
||||
Handlebars.registerHelper(
|
||||
"ifReactQueryType",
|
||||
function (this: SignatureReflection, options: Handlebars.HelperOptions) {
|
||||
return isReactQueryMutation(this) || isReactQueryQuery(this)
|
||||
? options.fn(this)
|
||||
: options.inverse(this)
|
||||
}
|
||||
)
|
||||
}
|
||||
+6
-13
@@ -3,6 +3,7 @@ import { ReflectionParameterType } from "../../types"
|
||||
import { parseParams } from "../../utils/params-utils"
|
||||
import { MarkdownTheme } from "../../theme"
|
||||
import { reflectionComponentFormatter } from "../../utils/reflection-formatter"
|
||||
import { formatParameterComponent } from "../../utils/format-parameter-component"
|
||||
|
||||
export default function (theme: MarkdownTheme) {
|
||||
Handlebars.registerHelper(
|
||||
@@ -21,19 +22,11 @@ export default function (theme: MarkdownTheme) {
|
||||
})
|
||||
)
|
||||
|
||||
let extraProps: string[] = []
|
||||
|
||||
if (parameterComponentExtraProps) {
|
||||
extraProps = Object.entries(parameterComponentExtraProps).map(
|
||||
([key, value]) => `${key}=${JSON.stringify(value)}`
|
||||
)
|
||||
}
|
||||
|
||||
return `<${parameterComponent} parameters={${JSON.stringify(
|
||||
parameters,
|
||||
null,
|
||||
2
|
||||
)}} ${extraProps.join(" ")}/>`
|
||||
return formatParameterComponent({
|
||||
parameterComponent,
|
||||
componentItems: parameters,
|
||||
extraProps: parameterComponentExtraProps,
|
||||
})
|
||||
}
|
||||
)
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
import * as Handlebars from "handlebars"
|
||||
import { SignatureReflection } from "typedoc"
|
||||
import { getHookParams } from "../../utils/react-query-utils"
|
||||
|
||||
export default function () {
|
||||
Handlebars.registerHelper(
|
||||
"reactQueryHookParams",
|
||||
function (this: SignatureReflection) {
|
||||
let parametersStr = ""
|
||||
const hookParameters = getHookParams(this)
|
||||
|
||||
if (hookParameters?.length) {
|
||||
parametersStr = Handlebars.helpers.parameter.call(hookParameters)
|
||||
}
|
||||
|
||||
return parametersStr
|
||||
}
|
||||
)
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
import * as Handlebars from "handlebars"
|
||||
import { SignatureReflection } from "typedoc"
|
||||
import { getMutationParams } from "../../utils/react-query-utils"
|
||||
import { MarkdownTheme } from "../../theme"
|
||||
import { formatParameterComponent } from "../../utils/format-parameter-component"
|
||||
|
||||
export default function (theme: MarkdownTheme) {
|
||||
Handlebars.registerHelper(
|
||||
"reactQueryMutationParams",
|
||||
function (this: SignatureReflection) {
|
||||
const {
|
||||
parameterStyle,
|
||||
parameterComponent,
|
||||
maxLevel,
|
||||
parameterComponentExtraProps,
|
||||
} = theme.getFormattingOptionsForLocation()
|
||||
const mutationParameters = getMutationParams({
|
||||
signatureReflection: this,
|
||||
project: theme.project || this.project,
|
||||
reflectionTypeGetterOptions: {
|
||||
maxLevel,
|
||||
},
|
||||
})
|
||||
|
||||
if (parameterStyle !== "component") {
|
||||
// TODO maybe handle other cases? But for now it's not important
|
||||
return ""
|
||||
}
|
||||
|
||||
return formatParameterComponent({
|
||||
parameterComponent,
|
||||
componentItems: mutationParameters,
|
||||
extraProps: parameterComponentExtraProps,
|
||||
})
|
||||
}
|
||||
)
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
import * as Handlebars from "handlebars"
|
||||
import { SignatureReflection } from "typedoc"
|
||||
import { getMutationReturn } from "../../utils/react-query-utils"
|
||||
import { MarkdownTheme } from "../../theme"
|
||||
import { formatParameterComponent } from "../../utils/format-parameter-component"
|
||||
|
||||
export default function (theme: MarkdownTheme) {
|
||||
Handlebars.registerHelper(
|
||||
"reactQueryMutationReturn",
|
||||
function (this: SignatureReflection) {
|
||||
const {
|
||||
parameterStyle,
|
||||
parameterComponent,
|
||||
maxLevel,
|
||||
parameterComponentExtraProps,
|
||||
} = theme.getFormattingOptionsForLocation()
|
||||
const mutationParameters = getMutationReturn({
|
||||
signatureReflection: this,
|
||||
project: theme.project || this.project,
|
||||
reflectionTypeGetterOptions: {
|
||||
maxLevel,
|
||||
},
|
||||
})
|
||||
|
||||
if (parameterStyle !== "component") {
|
||||
// TODO maybe handle other cases? But for now it's not important
|
||||
return ""
|
||||
}
|
||||
|
||||
return formatParameterComponent({
|
||||
parameterComponent,
|
||||
componentItems: mutationParameters,
|
||||
extraProps: parameterComponentExtraProps,
|
||||
})
|
||||
}
|
||||
)
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
import * as Handlebars from "handlebars"
|
||||
import { SignatureReflection } from "typedoc"
|
||||
import { getQueryReturn } from "../../utils/react-query-utils"
|
||||
import { MarkdownTheme } from "../../theme"
|
||||
import { formatParameterComponent } from "../../utils/format-parameter-component"
|
||||
|
||||
export default function (theme: MarkdownTheme) {
|
||||
Handlebars.registerHelper(
|
||||
"reactQueryQueryReturn",
|
||||
function (this: SignatureReflection) {
|
||||
const {
|
||||
parameterStyle,
|
||||
parameterComponent,
|
||||
maxLevel,
|
||||
parameterComponentExtraProps,
|
||||
} = theme.getFormattingOptionsForLocation()
|
||||
const mutationParameters = getQueryReturn({
|
||||
signatureReflection: this,
|
||||
project: theme.project || this.project,
|
||||
reflectionTypeGetterOptions: {
|
||||
maxLevel,
|
||||
},
|
||||
})
|
||||
|
||||
if (parameterStyle !== "component") {
|
||||
// TODO maybe handle other cases? But for now it's not important
|
||||
return ""
|
||||
}
|
||||
|
||||
return formatParameterComponent({
|
||||
parameterComponent,
|
||||
componentItems: mutationParameters,
|
||||
extraProps: parameterComponentExtraProps,
|
||||
})
|
||||
}
|
||||
)
|
||||
}
|
||||
+9
-2
@@ -3,6 +3,7 @@ import { PageEvent, ParameterReflection, ReflectionKind } from "typedoc"
|
||||
import { MarkdownTheme } from "../../theme"
|
||||
import { getDisplayName } from "../../utils"
|
||||
import { escapeChars } from "utils"
|
||||
import { replaceTemplateVariables } from "../../utils/reflection-template-strings"
|
||||
|
||||
export default function (theme: MarkdownTheme) {
|
||||
Handlebars.registerHelper(
|
||||
@@ -12,10 +13,16 @@ export default function (theme: MarkdownTheme) {
|
||||
const { reflectionTitle } = theme.getFormattingOptionsForLocation()
|
||||
|
||||
if (reflectionTitle?.fullReplacement?.length) {
|
||||
return reflectionTitle.fullReplacement
|
||||
return theme.reflection
|
||||
? replaceTemplateVariables(
|
||||
theme.reflection,
|
||||
reflectionTitle.fullReplacement
|
||||
)
|
||||
: reflectionTitle.fullReplacement
|
||||
}
|
||||
|
||||
const title: string[] = [""]
|
||||
const title: string[] = [reflectionTitle?.prefix || ""]
|
||||
|
||||
if (
|
||||
reflectionTitle?.kind &&
|
||||
this.model?.kind &&
|
||||
|
||||
+27
-15
@@ -2,8 +2,9 @@ import * as Handlebars from "handlebars"
|
||||
import { Comment, DeclarationReflection, SignatureReflection } from "typedoc"
|
||||
import { MarkdownTheme } from "../../theme"
|
||||
import reflectionFormatter from "../../utils/reflection-formatter"
|
||||
import { returnReflectionComponentFormatter } from "../../utils/return-reflection-formatter"
|
||||
import { getReflectionTypeParameters } from "../../utils/reflection-type-parameters"
|
||||
import { Parameter } from "../../types"
|
||||
import { formatParameterComponent } from "../../utils/format-parameter-component"
|
||||
|
||||
export default function (theme: MarkdownTheme) {
|
||||
Handlebars.registerHelper(
|
||||
@@ -24,14 +25,18 @@ function getReturnFromType(
|
||||
theme: MarkdownTheme,
|
||||
reflection: SignatureReflection
|
||||
) {
|
||||
const { parameterStyle, parameterComponent, maxLevel } =
|
||||
theme.getFormattingOptionsForLocation()
|
||||
const {
|
||||
parameterStyle,
|
||||
parameterComponent,
|
||||
maxLevel,
|
||||
parameterComponentExtraProps,
|
||||
} = theme.getFormattingOptionsForLocation()
|
||||
|
||||
if (!reflection.type) {
|
||||
return ""
|
||||
}
|
||||
|
||||
const componentItems = returnReflectionComponentFormatter({
|
||||
const componentItems = getReflectionTypeParameters({
|
||||
reflectionType: reflection.type,
|
||||
project: reflection.project || theme.project,
|
||||
comment: reflection.comment,
|
||||
@@ -40,11 +45,11 @@ function getReturnFromType(
|
||||
})
|
||||
|
||||
if (parameterStyle === "component") {
|
||||
return `<${parameterComponent} parameters={${JSON.stringify(
|
||||
return formatParameterComponent({
|
||||
parameterComponent,
|
||||
componentItems,
|
||||
null,
|
||||
2
|
||||
)}} />`
|
||||
extraProps: parameterComponentExtraProps,
|
||||
})
|
||||
} else {
|
||||
return formatReturnAsList(componentItems)
|
||||
}
|
||||
@@ -74,8 +79,12 @@ function formatReturnAsList(componentItems: Parameter[], level = 1): string {
|
||||
|
||||
function getReturnFromComment(theme: MarkdownTheme, comment: Comment) {
|
||||
const md: string[] = []
|
||||
const { parameterStyle, parameterComponent, maxLevel } =
|
||||
theme.getFormattingOptionsForLocation()
|
||||
const {
|
||||
parameterStyle,
|
||||
parameterComponent,
|
||||
maxLevel,
|
||||
parameterComponentExtraProps,
|
||||
} = theme.getFormattingOptionsForLocation()
|
||||
|
||||
if (comment.blockTags?.length) {
|
||||
const tags = comment.blockTags
|
||||
@@ -97,11 +106,14 @@ function getReturnFromComment(theme: MarkdownTheme, comment: Comment) {
|
||||
)
|
||||
result +=
|
||||
parameterStyle === "component"
|
||||
? `\n\n<${parameterComponent} parameters={${JSON.stringify(
|
||||
content,
|
||||
null,
|
||||
2
|
||||
)}} title={"${commentPart.target.name}"} />\n\n`
|
||||
? `\n\n${formatParameterComponent({
|
||||
parameterComponent,
|
||||
componentItems: content as Parameter[],
|
||||
extraProps: {
|
||||
...parameterComponentExtraProps,
|
||||
title: commentPart.target.name,
|
||||
},
|
||||
})}\n\n`
|
||||
: `\n\n<details>\n<summary>\n${
|
||||
commentPart.target.name
|
||||
}\n</summary>\n\n${content?.join("\n")}\n\n</details>`
|
||||
|
||||
+22
-14
@@ -2,15 +2,16 @@ import * as Handlebars from "handlebars"
|
||||
import { DeclarationReflection, ReflectionType } from "typedoc"
|
||||
import { MarkdownTheme } from "../../theme"
|
||||
import { parseParams } from "../../utils/params-utils"
|
||||
import { ReflectionParameterType } from "../../types"
|
||||
import { Parameter, ReflectionParameterType } from "../../types"
|
||||
import reflectionFormatter from "../../utils/reflection-formatter"
|
||||
import { escapeChars, stripLineBreaks } from "utils"
|
||||
import { formatParameterComponent } from "../../utils/format-parameter-component"
|
||||
|
||||
export default function (theme: MarkdownTheme) {
|
||||
Handlebars.registerHelper(
|
||||
"typeDeclarationMembers",
|
||||
function (this: DeclarationReflection[]) {
|
||||
const { parameterComponent, maxLevel } =
|
||||
const { parameterComponent, maxLevel, parameterComponentExtraProps } =
|
||||
theme.getFormattingOptionsForLocation()
|
||||
const comments = this.map(
|
||||
(param) => !!param.comment?.hasVisibleComponent()
|
||||
@@ -30,11 +31,12 @@ export default function (theme: MarkdownTheme) {
|
||||
break
|
||||
}
|
||||
case "component": {
|
||||
result = getComponentMarkdownContent(
|
||||
result = getComponentMarkdownContent({
|
||||
properties,
|
||||
parameterComponent,
|
||||
maxLevel
|
||||
)
|
||||
maxLevel,
|
||||
parameterComponentExtraProps,
|
||||
})
|
||||
break
|
||||
}
|
||||
case "table": {
|
||||
@@ -58,11 +60,17 @@ function getListMarkdownContent(properties: DeclarationReflection[]) {
|
||||
return items.join("\n")
|
||||
}
|
||||
|
||||
function getComponentMarkdownContent(
|
||||
properties: DeclarationReflection[],
|
||||
parameterComponent?: string,
|
||||
function getComponentMarkdownContent({
|
||||
properties,
|
||||
parameterComponent,
|
||||
maxLevel,
|
||||
parameterComponentExtraProps,
|
||||
}: {
|
||||
properties: DeclarationReflection[]
|
||||
parameterComponent?: string
|
||||
maxLevel?: number | undefined
|
||||
) {
|
||||
parameterComponentExtraProps?: Record<string, unknown>
|
||||
}) {
|
||||
const parameters = properties.map((property) =>
|
||||
reflectionFormatter({
|
||||
reflection: property,
|
||||
@@ -72,11 +80,11 @@ function getComponentMarkdownContent(
|
||||
})
|
||||
)
|
||||
|
||||
return `<${parameterComponent} parameters={${JSON.stringify(
|
||||
parameters,
|
||||
null,
|
||||
2
|
||||
)}} />`
|
||||
return formatParameterComponent({
|
||||
parameterComponent,
|
||||
componentItems: parameters as Parameter[],
|
||||
extraProps: parameterComponentExtraProps,
|
||||
})
|
||||
}
|
||||
|
||||
function getTableMarkdownContent(
|
||||
|
||||
+7
-6
@@ -2,12 +2,13 @@ import * as Handlebars from "handlebars"
|
||||
import { TypeParameterReflection } from "typedoc"
|
||||
import { reflectionComponentFormatter } from "../../utils/reflection-formatter"
|
||||
import { MarkdownTheme } from "../../theme"
|
||||
import { formatParameterComponent } from "../../utils/format-parameter-component"
|
||||
|
||||
export default function (theme: MarkdownTheme) {
|
||||
Handlebars.registerHelper(
|
||||
"typeParameterComponent",
|
||||
function (this: TypeParameterReflection[]) {
|
||||
const { parameterComponent, maxLevel } =
|
||||
const { parameterComponent, maxLevel, parameterComponentExtraProps } =
|
||||
theme.getFormattingOptionsForLocation()
|
||||
const parameters = this.map((parameter) =>
|
||||
reflectionComponentFormatter({
|
||||
@@ -17,11 +18,11 @@ export default function (theme: MarkdownTheme) {
|
||||
})
|
||||
)
|
||||
|
||||
return `<${parameterComponent} parameters={${JSON.stringify(
|
||||
parameters,
|
||||
null,
|
||||
2
|
||||
)}} />`
|
||||
return formatParameterComponent({
|
||||
parameterComponent,
|
||||
componentItems: parameters,
|
||||
extraProps: parameterComponentExtraProps,
|
||||
})
|
||||
}
|
||||
)
|
||||
}
|
||||
+1
-1
@@ -70,7 +70,7 @@
|
||||
|
||||
{{incrementCurrentTitleLevel}}
|
||||
|
||||
{{> member.signature showSources=false parent=../type.declaration }}
|
||||
{{> member.signature-wrapper showSources=false parent=../type.declaration }}
|
||||
|
||||
{{decrementCurrentTitleLevel}}
|
||||
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@
|
||||
|
||||
{{#with getSignature}}
|
||||
|
||||
{{> member.signature accessor="get" showSources=true }}
|
||||
{{> member.signature-wrapper accessor="get" showSources=true }}
|
||||
|
||||
{{/with}}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
{{#with setSignature}}
|
||||
|
||||
{{> member.signature accessor="set" showSources=true }}
|
||||
{{> member.signature-wrapper accessor="set" showSources=true }}
|
||||
|
||||
{{/with}}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
{{#each signatures}}
|
||||
|
||||
{{> member.signature showSources=true parent=.. }}
|
||||
{{> member.signature-wrapper showSources=true parent=.. }}
|
||||
|
||||
{{/each}}
|
||||
|
||||
@@ -58,9 +58,11 @@
|
||||
|
||||
{{#unless @last}}
|
||||
{{#unless hasOwnDocument}}
|
||||
{{#unless removeSeparator}}
|
||||
___
|
||||
{{/unless}}
|
||||
{{/unless}}
|
||||
{{/unless}}
|
||||
|
||||
{{#unless hasOwnDocument}}
|
||||
|
||||
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
{{{signatureTitle accessor parent}}}
|
||||
|
||||
{{#if (getFormattingOption "expandMembers")}}
|
||||
|
||||
{{#if (hasMoreThanOneSignature parent)}}
|
||||
|
||||
{{incrementCurrentTitleLevel}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{#if (sectionEnabled "member_signature_comment")}}
|
||||
|
||||
{{#with comment}}
|
||||
|
||||
{{#if hasVisibleComponent}}
|
||||
|
||||
{{{comments this true false}}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{/with}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{#if (sectionEnabled "member_signature_example")}}
|
||||
|
||||
{{{example this}}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{#if (sectionEnabled "member_signature_typeParameters")}}
|
||||
|
||||
{{#if typeParameters}}
|
||||
|
||||
{{{titleLevel}}} Type Parameters
|
||||
|
||||
{{#with typeParameters}}
|
||||
|
||||
{{{typeParameter}}}
|
||||
|
||||
{{/with}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{#if (sectionEnabled "member_signature_parameters")}}
|
||||
|
||||
{{#ifHasHookParams}}
|
||||
|
||||
{{{titleLevel}}} Hook Parameters
|
||||
|
||||
{{{reactQueryHookParams}}}
|
||||
|
||||
{{/ifHasHookParams}}
|
||||
|
||||
{{#ifHasMutationParams}}
|
||||
|
||||
{{{titleLevel}}} Mutation Function Parameters
|
||||
|
||||
{{{reactQueryMutationParams}}}
|
||||
|
||||
{{/ifHasMutationParams}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{#ifShowReturns}}
|
||||
|
||||
{{#ifHasMutationReturn}}
|
||||
|
||||
{{{titleLevel}}} Mutation Function Returned Data
|
||||
|
||||
{{{reactQueryMutationReturn}}}
|
||||
|
||||
{{/ifHasMutationReturn}}
|
||||
|
||||
{{#ifHasQueryReturn}}
|
||||
|
||||
{{{titleLevel}}} Query Returned Data
|
||||
|
||||
{{{reactQueryQueryReturn}}}
|
||||
|
||||
{{/ifHasQueryReturn}}
|
||||
|
||||
{{/ifShowReturns}}
|
||||
|
||||
{{#if (sectionEnabled "member_signature_comment")}}
|
||||
|
||||
{{#with comment}}
|
||||
|
||||
{{#if hasVisibleComponent}}
|
||||
|
||||
{{{comments this false true ..}}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{/with}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{#if (sectionEnabled "member_signature_sources")}}
|
||||
|
||||
{{#if showSources}}
|
||||
|
||||
{{incrementCurrentTitleLevel}}
|
||||
|
||||
{{> member.sources}}
|
||||
|
||||
{{decrementCurrentTitleLevel}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{#if (getFormattingOption "expandMembers")}}
|
||||
|
||||
{{#if (hasMoreThanOneSignature parent)}}
|
||||
|
||||
{{decrementCurrentTitleLevel}}
|
||||
|
||||
{{/if}}
|
||||
|
||||
{{/if}}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
{{#ifReactQueryType}}
|
||||
|
||||
{{> member.react-query.signature}}
|
||||
|
||||
{{else}}
|
||||
|
||||
{{> member.signature}}
|
||||
|
||||
{{/ifReactQueryType}}
|
||||
+1
-1
@@ -90,7 +90,7 @@
|
||||
|
||||
{{#each declaration.signatures}}
|
||||
|
||||
{{> member.signature showSources=false parent=../declaration }}
|
||||
{{> member.signature-wrapper showSources=false parent=../declaration }}
|
||||
|
||||
{{/each}}
|
||||
|
||||
|
||||
+5
-1
@@ -4,6 +4,10 @@
|
||||
|
||||
{{#each categories}}
|
||||
|
||||
{{#unless @first}}
|
||||
___
|
||||
{{/unless}}
|
||||
|
||||
{{#unless allChildrenHaveOwnDocument}}
|
||||
|
||||
{{#unless (getFormattingOption "expandMembers")}}
|
||||
@@ -18,7 +22,7 @@
|
||||
|
||||
{{#unless hasOwnDocument}}
|
||||
|
||||
{{> member}}
|
||||
{{> member removeSeparator=true}}
|
||||
|
||||
{{/unless}}
|
||||
|
||||
|
||||
+1
-1
@@ -100,7 +100,7 @@
|
||||
|
||||
{{incrementCurrentTitleLevel}}
|
||||
|
||||
{{> member.signature showSources=true }}
|
||||
{{> member.signature-wrapper showSources=true }}
|
||||
|
||||
{{decrementCurrentTitleLevel}}
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ import { Mapping } from "./types"
|
||||
|
||||
export class MarkdownTheme extends Theme {
|
||||
allReflectionsHaveOwnDocument!: string[]
|
||||
allReflectionsHaveOwnDocumentInNamespace: string[]
|
||||
entryDocument: string
|
||||
entryPoints!: string[]
|
||||
filenameSeparator!: string
|
||||
@@ -66,6 +67,9 @@ export class MarkdownTheme extends Theme {
|
||||
|
||||
// prettier-ignore
|
||||
this.allReflectionsHaveOwnDocument = this.getOption("allReflectionsHaveOwnDocument") as string[]
|
||||
this.allReflectionsHaveOwnDocumentInNamespace = this.getOption(
|
||||
"allReflectionsHaveOwnDocumentInNamespace"
|
||||
) as string[]
|
||||
this.entryDocument = this.getOption("entryDocument") as string
|
||||
this.entryPoints = this.getOption("entryPoints") as string[]
|
||||
this.filenameSeparator = this.getOption("filenameSeparator") as string
|
||||
@@ -143,14 +147,36 @@ export class MarkdownTheme extends Theme {
|
||||
return urls
|
||||
}
|
||||
|
||||
getAliasPath(reflection: Reflection): string {
|
||||
return path.join(
|
||||
reflection.parent && !reflection.parent.isProject()
|
||||
? this.getAliasPath(reflection.parent)
|
||||
: "",
|
||||
reflection.getAlias()
|
||||
)
|
||||
}
|
||||
|
||||
buildUrls(
|
||||
reflection: DeclarationReflection,
|
||||
urls: UrlMapping[]
|
||||
): UrlMapping[] {
|
||||
const mapping = this.getMappings(
|
||||
reflection,
|
||||
reflection.parent?.isProject() ? "" : reflection.parent?.getAlias()
|
||||
).find((mapping) => reflection.kindOf(mapping.kind))
|
||||
reflection.parent?.isProject() || !reflection.parent
|
||||
? ""
|
||||
: this.getAliasPath(reflection.parent)
|
||||
).find(
|
||||
(mapping) =>
|
||||
reflection.kindOf(mapping.kind) &&
|
||||
mapping.modifiers.has.every(
|
||||
(modifier) => reflection.comment?.hasModifier(modifier) || false
|
||||
) &&
|
||||
mapping.modifiers.not.every((modifier) => {
|
||||
return reflection.comment
|
||||
? !reflection.comment.hasModifier(modifier)
|
||||
: true
|
||||
})
|
||||
)
|
||||
if (mapping) {
|
||||
if (!reflection.url || !MarkdownTheme.URL_PREFIX.test(reflection.url)) {
|
||||
const url = this.toUrl(mapping, reflection)
|
||||
@@ -176,12 +202,23 @@ export class MarkdownTheme extends Theme {
|
||||
return (
|
||||
mapping.directory +
|
||||
"/" +
|
||||
this.getUrl(reflection) +
|
||||
this.getUrl({
|
||||
reflection,
|
||||
directory: mapping.directory,
|
||||
}) +
|
||||
(this.mdxOutput ? ".mdx" : ".md")
|
||||
)
|
||||
}
|
||||
|
||||
getUrl(reflection: Reflection, relative?: Reflection): string {
|
||||
getUrl({
|
||||
reflection,
|
||||
directory,
|
||||
relative,
|
||||
}: {
|
||||
reflection: Reflection
|
||||
directory: string
|
||||
relative?: Reflection
|
||||
}): string {
|
||||
let url = reflection.getAlias()
|
||||
|
||||
if (
|
||||
@@ -189,8 +226,15 @@ export class MarkdownTheme extends Theme {
|
||||
reflection.parent !== relative &&
|
||||
!(reflection.parent instanceof ProjectReflection)
|
||||
) {
|
||||
url =
|
||||
this.getUrl(reflection.parent, relative) + this.filenameSeparator + url
|
||||
const urlPrefix = this.getUrl({
|
||||
reflection: reflection.parent,
|
||||
directory,
|
||||
relative,
|
||||
})
|
||||
const fileNameSeparator = this.getFileNameSeparator(
|
||||
`${directory}/${urlPrefix}`
|
||||
)
|
||||
url = urlPrefix + fileNameSeparator + url
|
||||
}
|
||||
|
||||
return url.replace(/^_/, "")
|
||||
@@ -280,11 +324,14 @@ export class MarkdownTheme extends Theme {
|
||||
}
|
||||
}
|
||||
|
||||
getModuleParents(reflection: DeclarationReflection): DeclarationReflection[] {
|
||||
getParentsOfKind(
|
||||
reflection: DeclarationReflection,
|
||||
kind: ReflectionKind
|
||||
): DeclarationReflection[] {
|
||||
const parents: DeclarationReflection[] = []
|
||||
let currentParent = reflection?.parent as DeclarationReflection | undefined
|
||||
do {
|
||||
if (currentParent?.kind === ReflectionKind.Module) {
|
||||
if (currentParent?.kind === kind) {
|
||||
parents.push(currentParent)
|
||||
}
|
||||
currentParent = currentParent?.parent as DeclarationReflection | undefined
|
||||
@@ -294,11 +341,28 @@ export class MarkdownTheme extends Theme {
|
||||
}
|
||||
|
||||
getAllReflectionsHaveOwnDocument(reflection: DeclarationReflection): boolean {
|
||||
const moduleParents = this.getModuleParents(reflection)
|
||||
|
||||
return moduleParents.some((parent) =>
|
||||
this.allReflectionsHaveOwnDocument.includes(parent.name)
|
||||
const moduleParents = this.getParentsOfKind(
|
||||
reflection,
|
||||
ReflectionKind.Module
|
||||
)
|
||||
const namespaceParents = this.getParentsOfKind(
|
||||
reflection,
|
||||
ReflectionKind.Namespace
|
||||
)
|
||||
|
||||
return (
|
||||
moduleParents.some((parent) =>
|
||||
this.allReflectionsHaveOwnDocument.includes(parent.name)
|
||||
) ||
|
||||
namespaceParents.some((parent) =>
|
||||
this.allReflectionsHaveOwnDocumentInNamespace.includes(parent.name)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
getFileNameSeparator(pathPrefix: string): string {
|
||||
const formattingOptions = this.getFormattingOptions(pathPrefix)
|
||||
return formattingOptions.fileNameSeparator || this.filenameSeparator
|
||||
}
|
||||
|
||||
getMappings(
|
||||
@@ -308,36 +372,60 @@ export class MarkdownTheme extends Theme {
|
||||
return [
|
||||
{
|
||||
kind: [ReflectionKind.Module],
|
||||
modifiers: {
|
||||
has: [],
|
||||
not: [],
|
||||
},
|
||||
isLeaf: false,
|
||||
directory: path.join(directoryPrefix || "", "modules"),
|
||||
template: this.getReflectionTemplate(),
|
||||
},
|
||||
{
|
||||
kind: [ReflectionKind.Namespace],
|
||||
modifiers: {
|
||||
has: [],
|
||||
not: [],
|
||||
},
|
||||
isLeaf: false,
|
||||
directory: path.join(directoryPrefix || "", "modules"),
|
||||
directory: path.join(directoryPrefix || ""),
|
||||
template: this.getReflectionTemplate(),
|
||||
},
|
||||
{
|
||||
kind: [ReflectionKind.Enum],
|
||||
modifiers: {
|
||||
has: [],
|
||||
not: [],
|
||||
},
|
||||
isLeaf: false,
|
||||
directory: path.join(directoryPrefix || "", "enums"),
|
||||
template: this.getReflectionTemplate(),
|
||||
},
|
||||
{
|
||||
kind: [ReflectionKind.Class],
|
||||
modifiers: {
|
||||
has: [],
|
||||
not: [],
|
||||
},
|
||||
isLeaf: false,
|
||||
directory: path.join(directoryPrefix || "", "classes"),
|
||||
template: this.getReflectionTemplate(),
|
||||
},
|
||||
{
|
||||
kind: [ReflectionKind.Interface],
|
||||
modifiers: {
|
||||
has: [],
|
||||
not: [],
|
||||
},
|
||||
isLeaf: false,
|
||||
directory: path.join(directoryPrefix || "", "interfaces"),
|
||||
template: this.getReflectionTemplate(),
|
||||
},
|
||||
{
|
||||
kind: [ReflectionKind.TypeAlias],
|
||||
modifiers: {
|
||||
has: [],
|
||||
not: [],
|
||||
},
|
||||
isLeaf: true,
|
||||
directory: path.join(directoryPrefix || "", "types"),
|
||||
template: this.getReflectionMemberTemplate(),
|
||||
@@ -346,18 +434,30 @@ export class MarkdownTheme extends Theme {
|
||||
? [
|
||||
{
|
||||
kind: [ReflectionKind.Variable],
|
||||
modifiers: {
|
||||
has: [],
|
||||
not: [],
|
||||
},
|
||||
isLeaf: true,
|
||||
directory: path.join(directoryPrefix || "", "variables"),
|
||||
template: this.getReflectionMemberTemplate(),
|
||||
},
|
||||
{
|
||||
kind: [ReflectionKind.Function],
|
||||
modifiers: {
|
||||
has: [],
|
||||
not: [],
|
||||
},
|
||||
isLeaf: true,
|
||||
directory: path.join(directoryPrefix || "", "functions"),
|
||||
template: this.getReflectionMemberTemplate(),
|
||||
},
|
||||
{
|
||||
kind: [ReflectionKind.Method],
|
||||
modifiers: {
|
||||
has: [],
|
||||
not: [],
|
||||
},
|
||||
isLeaf: true,
|
||||
directory: path.join(directoryPrefix || "", "methods"),
|
||||
template: this.getReflectionMemberTemplate(),
|
||||
@@ -393,6 +493,25 @@ export class MarkdownTheme extends Theme {
|
||||
page.model instanceof ProjectReflection
|
||||
) {
|
||||
this.removeGroups(page.model)
|
||||
this.removeCategories(page.model)
|
||||
this.sortCategories(page.model)
|
||||
}
|
||||
|
||||
if (
|
||||
this.reflection instanceof DeclarationReflection &&
|
||||
this.reflection.parent instanceof ProjectReflection
|
||||
) {
|
||||
const namespacesGroup = this.reflection.groups?.find(
|
||||
(group) => group.title === "Namespaces"
|
||||
)
|
||||
if (namespacesGroup) {
|
||||
// remove the namespaces that have the `@namespaceMember` modifier
|
||||
namespacesGroup.children = namespacesGroup.children.filter((child) => {
|
||||
return child.comment
|
||||
? !child.comment.hasModifier("@namespaceMember")
|
||||
: true
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
@@ -428,6 +547,34 @@ export class MarkdownTheme extends Theme {
|
||||
})
|
||||
}
|
||||
|
||||
protected removeCategories(
|
||||
model?: DeclarationReflection | ProjectReflection
|
||||
) {
|
||||
if (!model?.categories) {
|
||||
return
|
||||
}
|
||||
|
||||
const options = this.getFormattingOptionsForLocation()
|
||||
|
||||
model.categories = model.categories.filter((category) => {
|
||||
return (
|
||||
!options.reflectionCategories ||
|
||||
!(category.title in options.reflectionCategories) ||
|
||||
options.reflectionCategories[category.title]
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
protected sortCategories(model?: DeclarationReflection | ProjectReflection) {
|
||||
if (!model?.categories) {
|
||||
return
|
||||
}
|
||||
|
||||
model.categories.sort((categoryA, categoryB) => {
|
||||
return categoryA.title.localeCompare(categoryB.title)
|
||||
})
|
||||
}
|
||||
|
||||
get globalsFile() {
|
||||
return `modules.${this.mdxOutput ? "mdx" : "md"}`
|
||||
}
|
||||
@@ -441,10 +588,14 @@ export class MarkdownTheme extends Theme {
|
||||
return {}
|
||||
}
|
||||
|
||||
return this.getFormattingOptions(this.location)
|
||||
}
|
||||
|
||||
getFormattingOptions(location: string): FormattingOptionType {
|
||||
const applicableOptions: FormattingOptionType[] = []
|
||||
|
||||
Object.keys(this.formattingOptions).forEach((key) => {
|
||||
if (key === "*" || new RegExp(key).test(this.location)) {
|
||||
if (key === "*" || new RegExp(key).test(location)) {
|
||||
applicableOptions.push(this.formattingOptions[key])
|
||||
}
|
||||
})
|
||||
|
||||
@@ -16,6 +16,10 @@ export type ReflectionParameterType =
|
||||
|
||||
export type Mapping = {
|
||||
kind: ReflectionKind[]
|
||||
modifiers: {
|
||||
has: `@${string}`[]
|
||||
not: `@${string}`[]
|
||||
}
|
||||
isLeaf: boolean
|
||||
directory: string
|
||||
template: (pageEvent: PageEvent<ContainerReflection>) => string
|
||||
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
import { Parameter } from "../types"
|
||||
|
||||
type FormatParameterComponentProps = {
|
||||
parameterComponent: string | undefined
|
||||
componentItems: Parameter[]
|
||||
extraProps?: Record<string, unknown>
|
||||
}
|
||||
|
||||
/**
|
||||
* Function passed to an a Parameter array's sort method. It sorts
|
||||
* parameter items by whether they're optional or not. So, required items
|
||||
* are placed first in the array.
|
||||
*/
|
||||
function componentItemsSorter(a: Parameter, b: Parameter): number {
|
||||
if (a.optional) {
|
||||
return 1
|
||||
}
|
||||
if (b.optional) {
|
||||
return -1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
/**
|
||||
* Function that goes through items and their children to apply the
|
||||
* {@link componentItemsSorter} function on them and sort the items.
|
||||
*/
|
||||
function sortComponentItems(items: Parameter[]): Parameter[] {
|
||||
items.sort(componentItemsSorter)
|
||||
items = items.map((item) => {
|
||||
if (item.children) {
|
||||
item.children = sortComponentItems(item.children)
|
||||
}
|
||||
|
||||
return item
|
||||
})
|
||||
|
||||
return items
|
||||
}
|
||||
|
||||
export function formatParameterComponent({
|
||||
parameterComponent,
|
||||
componentItems,
|
||||
extraProps,
|
||||
}: FormatParameterComponentProps): string {
|
||||
let extraPropsArr: string[] = []
|
||||
if (extraProps) {
|
||||
extraPropsArr = Object.entries(extraProps).map(
|
||||
([key, value]) => `${key}=${JSON.stringify(value)}`
|
||||
)
|
||||
}
|
||||
// reorder component items to show required items first
|
||||
componentItems = sortComponentItems(componentItems)
|
||||
return `<${parameterComponent} parameters={${JSON.stringify(
|
||||
componentItems
|
||||
)}} ${extraPropsArr.join(" ")}/>`
|
||||
}
|
||||
@@ -0,0 +1,263 @@
|
||||
import {
|
||||
Comment,
|
||||
ParameterReflection,
|
||||
ProjectReflection,
|
||||
ReferenceType,
|
||||
SignatureReflection,
|
||||
SomeType,
|
||||
} from "typedoc"
|
||||
import { Parameter } from "../types"
|
||||
import {
|
||||
GetReflectionTypeParametersParams,
|
||||
getReflectionTypeParameters,
|
||||
} from "./reflection-type-parameters"
|
||||
|
||||
const MUTATION_PARAM_TYPE_NAME = "UseMutationOptions"
|
||||
const MUTATION_RETURN_TYPE_NAME = "UseMutationResult"
|
||||
const QUERY_PARAM_TYPE_NAME = "UseQueryOptionsWrapper"
|
||||
const BLACKLISTED_PARAM_NAMES = ["constructor", "void"]
|
||||
|
||||
export function isReactQueryMutation(
|
||||
signatureReflection: SignatureReflection
|
||||
): boolean {
|
||||
return (
|
||||
signatureReflection.type?.type === "reference" &&
|
||||
signatureReflection.type.name === MUTATION_RETURN_TYPE_NAME
|
||||
)
|
||||
}
|
||||
|
||||
export function getReactQueryQueryParameterType(
|
||||
signatureReflection: SignatureReflection
|
||||
): ReferenceType | undefined {
|
||||
let parameterType: ReferenceType | undefined
|
||||
signatureReflection.parameters?.some((parameter) => {
|
||||
if (
|
||||
parameter.type?.type === "reference" &&
|
||||
parameter.type.name === QUERY_PARAM_TYPE_NAME
|
||||
) {
|
||||
parameterType = parameter.type
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
return parameterType
|
||||
}
|
||||
|
||||
export function isReactQueryQuery(
|
||||
signatureReflection: SignatureReflection
|
||||
): boolean {
|
||||
return getReactQueryQueryParameterType(signatureReflection) !== undefined
|
||||
}
|
||||
|
||||
/**
|
||||
* Some parameter types are declared as classes which shows their constructor as
|
||||
* an accepted parameter. This removes the constructor from the list of parameters.
|
||||
*/
|
||||
export function cleanUpParameterTypes(parameters: Parameter[]): Parameter[] {
|
||||
return parameters.filter((parameter, index) => {
|
||||
const keep = !BLACKLISTED_PARAM_NAMES.includes(parameter.name)
|
||||
|
||||
if (keep && parameter.children) {
|
||||
parameters[index].children = cleanUpParameterTypes(parameter.children)
|
||||
}
|
||||
|
||||
return keep
|
||||
})
|
||||
}
|
||||
|
||||
export function getHookParams(
|
||||
signatureReflection: SignatureReflection
|
||||
): ParameterReflection[] {
|
||||
let hookParameters: ParameterReflection[] = []
|
||||
if (isReactQueryMutation(signatureReflection)) {
|
||||
/**
|
||||
* check parameters before the options parameter having the {@link MUTATION_PARAM_TYPE_NAME} type
|
||||
*/
|
||||
hookParameters =
|
||||
signatureReflection.parameters?.filter((parameter) => {
|
||||
return (
|
||||
parameter.type?.type !== "reference" ||
|
||||
parameter.type.name !== MUTATION_PARAM_TYPE_NAME
|
||||
)
|
||||
}) || []
|
||||
} else if (isReactQueryQuery(signatureReflection)) {
|
||||
/**
|
||||
* check parameters before the options parameter having the {@link QUERY_PARAM_TYPE_NAME} type
|
||||
*/
|
||||
hookParameters =
|
||||
signatureReflection.parameters?.filter((parameter) => {
|
||||
return (
|
||||
parameter.type?.type !== "reference" ||
|
||||
parameter.type.name !== QUERY_PARAM_TYPE_NAME
|
||||
)
|
||||
}) || []
|
||||
}
|
||||
|
||||
return hookParameters
|
||||
}
|
||||
|
||||
/**
|
||||
* Load comments of a type param from the signature's comments if it has the
|
||||
* `@typeParamDefinition` tag.
|
||||
*/
|
||||
function loadTypeComments(
|
||||
signatureReflection: SignatureReflection,
|
||||
typeName: string
|
||||
): Comment | undefined {
|
||||
const tagRegex = /^(?<typeName>\w+) - (?<typeDef>.*)$/
|
||||
const typeComment = new Comment()
|
||||
signatureReflection.comment?.blockTags
|
||||
.filter((tag) => tag.tag === "@typeParamDefinition")
|
||||
.some((tag) => {
|
||||
return tag.content.some((tagContent) => {
|
||||
const match = tagContent.text.match(tagRegex)
|
||||
if (match?.groups?.typeName === typeName && match?.groups?.typeDef) {
|
||||
typeComment.summary.push({
|
||||
kind: "text",
|
||||
text: match.groups.typeDef,
|
||||
})
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
})
|
||||
|
||||
return typeComment.summary.length > 0 ? typeComment : undefined
|
||||
}
|
||||
|
||||
type GetMutationParamsParams = {
|
||||
signatureReflection: SignatureReflection
|
||||
project: ProjectReflection
|
||||
reflectionTypeGetterOptions?: Partial<GetReflectionTypeParametersParams>
|
||||
}
|
||||
|
||||
type GetParamsOptions = GetMutationParamsParams & {
|
||||
reflectionType: SomeType
|
||||
}
|
||||
|
||||
function getParams({
|
||||
signatureReflection,
|
||||
reflectionType,
|
||||
reflectionTypeGetterOptions,
|
||||
...rest
|
||||
}: GetParamsOptions): Parameter[] {
|
||||
const comment =
|
||||
"name" in reflectionType
|
||||
? loadTypeComments(signatureReflection, reflectionType.name)
|
||||
: reflectionTypeGetterOptions?.comment
|
||||
|
||||
return cleanUpParameterTypes(
|
||||
getReflectionTypeParameters({
|
||||
reflectionType,
|
||||
comment,
|
||||
isReturn: false,
|
||||
...reflectionTypeGetterOptions,
|
||||
...rest,
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
export function getMutationParams({
|
||||
signatureReflection,
|
||||
reflectionTypeGetterOptions,
|
||||
project,
|
||||
}: GetMutationParamsParams): Parameter[] {
|
||||
let mutationParameters: Parameter[] = []
|
||||
if (isReactQueryMutation(signatureReflection)) {
|
||||
const mutationOptionParam = signatureReflection.parameters?.find(
|
||||
(parameter) => {
|
||||
return (
|
||||
parameter.type?.type === "reference" &&
|
||||
parameter.type.name === MUTATION_PARAM_TYPE_NAME
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
if (
|
||||
mutationOptionParam?.type?.type === "reference" &&
|
||||
(mutationOptionParam.type.typeArguments?.length || 0) >= 3
|
||||
) {
|
||||
mutationParameters = getParams({
|
||||
signatureReflection,
|
||||
project,
|
||||
reflectionType: mutationOptionParam.type.typeArguments![2],
|
||||
reflectionTypeGetterOptions: {
|
||||
...reflectionTypeGetterOptions,
|
||||
wrapObject:
|
||||
mutationOptionParam.type.typeArguments![2].type === "reference",
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return mutationParameters
|
||||
}
|
||||
|
||||
export function hasResponseTypeArgument(type: ReferenceType): boolean {
|
||||
return (
|
||||
(type.typeArguments?.length || 0) >= 1 &&
|
||||
type.typeArguments![0].type === "reference" &&
|
||||
type.typeArguments![0].name === "Response" &&
|
||||
(type.typeArguments![0].typeArguments?.length || 0) >= 1
|
||||
)
|
||||
}
|
||||
|
||||
type GetMutationReturnParams = GetMutationParamsParams
|
||||
|
||||
export function getMutationReturn({
|
||||
signatureReflection,
|
||||
reflectionTypeGetterOptions,
|
||||
project,
|
||||
}: GetMutationReturnParams): Parameter[] {
|
||||
let returnParams: Parameter[] = []
|
||||
if (!isReactQueryMutation(signatureReflection)) {
|
||||
return returnParams
|
||||
}
|
||||
|
||||
const returnType = signatureReflection.type! as ReferenceType
|
||||
|
||||
if (hasResponseTypeArgument(returnType)) {
|
||||
returnParams = getParams({
|
||||
signatureReflection,
|
||||
project,
|
||||
reflectionType: (returnType.typeArguments![0] as ReferenceType)
|
||||
.typeArguments![0],
|
||||
reflectionTypeGetterOptions: {
|
||||
...reflectionTypeGetterOptions,
|
||||
wrapObject:
|
||||
(returnType.typeArguments![0] as ReferenceType).typeArguments![0]
|
||||
.type === "reference",
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
return returnParams
|
||||
}
|
||||
|
||||
type GetQueryReturnParams = GetMutationParamsParams
|
||||
|
||||
export function getQueryReturn({
|
||||
signatureReflection,
|
||||
reflectionTypeGetterOptions,
|
||||
project,
|
||||
}: GetQueryReturnParams): Parameter[] {
|
||||
let returnParams: Parameter[] = []
|
||||
|
||||
const parameterType = getReactQueryQueryParameterType(signatureReflection)
|
||||
|
||||
if (parameterType && hasResponseTypeArgument(parameterType)) {
|
||||
returnParams = getParams({
|
||||
signatureReflection,
|
||||
project,
|
||||
reflectionType: (parameterType.typeArguments![0] as ReferenceType)
|
||||
.typeArguments![0],
|
||||
reflectionTypeGetterOptions,
|
||||
})
|
||||
}
|
||||
|
||||
return returnParams
|
||||
}
|
||||
@@ -85,7 +85,10 @@ export function reflectionListFormatter({
|
||||
) {
|
||||
const children = hasChildren
|
||||
? reflection.children
|
||||
: getTypeChildren(reflection.type!, reflection.project)
|
||||
: getTypeChildren({
|
||||
reflectionType: reflection.type!,
|
||||
project: reflection.project,
|
||||
})
|
||||
const itemChildren: string[] = []
|
||||
let itemChildrenKind: ReflectionKind | null = null
|
||||
children?.forEach((childItem: DeclarationReflection) => {
|
||||
@@ -156,7 +159,11 @@ export function reflectionComponentFormatter({
|
||||
) {
|
||||
const children = hasChildren
|
||||
? reflection.children
|
||||
: getTypeChildren(reflection.type!, project || reflection.project)
|
||||
: getTypeChildren({
|
||||
reflectionType: reflection.type!,
|
||||
project: project || reflection.project,
|
||||
maxLevel,
|
||||
})
|
||||
|
||||
children
|
||||
?.filter((childItem: DeclarationReflection) =>
|
||||
|
||||
+10
@@ -10,6 +10,16 @@ export function replaceTemplateVariables(
|
||||
|
||||
return text
|
||||
.replaceAll("{{alias}}", reflection.getAlias())
|
||||
.replaceAll("{{alias-lower}}", reflection.getAlias().toLowerCase())
|
||||
.replaceAll("{{parent.alias}}", reflection.parent?.getAlias() || "")
|
||||
.replaceAll(
|
||||
"{{parent.alias-lower}}",
|
||||
reflection.parent?.getAlias().toLowerCase() || ""
|
||||
)
|
||||
.replaceAll(
|
||||
"{{parent.parent.alias}}",
|
||||
reflection.parent?.parent?.getAlias() || ""
|
||||
)
|
||||
.replaceAll("{{kind}}", getKindAsText(reflection.kind))
|
||||
}
|
||||
|
||||
|
||||
+134
-119
@@ -15,21 +15,25 @@ import {
|
||||
import { MarkdownTheme } from "../theme"
|
||||
import { getProjectChild, getType, getTypeChildren } from "utils"
|
||||
|
||||
type ReturnReflectionComponentFormatterParams = {
|
||||
export type GetReflectionTypeParametersParams = {
|
||||
reflectionType: SomeType
|
||||
project: ProjectReflection
|
||||
comment?: Comment
|
||||
level: number
|
||||
level?: number
|
||||
maxLevel?: number | undefined
|
||||
wrapObject?: boolean
|
||||
isReturn?: boolean
|
||||
}
|
||||
|
||||
export function returnReflectionComponentFormatter({
|
||||
export function getReflectionTypeParameters({
|
||||
reflectionType,
|
||||
project,
|
||||
comment,
|
||||
level = 1,
|
||||
maxLevel,
|
||||
}: ReturnReflectionComponentFormatterParams): Parameter[] {
|
||||
wrapObject = false,
|
||||
isReturn = true,
|
||||
}: GetReflectionTypeParametersParams): Parameter[] {
|
||||
const typeName = getType({
|
||||
reflectionType,
|
||||
collapse: "object",
|
||||
@@ -39,11 +43,6 @@ export function returnReflectionComponentFormatter({
|
||||
project,
|
||||
getRelativeUrlMethod: Handlebars.helpers.relativeURL,
|
||||
})
|
||||
// if (
|
||||
// typeName === "Record<string, unknown> \\| PaymentProcessorError"
|
||||
// ) {
|
||||
// console.log(reflectionType)
|
||||
// }
|
||||
const type = getType({
|
||||
reflectionType: reflectionType,
|
||||
collapse: "object",
|
||||
@@ -51,28 +50,39 @@ export function returnReflectionComponentFormatter({
|
||||
escape: true,
|
||||
getRelativeUrlMethod: Handlebars.helpers.relativeURL,
|
||||
})
|
||||
|
||||
const formatParameter = () => {
|
||||
return {
|
||||
name: "name" in reflectionType ? reflectionType.name : typeName,
|
||||
type,
|
||||
optional:
|
||||
"flags" in reflectionType
|
||||
? (reflectionType.flags as ReflectionFlags).isOptional
|
||||
: false,
|
||||
defaultValue:
|
||||
"declaration" in reflectionType
|
||||
? getDefaultValue(
|
||||
reflectionType.declaration as DeclarationReflection
|
||||
) || ""
|
||||
: "",
|
||||
description: comment
|
||||
? isReturn
|
||||
? getReturnComment(comment)
|
||||
: Handlebars.helpers.comment(comment.summary)
|
||||
: !comment && !isReturn
|
||||
? loadComment(typeName, project)
|
||||
: "",
|
||||
expandable: comment?.hasModifier(`@expandable`) || false,
|
||||
featureFlag: Handlebars.helpers.featureFlag(comment),
|
||||
children: [],
|
||||
}
|
||||
}
|
||||
|
||||
const componentItem: Parameter[] = []
|
||||
const canRetrieveChildren = level + 1 <= (maxLevel || MarkdownTheme.MAX_LEVEL)
|
||||
if (reflectionType.type === "reference") {
|
||||
if (reflectionType.typeArguments || reflectionType.refersToTypeParameter) {
|
||||
const parentKey = componentItem.push({
|
||||
name: "name" in reflectionType ? reflectionType.name : typeName,
|
||||
type,
|
||||
optional:
|
||||
"flags" in reflectionType
|
||||
? (reflectionType.flags as ReflectionFlags).isOptional
|
||||
: false,
|
||||
defaultValue:
|
||||
"declaration" in reflectionType
|
||||
? getDefaultValue(
|
||||
reflectionType.declaration as DeclarationReflection
|
||||
) || ""
|
||||
: "",
|
||||
description: comment ? getReturnComment(comment) : "",
|
||||
expandable: comment?.hasModifier(`@expandable`) || false,
|
||||
featureFlag: Handlebars.helpers.featureFlag(comment),
|
||||
children: [],
|
||||
})
|
||||
const parentKey = componentItem.push(formatParameter())
|
||||
const typeArgs = reflectionType.typeArguments
|
||||
? reflectionType.typeArguments
|
||||
: "typeParameters" in reflectionType
|
||||
@@ -89,7 +99,7 @@ export function returnReflectionComponentFormatter({
|
||||
if (!reflectionTypeArg) {
|
||||
return
|
||||
}
|
||||
const typeArgComponent = returnReflectionComponentFormatter({
|
||||
const typeArgComponent = getReflectionTypeParameters({
|
||||
reflectionType: reflectionTypeArg,
|
||||
project,
|
||||
level: level + 1,
|
||||
@@ -102,75 +112,53 @@ export function returnReflectionComponentFormatter({
|
||||
} else {
|
||||
const reflection = (reflectionType.reflection ||
|
||||
getProjectChild(project, reflectionType.name)) as DeclarationReflection
|
||||
const parentKey = wrapObject
|
||||
? componentItem.push(formatParameter())
|
||||
: undefined
|
||||
if (reflection) {
|
||||
const reflectionChildren = canRetrieveChildren
|
||||
? reflection.children ||
|
||||
getTypeChildren(reflectionType, project, level)
|
||||
getTypeChildren({
|
||||
reflectionType,
|
||||
project,
|
||||
level,
|
||||
maxLevel,
|
||||
})
|
||||
: undefined
|
||||
if (reflectionChildren?.length) {
|
||||
reflectionChildren.forEach((childItem) => {
|
||||
componentItem.push(
|
||||
reflectionComponentFormatter({
|
||||
reflection: childItem as DeclarationReflection,
|
||||
level,
|
||||
maxLevel,
|
||||
project,
|
||||
})
|
||||
)
|
||||
})
|
||||
} else {
|
||||
componentItem.push(
|
||||
reflectionComponentFormatter({
|
||||
reflection,
|
||||
const childParameter = reflectionComponentFormatter({
|
||||
reflection: childItem as DeclarationReflection,
|
||||
level,
|
||||
maxLevel,
|
||||
project,
|
||||
})
|
||||
)
|
||||
parentKey
|
||||
? componentItem[parentKey - 1].children?.push(childParameter)
|
||||
: componentItem.push(childParameter)
|
||||
})
|
||||
} else {
|
||||
const childParameter = reflectionComponentFormatter({
|
||||
reflection,
|
||||
level,
|
||||
maxLevel,
|
||||
project,
|
||||
})
|
||||
|
||||
parentKey
|
||||
? componentItem[parentKey - 1].children?.push(childParameter)
|
||||
: componentItem.push(childParameter)
|
||||
}
|
||||
} else {
|
||||
componentItem.push({
|
||||
name: "name" in reflectionType ? reflectionType.name : typeName,
|
||||
type,
|
||||
optional:
|
||||
"flags" in reflectionType
|
||||
? (reflectionType.flags as ReflectionFlags).isOptional
|
||||
: false,
|
||||
defaultValue:
|
||||
"declaration" in reflectionType
|
||||
? getDefaultValue(
|
||||
reflectionType.declaration as DeclarationReflection
|
||||
) || ""
|
||||
: "",
|
||||
description: comment ? getReturnComment(comment) : "",
|
||||
expandable: comment?.hasModifier(`@expandable`) || false,
|
||||
featureFlag: Handlebars.helpers.featureFlag(comment),
|
||||
children: [],
|
||||
})
|
||||
parentKey
|
||||
? componentItem[parentKey - 1].children?.push(formatParameter())
|
||||
: componentItem.push(formatParameter())
|
||||
}
|
||||
}
|
||||
} else if (reflectionType.type === "array") {
|
||||
const parentKey = componentItem.push({
|
||||
name:
|
||||
"name" in reflectionType ? (reflectionType.name as string) : typeName,
|
||||
type,
|
||||
optional:
|
||||
"flags" in reflectionType
|
||||
? (reflectionType.flags as ReflectionFlags).isOptional
|
||||
: false,
|
||||
defaultValue:
|
||||
"declaration" in reflectionType
|
||||
? getDefaultValue(
|
||||
reflectionType.declaration as DeclarationReflection
|
||||
) || ""
|
||||
: "",
|
||||
description: comment ? getReturnComment(comment) : "",
|
||||
expandable: comment?.hasModifier(`@expandable`) || false,
|
||||
featureFlag: Handlebars.helpers.featureFlag(comment),
|
||||
children: [],
|
||||
})
|
||||
const parentKey = componentItem.push(formatParameter())
|
||||
if (canRetrieveChildren) {
|
||||
const elementTypeItem = returnReflectionComponentFormatter({
|
||||
const elementTypeItem = getReflectionTypeParameters({
|
||||
reflectionType: reflectionType.elementType,
|
||||
project,
|
||||
level: level + 1,
|
||||
@@ -181,32 +169,19 @@ export function returnReflectionComponentFormatter({
|
||||
} else if (reflectionType.type === "tuple") {
|
||||
let pushTo: Parameter[] = []
|
||||
if (level === 1) {
|
||||
const parentKey = componentItem.push({
|
||||
name:
|
||||
"name" in reflectionType ? (reflectionType.name as string) : typeName,
|
||||
type,
|
||||
optional:
|
||||
"flags" in reflectionType
|
||||
? (reflectionType.flags as ReflectionFlags).isOptional
|
||||
: false,
|
||||
defaultValue:
|
||||
"declaration" in reflectionType
|
||||
? getDefaultValue(
|
||||
reflectionType.declaration as DeclarationReflection
|
||||
) || ""
|
||||
: "",
|
||||
description: comment ? getReturnComment(comment) : "",
|
||||
expandable: comment?.hasModifier(`@expandable`) || false,
|
||||
featureFlag: Handlebars.helpers.featureFlag(comment),
|
||||
children: [],
|
||||
})
|
||||
const parentKey = componentItem.push(formatParameter())
|
||||
pushTo = componentItem[parentKey - 1].children!
|
||||
} else {
|
||||
pushTo = componentItem
|
||||
const parentKey = wrapObject
|
||||
? componentItem.push(formatParameter())
|
||||
: undefined
|
||||
pushTo = parentKey
|
||||
? componentItem[parentKey - 1].children!
|
||||
: componentItem
|
||||
}
|
||||
if (canRetrieveChildren) {
|
||||
reflectionType.elements.forEach((element) => {
|
||||
const elementTypeItem = returnReflectionComponentFormatter({
|
||||
const elementTypeItem = getReflectionTypeParameters({
|
||||
reflectionType: element,
|
||||
project,
|
||||
level: level + 1,
|
||||
@@ -215,24 +190,47 @@ export function returnReflectionComponentFormatter({
|
||||
pushTo.push(...elementTypeItem)
|
||||
})
|
||||
}
|
||||
} else {
|
||||
// put type as the only component.
|
||||
componentItem.push({
|
||||
name: "name" in reflectionType ? reflectionType.name : typeName,
|
||||
type,
|
||||
optional:
|
||||
"flags" in reflectionType
|
||||
? (reflectionType.flags as ReflectionFlags).isOptional
|
||||
: true,
|
||||
defaultValue:
|
||||
"declaration" in reflectionType
|
||||
? getDefaultValue(reflectionType.declaration) || ""
|
||||
: "",
|
||||
description: comment ? getReturnComment(comment) : "",
|
||||
expandable: comment?.hasModifier(`@expandable`) || false,
|
||||
featureFlag: Handlebars.helpers.featureFlag(comment),
|
||||
children: [],
|
||||
} else if (reflectionType.type === "intersection") {
|
||||
const parentKey = wrapObject
|
||||
? componentItem.push(formatParameter())
|
||||
: undefined
|
||||
reflectionType.types.forEach((childType) => {
|
||||
const childParameter = getReflectionTypeParameters({
|
||||
reflectionType: childType,
|
||||
project,
|
||||
level: level + 1,
|
||||
maxLevel,
|
||||
})
|
||||
|
||||
parentKey
|
||||
? componentItem[parentKey - 1].children?.push(...childParameter)
|
||||
: componentItem.push(...childParameter)
|
||||
})
|
||||
} else if (reflectionType.type === "reflection") {
|
||||
const parentKey =
|
||||
type === "`object`" && typeName === "object"
|
||||
? undefined
|
||||
: componentItem.push(formatParameter())
|
||||
reflectionType.declaration.children?.forEach((childItem) => {
|
||||
const childParameter = reflectionComponentFormatter({
|
||||
reflection: childItem as DeclarationReflection,
|
||||
level,
|
||||
maxLevel,
|
||||
project,
|
||||
})
|
||||
|
||||
parentKey
|
||||
? componentItem[parentKey - 1].children?.push(childParameter)
|
||||
: componentItem.push(childParameter)
|
||||
})
|
||||
} else {
|
||||
const parentKey = wrapObject
|
||||
? componentItem.push(formatParameter())
|
||||
: undefined
|
||||
// put type as the only component.
|
||||
parentKey
|
||||
? componentItem[parentKey - 1].children?.push(formatParameter())
|
||||
: componentItem.push(formatParameter())
|
||||
}
|
||||
|
||||
return componentItem
|
||||
@@ -249,6 +247,23 @@ export function getReturnComment(comment: Comment): string {
|
||||
.join("\n\n")
|
||||
}
|
||||
|
||||
export function loadComment(
|
||||
reflectionTypeName: string,
|
||||
project: ProjectReflection
|
||||
): string {
|
||||
// try to load reflection from project
|
||||
const reflection = getProjectChild(project, reflectionTypeName)
|
||||
if (reflection) {
|
||||
return (
|
||||
reflection.comment?.summary
|
||||
.map((summaryPart) => summaryPart.text)
|
||||
.join("\n\n") || ""
|
||||
)
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
export function isOnlyVoid(reflectionTypes: SomeType[]) {
|
||||
return reflectionTypes.every(
|
||||
(type) => type.type === "intrinsic" && type.name === "void"
|
||||
+27
@@ -50,9 +50,13 @@ export type FormattingOptionType = {
|
||||
reflectionGroups?: {
|
||||
[k: string]: boolean
|
||||
}
|
||||
reflectionCategories?: {
|
||||
[k: string]: boolean
|
||||
}
|
||||
reflectionTitle?: {
|
||||
kind: boolean
|
||||
typeParameters: boolean
|
||||
prefix?: string
|
||||
suffix?: string
|
||||
fullReplacement?: string
|
||||
}
|
||||
@@ -66,6 +70,7 @@ export type FormattingOptionType = {
|
||||
parameterComponentExtraProps?: Record<string, unknown>
|
||||
mdxImports?: string[]
|
||||
maxLevel?: number
|
||||
fileNameSeparator?: string
|
||||
}
|
||||
|
||||
export declare module "typedoc" {
|
||||
@@ -178,5 +183,27 @@ export declare module "typedoc" {
|
||||
* @defaultValue true
|
||||
*/
|
||||
outputModules: boolean
|
||||
/**
|
||||
* Whether to enable category to namespace conversion.
|
||||
* @defaultValue false
|
||||
*/
|
||||
generateNamespaces: boolean
|
||||
/**
|
||||
* Optionally specify a parent namespace to place all generated namespaces in.
|
||||
*/
|
||||
parentNamespace: string
|
||||
/**
|
||||
* Optionally specify a name prefix for all generated namespaces.
|
||||
*/
|
||||
namePrefix: string
|
||||
/**
|
||||
* Whether to enable the React Query manipulator.
|
||||
* @defaultValue false
|
||||
*/
|
||||
enableReactQueryManipulator: boolean
|
||||
/**
|
||||
* Namespace names whose child members should have their own documents.
|
||||
*/
|
||||
allReflectionsHaveOwnDocumentInNamespace: string[]
|
||||
}
|
||||
}
|
||||
@@ -1,23 +1,37 @@
|
||||
/* eslint-disable no-case-declarations */
|
||||
import { DeclarationReflection, ProjectReflection, SomeType } from "typedoc"
|
||||
import { getProjectChild } from "./get-project-child"
|
||||
|
||||
const MAX_LEVEL = 3
|
||||
type GetTypeChildrenOptions = {
|
||||
reflectionType: SomeType
|
||||
project: ProjectReflection | undefined
|
||||
level?: number
|
||||
maxLevel?: number
|
||||
}
|
||||
|
||||
export function getTypeChildren(
|
||||
reflectionType: SomeType,
|
||||
project: ProjectReflection | undefined,
|
||||
level = 1
|
||||
): DeclarationReflection[] {
|
||||
export function getTypeChildren({
|
||||
reflectionType,
|
||||
project,
|
||||
level = 1,
|
||||
maxLevel = 3,
|
||||
}: GetTypeChildrenOptions): DeclarationReflection[] {
|
||||
let children: DeclarationReflection[] = []
|
||||
|
||||
if (level > MAX_LEVEL) {
|
||||
if (level > maxLevel) {
|
||||
return children
|
||||
}
|
||||
|
||||
switch (reflectionType.type) {
|
||||
case "intersection":
|
||||
reflectionType.types.forEach((intersectionType) => {
|
||||
children.push(...getTypeChildren(intersectionType, project, level + 1))
|
||||
children.push(
|
||||
...getTypeChildren({
|
||||
reflectionType: intersectionType,
|
||||
project,
|
||||
level: level + 1,
|
||||
maxLevel,
|
||||
})
|
||||
)
|
||||
})
|
||||
break
|
||||
case "reference":
|
||||
@@ -36,13 +50,16 @@ export function getTypeChildren(
|
||||
if (referencedReflection.children) {
|
||||
children = referencedReflection.children
|
||||
} else if (referencedReflection.type) {
|
||||
children = getTypeChildren(
|
||||
referencedReflection.type,
|
||||
children = getTypeChildren({
|
||||
reflectionType: referencedReflection.type,
|
||||
project,
|
||||
level + 1
|
||||
)
|
||||
level: level + 1,
|
||||
maxLevel,
|
||||
})
|
||||
}
|
||||
} else if (reflectionType.typeArguments?.length) {
|
||||
// Only useful if the reflection type is `Pick<...>`.
|
||||
const toKeepChildren: string[] = []
|
||||
reflectionType.typeArguments.forEach((typeArgument, index) => {
|
||||
if (reflectionType.name === "Omit" && index > 0) {
|
||||
switch (typeArgument.type) {
|
||||
@@ -54,23 +71,69 @@ export function getTypeChildren(
|
||||
if (childItem.type === "literal") {
|
||||
removeChild(childItem.value?.toString(), children)
|
||||
} else {
|
||||
getTypeChildren(childItem, project, level + 1).forEach(
|
||||
(child) => {
|
||||
removeChild(child.name, children)
|
||||
}
|
||||
)
|
||||
getTypeChildren({
|
||||
reflectionType: childItem,
|
||||
project,
|
||||
level: level + 1,
|
||||
maxLevel,
|
||||
}).forEach((child) => {
|
||||
removeChild(child.name, children)
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
} else if (reflectionType.name === "Pick") {
|
||||
if (index === 0 && !children.length) {
|
||||
children = getTypeChildren({
|
||||
reflectionType: typeArgument,
|
||||
project,
|
||||
level: level + 1,
|
||||
maxLevel,
|
||||
})
|
||||
} else {
|
||||
switch (typeArgument.type) {
|
||||
case "literal":
|
||||
if (typeArgument.value) {
|
||||
toKeepChildren.push(typeArgument.value?.toString())
|
||||
}
|
||||
break
|
||||
case "union":
|
||||
typeArgument.types.forEach((childItem) => {
|
||||
if (childItem.type === "literal") {
|
||||
if (childItem.value) {
|
||||
toKeepChildren.push(childItem.value?.toString())
|
||||
}
|
||||
} else {
|
||||
getTypeChildren({
|
||||
reflectionType: childItem,
|
||||
project,
|
||||
level: level + 1,
|
||||
maxLevel,
|
||||
}).forEach((child) => {
|
||||
if (child.name) {
|
||||
toKeepChildren.push(child.name)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const typeArgumentChildren = getTypeChildren(
|
||||
typeArgument,
|
||||
const typeArgumentChildren = getTypeChildren({
|
||||
reflectionType: typeArgument,
|
||||
project,
|
||||
level + 1
|
||||
)
|
||||
level: level + 1,
|
||||
maxLevel,
|
||||
})
|
||||
children.push(...typeArgumentChildren)
|
||||
}
|
||||
})
|
||||
|
||||
if (toKeepChildren.length) {
|
||||
children = children.filter((child) =>
|
||||
toKeepChildren.includes(child.name)
|
||||
)
|
||||
}
|
||||
}
|
||||
break
|
||||
case "reflection":
|
||||
@@ -79,7 +142,12 @@ export function getTypeChildren(
|
||||
]
|
||||
break
|
||||
case "array":
|
||||
children = getTypeChildren(reflectionType.elementType, project, level + 1)
|
||||
children = getTypeChildren({
|
||||
reflectionType: reflectionType.elementType,
|
||||
project,
|
||||
level: level + 1,
|
||||
maxLevel,
|
||||
})
|
||||
}
|
||||
|
||||
return filterChildren(children)
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
+6097
-5045
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
+27513
-24779
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user