Add comprehensive development roadmap via GitHub Issues
Created 10 detailed GitHub issues covering: - Project activation and management UI (#1-2) - Worker node coordination and visualization (#3-4) - Automated GitHub repository scanning (#5) - Intelligent model-to-issue matching (#6) - Multi-model task execution system (#7) - N8N workflow integration (#8) - Hive-Bzzz P2P bridge (#9) - Peer assistance protocol (#10) Each issue includes detailed specifications, acceptance criteria, technical implementation notes, and dependency mapping. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
14
frontend/node_modules/react-docgen/dist/utils/docblock.d.ts
generated
vendored
Normal file
14
frontend/node_modules/react-docgen/dist/utils/docblock.d.ts
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Helper functions to work with docblock comments.
|
||||
*/
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* Given a path, this function returns the closest preceding docblock if it
|
||||
* exists.
|
||||
*/
|
||||
export declare function getDocblock(path: NodePath, trailing?: boolean): string | null;
|
||||
/**
|
||||
* Given a string, this functions returns an object with doclet names as keys
|
||||
* and their "content" as values.
|
||||
*/
|
||||
export declare function getDoclets(str: string): Record<string, string>;
|
||||
39
frontend/node_modules/react-docgen/dist/utils/docblock.js
generated
vendored
Normal file
39
frontend/node_modules/react-docgen/dist/utils/docblock.js
generated
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
/**
|
||||
* Helper functions to work with docblock comments.
|
||||
*/
|
||||
const DOCLET_PATTERN = /^@(\w+)(?:$|\s((?:[^](?!^@\w))*))/gim;
|
||||
function parseDocblock(str) {
|
||||
// Does not use \s in the regex as this would match also \n and conflicts
|
||||
// with windows line endings.
|
||||
return str.replace(/^[ \t]*\*[ \t]?/gm, '').trim();
|
||||
}
|
||||
const DOCBLOCK_HEADER = /^\*\s/;
|
||||
/**
|
||||
* Given a path, this function returns the closest preceding docblock if it
|
||||
* exists.
|
||||
*/
|
||||
export function getDocblock(path, trailing = false) {
|
||||
let comments = [];
|
||||
if (trailing && path.node.trailingComments) {
|
||||
comments = path.node.trailingComments.filter((comment) => comment.type === 'CommentBlock' && DOCBLOCK_HEADER.test(comment.value));
|
||||
}
|
||||
else if (path.node.leadingComments) {
|
||||
comments = path.node.leadingComments.filter((comment) => comment.type === 'CommentBlock' && DOCBLOCK_HEADER.test(comment.value));
|
||||
}
|
||||
if (comments.length > 0) {
|
||||
return parseDocblock(comments[comments.length - 1].value);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Given a string, this functions returns an object with doclet names as keys
|
||||
* and their "content" as values.
|
||||
*/
|
||||
export function getDoclets(str) {
|
||||
const doclets = Object.create(null);
|
||||
let match;
|
||||
while ((match = DOCLET_PATTERN.exec(str))) {
|
||||
doclets[match[1]] = match[2] || true;
|
||||
}
|
||||
return doclets;
|
||||
}
|
||||
12
frontend/node_modules/react-docgen/dist/utils/expressionTo.d.ts
generated
vendored
Normal file
12
frontend/node_modules/react-docgen/dist/utils/expressionTo.d.ts
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { Node } from '@babel/types';
|
||||
/**
|
||||
* Splits a MemberExpression or CallExpression into parts.
|
||||
* E.g. foo.bar.baz becomes ['foo', 'bar', 'baz']
|
||||
*/
|
||||
declare function toArray(path: NodePath<Node | null>): string[];
|
||||
/**
|
||||
* Creates a string representation of a member expression.
|
||||
*/
|
||||
declare function toString(path: NodePath<Node | null>): string;
|
||||
export { toString as String, toArray as Array };
|
||||
96
frontend/node_modules/react-docgen/dist/utils/expressionTo.js
generated
vendored
Normal file
96
frontend/node_modules/react-docgen/dist/utils/expressionTo.js
generated
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
/*eslint no-loop-func: 0, no-use-before-define: 0*/
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
/**
|
||||
* Splits a MemberExpression or CallExpression into parts.
|
||||
* E.g. foo.bar.baz becomes ['foo', 'bar', 'baz']
|
||||
*/
|
||||
function toArray(path) {
|
||||
const parts = [path];
|
||||
let result = [];
|
||||
while (parts.length > 0) {
|
||||
path = parts.shift();
|
||||
if (path.isCallExpression()) {
|
||||
parts.push(path.get('callee'));
|
||||
continue;
|
||||
}
|
||||
else if (path.isMemberExpression()) {
|
||||
parts.push(path.get('object'));
|
||||
const property = path.get('property');
|
||||
if (path.node.computed) {
|
||||
const resolvedPath = resolveToValue(property);
|
||||
if (resolvedPath !== undefined) {
|
||||
result = result.concat(toArray(resolvedPath));
|
||||
}
|
||||
else {
|
||||
result.push('<computed>');
|
||||
}
|
||||
}
|
||||
else if (property.isIdentifier()) {
|
||||
result.push(property.node.name);
|
||||
}
|
||||
else if (property.isPrivateName()) {
|
||||
// new test
|
||||
result.push(`#${property.get('id').node.name}`);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if (path.isIdentifier()) {
|
||||
result.push(path.node.name);
|
||||
continue;
|
||||
}
|
||||
else if (path.isTSAsExpression()) {
|
||||
const expression = path.get('expression');
|
||||
if (expression.isIdentifier()) {
|
||||
result.push(expression.node.name);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if (path.isLiteral() && path.node.extra?.raw) {
|
||||
result.push(path.node.extra.raw);
|
||||
continue;
|
||||
}
|
||||
else if (path.isThisExpression()) {
|
||||
result.push('this');
|
||||
continue;
|
||||
}
|
||||
else if (path.isObjectExpression()) {
|
||||
const properties = path.get('properties').map(function (property) {
|
||||
if (property.isSpreadElement()) {
|
||||
return `...${toString(property.get('argument'))}`;
|
||||
}
|
||||
else if (property.isObjectProperty()) {
|
||||
return (toString(property.get('key')) +
|
||||
': ' +
|
||||
toString(property.get('value')));
|
||||
}
|
||||
else if (property.isObjectMethod()) {
|
||||
return toString(property.get('key')) + ': <function>';
|
||||
}
|
||||
else {
|
||||
throw new Error('Unrecognized object property type');
|
||||
}
|
||||
});
|
||||
result.push('{' + properties.join(', ') + '}');
|
||||
continue;
|
||||
}
|
||||
else if (path.isArrayExpression()) {
|
||||
result.push('[' +
|
||||
path
|
||||
.get('elements')
|
||||
.map(function (el) {
|
||||
return toString(el);
|
||||
})
|
||||
.join(', ') +
|
||||
']');
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return result.reverse();
|
||||
}
|
||||
/**
|
||||
* Creates a string representation of a member expression.
|
||||
*/
|
||||
function toString(path) {
|
||||
return toArray(path).join('.');
|
||||
}
|
||||
export { toString as String, toArray as Array };
|
||||
3
frontend/node_modules/react-docgen/dist/utils/findComponentDefinition.d.ts
generated
vendored
Normal file
3
frontend/node_modules/react-docgen/dist/utils/findComponentDefinition.d.ts
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { ComponentNode } from '../resolver/index.js';
|
||||
export default function findComponentDefinition(path: NodePath): NodePath<ComponentNode> | null;
|
||||
41
frontend/node_modules/react-docgen/dist/utils/findComponentDefinition.js
generated
vendored
Normal file
41
frontend/node_modules/react-docgen/dist/utils/findComponentDefinition.js
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
import isReactComponentClass from './isReactComponentClass.js';
|
||||
import isReactCreateClassCall from './isReactCreateClassCall.js';
|
||||
import isReactForwardRefCall from './isReactForwardRefCall.js';
|
||||
import isStatelessComponent from './isStatelessComponent.js';
|
||||
import normalizeClassDefinition from './normalizeClassDefinition.js';
|
||||
import resolveHOC from './resolveHOC.js';
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
function isComponentDefinition(path) {
|
||||
return (isReactCreateClassCall(path) ||
|
||||
isReactComponentClass(path) ||
|
||||
isStatelessComponent(path) ||
|
||||
isReactForwardRefCall(path));
|
||||
}
|
||||
function resolveComponentDefinition(definition) {
|
||||
if (isReactCreateClassCall(definition)) {
|
||||
// return argument
|
||||
const resolvedPath = resolveToValue(definition.get('arguments')[0]);
|
||||
if (resolvedPath.isObjectExpression()) {
|
||||
return resolvedPath;
|
||||
}
|
||||
}
|
||||
else if (isReactComponentClass(definition)) {
|
||||
normalizeClassDefinition(definition);
|
||||
return definition;
|
||||
}
|
||||
else if (isStatelessComponent(definition) ||
|
||||
isReactForwardRefCall(definition)) {
|
||||
return definition;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
export default function findComponentDefinition(path) {
|
||||
let resolvedPath = path;
|
||||
if (!isComponentDefinition(resolvedPath)) {
|
||||
resolvedPath = resolveToValue(resolveHOC(resolvedPath));
|
||||
if (!isComponentDefinition(resolvedPath)) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return resolveComponentDefinition(resolvedPath);
|
||||
}
|
||||
11
frontend/node_modules/react-docgen/dist/utils/findFunctionReturn.d.ts
generated
vendored
Normal file
11
frontend/node_modules/react-docgen/dist/utils/findFunctionReturn.d.ts
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
type Predicate<T extends NodePath> = (path: NodePath) => path is T;
|
||||
/**
|
||||
* This can be used in two ways
|
||||
* 1. Find the first return path that passes the predicate function
|
||||
* (for example to check if a function is returning something)
|
||||
* 2. Find all occurrences of return values
|
||||
* For this the predicate acts more like a collector and always needs to return false
|
||||
*/
|
||||
export default function findFunctionReturn<T extends NodePath = NodePath>(path: NodePath, predicate: Predicate<T>): T | undefined;
|
||||
export {};
|
||||
102
frontend/node_modules/react-docgen/dist/utils/findFunctionReturn.js
generated
vendored
Normal file
102
frontend/node_modules/react-docgen/dist/utils/findFunctionReturn.js
generated
vendored
Normal file
@@ -0,0 +1,102 @@
|
||||
import { visitors } from '@babel/traverse';
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
import { ignore } from './traverse.js';
|
||||
const explodedVisitors = visitors.explode({
|
||||
Function: { enter: ignore },
|
||||
Class: { enter: ignore },
|
||||
ObjectExpression: { enter: ignore },
|
||||
ReturnStatement: {
|
||||
enter: function (path, state) {
|
||||
const argument = path.get('argument');
|
||||
if (argument.hasNode()) {
|
||||
const resolvedPath = resolvesToFinalValue(argument, state.predicate, state.seen);
|
||||
if (resolvedPath) {
|
||||
state.resolvedReturnPath = resolvedPath;
|
||||
path.stop();
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
function resolvesToFinalValue(path, predicate, seen) {
|
||||
// avoid returns with recursive function calls
|
||||
if (seen.has(path)) {
|
||||
return;
|
||||
}
|
||||
seen.add(path);
|
||||
// Is the path already passes then return it.
|
||||
if (predicate(path)) {
|
||||
return path;
|
||||
}
|
||||
const resolvedPath = resolveToValue(path);
|
||||
// If the resolved path is already passing then no need to further check
|
||||
// Only do this if the resolvedPath actually resolved something as otherwise we did this check already
|
||||
if (resolvedPath.node !== path.node && predicate(resolvedPath)) {
|
||||
return resolvedPath;
|
||||
}
|
||||
// If the path points to a conditional expression, then we need to look only at
|
||||
// the two possible paths
|
||||
if (resolvedPath.isConditionalExpression()) {
|
||||
return (resolvesToFinalValue(resolvedPath.get('consequent'), predicate, seen) ||
|
||||
resolvesToFinalValue(resolvedPath.get('alternate'), predicate, seen));
|
||||
}
|
||||
// If the path points to a logical expression (AND, OR, ...), then we need to look only at
|
||||
// the two possible paths
|
||||
if (resolvedPath.isLogicalExpression()) {
|
||||
return (resolvesToFinalValue(resolvedPath.get('left'), predicate, seen) ||
|
||||
resolvesToFinalValue(resolvedPath.get('right'), predicate, seen));
|
||||
}
|
||||
// If we have a call expression, lets try to follow it
|
||||
if (resolvedPath.isCallExpression()) {
|
||||
const returnValue = findFunctionReturnWithCache(resolveToValue(resolvedPath.get('callee')), predicate, seen);
|
||||
if (returnValue) {
|
||||
return returnValue;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
/**
|
||||
* This can be used in two ways
|
||||
* 1. Find the first return path that passes the predicate function
|
||||
* (for example to check if a function is returning something)
|
||||
* 2. Find all occurrences of return values
|
||||
* For this the predicate acts more like a collector and always needs to return false
|
||||
*/
|
||||
function findFunctionReturnWithCache(path, predicate, seen) {
|
||||
let functionPath = path;
|
||||
if (functionPath.isObjectProperty()) {
|
||||
functionPath = functionPath.get('value');
|
||||
}
|
||||
else if (functionPath.isClassProperty()) {
|
||||
const classPropertyValue = functionPath.get('value');
|
||||
if (classPropertyValue.hasNode()) {
|
||||
functionPath = classPropertyValue;
|
||||
}
|
||||
}
|
||||
if (!functionPath.isFunction()) {
|
||||
return;
|
||||
}
|
||||
// skip traversing for ArrowFunctionExpressions with no block
|
||||
if (path.isArrowFunctionExpression()) {
|
||||
const body = path.get('body');
|
||||
if (!body.isBlockStatement()) {
|
||||
return resolvesToFinalValue(body, predicate, seen);
|
||||
}
|
||||
}
|
||||
const state = {
|
||||
predicate,
|
||||
seen,
|
||||
};
|
||||
path.traverse(explodedVisitors, state);
|
||||
return state.resolvedReturnPath;
|
||||
}
|
||||
/**
|
||||
* This can be used in two ways
|
||||
* 1. Find the first return path that passes the predicate function
|
||||
* (for example to check if a function is returning something)
|
||||
* 2. Find all occurrences of return values
|
||||
* For this the predicate acts more like a collector and always needs to return false
|
||||
*/
|
||||
export default function findFunctionReturn(path, predicate) {
|
||||
return findFunctionReturnWithCache(path, predicate, new WeakSet());
|
||||
}
|
||||
13
frontend/node_modules/react-docgen/dist/utils/flowUtilityTypes.d.ts
generated
vendored
Normal file
13
frontend/node_modules/react-docgen/dist/utils/flowUtilityTypes.d.ts
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { GenericTypeAnnotation } from '@babel/types';
|
||||
/**
|
||||
* See `supportedUtilityTypes` for which types are supported and
|
||||
* https://flow.org/en/docs/types/utilities/ for which types are available.
|
||||
*/
|
||||
export declare function isSupportedUtilityType(path: NodePath): path is NodePath<GenericTypeAnnotation>;
|
||||
/**
|
||||
* Unwraps well known utility types. For example:
|
||||
*
|
||||
* $ReadOnly<T> => T
|
||||
*/
|
||||
export declare function unwrapUtilityType(path: NodePath): NodePath;
|
||||
32
frontend/node_modules/react-docgen/dist/utils/flowUtilityTypes.js
generated
vendored
Normal file
32
frontend/node_modules/react-docgen/dist/utils/flowUtilityTypes.js
generated
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* See `supportedUtilityTypes` for which types are supported and
|
||||
* https://flow.org/en/docs/types/utilities/ for which types are available.
|
||||
*/
|
||||
export function isSupportedUtilityType(path) {
|
||||
if (path.isGenericTypeAnnotation()) {
|
||||
const idPath = path.get('id');
|
||||
if (idPath.isIdentifier()) {
|
||||
const name = idPath.node.name;
|
||||
return name === '$Exact' || name === '$ReadOnly';
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Unwraps well known utility types. For example:
|
||||
*
|
||||
* $ReadOnly<T> => T
|
||||
*/
|
||||
export function unwrapUtilityType(path) {
|
||||
let resultPath = path;
|
||||
while (isSupportedUtilityType(resultPath)) {
|
||||
const typeParameters = resultPath.get('typeParameters');
|
||||
if (!typeParameters.hasNode())
|
||||
break;
|
||||
const firstParam = typeParameters.get('params')[0];
|
||||
if (!firstParam)
|
||||
break;
|
||||
resultPath = firstParam;
|
||||
}
|
||||
return resultPath;
|
||||
}
|
||||
3
frontend/node_modules/react-docgen/dist/utils/getClassMemberValuePath.d.ts
generated
vendored
Normal file
3
frontend/node_modules/react-docgen/dist/utils/getClassMemberValuePath.d.ts
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { ClassDeclaration, ClassExpression, ClassMethod, Expression } from '@babel/types';
|
||||
export default function getClassMemberValuePath(classDefinition: NodePath<ClassDeclaration | ClassExpression>, memberName: string): NodePath<ClassMethod | Expression> | null;
|
||||
23
frontend/node_modules/react-docgen/dist/utils/getClassMemberValuePath.js
generated
vendored
Normal file
23
frontend/node_modules/react-docgen/dist/utils/getClassMemberValuePath.js
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
import getNameOrValue from './getNameOrValue.js';
|
||||
export default function getClassMemberValuePath(classDefinition, memberName) {
|
||||
const classMember = classDefinition
|
||||
.get('body')
|
||||
.get('body')
|
||||
.find((memberPath) => {
|
||||
if ((memberPath.isClassMethod() && memberPath.node.kind !== 'set') ||
|
||||
memberPath.isClassProperty()) {
|
||||
const key = memberPath.get('key');
|
||||
return ((!memberPath.node.computed || key.isLiteral()) &&
|
||||
getNameOrValue(key) === memberName);
|
||||
}
|
||||
return false;
|
||||
});
|
||||
if (classMember) {
|
||||
// For ClassProperty we return the value and for ClassMethod
|
||||
// we return itself
|
||||
return classMember.isClassMethod()
|
||||
? classMember
|
||||
: classMember.get('value');
|
||||
}
|
||||
return null;
|
||||
}
|
||||
12
frontend/node_modules/react-docgen/dist/utils/getFlowType.d.ts
generated
vendored
Normal file
12
frontend/node_modules/react-docgen/dist/utils/getFlowType.d.ts
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
import type { TypeParameters } from '../utils/getTypeParameters.js';
|
||||
import type { TypeDescriptor } from '../Documentation.js';
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { FlowType } from '@babel/types';
|
||||
/**
|
||||
* Tries to identify the flow type by inspecting the path for known
|
||||
* flow type names. This method doesn't check whether the found type is actually
|
||||
* existing. It simply assumes that a match is always valid.
|
||||
*
|
||||
* If there is no match, "unknown" is returned.
|
||||
*/
|
||||
export default function getFlowType(path: NodePath<FlowType>, typeParams?: TypeParameters | null): TypeDescriptor;
|
||||
343
frontend/node_modules/react-docgen/dist/utils/getFlowType.js
generated
vendored
Normal file
343
frontend/node_modules/react-docgen/dist/utils/getFlowType.js
generated
vendored
Normal file
@@ -0,0 +1,343 @@
|
||||
import getPropertyName from './getPropertyName.js';
|
||||
import printValue from './printValue.js';
|
||||
import getTypeAnnotation from '../utils/getTypeAnnotation.js';
|
||||
import resolveToValue from '../utils/resolveToValue.js';
|
||||
import { resolveObjectToNameArray } from '../utils/resolveObjectKeysToArray.js';
|
||||
import getTypeParameters from '../utils/getTypeParameters.js';
|
||||
import { getDocblock } from './docblock.js';
|
||||
const flowTypes = {
|
||||
AnyTypeAnnotation: 'any',
|
||||
BooleanTypeAnnotation: 'boolean',
|
||||
MixedTypeAnnotation: 'mixed',
|
||||
NullLiteralTypeAnnotation: 'null',
|
||||
NumberTypeAnnotation: 'number',
|
||||
StringTypeAnnotation: 'string',
|
||||
VoidTypeAnnotation: 'void',
|
||||
EmptyTypeAnnotation: 'empty',
|
||||
};
|
||||
const flowLiteralTypes = {
|
||||
BooleanLiteralTypeAnnotation: 1,
|
||||
NumberLiteralTypeAnnotation: 1,
|
||||
StringLiteralTypeAnnotation: 1,
|
||||
};
|
||||
const namedTypes = {
|
||||
ArrayTypeAnnotation: handleArrayTypeAnnotation,
|
||||
GenericTypeAnnotation: handleGenericTypeAnnotation,
|
||||
ObjectTypeAnnotation: handleObjectTypeAnnotation,
|
||||
InterfaceDeclaration: handleInterfaceDeclaration,
|
||||
UnionTypeAnnotation: handleUnionTypeAnnotation,
|
||||
NullableTypeAnnotation: handleNullableTypeAnnotation,
|
||||
FunctionTypeAnnotation: handleFunctionTypeAnnotation,
|
||||
IntersectionTypeAnnotation: handleIntersectionTypeAnnotation,
|
||||
TupleTypeAnnotation: handleTupleTypeAnnotation,
|
||||
TypeofTypeAnnotation: handleTypeofTypeAnnotation,
|
||||
IndexedAccessType: handleIndexedAccessType,
|
||||
};
|
||||
function getFlowTypeWithRequirements(path, typeParams) {
|
||||
const type = getFlowTypeWithResolvedTypes(path, typeParams);
|
||||
type.required =
|
||||
'optional' in path.parentPath.node ? !path.parentPath.node.optional : true;
|
||||
return type;
|
||||
}
|
||||
function handleKeysHelper(path) {
|
||||
const typeParams = path.get('typeParameters');
|
||||
if (!typeParams.hasNode()) {
|
||||
return null;
|
||||
}
|
||||
let value = typeParams.get('params')[0];
|
||||
if (!value) {
|
||||
return null;
|
||||
}
|
||||
if (value.isTypeofTypeAnnotation()) {
|
||||
value = value.get('argument').get('id');
|
||||
}
|
||||
else if (!value.isObjectTypeAnnotation()) {
|
||||
value = value.get('id');
|
||||
}
|
||||
const resolvedPath = value.hasNode() ? resolveToValue(value) : value;
|
||||
if (resolvedPath.isObjectExpression() ||
|
||||
resolvedPath.isObjectTypeAnnotation()) {
|
||||
const keys = resolveObjectToNameArray(resolvedPath, true);
|
||||
if (keys) {
|
||||
return {
|
||||
name: 'union',
|
||||
raw: printValue(path),
|
||||
elements: keys.map((key) => ({ name: 'literal', value: key })),
|
||||
};
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function handleArrayTypeAnnotation(path, typeParams) {
|
||||
return {
|
||||
name: 'Array',
|
||||
elements: [
|
||||
getFlowTypeWithResolvedTypes(path.get('elementType'), typeParams),
|
||||
],
|
||||
raw: printValue(path),
|
||||
};
|
||||
}
|
||||
function handleGenericTypeAnnotation(path, typeParams) {
|
||||
const id = path.get('id');
|
||||
const typeParameters = path.get('typeParameters');
|
||||
if (id.isIdentifier({ name: '$Keys' }) && typeParameters.hasNode()) {
|
||||
return handleKeysHelper(path);
|
||||
}
|
||||
let type;
|
||||
if (id.isQualifiedTypeIdentifier()) {
|
||||
const qualification = id.get('qualification');
|
||||
if (qualification.isIdentifier({ name: 'React' })) {
|
||||
type = {
|
||||
name: `${qualification.node.name}${id.node.id.name}`,
|
||||
raw: printValue(id),
|
||||
};
|
||||
}
|
||||
else {
|
||||
type = { name: printValue(id).replace(/<.*>$/, '') };
|
||||
}
|
||||
}
|
||||
else {
|
||||
type = { name: id.node.name };
|
||||
}
|
||||
const resolvedPath = (typeParams && typeParams[type.name]) || resolveToValue(path.get('id'));
|
||||
if (typeParameters.hasNode() && resolvedPath.has('typeParameters')) {
|
||||
typeParams = getTypeParameters(resolvedPath.get('typeParameters'), typeParameters, typeParams);
|
||||
}
|
||||
if (typeParams &&
|
||||
typeParams[type.name] &&
|
||||
typeParams[type.name].isGenericTypeAnnotation()) {
|
||||
return type;
|
||||
}
|
||||
if (typeParams && typeParams[type.name]) {
|
||||
type = getFlowTypeWithResolvedTypes(resolvedPath, typeParams);
|
||||
}
|
||||
if (resolvedPath && resolvedPath.has('right')) {
|
||||
type = getFlowTypeWithResolvedTypes(resolvedPath.get('right'), typeParams);
|
||||
}
|
||||
else if (typeParameters.hasNode()) {
|
||||
const params = typeParameters.get('params');
|
||||
type = {
|
||||
...type,
|
||||
elements: params.map((param) => getFlowTypeWithResolvedTypes(param, typeParams)),
|
||||
raw: printValue(path),
|
||||
};
|
||||
}
|
||||
return type;
|
||||
}
|
||||
function handleObjectTypeAnnotation(path, typeParams) {
|
||||
const type = {
|
||||
name: 'signature',
|
||||
type: 'object',
|
||||
raw: printValue(path),
|
||||
signature: { properties: [] },
|
||||
};
|
||||
const callProperties = path.get('callProperties');
|
||||
if (Array.isArray(callProperties)) {
|
||||
callProperties.forEach((param) => {
|
||||
type.signature.constructor = getFlowTypeWithResolvedTypes(param.get('value'), typeParams);
|
||||
});
|
||||
}
|
||||
const indexers = path.get('indexers');
|
||||
if (Array.isArray(indexers)) {
|
||||
indexers.forEach((param) => {
|
||||
const typeDescriptor = {
|
||||
key: getFlowTypeWithResolvedTypes(param.get('key'), typeParams),
|
||||
value: getFlowTypeWithRequirements(param.get('value'), typeParams),
|
||||
};
|
||||
const docblock = getDocblock(param);
|
||||
if (docblock) {
|
||||
typeDescriptor.description = docblock;
|
||||
}
|
||||
type.signature.properties.push(typeDescriptor);
|
||||
});
|
||||
}
|
||||
path.get('properties').forEach((param) => {
|
||||
if (param.isObjectTypeProperty()) {
|
||||
const typeDescriptor = {
|
||||
// For ObjectTypeProperties `getPropertyName` always returns string
|
||||
key: getPropertyName(param),
|
||||
value: getFlowTypeWithRequirements(param.get('value'), typeParams),
|
||||
};
|
||||
const docblock = getDocblock(param);
|
||||
if (docblock) {
|
||||
typeDescriptor.description = docblock;
|
||||
}
|
||||
type.signature.properties.push(typeDescriptor);
|
||||
}
|
||||
else if (param.isObjectTypeSpreadProperty()) {
|
||||
let spreadObject = resolveToValue(param.get('argument'));
|
||||
if (spreadObject.isGenericTypeAnnotation()) {
|
||||
const typeAlias = resolveToValue(spreadObject.get('id'));
|
||||
if (typeAlias.isTypeAlias() &&
|
||||
typeAlias.get('right').isObjectTypeAnnotation()) {
|
||||
spreadObject = resolveToValue(typeAlias.get('right'));
|
||||
}
|
||||
}
|
||||
if (spreadObject.isObjectTypeAnnotation()) {
|
||||
const props = handleObjectTypeAnnotation(spreadObject, typeParams);
|
||||
type.signature.properties.push(...props.signature.properties);
|
||||
}
|
||||
}
|
||||
});
|
||||
return type;
|
||||
}
|
||||
function handleInterfaceDeclaration(path) {
|
||||
// Interfaces are handled like references which would be documented separately,
|
||||
// rather than inlined like type aliases.
|
||||
return {
|
||||
name: path.node.id.name,
|
||||
};
|
||||
}
|
||||
function handleUnionTypeAnnotation(path, typeParams) {
|
||||
return {
|
||||
name: 'union',
|
||||
raw: printValue(path),
|
||||
elements: path
|
||||
.get('types')
|
||||
.map((subType) => getFlowTypeWithResolvedTypes(subType, typeParams)),
|
||||
};
|
||||
}
|
||||
function handleIntersectionTypeAnnotation(path, typeParams) {
|
||||
return {
|
||||
name: 'intersection',
|
||||
raw: printValue(path),
|
||||
elements: path
|
||||
.get('types')
|
||||
.map((subType) => getFlowTypeWithResolvedTypes(subType, typeParams)),
|
||||
};
|
||||
}
|
||||
function handleNullableTypeAnnotation(path, typeParams) {
|
||||
const typeAnnotation = getTypeAnnotation(path);
|
||||
if (!typeAnnotation)
|
||||
return null;
|
||||
const type = getFlowTypeWithResolvedTypes(typeAnnotation, typeParams);
|
||||
type.nullable = true;
|
||||
return type;
|
||||
}
|
||||
function handleFunctionTypeAnnotation(path, typeParams) {
|
||||
const type = {
|
||||
name: 'signature',
|
||||
type: 'function',
|
||||
raw: printValue(path),
|
||||
signature: {
|
||||
arguments: [],
|
||||
return: getFlowTypeWithResolvedTypes(path.get('returnType'), typeParams),
|
||||
},
|
||||
};
|
||||
path.get('params').forEach((param) => {
|
||||
const typeAnnotation = getTypeAnnotation(param);
|
||||
type.signature.arguments.push({
|
||||
name: param.node.name ? param.node.name.name : '',
|
||||
type: typeAnnotation
|
||||
? getFlowTypeWithResolvedTypes(typeAnnotation, typeParams)
|
||||
: undefined,
|
||||
});
|
||||
});
|
||||
const rest = path.get('rest');
|
||||
if (rest.hasNode()) {
|
||||
const typeAnnotation = getTypeAnnotation(rest);
|
||||
type.signature.arguments.push({
|
||||
name: rest.node.name ? rest.node.name.name : '',
|
||||
type: typeAnnotation
|
||||
? getFlowTypeWithResolvedTypes(typeAnnotation, typeParams)
|
||||
: undefined,
|
||||
rest: true,
|
||||
});
|
||||
}
|
||||
return type;
|
||||
}
|
||||
function handleTupleTypeAnnotation(path, typeParams) {
|
||||
const type = {
|
||||
name: 'tuple',
|
||||
raw: printValue(path),
|
||||
elements: [],
|
||||
};
|
||||
path.get('types').forEach((param) => {
|
||||
type.elements.push(getFlowTypeWithResolvedTypes(param, typeParams));
|
||||
});
|
||||
return type;
|
||||
}
|
||||
function handleTypeofTypeAnnotation(path, typeParams) {
|
||||
return getFlowTypeWithResolvedTypes(path.get('argument'), typeParams);
|
||||
}
|
||||
function handleIndexedAccessType(path, typeParams) {
|
||||
const objectType = getFlowTypeWithResolvedTypes(path.get('objectType'), typeParams);
|
||||
const indexType = getFlowTypeWithResolvedTypes(path.get('indexType'), typeParams);
|
||||
// We only get the signature if the objectType is a type (vs interface)
|
||||
if (!objectType.signature) {
|
||||
return {
|
||||
name: `${objectType.name}[${indexType.value ? indexType.value.toString() : indexType.name}]`,
|
||||
raw: printValue(path),
|
||||
};
|
||||
}
|
||||
const resolvedType = objectType.signature.properties.find((p) => {
|
||||
// indexType.value = "'foo'"
|
||||
return indexType.value && p.key === indexType.value.replace(/['"]+/g, '');
|
||||
});
|
||||
if (!resolvedType) {
|
||||
return { name: 'unknown' };
|
||||
}
|
||||
return {
|
||||
name: resolvedType.value.name,
|
||||
raw: printValue(path),
|
||||
};
|
||||
}
|
||||
let visitedTypes = {};
|
||||
function getFlowTypeWithResolvedTypes(path, typeParams) {
|
||||
let type = null;
|
||||
const parent = path.parentPath;
|
||||
const isTypeAlias = parent.isTypeAlias();
|
||||
// When we see a TypeAlias mark it as visited so that the next
|
||||
// call of this function does not run into an endless loop
|
||||
if (isTypeAlias) {
|
||||
const visitedType = visitedTypes[parent.node.id.name];
|
||||
if (visitedType === true) {
|
||||
// if we are currently visiting this node then just return the name
|
||||
// as we are starting to endless loop
|
||||
return { name: parent.node.id.name };
|
||||
}
|
||||
else if (typeof visitedType === 'object') {
|
||||
// if we already resolved the type simple return it
|
||||
return visitedType;
|
||||
}
|
||||
// mark the type as visited
|
||||
visitedTypes[parent.node.id.name] = true;
|
||||
}
|
||||
if (path.node.type in flowTypes) {
|
||||
type = { name: flowTypes[path.node.type] };
|
||||
}
|
||||
else if (path.node.type in flowLiteralTypes) {
|
||||
type = {
|
||||
name: 'literal',
|
||||
value: path.node.extra?.raw ||
|
||||
`${path.node.value}`,
|
||||
};
|
||||
}
|
||||
else if (path.node.type in namedTypes) {
|
||||
type = namedTypes[path.node.type](path, typeParams);
|
||||
}
|
||||
if (!type) {
|
||||
type = { name: 'unknown' };
|
||||
}
|
||||
if (isTypeAlias) {
|
||||
// mark the type as unvisited so that further calls can resolve the type again
|
||||
visitedTypes[parent.node.id.name] = type;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
/**
|
||||
* Tries to identify the flow type by inspecting the path for known
|
||||
* flow type names. This method doesn't check whether the found type is actually
|
||||
* existing. It simply assumes that a match is always valid.
|
||||
*
|
||||
* If there is no match, "unknown" is returned.
|
||||
*/
|
||||
export default function getFlowType(path, typeParams = null) {
|
||||
// Empty visited types before an after run
|
||||
// Before: in case the detection threw and we rerun again
|
||||
// After: cleanup memory after we are done here
|
||||
visitedTypes = {};
|
||||
const type = getFlowTypeWithResolvedTypes(path, typeParams);
|
||||
visitedTypes = {};
|
||||
return type;
|
||||
}
|
||||
11
frontend/node_modules/react-docgen/dist/utils/getMemberExpressionRoot.d.ts
generated
vendored
Normal file
11
frontend/node_modules/react-docgen/dist/utils/getMemberExpressionRoot.d.ts
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { Expression, MemberExpression } from '@babel/types';
|
||||
/**
|
||||
* Returns the path to the first part of the MemberExpression. I.e. given a
|
||||
* path representing
|
||||
*
|
||||
* foo.bar.baz
|
||||
*
|
||||
* it returns the path of/to `foo`.
|
||||
*/
|
||||
export default function getMemberExpressionRoot(memberExpressionPath: NodePath<MemberExpression>): NodePath<Expression>;
|
||||
15
frontend/node_modules/react-docgen/dist/utils/getMemberExpressionRoot.js
generated
vendored
Normal file
15
frontend/node_modules/react-docgen/dist/utils/getMemberExpressionRoot.js
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
* Returns the path to the first part of the MemberExpression. I.e. given a
|
||||
* path representing
|
||||
*
|
||||
* foo.bar.baz
|
||||
*
|
||||
* it returns the path of/to `foo`.
|
||||
*/
|
||||
export default function getMemberExpressionRoot(memberExpressionPath) {
|
||||
let path = memberExpressionPath;
|
||||
while (path.isMemberExpression()) {
|
||||
path = path.get('object');
|
||||
}
|
||||
return path;
|
||||
}
|
||||
3
frontend/node_modules/react-docgen/dist/utils/getMemberExpressionValuePath.d.ts
generated
vendored
Normal file
3
frontend/node_modules/react-docgen/dist/utils/getMemberExpressionValuePath.d.ts
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { Expression } from '@babel/types';
|
||||
export default function getMemberExpressionValuePath(variableDefinition: NodePath, memberName: string): NodePath<Expression> | null;
|
||||
83
frontend/node_modules/react-docgen/dist/utils/getMemberExpressionValuePath.js
generated
vendored
Normal file
83
frontend/node_modules/react-docgen/dist/utils/getMemberExpressionValuePath.js
generated
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
import { visitors } from '@babel/traverse';
|
||||
import getNameOrValue from './getNameOrValue.js';
|
||||
import { String as toString } from './expressionTo.js';
|
||||
import isReactForwardRefCall from './isReactForwardRefCall.js';
|
||||
function resolveName(path) {
|
||||
if (path.isVariableDeclaration()) {
|
||||
const declarations = path.get('declarations');
|
||||
if (declarations.length > 1) {
|
||||
throw new TypeError('Got unsupported VariableDeclaration. VariableDeclaration must only ' +
|
||||
'have a single VariableDeclarator. Got ' +
|
||||
declarations.length +
|
||||
' declarations.');
|
||||
}
|
||||
// VariableDeclarator always has at least one declaration, hence the non-null-assertion
|
||||
const id = declarations[0].get('id');
|
||||
if (id.isIdentifier()) {
|
||||
return id.node.name;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (path.isFunctionDeclaration()) {
|
||||
const id = path.get('id');
|
||||
if (id.isIdentifier()) {
|
||||
return id.node.name;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (path.isFunctionExpression() ||
|
||||
path.isArrowFunctionExpression() ||
|
||||
path.isTaggedTemplateExpression() ||
|
||||
path.isCallExpression() ||
|
||||
isReactForwardRefCall(path)) {
|
||||
let currentPath = path;
|
||||
while (currentPath.parentPath) {
|
||||
if (currentPath.parentPath.isVariableDeclarator()) {
|
||||
const id = currentPath.parentPath.get('id');
|
||||
if (id.isIdentifier()) {
|
||||
return id.node.name;
|
||||
}
|
||||
return;
|
||||
}
|
||||
currentPath = currentPath.parentPath;
|
||||
}
|
||||
return;
|
||||
}
|
||||
throw new TypeError('Attempted to resolveName for an unsupported path. resolveName does not accept ' +
|
||||
path.node.type +
|
||||
'".');
|
||||
}
|
||||
const explodedVisitors = visitors.explode({
|
||||
AssignmentExpression: {
|
||||
enter: function (path, state) {
|
||||
const memberPath = path.get('left');
|
||||
if (!memberPath.isMemberExpression()) {
|
||||
return;
|
||||
}
|
||||
const property = memberPath.get('property');
|
||||
if (((!memberPath.node.computed && property.isIdentifier()) ||
|
||||
property.isStringLiteral() ||
|
||||
property.isNumericLiteral()) &&
|
||||
getNameOrValue(property) === state.memberName &&
|
||||
toString(memberPath.get('object')) === state.localName) {
|
||||
state.result = path.get('right');
|
||||
path.stop();
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
export default function getMemberExpressionValuePath(variableDefinition, memberName) {
|
||||
const localName = resolveName(variableDefinition);
|
||||
if (!localName) {
|
||||
// likely an immediately exported and therefore nameless/anonymous node
|
||||
// passed in
|
||||
return null;
|
||||
}
|
||||
const state = {
|
||||
localName,
|
||||
memberName,
|
||||
result: null,
|
||||
};
|
||||
variableDefinition.hub.file.traverse(explodedVisitors, state);
|
||||
return state.result;
|
||||
}
|
||||
20
frontend/node_modules/react-docgen/dist/utils/getMemberValuePath.d.ts
generated
vendored
Normal file
20
frontend/node_modules/react-docgen/dist/utils/getMemberValuePath.d.ts
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { CallExpression, ClassDeclaration, ClassExpression, ClassMethod, Expression, ObjectExpression, ObjectMethod, TaggedTemplateExpression, VariableDeclaration } from '@babel/types';
|
||||
import type { StatelessComponentNode } from '../resolver/index.js';
|
||||
type SupportedNodes = CallExpression | ClassDeclaration | ClassExpression | ObjectExpression | StatelessComponentNode | TaggedTemplateExpression | VariableDeclaration;
|
||||
export declare function isSupportedDefinitionType(path: NodePath): path is NodePath<SupportedNodes>;
|
||||
/**
|
||||
* This is a helper method for handlers to make it easier to work either with
|
||||
* an ObjectExpression from `React.createClass` class or with a class
|
||||
* definition.
|
||||
*
|
||||
* Given a path and a name, this function will either return the path of the
|
||||
* property value if the path is an ObjectExpression, or the value of the
|
||||
* ClassProperty/MethodDefinition if it is a class definition (declaration or
|
||||
* expression).
|
||||
*
|
||||
* It also normalizes the names so that e.g. `defaultProps` and
|
||||
* `getDefaultProps` can be used interchangeably.
|
||||
*/
|
||||
export default function getMemberValuePath(componentDefinition: NodePath<SupportedNodes>, memberName: string): NodePath<ClassMethod | Expression | ObjectMethod> | null;
|
||||
export {};
|
||||
85
frontend/node_modules/react-docgen/dist/utils/getMemberValuePath.js
generated
vendored
Normal file
85
frontend/node_modules/react-docgen/dist/utils/getMemberValuePath.js
generated
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
import getClassMemberValuePath from './getClassMemberValuePath.js';
|
||||
import getMemberExpressionValuePath from './getMemberExpressionValuePath.js';
|
||||
import getPropertyValuePath from './getPropertyValuePath.js';
|
||||
import resolveFunctionDefinitionToReturnValue from '../utils/resolveFunctionDefinitionToReturnValue.js';
|
||||
const postprocessPropTypes = (path) => path.isFunction() ? resolveFunctionDefinitionToReturnValue(path) : path;
|
||||
const POSTPROCESS_MEMBERS = new Map([['propTypes', postprocessPropTypes]]);
|
||||
const SUPPORTED_DEFINITION_TYPES = [
|
||||
// potential stateless function component
|
||||
'ArrowFunctionExpression',
|
||||
/**
|
||||
* Adds support for libraries such as
|
||||
* [system-components]{@link https://jxnblk.com/styled-system/system-components} that use
|
||||
* CallExpressions to generate components.
|
||||
*
|
||||
* While react-docgen's built-in resolvers do not support resolving
|
||||
* CallExpressions definitions, third-party resolvers (such as
|
||||
* https://github.com/Jmeyering/react-docgen-annotation-resolver) could be
|
||||
* used to add these definitions.
|
||||
*/
|
||||
'CallExpression',
|
||||
'ClassDeclaration',
|
||||
'ClassExpression',
|
||||
// potential stateless function component
|
||||
'FunctionDeclaration',
|
||||
// potential stateless function component
|
||||
'FunctionExpression',
|
||||
'ObjectExpression',
|
||||
// potential stateless function component
|
||||
'ObjectMethod',
|
||||
/**
|
||||
* Adds support for libraries such as
|
||||
* [styled components]{@link https://github.com/styled-components} that use
|
||||
* TaggedTemplateExpression's to generate components.
|
||||
*
|
||||
* While react-docgen's built-in resolvers do not support resolving
|
||||
* TaggedTemplateExpression definitions, third-party resolvers (such as
|
||||
* https://github.com/Jmeyering/react-docgen-annotation-resolver) could be
|
||||
* used to add these definitions.
|
||||
*/
|
||||
'TaggedTemplateExpression',
|
||||
'VariableDeclaration',
|
||||
];
|
||||
export function isSupportedDefinitionType(path) {
|
||||
return SUPPORTED_DEFINITION_TYPES.includes(path.node.type);
|
||||
}
|
||||
/**
|
||||
* This is a helper method for handlers to make it easier to work either with
|
||||
* an ObjectExpression from `React.createClass` class or with a class
|
||||
* definition.
|
||||
*
|
||||
* Given a path and a name, this function will either return the path of the
|
||||
* property value if the path is an ObjectExpression, or the value of the
|
||||
* ClassProperty/MethodDefinition if it is a class definition (declaration or
|
||||
* expression).
|
||||
*
|
||||
* It also normalizes the names so that e.g. `defaultProps` and
|
||||
* `getDefaultProps` can be used interchangeably.
|
||||
*/
|
||||
export default function getMemberValuePath(componentDefinition, memberName) {
|
||||
let result;
|
||||
if (componentDefinition.isObjectExpression()) {
|
||||
result = getPropertyValuePath(componentDefinition, memberName);
|
||||
if (!result && memberName === 'defaultProps') {
|
||||
result = getPropertyValuePath(componentDefinition, 'getDefaultProps');
|
||||
}
|
||||
}
|
||||
else if (componentDefinition.isClassDeclaration() ||
|
||||
componentDefinition.isClassExpression()) {
|
||||
result = getClassMemberValuePath(componentDefinition, memberName);
|
||||
if (!result && memberName === 'defaultProps') {
|
||||
result = getClassMemberValuePath(componentDefinition, 'getDefaultProps');
|
||||
}
|
||||
}
|
||||
else {
|
||||
result = getMemberExpressionValuePath(componentDefinition, memberName);
|
||||
if (!result && memberName === 'defaultProps') {
|
||||
result = getMemberExpressionValuePath(componentDefinition, 'getDefaultProps');
|
||||
}
|
||||
}
|
||||
const postprocessMethod = POSTPROCESS_MEMBERS.get(memberName);
|
||||
if (result && postprocessMethod) {
|
||||
result = postprocessMethod(result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
21
frontend/node_modules/react-docgen/dist/utils/getMembers.d.ts
generated
vendored
Normal file
21
frontend/node_modules/react-docgen/dist/utils/getMembers.d.ts
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { Expression, PrivateName } from '@babel/types';
|
||||
interface MemberDescriptor {
|
||||
path: NodePath<Expression | PrivateName>;
|
||||
computed: boolean;
|
||||
argumentPaths: NodePath[];
|
||||
}
|
||||
/**
|
||||
* Given a "nested" Member/CallExpression, e.g.
|
||||
*
|
||||
* foo.bar()[baz][42]
|
||||
*
|
||||
* this returns a list of "members". In this example it would be something like
|
||||
* [
|
||||
* {path: NodePath<bar>, arguments: NodePath<empty>, computed: false},
|
||||
* {path: NodePath<baz>, arguments: null, computed: true},
|
||||
* {path: NodePath<42>, arguments: null, computed: false}
|
||||
* ]
|
||||
*/
|
||||
export default function getMembers(path: NodePath, includeRoot?: boolean): MemberDescriptor[];
|
||||
export {};
|
||||
50
frontend/node_modules/react-docgen/dist/utils/getMembers.js
generated
vendored
Normal file
50
frontend/node_modules/react-docgen/dist/utils/getMembers.js
generated
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
/**
|
||||
* Given a "nested" Member/CallExpression, e.g.
|
||||
*
|
||||
* foo.bar()[baz][42]
|
||||
*
|
||||
* this returns a list of "members". In this example it would be something like
|
||||
* [
|
||||
* {path: NodePath<bar>, arguments: NodePath<empty>, computed: false},
|
||||
* {path: NodePath<baz>, arguments: null, computed: true},
|
||||
* {path: NodePath<42>, arguments: null, computed: false}
|
||||
* ]
|
||||
*/
|
||||
export default function getMembers(path, includeRoot = false) {
|
||||
const result = [];
|
||||
let argumentPaths = [];
|
||||
let resultPath = path;
|
||||
while (true) {
|
||||
if (resultPath.isMemberExpression()) {
|
||||
const property = resultPath.get('property');
|
||||
result.push({
|
||||
path: property,
|
||||
computed: resultPath.node.computed,
|
||||
argumentPaths,
|
||||
});
|
||||
argumentPaths = [];
|
||||
resultPath = resultPath.get('object');
|
||||
}
|
||||
else if (resultPath.isCallExpression()) {
|
||||
const callee = resultPath.get('callee');
|
||||
if (callee.isExpression()) {
|
||||
argumentPaths = resultPath.get('arguments');
|
||||
resultPath = callee;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (includeRoot && result.length > 0) {
|
||||
result.push({
|
||||
path: resultPath,
|
||||
computed: false,
|
||||
argumentPaths,
|
||||
});
|
||||
}
|
||||
return result.reverse();
|
||||
}
|
||||
7
frontend/node_modules/react-docgen/dist/utils/getMethodDocumentation.d.ts
generated
vendored
Normal file
7
frontend/node_modules/react-docgen/dist/utils/getMethodDocumentation.d.ts
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { AssignmentExpression, ClassMethod, ClassPrivateMethod, ClassProperty, ObjectMethod, ObjectProperty } from '@babel/types';
|
||||
import type { MethodDescriptor } from '../Documentation.js';
|
||||
export type MethodNodePath = NodePath<AssignmentExpression> | NodePath<ClassMethod> | NodePath<ClassPrivateMethod> | NodePath<ClassProperty> | NodePath<ObjectMethod> | NodePath<ObjectProperty>;
|
||||
export default function getMethodDocumentation(methodPath: MethodNodePath, options?: {
|
||||
isStatic?: boolean;
|
||||
}): MethodDescriptor | null;
|
||||
166
frontend/node_modules/react-docgen/dist/utils/getMethodDocumentation.js
generated
vendored
Normal file
166
frontend/node_modules/react-docgen/dist/utils/getMethodDocumentation.js
generated
vendored
Normal file
@@ -0,0 +1,166 @@
|
||||
import { getDocblock } from './docblock.js';
|
||||
import getFlowType from './getFlowType.js';
|
||||
import getTSType from './getTSType.js';
|
||||
import getParameterName from './getParameterName.js';
|
||||
import getPropertyName from './getPropertyName.js';
|
||||
import getTypeAnnotation from './getTypeAnnotation.js';
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
import printValue from './printValue.js';
|
||||
function getMethodFunctionExpression(methodPath) {
|
||||
if (methodPath.isClassMethod() || methodPath.isObjectMethod()) {
|
||||
return methodPath;
|
||||
}
|
||||
const potentialFunctionExpression = methodPath.isAssignmentExpression()
|
||||
? methodPath.get('right')
|
||||
: methodPath.get('value');
|
||||
const functionExpression = resolveToValue(potentialFunctionExpression);
|
||||
if (functionExpression.isFunction()) {
|
||||
return functionExpression;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function getMethodParamOptional(path) {
|
||||
let identifier = path;
|
||||
if (identifier.isTSParameterProperty()) {
|
||||
identifier = identifier.get('parameter');
|
||||
}
|
||||
if (identifier.isAssignmentPattern()) {
|
||||
// A default value always makes the param optional
|
||||
return true;
|
||||
}
|
||||
return identifier.isIdentifier() ? Boolean(identifier.node.optional) : false;
|
||||
}
|
||||
function getMethodParamsDoc(methodPath) {
|
||||
const params = [];
|
||||
const functionExpression = getMethodFunctionExpression(methodPath);
|
||||
if (functionExpression) {
|
||||
// Extract param types.
|
||||
functionExpression.get('params').forEach((paramPath) => {
|
||||
let type = null;
|
||||
const typePath = getTypeAnnotation(paramPath);
|
||||
if (typePath) {
|
||||
if (typePath.isFlowType()) {
|
||||
type = getFlowType(typePath, null);
|
||||
if (typePath.isGenericTypeAnnotation()) {
|
||||
type.alias = printValue(typePath.get('id'));
|
||||
}
|
||||
}
|
||||
else if (typePath.isTSType()) {
|
||||
type = getTSType(typePath, null);
|
||||
if (typePath.isTSTypeReference()) {
|
||||
type.alias = printValue(typePath.get('typeName'));
|
||||
}
|
||||
}
|
||||
}
|
||||
const param = {
|
||||
name: getParameterName(paramPath),
|
||||
optional: getMethodParamOptional(paramPath),
|
||||
type,
|
||||
};
|
||||
params.push(param);
|
||||
});
|
||||
}
|
||||
return params;
|
||||
}
|
||||
// Extract flow return type.
|
||||
function getMethodReturnDoc(methodPath) {
|
||||
const functionExpression = getMethodFunctionExpression(methodPath);
|
||||
if (functionExpression && functionExpression.node.returnType) {
|
||||
const returnType = getTypeAnnotation(functionExpression.get('returnType'));
|
||||
if (!returnType) {
|
||||
return null;
|
||||
}
|
||||
if (returnType.isFlowType()) {
|
||||
return { type: getFlowType(returnType, null) };
|
||||
}
|
||||
else if (returnType.isTSType()) {
|
||||
return { type: getTSType(returnType, null) };
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function getMethodModifiers(methodPath, options) {
|
||||
if (methodPath.isAssignmentExpression()) {
|
||||
return ['static'];
|
||||
}
|
||||
// Otherwise this is a method/property node
|
||||
const modifiers = [];
|
||||
if (options.isStatic === true ||
|
||||
((methodPath.isClassProperty() || methodPath.isClassMethod()) &&
|
||||
methodPath.node.static)) {
|
||||
modifiers.push('static');
|
||||
}
|
||||
const functionExpression = getMethodFunctionExpression(methodPath);
|
||||
if (functionExpression) {
|
||||
if (functionExpression.isClassMethod() ||
|
||||
functionExpression.isObjectMethod()) {
|
||||
if (functionExpression.node.kind === 'get' ||
|
||||
functionExpression.node.kind === 'set') {
|
||||
modifiers.push(functionExpression.node.kind);
|
||||
}
|
||||
}
|
||||
if (functionExpression.node.generator) {
|
||||
modifiers.push('generator');
|
||||
}
|
||||
if (functionExpression.node.async) {
|
||||
modifiers.push('async');
|
||||
}
|
||||
}
|
||||
return modifiers;
|
||||
}
|
||||
function getMethodName(methodPath) {
|
||||
if (methodPath.isAssignmentExpression()) {
|
||||
const left = methodPath.get('left');
|
||||
if (left.isMemberExpression()) {
|
||||
const property = left.get('property');
|
||||
if (!left.node.computed && property.isIdentifier()) {
|
||||
return property.node.name;
|
||||
}
|
||||
if (property.isStringLiteral() || property.isNumericLiteral()) {
|
||||
return String(property.node.value);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return getPropertyName(methodPath);
|
||||
}
|
||||
function getMethodAccessibility(methodPath) {
|
||||
if (methodPath.isClassMethod() || methodPath.isClassProperty()) {
|
||||
return methodPath.node.accessibility || null;
|
||||
}
|
||||
// Otherwise this is a object method/property or assignment expression
|
||||
return null;
|
||||
}
|
||||
function getMethodDocblock(methodPath) {
|
||||
if (methodPath.isAssignmentExpression()) {
|
||||
let path = methodPath;
|
||||
do {
|
||||
path = path.parentPath;
|
||||
} while (path && !path.isExpressionStatement());
|
||||
if (path) {
|
||||
return getDocblock(path);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
// Otherwise this is a method/property node
|
||||
return getDocblock(methodPath);
|
||||
}
|
||||
// Gets the documentation object for a component method.
|
||||
// Component methods may be represented as class/object method/property nodes
|
||||
// or as assignment expression of the form `Component.foo = function() {}`
|
||||
export default function getMethodDocumentation(methodPath, options = {}) {
|
||||
if (getMethodAccessibility(methodPath) === 'private' ||
|
||||
methodPath.isClassPrivateMethod()) {
|
||||
return null;
|
||||
}
|
||||
const name = getMethodName(methodPath);
|
||||
if (!name)
|
||||
return null;
|
||||
return {
|
||||
name,
|
||||
docblock: getMethodDocblock(methodPath),
|
||||
modifiers: getMethodModifiers(methodPath, options),
|
||||
params: getMethodParamsDoc(methodPath),
|
||||
returns: getMethodReturnDoc(methodPath),
|
||||
};
|
||||
}
|
||||
6
frontend/node_modules/react-docgen/dist/utils/getNameOrValue.d.ts
generated
vendored
Normal file
6
frontend/node_modules/react-docgen/dist/utils/getNameOrValue.d.ts
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* If node is an Identifier, it returns its name. If it is a literal, it returns
|
||||
* its value.
|
||||
*/
|
||||
export default function getNameOrValue(path: NodePath): boolean | number | string | null;
|
||||
25
frontend/node_modules/react-docgen/dist/utils/getNameOrValue.js
generated
vendored
Normal file
25
frontend/node_modules/react-docgen/dist/utils/getNameOrValue.js
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
import printValue from './printValue.js';
|
||||
/**
|
||||
* If node is an Identifier, it returns its name. If it is a literal, it returns
|
||||
* its value.
|
||||
*/
|
||||
export default function getNameOrValue(path) {
|
||||
if (path.isIdentifier()) {
|
||||
return path.node.name;
|
||||
}
|
||||
else if (path.isQualifiedTypeIdentifier() || path.isTSQualifiedName()) {
|
||||
return printValue(path);
|
||||
}
|
||||
else if (path.isStringLiteral() ||
|
||||
path.isNumericLiteral() ||
|
||||
path.isBooleanLiteral()) {
|
||||
return path.node.value;
|
||||
}
|
||||
else if (path.isRegExpLiteral()) {
|
||||
return path.node.pattern;
|
||||
}
|
||||
else if (path.isNullLiteral()) {
|
||||
return null;
|
||||
}
|
||||
throw new TypeError(`Argument must be Identifier, Literal, QualifiedTypeIdentifier or TSQualifiedName. Received '${path.node.type}'`);
|
||||
}
|
||||
5
frontend/node_modules/react-docgen/dist/utils/getParameterName.d.ts
generated
vendored
Normal file
5
frontend/node_modules/react-docgen/dist/utils/getParameterName.d.ts
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { ArrayPattern, AssignmentPattern, Identifier, ObjectPattern, RestElement, TSParameterProperty } from '@babel/types';
|
||||
type ParameterNodePath = NodePath<ArrayPattern | AssignmentPattern | Identifier | ObjectPattern | RestElement | TSParameterProperty>;
|
||||
export default function getParameterName(parameterPath: ParameterNodePath): string;
|
||||
export {};
|
||||
21
frontend/node_modules/react-docgen/dist/utils/getParameterName.js
generated
vendored
Normal file
21
frontend/node_modules/react-docgen/dist/utils/getParameterName.js
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
import printValue from './printValue.js';
|
||||
export default function getParameterName(parameterPath) {
|
||||
if (parameterPath.isIdentifier()) {
|
||||
return parameterPath.node.name;
|
||||
}
|
||||
else if (parameterPath.isAssignmentPattern()) {
|
||||
return getParameterName(parameterPath.get('left'));
|
||||
}
|
||||
else if (parameterPath.isObjectPattern() ||
|
||||
parameterPath.isArrayPattern()) {
|
||||
return printValue(parameterPath);
|
||||
}
|
||||
else if (parameterPath.isRestElement()) {
|
||||
return `...${getParameterName(parameterPath.get('argument'))}`;
|
||||
}
|
||||
else if (parameterPath.isTSParameterProperty()) {
|
||||
return getParameterName(parameterPath.get('parameter'));
|
||||
}
|
||||
throw new TypeError('Parameter name must be one of Identifier, AssignmentPattern, ArrayPattern, ' +
|
||||
`ObjectPattern or RestElement, instead got ${parameterPath.node.type}`);
|
||||
}
|
||||
11
frontend/node_modules/react-docgen/dist/utils/getPropType.d.ts
generated
vendored
Normal file
11
frontend/node_modules/react-docgen/dist/utils/getPropType.d.ts
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { PropTypeDescriptor } from '../Documentation.js';
|
||||
/**
|
||||
* Tries to identify the prop type by inspecting the path for known
|
||||
* prop type names. This method doesn't check whether the found type is actually
|
||||
* from React.PropTypes. It simply assumes that a match has the same meaning
|
||||
* as the React.PropTypes one.
|
||||
*
|
||||
* If there is no match, "custom" is returned.
|
||||
*/
|
||||
export default function getPropType(path: NodePath): PropTypeDescriptor;
|
||||
239
frontend/node_modules/react-docgen/dist/utils/getPropType.js
generated
vendored
Normal file
239
frontend/node_modules/react-docgen/dist/utils/getPropType.js
generated
vendored
Normal file
@@ -0,0 +1,239 @@
|
||||
import { getDocblock } from '../utils/docblock.js';
|
||||
import getMembers from './getMembers.js';
|
||||
import getPropertyName from './getPropertyName.js';
|
||||
import isRequiredPropType from '../utils/isRequiredPropType.js';
|
||||
import printValue from './printValue.js';
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
import resolveObjectKeysToArray from './resolveObjectKeysToArray.js';
|
||||
import resolveObjectValuesToArray from './resolveObjectValuesToArray.js';
|
||||
function getEnumValuesFromArrayExpression(path) {
|
||||
const values = [];
|
||||
path.get('elements').forEach((elementPath) => {
|
||||
if (!elementPath.hasNode())
|
||||
return;
|
||||
if (elementPath.isSpreadElement()) {
|
||||
const value = resolveToValue(elementPath.get('argument'));
|
||||
if (value.isArrayExpression()) {
|
||||
// if the SpreadElement resolved to an Array, add all their elements too
|
||||
return values.push(...getEnumValuesFromArrayExpression(value));
|
||||
}
|
||||
else {
|
||||
// otherwise we'll just print the SpreadElement itself
|
||||
return values.push({
|
||||
value: printValue(elementPath),
|
||||
computed: !elementPath.isLiteral(),
|
||||
});
|
||||
}
|
||||
}
|
||||
// try to resolve the array element to it's value
|
||||
const value = resolveToValue(elementPath);
|
||||
return values.push({
|
||||
value: printValue(value.parentPath?.isImportDeclaration() ? elementPath : value),
|
||||
computed: !value.isLiteral(),
|
||||
});
|
||||
});
|
||||
return values;
|
||||
}
|
||||
function getPropTypeOneOf(type, argumentPath) {
|
||||
const value = resolveToValue(argumentPath);
|
||||
if (value.isArrayExpression()) {
|
||||
type.value = getEnumValuesFromArrayExpression(value);
|
||||
}
|
||||
else {
|
||||
const objectValues = resolveObjectKeysToArray(value) || resolveObjectValuesToArray(value);
|
||||
if (objectValues) {
|
||||
type.value = objectValues.map((objectValue) => ({
|
||||
value: objectValue,
|
||||
computed: false,
|
||||
}));
|
||||
}
|
||||
else {
|
||||
// could not easily resolve to an Array, let's print the original value
|
||||
type.computed = true;
|
||||
type.value = printValue(argumentPath);
|
||||
}
|
||||
}
|
||||
return type;
|
||||
}
|
||||
function getPropTypeOneOfType(type, argumentPath) {
|
||||
if (argumentPath.isArrayExpression()) {
|
||||
type.value = argumentPath.get('elements').map((elementPath) => {
|
||||
if (!elementPath.hasNode())
|
||||
return;
|
||||
const descriptor = getPropType(elementPath);
|
||||
const docs = getDocblock(elementPath);
|
||||
if (docs) {
|
||||
descriptor.description = docs;
|
||||
}
|
||||
return descriptor;
|
||||
});
|
||||
}
|
||||
return type;
|
||||
}
|
||||
function getPropTypeArrayOf(type, argumentPath) {
|
||||
const docs = getDocblock(argumentPath);
|
||||
if (docs) {
|
||||
type.description = docs;
|
||||
}
|
||||
const subType = getPropType(argumentPath);
|
||||
type.value = subType;
|
||||
return type;
|
||||
}
|
||||
function getPropTypeObjectOf(type, argumentPath) {
|
||||
const docs = getDocblock(argumentPath);
|
||||
if (docs) {
|
||||
type.description = docs;
|
||||
}
|
||||
const subType = getPropType(argumentPath);
|
||||
type.value = subType;
|
||||
return type;
|
||||
}
|
||||
function getFirstArgument(path) {
|
||||
let argument;
|
||||
if (path.isCallExpression()) {
|
||||
argument = path.get('arguments')[0];
|
||||
}
|
||||
else {
|
||||
const members = getMembers(path, true);
|
||||
if (members[0] && members[0].argumentPaths[0]) {
|
||||
argument = members[0].argumentPaths[0];
|
||||
}
|
||||
}
|
||||
return argument;
|
||||
}
|
||||
function isCyclicReference(argument, argumentPath) {
|
||||
return Boolean(argument && resolveToValue(argument) === argumentPath);
|
||||
}
|
||||
/**
|
||||
* Handles shape and exact prop types
|
||||
*/
|
||||
function getPropTypeShapish(type, argumentPath) {
|
||||
if (!argumentPath.isObjectExpression()) {
|
||||
argumentPath = resolveToValue(argumentPath);
|
||||
}
|
||||
if (argumentPath.isObjectExpression()) {
|
||||
const value = {};
|
||||
let rawValue;
|
||||
argumentPath.get('properties').forEach((propertyPath) => {
|
||||
// We only handle ObjectProperty as there is nothing to handle for
|
||||
// SpreadElements and ObjectMethods
|
||||
if (propertyPath.isObjectProperty()) {
|
||||
const propertyName = getPropertyName(propertyPath);
|
||||
if (!propertyName)
|
||||
return;
|
||||
const valuePath = propertyPath.get('value');
|
||||
const argument = getFirstArgument(valuePath);
|
||||
// This indicates we have a cyclic reference in the shape
|
||||
// In this case we simply print the argument to shape and bail
|
||||
if (argument && isCyclicReference(argument, argumentPath)) {
|
||||
rawValue = printValue(argument);
|
||||
return;
|
||||
}
|
||||
const descriptor = getPropType(valuePath);
|
||||
const docs = getDocblock(propertyPath);
|
||||
if (docs) {
|
||||
descriptor.description = docs;
|
||||
}
|
||||
descriptor.required = isRequiredPropType(valuePath);
|
||||
value[propertyName] = descriptor;
|
||||
}
|
||||
});
|
||||
type.value = rawValue ?? value;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
function getPropTypeInstanceOf(_type, argumentPath) {
|
||||
return {
|
||||
name: 'instanceOf',
|
||||
value: printValue(argumentPath),
|
||||
};
|
||||
}
|
||||
const simplePropTypes = [
|
||||
'array',
|
||||
'bool',
|
||||
'func',
|
||||
'number',
|
||||
'object',
|
||||
'string',
|
||||
'any',
|
||||
'element',
|
||||
'node',
|
||||
'symbol',
|
||||
'elementType',
|
||||
];
|
||||
function isSimplePropType(name) {
|
||||
return simplePropTypes.includes(name);
|
||||
}
|
||||
const propTypes = new Map([
|
||||
['oneOf', callPropTypeHandler.bind(null, 'enum', getPropTypeOneOf)],
|
||||
['oneOfType', callPropTypeHandler.bind(null, 'union', getPropTypeOneOfType)],
|
||||
[
|
||||
'instanceOf',
|
||||
callPropTypeHandler.bind(null, 'instanceOf', getPropTypeInstanceOf),
|
||||
],
|
||||
['arrayOf', callPropTypeHandler.bind(null, 'arrayOf', getPropTypeArrayOf)],
|
||||
['objectOf', callPropTypeHandler.bind(null, 'objectOf', getPropTypeObjectOf)],
|
||||
['shape', callPropTypeHandler.bind(null, 'shape', getPropTypeShapish)],
|
||||
['exact', callPropTypeHandler.bind(null, 'exact', getPropTypeShapish)],
|
||||
]);
|
||||
function callPropTypeHandler(name, handler, argumentPath) {
|
||||
let type = { name };
|
||||
if (argumentPath) {
|
||||
type = handler(type, argumentPath);
|
||||
}
|
||||
if (!type.value) {
|
||||
// If there is no argument then leave the value an empty string
|
||||
type.value = argumentPath ? printValue(argumentPath) : '';
|
||||
type.computed = true;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
/**
|
||||
* Tries to identify the prop type by inspecting the path for known
|
||||
* prop type names. This method doesn't check whether the found type is actually
|
||||
* from React.PropTypes. It simply assumes that a match has the same meaning
|
||||
* as the React.PropTypes one.
|
||||
*
|
||||
* If there is no match, "custom" is returned.
|
||||
*/
|
||||
export default function getPropType(path) {
|
||||
let descriptor = null;
|
||||
getMembers(path, true).some((member) => {
|
||||
const memberPath = member.path;
|
||||
let name = null;
|
||||
if (memberPath.isStringLiteral()) {
|
||||
name = memberPath.node.value;
|
||||
}
|
||||
else if (memberPath.isIdentifier() && !member.computed) {
|
||||
name = memberPath.node.name;
|
||||
}
|
||||
if (name) {
|
||||
if (isSimplePropType(name)) {
|
||||
descriptor = { name };
|
||||
return true;
|
||||
}
|
||||
const propTypeHandler = propTypes.get(name);
|
||||
if (propTypeHandler) {
|
||||
descriptor = propTypeHandler(member.argumentPaths[0]);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return;
|
||||
});
|
||||
if (descriptor) {
|
||||
return descriptor;
|
||||
}
|
||||
if (path.isIdentifier() && isSimplePropType(path.node.name)) {
|
||||
return { name: path.node.name };
|
||||
}
|
||||
if (path.isCallExpression()) {
|
||||
const callee = path.get('callee');
|
||||
if (callee.isIdentifier()) {
|
||||
const propTypeHandler = propTypes.get(callee.node.name);
|
||||
if (propTypeHandler) {
|
||||
return propTypeHandler(path.get('arguments')[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return { name: 'custom', raw: printValue(path) };
|
||||
}
|
||||
9
frontend/node_modules/react-docgen/dist/utils/getPropertyName.d.ts
generated
vendored
Normal file
9
frontend/node_modules/react-docgen/dist/utils/getPropertyName.d.ts
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { ClassMethod, ClassProperty, ObjectMethod, ObjectProperty, ObjectTypeProperty, ObjectTypeSpreadProperty, SpreadElement, TSMethodSignature, TSPropertySignature } from '@babel/types';
|
||||
export declare const COMPUTED_PREFIX = "@computed#";
|
||||
/**
|
||||
* In an ObjectExpression, the name of a property can either be an identifier
|
||||
* or a literal (or dynamic, but we don't support those). This function simply
|
||||
* returns the value of the literal or name of the identifier.
|
||||
*/
|
||||
export default function getPropertyName(propertyPath: NodePath<ClassMethod | ClassProperty | ObjectMethod | ObjectProperty | ObjectTypeProperty | ObjectTypeSpreadProperty | SpreadElement | TSMethodSignature | TSPropertySignature>): string | null;
|
||||
36
frontend/node_modules/react-docgen/dist/utils/getPropertyName.js
generated
vendored
Normal file
36
frontend/node_modules/react-docgen/dist/utils/getPropertyName.js
generated
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
import getNameOrValue from './getNameOrValue.js';
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
export const COMPUTED_PREFIX = '@computed#';
|
||||
/**
|
||||
* In an ObjectExpression, the name of a property can either be an identifier
|
||||
* or a literal (or dynamic, but we don't support those). This function simply
|
||||
* returns the value of the literal or name of the identifier.
|
||||
*/
|
||||
export default function getPropertyName(propertyPath) {
|
||||
if (propertyPath.isObjectTypeSpreadProperty()) {
|
||||
const argument = propertyPath.get('argument');
|
||||
if (argument.isGenericTypeAnnotation()) {
|
||||
return getNameOrValue(argument.get('id'));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
else if (propertyPath.has('computed')) {
|
||||
const key = propertyPath.get('key');
|
||||
// Try to resolve variables and member expressions
|
||||
if (key.isIdentifier() || key.isMemberExpression()) {
|
||||
const valuePath = resolveToValue(key);
|
||||
if (valuePath.isStringLiteral() || valuePath.isNumericLiteral()) {
|
||||
return `${valuePath.node.value}`;
|
||||
}
|
||||
}
|
||||
// generate name for identifier
|
||||
if (key.isIdentifier()) {
|
||||
return `${COMPUTED_PREFIX}${key.node.name}`;
|
||||
}
|
||||
if (key.isStringLiteral() || key.isNumericLiteral()) {
|
||||
return `${key.node.value}`;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return `${getNameOrValue(propertyPath.get('key'))}`;
|
||||
}
|
||||
8
frontend/node_modules/react-docgen/dist/utils/getPropertyValuePath.d.ts
generated
vendored
Normal file
8
frontend/node_modules/react-docgen/dist/utils/getPropertyValuePath.d.ts
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { Expression, ObjectExpression, ObjectMethod } from '@babel/types';
|
||||
/**
|
||||
* Given an ObjectExpression, this function returns the path of the value of
|
||||
* the property with name `propertyName`. if the property is an ObjectMethod we
|
||||
* return the ObjectMethod itself.
|
||||
*/
|
||||
export default function getPropertyValuePath(path: NodePath<ObjectExpression>, propertyName: string): NodePath<Expression | ObjectMethod> | null;
|
||||
18
frontend/node_modules/react-docgen/dist/utils/getPropertyValuePath.js
generated
vendored
Normal file
18
frontend/node_modules/react-docgen/dist/utils/getPropertyValuePath.js
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
import getPropertyName from './getPropertyName.js';
|
||||
/**
|
||||
* Given an ObjectExpression, this function returns the path of the value of
|
||||
* the property with name `propertyName`. if the property is an ObjectMethod we
|
||||
* return the ObjectMethod itself.
|
||||
*/
|
||||
export default function getPropertyValuePath(path, propertyName) {
|
||||
const property = path
|
||||
.get('properties')
|
||||
.find((propertyPath) => !propertyPath.isSpreadElement() &&
|
||||
getPropertyName(propertyPath) === propertyName);
|
||||
if (property) {
|
||||
return property.isObjectMethod()
|
||||
? property
|
||||
: property.get('value');
|
||||
}
|
||||
return null;
|
||||
}
|
||||
12
frontend/node_modules/react-docgen/dist/utils/getTSType.d.ts
generated
vendored
Normal file
12
frontend/node_modules/react-docgen/dist/utils/getTSType.d.ts
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
import type { TypeParameters } from '../utils/getTypeParameters.js';
|
||||
import type { TypeDescriptor, TSFunctionSignatureType } from '../Documentation.js';
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { TypeScript } from '@babel/types';
|
||||
/**
|
||||
* Tries to identify the typescript type by inspecting the path for known
|
||||
* typescript type names. This method doesn't check whether the found type is actually
|
||||
* existing. It simply assumes that a match is always valid.
|
||||
*
|
||||
* If there is no match, "unknown" is returned.
|
||||
*/
|
||||
export default function getTSType(path: NodePath<TypeScript>, typeParamMap?: TypeParameters | null): TypeDescriptor<TSFunctionSignatureType>;
|
||||
374
frontend/node_modules/react-docgen/dist/utils/getTSType.js
generated
vendored
Normal file
374
frontend/node_modules/react-docgen/dist/utils/getTSType.js
generated
vendored
Normal file
@@ -0,0 +1,374 @@
|
||||
import getPropertyName from './getPropertyName.js';
|
||||
import printValue from './printValue.js';
|
||||
import getTypeAnnotation from '../utils/getTypeAnnotation.js';
|
||||
import resolveToValue from '../utils/resolveToValue.js';
|
||||
import { resolveObjectToNameArray } from '../utils/resolveObjectKeysToArray.js';
|
||||
import getTypeParameters from '../utils/getTypeParameters.js';
|
||||
import { getDocblock } from './docblock.js';
|
||||
const tsTypes = {
|
||||
TSAnyKeyword: 'any',
|
||||
TSBooleanKeyword: 'boolean',
|
||||
TSUnknownKeyword: 'unknown',
|
||||
TSNeverKeyword: 'never',
|
||||
TSNullKeyword: 'null',
|
||||
TSUndefinedKeyword: 'undefined',
|
||||
TSNumberKeyword: 'number',
|
||||
TSStringKeyword: 'string',
|
||||
TSSymbolKeyword: 'symbol',
|
||||
TSThisType: 'this',
|
||||
TSObjectKeyword: 'object',
|
||||
TSVoidKeyword: 'void',
|
||||
};
|
||||
const namedTypes = {
|
||||
TSArrayType: handleTSArrayType,
|
||||
TSTypeReference: handleTSTypeReference,
|
||||
TSTypeLiteral: handleTSTypeLiteral,
|
||||
TSInterfaceDeclaration: handleTSInterfaceDeclaration,
|
||||
TSUnionType: handleTSUnionType,
|
||||
TSFunctionType: handleTSFunctionType,
|
||||
TSIntersectionType: handleTSIntersectionType,
|
||||
TSMappedType: handleTSMappedType,
|
||||
TSTupleType: handleTSTupleType,
|
||||
TSTypeQuery: handleTSTypeQuery,
|
||||
TSTypeOperator: handleTSTypeOperator,
|
||||
TSIndexedAccessType: handleTSIndexedAccessType,
|
||||
TSLiteralType: handleTSLiteralType,
|
||||
};
|
||||
function handleTSQualifiedName(path) {
|
||||
const left = path.get('left');
|
||||
const right = path.get('right');
|
||||
if (left.isIdentifier({ name: 'React' }) && right.isIdentifier()) {
|
||||
return {
|
||||
name: `${left.node.name}${right.node.name}`,
|
||||
raw: printValue(path),
|
||||
};
|
||||
}
|
||||
return { name: printValue(path).replace(/<.*>$/, '') };
|
||||
}
|
||||
function handleTSLiteralType(path) {
|
||||
const literal = path.get('literal');
|
||||
return {
|
||||
name: 'literal',
|
||||
value: printValue(literal),
|
||||
};
|
||||
}
|
||||
function handleTSArrayType(path, typeParams) {
|
||||
return {
|
||||
name: 'Array',
|
||||
elements: [getTSTypeWithResolvedTypes(path.get('elementType'), typeParams)],
|
||||
raw: printValue(path),
|
||||
};
|
||||
}
|
||||
function handleTSTypeReference(path, typeParams) {
|
||||
let type;
|
||||
const typeName = path.get('typeName');
|
||||
if (typeName.isTSQualifiedName()) {
|
||||
type = handleTSQualifiedName(typeName);
|
||||
}
|
||||
else {
|
||||
type = { name: typeName.node.name };
|
||||
}
|
||||
const resolvedPath = (typeParams && typeParams[type.name]) ||
|
||||
resolveToValue(path.get('typeName'));
|
||||
const typeParameters = path.get('typeParameters');
|
||||
const resolvedTypeParameters = resolvedPath.get('typeParameters');
|
||||
if (typeParameters.hasNode() && resolvedTypeParameters.hasNode()) {
|
||||
typeParams = getTypeParameters(resolvedTypeParameters, typeParameters, typeParams);
|
||||
}
|
||||
if (typeParams && typeParams[type.name]) {
|
||||
// Open question: Why is this `null` instead of `typeParams`
|
||||
type = getTSTypeWithResolvedTypes(resolvedPath, null);
|
||||
}
|
||||
const resolvedTypeAnnotation = resolvedPath.get('typeAnnotation');
|
||||
if (resolvedTypeAnnotation.hasNode()) {
|
||||
type = getTSTypeWithResolvedTypes(resolvedTypeAnnotation, typeParams);
|
||||
}
|
||||
else if (typeParameters.hasNode()) {
|
||||
const params = typeParameters.get('params');
|
||||
type = {
|
||||
...type,
|
||||
elements: params.map((param) => getTSTypeWithResolvedTypes(param, typeParams)),
|
||||
raw: printValue(path),
|
||||
};
|
||||
}
|
||||
return type;
|
||||
}
|
||||
function getTSTypeWithRequirements(path, typeParams) {
|
||||
const type = getTSTypeWithResolvedTypes(path, typeParams);
|
||||
type.required =
|
||||
!('optional' in path.parentPath.node) || !path.parentPath.node.optional;
|
||||
return type;
|
||||
}
|
||||
function handleTSTypeLiteral(path, typeParams) {
|
||||
const type = {
|
||||
name: 'signature',
|
||||
type: 'object',
|
||||
raw: printValue(path),
|
||||
signature: { properties: [] },
|
||||
};
|
||||
path.get('members').forEach((param) => {
|
||||
const typeAnnotation = param.get('typeAnnotation');
|
||||
if ((param.isTSPropertySignature() || param.isTSMethodSignature()) &&
|
||||
typeAnnotation.hasNode()) {
|
||||
const propName = getPropertyName(param);
|
||||
if (!propName) {
|
||||
return;
|
||||
}
|
||||
const docblock = getDocblock(param);
|
||||
let doc = {};
|
||||
if (docblock) {
|
||||
doc = { description: docblock };
|
||||
}
|
||||
type.signature.properties.push({
|
||||
key: propName,
|
||||
value: getTSTypeWithRequirements(typeAnnotation, typeParams),
|
||||
...doc,
|
||||
});
|
||||
}
|
||||
else if (param.isTSCallSignatureDeclaration()) {
|
||||
type.signature.constructor = handleTSFunctionType(param, typeParams);
|
||||
}
|
||||
else if (param.isTSIndexSignature() && typeAnnotation.hasNode()) {
|
||||
const parameters = param.get('parameters');
|
||||
if (parameters[0]) {
|
||||
const idTypeAnnotation = parameters[0].get('typeAnnotation');
|
||||
if (idTypeAnnotation.hasNode()) {
|
||||
type.signature.properties.push({
|
||||
key: getTSTypeWithResolvedTypes(idTypeAnnotation, typeParams),
|
||||
value: getTSTypeWithRequirements(typeAnnotation, typeParams),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
return type;
|
||||
}
|
||||
function handleTSInterfaceDeclaration(path) {
|
||||
// Interfaces are handled like references which would be documented separately,
|
||||
// rather than inlined like type aliases.
|
||||
return {
|
||||
name: path.node.id.name,
|
||||
};
|
||||
}
|
||||
function handleTSUnionType(path, typeParams) {
|
||||
return {
|
||||
name: 'union',
|
||||
raw: printValue(path),
|
||||
elements: path
|
||||
.get('types')
|
||||
.map((subType) => getTSTypeWithResolvedTypes(subType, typeParams)),
|
||||
};
|
||||
}
|
||||
function handleTSIntersectionType(path, typeParams) {
|
||||
return {
|
||||
name: 'intersection',
|
||||
raw: printValue(path),
|
||||
elements: path
|
||||
.get('types')
|
||||
.map((subType) => getTSTypeWithResolvedTypes(subType, typeParams)),
|
||||
};
|
||||
}
|
||||
// type OptionsFlags<Type> = { [Property in keyof Type]; };
|
||||
function handleTSMappedType(path, typeParams) {
|
||||
const key = getTSTypeWithResolvedTypes(path.get('typeParameter').get('constraint'), typeParams);
|
||||
key.required = !path.node.optional;
|
||||
const typeAnnotation = path.get('typeAnnotation');
|
||||
let value;
|
||||
if (typeAnnotation.hasNode()) {
|
||||
value = getTSTypeWithResolvedTypes(typeAnnotation, typeParams);
|
||||
}
|
||||
else {
|
||||
value = { name: 'any' };
|
||||
}
|
||||
return {
|
||||
name: 'signature',
|
||||
type: 'object',
|
||||
raw: printValue(path),
|
||||
signature: {
|
||||
properties: [
|
||||
{
|
||||
key,
|
||||
value,
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
}
|
||||
function handleTSFunctionType(path, typeParams) {
|
||||
let returnType;
|
||||
const annotation = path.get('typeAnnotation');
|
||||
if (annotation.hasNode()) {
|
||||
returnType = getTSTypeWithResolvedTypes(annotation, typeParams);
|
||||
}
|
||||
const type = {
|
||||
name: 'signature',
|
||||
type: 'function',
|
||||
raw: printValue(path),
|
||||
signature: {
|
||||
arguments: [],
|
||||
return: returnType,
|
||||
},
|
||||
};
|
||||
path.get('parameters').forEach((param) => {
|
||||
const typeAnnotation = getTypeAnnotation(param);
|
||||
const arg = {
|
||||
type: typeAnnotation
|
||||
? getTSTypeWithResolvedTypes(typeAnnotation, typeParams)
|
||||
: undefined,
|
||||
name: '',
|
||||
};
|
||||
if (param.isIdentifier()) {
|
||||
arg.name = param.node.name;
|
||||
if (param.node.name === 'this') {
|
||||
type.signature.this = arg.type;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (param.isRestElement()) {
|
||||
const restArgument = param.get('argument');
|
||||
if (restArgument.isIdentifier()) {
|
||||
arg.name = restArgument.node.name;
|
||||
}
|
||||
else {
|
||||
arg.name = printValue(restArgument);
|
||||
}
|
||||
arg.rest = true;
|
||||
}
|
||||
type.signature.arguments.push(arg);
|
||||
});
|
||||
return type;
|
||||
}
|
||||
function handleTSTupleType(path, typeParams) {
|
||||
const type = {
|
||||
name: 'tuple',
|
||||
raw: printValue(path),
|
||||
elements: [],
|
||||
};
|
||||
path.get('elementTypes').forEach((param) => {
|
||||
type.elements.push(getTSTypeWithResolvedTypes(param, typeParams));
|
||||
});
|
||||
return type;
|
||||
}
|
||||
function handleTSTypeQuery(path, typeParams) {
|
||||
const exprName = path.get('exprName');
|
||||
if (exprName.isIdentifier()) {
|
||||
const resolvedPath = resolveToValue(path.get('exprName'));
|
||||
if (resolvedPath.has('typeAnnotation')) {
|
||||
return getTSTypeWithResolvedTypes(resolvedPath.get('typeAnnotation'), typeParams);
|
||||
}
|
||||
return { name: exprName.node.name };
|
||||
}
|
||||
else if (exprName.isTSQualifiedName()) {
|
||||
return handleTSQualifiedName(exprName);
|
||||
}
|
||||
else {
|
||||
// TSImportType
|
||||
return { name: printValue(exprName) };
|
||||
}
|
||||
}
|
||||
function handleTSTypeOperator(path, typeParams) {
|
||||
if (path.node.operator !== 'keyof') {
|
||||
return null;
|
||||
}
|
||||
let value = path.get('typeAnnotation');
|
||||
if (value.isTSTypeQuery()) {
|
||||
value = value.get('exprName');
|
||||
}
|
||||
else if ('id' in value.node) {
|
||||
value = value.get('id');
|
||||
}
|
||||
else if (value.isTSTypeReference()) {
|
||||
return getTSTypeWithResolvedTypes(value, typeParams);
|
||||
}
|
||||
const resolvedPath = resolveToValue(value);
|
||||
if (resolvedPath.isObjectExpression() || resolvedPath.isTSTypeLiteral()) {
|
||||
const keys = resolveObjectToNameArray(resolvedPath, true);
|
||||
if (keys) {
|
||||
return {
|
||||
name: 'union',
|
||||
raw: printValue(path),
|
||||
elements: keys.map((key) => ({ name: 'literal', value: key })),
|
||||
};
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function handleTSIndexedAccessType(path, typeParams) {
|
||||
const objectType = getTSTypeWithResolvedTypes(path.get('objectType'), typeParams);
|
||||
const indexType = getTSTypeWithResolvedTypes(path.get('indexType'), typeParams);
|
||||
// We only get the signature if the objectType is a type (vs interface)
|
||||
if (!objectType.signature) {
|
||||
return {
|
||||
name: `${objectType.name}[${indexType.value ? indexType.value.toString() : indexType.name}]`,
|
||||
raw: printValue(path),
|
||||
};
|
||||
}
|
||||
const resolvedType = objectType.signature.properties.find((p) => {
|
||||
// indexType.value = "'foo'"
|
||||
return indexType.value && p.key === indexType.value.replace(/['"]+/g, '');
|
||||
});
|
||||
if (!resolvedType) {
|
||||
return { name: 'unknown' };
|
||||
}
|
||||
return {
|
||||
name: resolvedType.value.name,
|
||||
raw: printValue(path),
|
||||
};
|
||||
}
|
||||
let visitedTypes = {};
|
||||
function getTSTypeWithResolvedTypes(path, typeParams) {
|
||||
if (path.isTSTypeAnnotation()) {
|
||||
path = path.get('typeAnnotation');
|
||||
}
|
||||
const node = path.node;
|
||||
let type = null;
|
||||
let typeAliasName = null;
|
||||
if (path.parentPath.isTSTypeAliasDeclaration()) {
|
||||
typeAliasName = path.parentPath.node.id.name;
|
||||
}
|
||||
// When we see a typealias mark it as visited so that the next
|
||||
// call of this function does not run into an endless loop
|
||||
if (typeAliasName) {
|
||||
if (visitedTypes[typeAliasName] === true) {
|
||||
// if we are currently visiting this node then just return the name
|
||||
// as we are starting to endless loop
|
||||
return { name: typeAliasName };
|
||||
}
|
||||
else if (typeof visitedTypes[typeAliasName] === 'object') {
|
||||
// if we already resolved the type simple return it
|
||||
return visitedTypes[typeAliasName];
|
||||
}
|
||||
// mark the type as visited
|
||||
visitedTypes[typeAliasName] = true;
|
||||
}
|
||||
if (node.type in tsTypes) {
|
||||
type = { name: tsTypes[node.type] };
|
||||
}
|
||||
else if (node.type in namedTypes) {
|
||||
type = namedTypes[node.type](path, typeParams);
|
||||
}
|
||||
if (!type) {
|
||||
type = { name: 'unknown' };
|
||||
}
|
||||
if (typeAliasName) {
|
||||
// mark the type as unvisited so that further calls can resolve the type again
|
||||
visitedTypes[typeAliasName] = type;
|
||||
}
|
||||
return type;
|
||||
}
|
||||
/**
|
||||
* Tries to identify the typescript type by inspecting the path for known
|
||||
* typescript type names. This method doesn't check whether the found type is actually
|
||||
* existing. It simply assumes that a match is always valid.
|
||||
*
|
||||
* If there is no match, "unknown" is returned.
|
||||
*/
|
||||
export default function getTSType(path, typeParamMap = null) {
|
||||
// Empty visited types before an after run
|
||||
// Before: in case the detection threw and we rerun again
|
||||
// After: cleanup memory after we are done here
|
||||
visitedTypes = {};
|
||||
const type = getTSTypeWithResolvedTypes(path, typeParamMap);
|
||||
visitedTypes = {};
|
||||
return type;
|
||||
}
|
||||
7
frontend/node_modules/react-docgen/dist/utils/getTypeAnnotation.d.ts
generated
vendored
Normal file
7
frontend/node_modules/react-docgen/dist/utils/getTypeAnnotation.d.ts
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { FlowType, Node, TSType } from '@babel/types';
|
||||
/**
|
||||
* Gets the most inner valuable TypeAnnotation from path. If no TypeAnnotation
|
||||
* can be found null is returned
|
||||
*/
|
||||
export default function getTypeAnnotation<T extends Node = FlowType | TSType>(path: NodePath<Node | null | undefined>): NodePath<T> | null;
|
||||
15
frontend/node_modules/react-docgen/dist/utils/getTypeAnnotation.js
generated
vendored
Normal file
15
frontend/node_modules/react-docgen/dist/utils/getTypeAnnotation.js
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
* Gets the most inner valuable TypeAnnotation from path. If no TypeAnnotation
|
||||
* can be found null is returned
|
||||
*/
|
||||
export default function getTypeAnnotation(path) {
|
||||
if (!path.has('typeAnnotation'))
|
||||
return null;
|
||||
let resultPath = path;
|
||||
do {
|
||||
resultPath = resultPath.get('typeAnnotation');
|
||||
} while (resultPath.has('typeAnnotation') &&
|
||||
!resultPath.isFlowType() &&
|
||||
!resultPath.isTSType());
|
||||
return resultPath;
|
||||
}
|
||||
12
frontend/node_modules/react-docgen/dist/utils/getTypeFromReactComponent.d.ts
generated
vendored
Normal file
12
frontend/node_modules/react-docgen/dist/utils/getTypeFromReactComponent.d.ts
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type Documentation from '../Documentation.js';
|
||||
import type { TypeParameters } from './getTypeParameters.js';
|
||||
/**
|
||||
* Given an React component (stateless or class) tries to find
|
||||
* flow or TS types for the props. It may find multiple types.
|
||||
* If not found or it is not one of the supported component types,
|
||||
* this function returns an empty array.
|
||||
*/
|
||||
declare const _default: (componentDefinition: NodePath) => NodePath[];
|
||||
export default _default;
|
||||
export declare function applyToTypeProperties(documentation: Documentation, path: NodePath, callback: (propertyPath: NodePath, params: TypeParameters | null) => void, typeParams: TypeParameters | null): void;
|
||||
153
frontend/node_modules/react-docgen/dist/utils/getTypeFromReactComponent.js
generated
vendored
Normal file
153
frontend/node_modules/react-docgen/dist/utils/getTypeFromReactComponent.js
generated
vendored
Normal file
@@ -0,0 +1,153 @@
|
||||
import getMemberValuePath from './getMemberValuePath.js';
|
||||
import getTypeAnnotation from './getTypeAnnotation.js';
|
||||
import getTypeParameters from './getTypeParameters.js';
|
||||
import isReactComponentClass from './isReactComponentClass.js';
|
||||
import isReactForwardRefCall from './isReactForwardRefCall.js';
|
||||
import resolveGenericTypeAnnotation from './resolveGenericTypeAnnotation.js';
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
import getTypeIdentifier from './getTypeIdentifier.js';
|
||||
import isReactBuiltinReference from './isReactBuiltinReference.js';
|
||||
import unwrapBuiltinTSPropTypes from './unwrapBuiltinTSPropTypes.js';
|
||||
function getStatelessPropsPath(componentDefinition) {
|
||||
if (!componentDefinition.isFunction())
|
||||
return;
|
||||
return componentDefinition.get('params')[0];
|
||||
}
|
||||
function getForwardRefGenericsType(componentDefinition) {
|
||||
const typeParameters = componentDefinition.get('typeParameters');
|
||||
if (typeParameters && typeParameters.hasNode()) {
|
||||
const params = typeParameters.get('params');
|
||||
return params[1] ?? null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
function findAssignedVariableType(componentDefinition) {
|
||||
const variableDeclarator = componentDefinition.findParent((path) => path.isVariableDeclarator());
|
||||
if (!variableDeclarator)
|
||||
return null;
|
||||
const typeAnnotation = getTypeAnnotation(variableDeclarator.get('id'));
|
||||
if (!typeAnnotation)
|
||||
return null;
|
||||
if (typeAnnotation.isTSTypeReference()) {
|
||||
const typeName = typeAnnotation.get('typeName');
|
||||
if (isReactBuiltinReference(typeName, 'FunctionComponent') ||
|
||||
isReactBuiltinReference(typeName, 'FC') ||
|
||||
isReactBuiltinReference(typeName, 'VoidFunctionComponent') ||
|
||||
isReactBuiltinReference(typeName, 'VFC')) {
|
||||
const typeParameters = typeAnnotation.get('typeParameters');
|
||||
if (typeParameters.hasNode()) {
|
||||
return typeParameters.get('params')[0] ?? null;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Given an React component (stateless or class) tries to find
|
||||
* flow or TS types for the props. It may find multiple types.
|
||||
* If not found or it is not one of the supported component types,
|
||||
* this function returns an empty array.
|
||||
*/
|
||||
export default (componentDefinition) => {
|
||||
const typePaths = [];
|
||||
if (isReactComponentClass(componentDefinition)) {
|
||||
const superTypes = componentDefinition.get('superTypeParameters');
|
||||
if (superTypes.hasNode()) {
|
||||
const params = superTypes.get('params');
|
||||
if (params.length >= 1) {
|
||||
typePaths.push(params[params.length === 3 ? 1 : 0]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
const propsMemberPath = getMemberValuePath(componentDefinition, 'props');
|
||||
if (!propsMemberPath) {
|
||||
return [];
|
||||
}
|
||||
const typeAnnotation = getTypeAnnotation(propsMemberPath.parentPath);
|
||||
if (typeAnnotation) {
|
||||
typePaths.push(typeAnnotation);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (isReactForwardRefCall(componentDefinition)) {
|
||||
const genericTypeAnnotation = getForwardRefGenericsType(componentDefinition);
|
||||
if (genericTypeAnnotation) {
|
||||
typePaths.push(genericTypeAnnotation);
|
||||
}
|
||||
componentDefinition = resolveToValue(componentDefinition.get('arguments')[0]);
|
||||
}
|
||||
const propsParam = getStatelessPropsPath(componentDefinition);
|
||||
if (propsParam) {
|
||||
const typeAnnotation = getTypeAnnotation(propsParam);
|
||||
if (typeAnnotation) {
|
||||
typePaths.push(typeAnnotation);
|
||||
}
|
||||
}
|
||||
const assignedVariableType = findAssignedVariableType(componentDefinition);
|
||||
if (assignedVariableType) {
|
||||
typePaths.push(assignedVariableType);
|
||||
}
|
||||
}
|
||||
return typePaths.map((typePath) => unwrapBuiltinTSPropTypes(typePath));
|
||||
};
|
||||
export function applyToTypeProperties(documentation, path, callback, typeParams) {
|
||||
if (path.isObjectTypeAnnotation()) {
|
||||
path
|
||||
.get('properties')
|
||||
.forEach((propertyPath) => callback(propertyPath, typeParams));
|
||||
}
|
||||
else if (path.isTSTypeLiteral()) {
|
||||
path
|
||||
.get('members')
|
||||
.forEach((propertyPath) => callback(propertyPath, typeParams));
|
||||
}
|
||||
else if (path.isInterfaceDeclaration()) {
|
||||
applyExtends(documentation, path, callback, typeParams);
|
||||
path
|
||||
.get('body')
|
||||
.get('properties')
|
||||
.forEach((propertyPath) => callback(propertyPath, typeParams));
|
||||
}
|
||||
else if (path.isTSInterfaceDeclaration()) {
|
||||
applyExtends(documentation, path, callback, typeParams);
|
||||
path
|
||||
.get('body')
|
||||
.get('body')
|
||||
.forEach((propertyPath) => callback(propertyPath, typeParams));
|
||||
}
|
||||
else if (path.isIntersectionTypeAnnotation() ||
|
||||
path.isTSIntersectionType()) {
|
||||
path.get('types').forEach((typesPath) => applyToTypeProperties(documentation, typesPath, callback, typeParams));
|
||||
}
|
||||
else if (!path.isUnionTypeAnnotation()) {
|
||||
// The react-docgen output format does not currently allow
|
||||
// for the expression of union types
|
||||
const typePath = resolveGenericTypeAnnotation(path);
|
||||
if (typePath) {
|
||||
applyToTypeProperties(documentation, typePath, callback, typeParams);
|
||||
}
|
||||
}
|
||||
}
|
||||
function applyExtends(documentation, path, callback, typeParams) {
|
||||
const classExtends = path.get('extends');
|
||||
if (!Array.isArray(classExtends)) {
|
||||
return;
|
||||
}
|
||||
classExtends.forEach((extendsPath) => {
|
||||
const resolvedPath = resolveGenericTypeAnnotation(extendsPath);
|
||||
if (resolvedPath) {
|
||||
if (resolvedPath.has('typeParameters') &&
|
||||
extendsPath.node.typeParameters) {
|
||||
typeParams = getTypeParameters(resolvedPath.get('typeParameters'), extendsPath.get('typeParameters'), typeParams);
|
||||
}
|
||||
applyToTypeProperties(documentation, resolvedPath, callback, typeParams);
|
||||
}
|
||||
else {
|
||||
const idPath = getTypeIdentifier(extendsPath);
|
||||
if (idPath && idPath.isIdentifier()) {
|
||||
documentation.addComposes(idPath.node.name);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
2
frontend/node_modules/react-docgen/dist/utils/getTypeIdentifier.d.ts
generated
vendored
Normal file
2
frontend/node_modules/react-docgen/dist/utils/getTypeIdentifier.d.ts
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
export default function getTypeIdentifier(path: NodePath): NodePath | null;
|
||||
12
frontend/node_modules/react-docgen/dist/utils/getTypeIdentifier.js
generated
vendored
Normal file
12
frontend/node_modules/react-docgen/dist/utils/getTypeIdentifier.js
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
export default function getTypeIdentifier(path) {
|
||||
if (path.has('id')) {
|
||||
return path.get('id');
|
||||
}
|
||||
else if (path.isTSTypeReference()) {
|
||||
return path.get('typeName');
|
||||
}
|
||||
else if (path.isTSExpressionWithTypeArguments()) {
|
||||
return path.get('expression');
|
||||
}
|
||||
return null;
|
||||
}
|
||||
4
frontend/node_modules/react-docgen/dist/utils/getTypeParameters.d.ts
generated
vendored
Normal file
4
frontend/node_modules/react-docgen/dist/utils/getTypeParameters.d.ts
generated
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { TSTypeParameterDeclaration, TSTypeParameterInstantiation, TypeParameterDeclaration, TypeParameterInstantiation } from '@babel/types';
|
||||
export type TypeParameters = Record<string, NodePath>;
|
||||
export default function getTypeParameters(declaration: NodePath<TSTypeParameterDeclaration | TypeParameterDeclaration>, instantiation: NodePath<TSTypeParameterInstantiation | TypeParameterInstantiation>, inputParams: TypeParameters | null | undefined): TypeParameters;
|
||||
34
frontend/node_modules/react-docgen/dist/utils/getTypeParameters.js
generated
vendored
Normal file
34
frontend/node_modules/react-docgen/dist/utils/getTypeParameters.js
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
import resolveGenericTypeAnnotation from '../utils/resolveGenericTypeAnnotation.js';
|
||||
export default function getTypeParameters(declaration, instantiation, inputParams) {
|
||||
const params = {};
|
||||
const numInstantiationParams = instantiation.node.params.length;
|
||||
let i = 0;
|
||||
declaration
|
||||
.get('params')
|
||||
.forEach((paramPath) => {
|
||||
const key = paramPath.node.name;
|
||||
const defaultProp = paramPath.get('default');
|
||||
const defaultTypePath = defaultProp.hasNode() ? defaultProp : null;
|
||||
const typePath = i < numInstantiationParams
|
||||
? instantiation.get('params')[i++]
|
||||
: defaultTypePath;
|
||||
if (typePath) {
|
||||
let resolvedTypePath = resolveGenericTypeAnnotation(typePath) || typePath;
|
||||
let typeName;
|
||||
if (resolvedTypePath.isTSTypeReference()) {
|
||||
typeName = resolvedTypePath.get('typeName');
|
||||
}
|
||||
else if (resolvedTypePath.isGenericTypeAnnotation()) {
|
||||
typeName = resolvedTypePath.get('id');
|
||||
}
|
||||
if (typeName &&
|
||||
inputParams &&
|
||||
typeName.isIdentifier() &&
|
||||
inputParams[typeName.node.name]) {
|
||||
resolvedTypePath = inputParams[typeName.node.name];
|
||||
}
|
||||
params[key] = resolvedTypePath;
|
||||
}
|
||||
});
|
||||
return params;
|
||||
}
|
||||
55
frontend/node_modules/react-docgen/dist/utils/index.d.ts
generated
vendored
Normal file
55
frontend/node_modules/react-docgen/dist/utils/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
import * as docblock from './docblock.js';
|
||||
import * as expressionTo from './expressionTo.js';
|
||||
import * as flowUtilityTypes from './flowUtilityTypes.js';
|
||||
import * as traverse from './traverse.js';
|
||||
export { docblock, expressionTo, flowUtilityTypes, traverse };
|
||||
export { default as findFunctionReturn } from './findFunctionReturn.js';
|
||||
export { default as getClassMemberValuePath } from './getClassMemberValuePath.js';
|
||||
export { default as getFlowType } from './getFlowType.js';
|
||||
export { default as getMemberExpressionRoot } from './getMemberExpressionRoot.js';
|
||||
export { default as getMemberExpressionValuePath } from './getMemberExpressionValuePath.js';
|
||||
export { default as getMembers } from './getMembers.js';
|
||||
export { default as getMemberValuePath, isSupportedDefinitionType, } from './getMemberValuePath.js';
|
||||
export { default as getMethodDocumentation } from './getMethodDocumentation.js';
|
||||
export type { MethodNodePath } from './getMethodDocumentation.js';
|
||||
export { default as getNameOrValue } from './getNameOrValue.js';
|
||||
export { default as getParameterName } from './getParameterName.js';
|
||||
export { default as getPropertyName, COMPUTED_PREFIX, } from './getPropertyName.js';
|
||||
export { default as getPropertyValuePath } from './getPropertyValuePath.js';
|
||||
export { default as getPropType } from './getPropType.js';
|
||||
export { default as getTSType } from './getTSType.js';
|
||||
export { default as getTypeAnnotation } from './getTypeAnnotation.js';
|
||||
export { default as getTypeFromReactComponent, applyToTypeProperties, } from './getTypeFromReactComponent.js';
|
||||
export { default as getTypeIdentifier } from './getTypeIdentifier.js';
|
||||
export { default as getTypeParameters } from './getTypeParameters.js';
|
||||
export type { TypeParameters } from './getTypeParameters.js';
|
||||
export { default as isDestructuringAssignment } from './isDestructuringAssignment.js';
|
||||
export { default as isExportsOrModuleAssignment } from './isExportsOrModuleAssignment.js';
|
||||
export { default as isImportSpecifier } from './isImportSpecifier.js';
|
||||
export { default as isReactBuiltinCall } from './isReactBuiltinCall.js';
|
||||
export { default as isReactBuiltinReference } from './isReactBuiltinReference.js';
|
||||
export { default as isReactChildrenElementCall } from './isReactChildrenElementCall.js';
|
||||
export { default as isReactCloneElementCall } from './isReactCloneElementCall.js';
|
||||
export { default as isReactComponentClass } from './isReactComponentClass.js';
|
||||
export { default as isReactComponentMethod } from './isReactComponentMethod.js';
|
||||
export { default as isReactCreateClassCall } from './isReactCreateClassCall.js';
|
||||
export { default as isReactCreateElementCall } from './isReactCreateElementCall.js';
|
||||
export { default as isReactForwardRefCall } from './isReactForwardRefCall.js';
|
||||
export { default as isReactModuleName } from './isReactModuleName.js';
|
||||
export { default as isRequiredPropType } from './isRequiredPropType.js';
|
||||
export { default as isStatelessComponent } from './isStatelessComponent.js';
|
||||
export { default as isUnreachableFlowType } from './isUnreachableFlowType.js';
|
||||
export { default as normalizeClassDefinition } from './normalizeClassDefinition.js';
|
||||
export { default as parseJsDoc } from './parseJsDoc.js';
|
||||
export { default as postProcessDocumentation } from './postProcessDocumentation.js';
|
||||
export { default as printValue } from './printValue.js';
|
||||
export { default as resolveExportDeclaration } from './resolveExportDeclaration.js';
|
||||
export { default as resolveFunctionDefinitionToReturnValue } from './resolveFunctionDefinitionToReturnValue.js';
|
||||
export { default as resolveGenericTypeAnnotation } from './resolveGenericTypeAnnotation.js';
|
||||
export { default as resolveHOC } from './resolveHOC.js';
|
||||
export { default as resolveObjectPatternPropertyToValue } from './resolveObjectPatternPropertyToValue.js';
|
||||
export { default as resolveObjectKeysToArray, resolveObjectToNameArray, } from './resolveObjectKeysToArray.js';
|
||||
export { default as resolveObjectValuesToArray } from './resolveObjectValuesToArray.js';
|
||||
export { default as resolveToModule } from './resolveToModule.js';
|
||||
export { default as resolveToValue } from './resolveToValue.js';
|
||||
export { default as setPropDescription } from './setPropDescription.js';
|
||||
53
frontend/node_modules/react-docgen/dist/utils/index.js
generated
vendored
Normal file
53
frontend/node_modules/react-docgen/dist/utils/index.js
generated
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
import * as docblock from './docblock.js';
|
||||
import * as expressionTo from './expressionTo.js';
|
||||
import * as flowUtilityTypes from './flowUtilityTypes.js';
|
||||
import * as traverse from './traverse.js';
|
||||
export { docblock, expressionTo, flowUtilityTypes, traverse };
|
||||
export { default as findFunctionReturn } from './findFunctionReturn.js';
|
||||
export { default as getClassMemberValuePath } from './getClassMemberValuePath.js';
|
||||
export { default as getFlowType } from './getFlowType.js';
|
||||
export { default as getMemberExpressionRoot } from './getMemberExpressionRoot.js';
|
||||
export { default as getMemberExpressionValuePath } from './getMemberExpressionValuePath.js';
|
||||
export { default as getMembers } from './getMembers.js';
|
||||
export { default as getMemberValuePath, isSupportedDefinitionType, } from './getMemberValuePath.js';
|
||||
export { default as getMethodDocumentation } from './getMethodDocumentation.js';
|
||||
export { default as getNameOrValue } from './getNameOrValue.js';
|
||||
export { default as getParameterName } from './getParameterName.js';
|
||||
export { default as getPropertyName, COMPUTED_PREFIX, } from './getPropertyName.js';
|
||||
export { default as getPropertyValuePath } from './getPropertyValuePath.js';
|
||||
export { default as getPropType } from './getPropType.js';
|
||||
export { default as getTSType } from './getTSType.js';
|
||||
export { default as getTypeAnnotation } from './getTypeAnnotation.js';
|
||||
export { default as getTypeFromReactComponent, applyToTypeProperties, } from './getTypeFromReactComponent.js';
|
||||
export { default as getTypeIdentifier } from './getTypeIdentifier.js';
|
||||
export { default as getTypeParameters } from './getTypeParameters.js';
|
||||
export { default as isDestructuringAssignment } from './isDestructuringAssignment.js';
|
||||
export { default as isExportsOrModuleAssignment } from './isExportsOrModuleAssignment.js';
|
||||
export { default as isImportSpecifier } from './isImportSpecifier.js';
|
||||
export { default as isReactBuiltinCall } from './isReactBuiltinCall.js';
|
||||
export { default as isReactBuiltinReference } from './isReactBuiltinReference.js';
|
||||
export { default as isReactChildrenElementCall } from './isReactChildrenElementCall.js';
|
||||
export { default as isReactCloneElementCall } from './isReactCloneElementCall.js';
|
||||
export { default as isReactComponentClass } from './isReactComponentClass.js';
|
||||
export { default as isReactComponentMethod } from './isReactComponentMethod.js';
|
||||
export { default as isReactCreateClassCall } from './isReactCreateClassCall.js';
|
||||
export { default as isReactCreateElementCall } from './isReactCreateElementCall.js';
|
||||
export { default as isReactForwardRefCall } from './isReactForwardRefCall.js';
|
||||
export { default as isReactModuleName } from './isReactModuleName.js';
|
||||
export { default as isRequiredPropType } from './isRequiredPropType.js';
|
||||
export { default as isStatelessComponent } from './isStatelessComponent.js';
|
||||
export { default as isUnreachableFlowType } from './isUnreachableFlowType.js';
|
||||
export { default as normalizeClassDefinition } from './normalizeClassDefinition.js';
|
||||
export { default as parseJsDoc } from './parseJsDoc.js';
|
||||
export { default as postProcessDocumentation } from './postProcessDocumentation.js';
|
||||
export { default as printValue } from './printValue.js';
|
||||
export { default as resolveExportDeclaration } from './resolveExportDeclaration.js';
|
||||
export { default as resolveFunctionDefinitionToReturnValue } from './resolveFunctionDefinitionToReturnValue.js';
|
||||
export { default as resolveGenericTypeAnnotation } from './resolveGenericTypeAnnotation.js';
|
||||
export { default as resolveHOC } from './resolveHOC.js';
|
||||
export { default as resolveObjectPatternPropertyToValue } from './resolveObjectPatternPropertyToValue.js';
|
||||
export { default as resolveObjectKeysToArray, resolveObjectToNameArray, } from './resolveObjectKeysToArray.js';
|
||||
export { default as resolveObjectValuesToArray } from './resolveObjectValuesToArray.js';
|
||||
export { default as resolveToModule } from './resolveToModule.js';
|
||||
export { default as resolveToValue } from './resolveToValue.js';
|
||||
export { default as setPropDescription } from './setPropDescription.js';
|
||||
6
frontend/node_modules/react-docgen/dist/utils/isDestructuringAssignment.d.ts
generated
vendored
Normal file
6
frontend/node_modules/react-docgen/dist/utils/isDestructuringAssignment.d.ts
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* Checks if the input Identifier is part of a destructuring Assignment
|
||||
* and the name of the property key matches the input name
|
||||
*/
|
||||
export default function isDestructuringAssignment(path: NodePath, name: string): boolean;
|
||||
11
frontend/node_modules/react-docgen/dist/utils/isDestructuringAssignment.js
generated
vendored
Normal file
11
frontend/node_modules/react-docgen/dist/utils/isDestructuringAssignment.js
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
/**
|
||||
* Checks if the input Identifier is part of a destructuring Assignment
|
||||
* and the name of the property key matches the input name
|
||||
*/
|
||||
export default function isDestructuringAssignment(path, name) {
|
||||
if (!path.isObjectProperty()) {
|
||||
return false;
|
||||
}
|
||||
const id = path.get('key');
|
||||
return id.isIdentifier({ name }) && path.parentPath.isObjectPattern();
|
||||
}
|
||||
6
frontend/node_modules/react-docgen/dist/utils/isExportsOrModuleAssignment.d.ts
generated
vendored
Normal file
6
frontend/node_modules/react-docgen/dist/utils/isExportsOrModuleAssignment.d.ts
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* Returns true if the expression is of form `exports.foo = ...;` or
|
||||
* `modules.exports = ...;`.
|
||||
*/
|
||||
export default function isExportsOrModuleAssignment(path: NodePath): boolean;
|
||||
14
frontend/node_modules/react-docgen/dist/utils/isExportsOrModuleAssignment.js
generated
vendored
Normal file
14
frontend/node_modules/react-docgen/dist/utils/isExportsOrModuleAssignment.js
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
import * as expressionTo from './expressionTo.js';
|
||||
/**
|
||||
* Returns true if the expression is of form `exports.foo = ...;` or
|
||||
* `modules.exports = ...;`.
|
||||
*/
|
||||
export default function isExportsOrModuleAssignment(path) {
|
||||
if (!path.isAssignmentExpression() ||
|
||||
!path.get('left').isMemberExpression()) {
|
||||
return false;
|
||||
}
|
||||
const exprArr = expressionTo.Array(path.get('left'));
|
||||
return ((exprArr[0] === 'module' && exprArr[1] === 'exports') ||
|
||||
exprArr[0] === 'exports');
|
||||
}
|
||||
5
frontend/node_modules/react-docgen/dist/utils/isImportSpecifier.d.ts
generated
vendored
Normal file
5
frontend/node_modules/react-docgen/dist/utils/isImportSpecifier.d.ts
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* Checks if the path is a ImportSpecifier that imports the given named export
|
||||
*/
|
||||
export default function isImportSpecifier(path: NodePath, name: string): boolean;
|
||||
8
frontend/node_modules/react-docgen/dist/utils/isImportSpecifier.js
generated
vendored
Normal file
8
frontend/node_modules/react-docgen/dist/utils/isImportSpecifier.js
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* Checks if the path is a ImportSpecifier that imports the given named export
|
||||
*/
|
||||
export default function isImportSpecifier(path, name) {
|
||||
return (path.isImportSpecifier() &&
|
||||
(path.get('imported').isIdentifier({ name }) ||
|
||||
path.get('imported').isStringLiteral({ value: name })));
|
||||
}
|
||||
9
frontend/node_modules/react-docgen/dist/utils/isReactBuiltinCall.d.ts
generated
vendored
Normal file
9
frontend/node_modules/react-docgen/dist/utils/isReactBuiltinCall.d.ts
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { CallExpression } from '@babel/types';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.foo(...)`.
|
||||
*/
|
||||
export default function isReactBuiltinCall(path: NodePath, name: string): path is NodePath<CallExpression & {
|
||||
__reactBuiltinTypeHint: true;
|
||||
}>;
|
||||
12
frontend/node_modules/react-docgen/dist/utils/isReactBuiltinCall.js
generated
vendored
Normal file
12
frontend/node_modules/react-docgen/dist/utils/isReactBuiltinCall.js
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
import isReactBuiltinReference from './isReactBuiltinReference.js';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.foo(...)`.
|
||||
*/
|
||||
export default function isReactBuiltinCall(path, name) {
|
||||
if (!path.isCallExpression()) {
|
||||
return false;
|
||||
}
|
||||
const callee = path.get('callee');
|
||||
return isReactBuiltinReference(callee, name);
|
||||
}
|
||||
5
frontend/node_modules/react-docgen/dist/utils/isReactBuiltinReference.d.ts
generated
vendored
Normal file
5
frontend/node_modules/react-docgen/dist/utils/isReactBuiltinReference.d.ts
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* Returns true if the expression is a reference to a react export.
|
||||
*/
|
||||
export default function isReactBuiltinReference(path: NodePath, name: string): boolean;
|
||||
48
frontend/node_modules/react-docgen/dist/utils/isReactBuiltinReference.js
generated
vendored
Normal file
48
frontend/node_modules/react-docgen/dist/utils/isReactBuiltinReference.js
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
import isReactModuleName from './isReactModuleName.js';
|
||||
import resolveToModule from './resolveToModule.js';
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
import isDestructuringAssignment from './isDestructuringAssignment.js';
|
||||
import isImportSpecifier from './isImportSpecifier.js';
|
||||
function isNamedMemberExpression(value, name) {
|
||||
if (!value.isMemberExpression()) {
|
||||
return false;
|
||||
}
|
||||
const property = value.get('property');
|
||||
return property.isIdentifier() && property.node.name === name;
|
||||
}
|
||||
/**
|
||||
* Returns true if the expression is a reference to a react export.
|
||||
*/
|
||||
export default function isReactBuiltinReference(path, name) {
|
||||
if (path.isMemberExpression() &&
|
||||
path.get('property').isIdentifier({ name })) {
|
||||
const module = resolveToModule(path.get('object'));
|
||||
return Boolean(module && isReactModuleName(module));
|
||||
}
|
||||
// Typescript
|
||||
if (path.isTSQualifiedName() && path.get('right').isIdentifier({ name })) {
|
||||
const module = resolveToModule(path.get('left'));
|
||||
return Boolean(module && isReactModuleName(module));
|
||||
}
|
||||
// Flow
|
||||
if (path.isQualifiedTypeIdentifier() &&
|
||||
path.get('id').isIdentifier({ name })) {
|
||||
const module = resolveToModule(path.get('qualification'));
|
||||
return Boolean(module && isReactModuleName(module));
|
||||
}
|
||||
const value = resolveToValue(path);
|
||||
if (value === path) {
|
||||
return false;
|
||||
}
|
||||
if (
|
||||
// const { x } = require('react')
|
||||
isDestructuringAssignment(value, name) ||
|
||||
// `require('react').createElement`
|
||||
isNamedMemberExpression(value, name) ||
|
||||
// `import { createElement } from 'react'`
|
||||
isImportSpecifier(value, name)) {
|
||||
const module = resolveToModule(value);
|
||||
return Boolean(module && isReactModuleName(module));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
9
frontend/node_modules/react-docgen/dist/utils/isReactChildrenElementCall.d.ts
generated
vendored
Normal file
9
frontend/node_modules/react-docgen/dist/utils/isReactChildrenElementCall.d.ts
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { CallExpression } from '@babel/types';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.Children.only(...)` or `React.Children.map(...)`.
|
||||
*/
|
||||
export default function isReactChildrenElementCall(path: NodePath): path is NodePath<CallExpression & {
|
||||
__reactBuiltinTypeHint: true;
|
||||
}>;
|
||||
19
frontend/node_modules/react-docgen/dist/utils/isReactChildrenElementCall.js
generated
vendored
Normal file
19
frontend/node_modules/react-docgen/dist/utils/isReactChildrenElementCall.js
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
import isReactBuiltinReference from './isReactBuiltinReference.js';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.Children.only(...)` or `React.Children.map(...)`.
|
||||
*/
|
||||
export default function isReactChildrenElementCall(path) {
|
||||
if (!path.isCallExpression()) {
|
||||
return false;
|
||||
}
|
||||
const callee = path.get('callee');
|
||||
if (callee.isMemberExpression()) {
|
||||
const calleeProperty = callee.get('property');
|
||||
if (calleeProperty.isIdentifier({ name: 'only' }) ||
|
||||
calleeProperty.isIdentifier({ name: 'map' })) {
|
||||
return isReactBuiltinReference(callee.get('object'), 'Children');
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
9
frontend/node_modules/react-docgen/dist/utils/isReactCloneElementCall.d.ts
generated
vendored
Normal file
9
frontend/node_modules/react-docgen/dist/utils/isReactCloneElementCall.d.ts
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { CallExpression } from '@babel/types';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.cloneElement(...)`.
|
||||
*/
|
||||
export default function isReactCloneElementCall(path: NodePath): path is NodePath<CallExpression & {
|
||||
__reactBuiltinTypeHint: true;
|
||||
}>;
|
||||
8
frontend/node_modules/react-docgen/dist/utils/isReactCloneElementCall.js
generated
vendored
Normal file
8
frontend/node_modules/react-docgen/dist/utils/isReactCloneElementCall.js
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import isReactBuiltinCall from './isReactBuiltinCall.js';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.cloneElement(...)`.
|
||||
*/
|
||||
export default function isReactCloneElementCall(path) {
|
||||
return isReactBuiltinCall(path, 'cloneElement');
|
||||
}
|
||||
7
frontend/node_modules/react-docgen/dist/utils/isReactComponentClass.d.ts
generated
vendored
Normal file
7
frontend/node_modules/react-docgen/dist/utils/isReactComponentClass.d.ts
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { ClassDeclaration, ClassExpression } from '@babel/types';
|
||||
/**
|
||||
* Returns `true` of the path represents a class definition which either extends
|
||||
* `React.Component` or has a superclass and implements a `render()` method.
|
||||
*/
|
||||
export default function isReactComponentClass(path: NodePath): path is NodePath<ClassDeclaration | ClassExpression>;
|
||||
66
frontend/node_modules/react-docgen/dist/utils/isReactComponentClass.js
generated
vendored
Normal file
66
frontend/node_modules/react-docgen/dist/utils/isReactComponentClass.js
generated
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
import isReactModuleName from './isReactModuleName.js';
|
||||
import resolveToModule from './resolveToModule.js';
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
import isDestructuringAssignment from './isDestructuringAssignment.js';
|
||||
import isImportSpecifier from './isImportSpecifier.js';
|
||||
function isRenderMethod(path) {
|
||||
if ((!path.isClassMethod() || path.node.kind !== 'method') &&
|
||||
!path.isClassProperty()) {
|
||||
return false;
|
||||
}
|
||||
if (path.node.computed || path.node.static) {
|
||||
return false;
|
||||
}
|
||||
const key = path.get('key');
|
||||
if (!key.isIdentifier() || key.node.name !== 'render') {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
function classExtendsReactComponent(path) {
|
||||
if (path.isMemberExpression()) {
|
||||
const property = path.get('property');
|
||||
if (property.isIdentifier({ name: 'Component' }) ||
|
||||
property.isIdentifier({ name: 'PureComponent' })) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (isImportSpecifier(path, 'Component') ||
|
||||
isImportSpecifier(path, 'PureComponent')) {
|
||||
return true;
|
||||
}
|
||||
else if (isDestructuringAssignment(path, 'Component') ||
|
||||
isDestructuringAssignment(path, 'PureComponent')) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Returns `true` of the path represents a class definition which either extends
|
||||
* `React.Component` or has a superclass and implements a `render()` method.
|
||||
*/
|
||||
export default function isReactComponentClass(path) {
|
||||
if (!path.isClass()) {
|
||||
return false;
|
||||
}
|
||||
// React.Component or React.PureComponent
|
||||
const superClass = path.get('superClass');
|
||||
if (superClass.hasNode()) {
|
||||
const resolvedSuperClass = resolveToValue(superClass);
|
||||
if (classExtendsReactComponent(resolvedSuperClass)) {
|
||||
const module = resolveToModule(resolvedSuperClass);
|
||||
if (module && isReactModuleName(module)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
// does not extend anything
|
||||
return false;
|
||||
}
|
||||
// render method
|
||||
if (path.get('body').get('body').some(isRenderMethod)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
5
frontend/node_modules/react-docgen/dist/utils/isReactComponentMethod.d.ts
generated
vendored
Normal file
5
frontend/node_modules/react-docgen/dist/utils/isReactComponentMethod.d.ts
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* Returns if the method path is a Component method.
|
||||
*/
|
||||
export default function (methodPath: NodePath): boolean;
|
||||
34
frontend/node_modules/react-docgen/dist/utils/isReactComponentMethod.js
generated
vendored
Normal file
34
frontend/node_modules/react-docgen/dist/utils/isReactComponentMethod.js
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
import getPropertyName from './getPropertyName.js';
|
||||
const componentMethods = [
|
||||
'componentDidMount',
|
||||
'componentDidReceiveProps',
|
||||
'componentDidUpdate',
|
||||
'componentWillMount',
|
||||
'UNSAFE_componentWillMount',
|
||||
'componentWillReceiveProps',
|
||||
'UNSAFE_componentWillReceiveProps',
|
||||
'componentWillUnmount',
|
||||
'componentWillUpdate',
|
||||
'UNSAFE_componentWillUpdate',
|
||||
'getChildContext',
|
||||
'getDefaultProps',
|
||||
'getInitialState',
|
||||
'render',
|
||||
'shouldComponentUpdate',
|
||||
'getDerivedStateFromProps',
|
||||
'getDerivedStateFromError',
|
||||
'getSnapshotBeforeUpdate',
|
||||
'componentDidCatch',
|
||||
];
|
||||
/**
|
||||
* Returns if the method path is a Component method.
|
||||
*/
|
||||
export default function (methodPath) {
|
||||
if (!methodPath.isClassMethod() &&
|
||||
!methodPath.isObjectMethod() &&
|
||||
!methodPath.isObjectProperty()) {
|
||||
return false;
|
||||
}
|
||||
const name = getPropertyName(methodPath);
|
||||
return Boolean(name && componentMethods.indexOf(name) !== -1);
|
||||
}
|
||||
13
frontend/node_modules/react-docgen/dist/utils/isReactCreateClassCall.d.ts
generated
vendored
Normal file
13
frontend/node_modules/react-docgen/dist/utils/isReactCreateClassCall.d.ts
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { CallExpression } from '@babel/types';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.createClass(...)` or
|
||||
* ```
|
||||
* import createReactClass from 'create-react-class';
|
||||
* createReactClass(...);
|
||||
* ```
|
||||
*/
|
||||
export default function isReactCreateClassCall(path: NodePath): path is NodePath<CallExpression & {
|
||||
__reactBuiltinTypeHint: true;
|
||||
}>;
|
||||
29
frontend/node_modules/react-docgen/dist/utils/isReactCreateClassCall.js
generated
vendored
Normal file
29
frontend/node_modules/react-docgen/dist/utils/isReactCreateClassCall.js
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
import resolveToModule from './resolveToModule.js';
|
||||
import isReactBuiltinCall from './isReactBuiltinCall.js';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* ```
|
||||
* import createReactClass from 'create-react-class';
|
||||
* createReactClass(...);
|
||||
* ```
|
||||
*/
|
||||
function isReactCreateClassCallModular(path) {
|
||||
if (!path.isCallExpression()) {
|
||||
return false;
|
||||
}
|
||||
const module = resolveToModule(path);
|
||||
return Boolean(module && module === 'create-react-class');
|
||||
}
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.createClass(...)` or
|
||||
* ```
|
||||
* import createReactClass from 'create-react-class';
|
||||
* createReactClass(...);
|
||||
* ```
|
||||
*/
|
||||
export default function isReactCreateClassCall(path) {
|
||||
return ((isReactBuiltinCall(path, 'createClass') &&
|
||||
path.get('arguments').length === 1) ||
|
||||
isReactCreateClassCallModular(path));
|
||||
}
|
||||
9
frontend/node_modules/react-docgen/dist/utils/isReactCreateElementCall.d.ts
generated
vendored
Normal file
9
frontend/node_modules/react-docgen/dist/utils/isReactCreateElementCall.d.ts
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { CallExpression } from '@babel/types';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.createElement(...)`.
|
||||
*/
|
||||
export default function isReactCreateElementCall(path: NodePath): path is NodePath<CallExpression & {
|
||||
__reactBuiltinTypeHint: true;
|
||||
}>;
|
||||
8
frontend/node_modules/react-docgen/dist/utils/isReactCreateElementCall.js
generated
vendored
Normal file
8
frontend/node_modules/react-docgen/dist/utils/isReactCreateElementCall.js
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import isReactBuiltinCall from './isReactBuiltinCall.js';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.createElement(...)`.
|
||||
*/
|
||||
export default function isReactCreateElementCall(path) {
|
||||
return isReactBuiltinCall(path, 'createElement');
|
||||
}
|
||||
9
frontend/node_modules/react-docgen/dist/utils/isReactForwardRefCall.d.ts
generated
vendored
Normal file
9
frontend/node_modules/react-docgen/dist/utils/isReactForwardRefCall.d.ts
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { CallExpression } from '@babel/types';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.forwardRef(...)`.
|
||||
*/
|
||||
export default function isReactForwardRefCall(path: NodePath): path is NodePath<CallExpression & {
|
||||
__reactBuiltinTypeHint: true;
|
||||
}>;
|
||||
9
frontend/node_modules/react-docgen/dist/utils/isReactForwardRefCall.js
generated
vendored
Normal file
9
frontend/node_modules/react-docgen/dist/utils/isReactForwardRefCall.js
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import isReactBuiltinCall from './isReactBuiltinCall.js';
|
||||
/**
|
||||
* Returns true if the expression is a function call of the form
|
||||
* `React.forwardRef(...)`.
|
||||
*/
|
||||
export default function isReactForwardRefCall(path) {
|
||||
return (isReactBuiltinCall(path, 'forwardRef') &&
|
||||
path.get('arguments').length === 1);
|
||||
}
|
||||
5
frontend/node_modules/react-docgen/dist/utils/isReactModuleName.d.ts
generated
vendored
Normal file
5
frontend/node_modules/react-docgen/dist/utils/isReactModuleName.d.ts
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
/**
|
||||
* Takes a module name (string) and returns true if it refers to a root react
|
||||
* module name.
|
||||
*/
|
||||
export default function isReactModuleName(moduleName: string): boolean;
|
||||
14
frontend/node_modules/react-docgen/dist/utils/isReactModuleName.js
generated
vendored
Normal file
14
frontend/node_modules/react-docgen/dist/utils/isReactModuleName.js
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
const reactModules = [
|
||||
'react',
|
||||
'react/addons',
|
||||
'react-native',
|
||||
'proptypes',
|
||||
'prop-types',
|
||||
];
|
||||
/**
|
||||
* Takes a module name (string) and returns true if it refers to a root react
|
||||
* module name.
|
||||
*/
|
||||
export default function isReactModuleName(moduleName) {
|
||||
return reactModules.includes(moduleName.toLowerCase());
|
||||
}
|
||||
5
frontend/node_modules/react-docgen/dist/utils/isRequiredPropType.d.ts
generated
vendored
Normal file
5
frontend/node_modules/react-docgen/dist/utils/isRequiredPropType.d.ts
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* Returns true of the prop is required, according to its type definition
|
||||
*/
|
||||
export default function isRequiredPropType(path: NodePath): boolean;
|
||||
8
frontend/node_modules/react-docgen/dist/utils/isRequiredPropType.js
generated
vendored
Normal file
8
frontend/node_modules/react-docgen/dist/utils/isRequiredPropType.js
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import getMembers from '../utils/getMembers.js';
|
||||
/**
|
||||
* Returns true of the prop is required, according to its type definition
|
||||
*/
|
||||
export default function isRequiredPropType(path) {
|
||||
return getMembers(path).some(({ computed, path: memberPath }) => (!computed && memberPath.isIdentifier({ name: 'isRequired' })) ||
|
||||
memberPath.isStringLiteral({ value: 'isRequired' }));
|
||||
}
|
||||
6
frontend/node_modules/react-docgen/dist/utils/isStatelessComponent.d.ts
generated
vendored
Normal file
6
frontend/node_modules/react-docgen/dist/utils/isStatelessComponent.d.ts
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { StatelessComponentNode } from '../resolver/index.js';
|
||||
/**
|
||||
* Returns `true` if the path represents a function which returns a JSXElement
|
||||
*/
|
||||
export default function isStatelessComponent(path: NodePath): path is NodePath<StatelessComponentNode>;
|
||||
28
frontend/node_modules/react-docgen/dist/utils/isStatelessComponent.js
generated
vendored
Normal file
28
frontend/node_modules/react-docgen/dist/utils/isStatelessComponent.js
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
import isReactCreateElementCall from './isReactCreateElementCall.js';
|
||||
import isReactCloneElementCall from './isReactCloneElementCall.js';
|
||||
import isReactChildrenElementCall from './isReactChildrenElementCall.js';
|
||||
import findFunctionReturn from './findFunctionReturn.js';
|
||||
const validPossibleStatelessComponentTypes = [
|
||||
'ArrowFunctionExpression',
|
||||
'FunctionDeclaration',
|
||||
'FunctionExpression',
|
||||
'ObjectMethod',
|
||||
];
|
||||
function isJSXElementOrReactCall(path) {
|
||||
return (path.isJSXElement() ||
|
||||
path.isJSXFragment() ||
|
||||
(path.isCallExpression() &&
|
||||
(isReactCreateElementCall(path) ||
|
||||
isReactCloneElementCall(path) ||
|
||||
isReactChildrenElementCall(path))));
|
||||
}
|
||||
/**
|
||||
* Returns `true` if the path represents a function which returns a JSXElement
|
||||
*/
|
||||
export default function isStatelessComponent(path) {
|
||||
if (!path.inType(...validPossibleStatelessComponentTypes)) {
|
||||
return false;
|
||||
}
|
||||
const foundPath = findFunctionReturn(path, isJSXElementOrReactCall);
|
||||
return Boolean(foundPath);
|
||||
}
|
||||
7
frontend/node_modules/react-docgen/dist/utils/isUnreachableFlowType.d.ts
generated
vendored
Normal file
7
frontend/node_modules/react-docgen/dist/utils/isUnreachableFlowType.d.ts
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* Returns true of the path is an unreachable TypePath
|
||||
* This evaluates the NodePaths returned from resolveToValue
|
||||
*/
|
||||
declare const _default: (path: NodePath) => boolean;
|
||||
export default _default;
|
||||
9
frontend/node_modules/react-docgen/dist/utils/isUnreachableFlowType.js
generated
vendored
Normal file
9
frontend/node_modules/react-docgen/dist/utils/isUnreachableFlowType.js
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/**
|
||||
* Returns true of the path is an unreachable TypePath
|
||||
* This evaluates the NodePaths returned from resolveToValue
|
||||
*/
|
||||
export default (path) => {
|
||||
return (path.isIdentifier() ||
|
||||
path.parentPath?.isImportDeclaration() ||
|
||||
path.isCallExpression());
|
||||
};
|
||||
22
frontend/node_modules/react-docgen/dist/utils/normalizeClassDefinition.d.ts
generated
vendored
Normal file
22
frontend/node_modules/react-docgen/dist/utils/normalizeClassDefinition.d.ts
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { ClassDeclaration, ClassExpression } from '@babel/types';
|
||||
/**
|
||||
* Given a class definition (i.e. `class` declaration or expression), this
|
||||
* function "normalizes" the definition, by looking for assignments of static
|
||||
* properties and converting them to ClassProperties.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* class MyComponent extends React.Component {
|
||||
* // ...
|
||||
* }
|
||||
* MyComponent.propTypes = { ... };
|
||||
*
|
||||
* is converted to
|
||||
*
|
||||
* class MyComponent extends React.Component {
|
||||
* // ...
|
||||
* static propTypes = { ... };
|
||||
* }
|
||||
*/
|
||||
export default function normalizeClassDefinition(classDefinition: NodePath<ClassDeclaration | ClassExpression>): void;
|
||||
92
frontend/node_modules/react-docgen/dist/utils/normalizeClassDefinition.js
generated
vendored
Normal file
92
frontend/node_modules/react-docgen/dist/utils/normalizeClassDefinition.js
generated
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
import { classProperty, inheritsComments } from '@babel/types';
|
||||
import getMemberExpressionRoot from '../utils/getMemberExpressionRoot.js';
|
||||
import getMembers from '../utils/getMembers.js';
|
||||
import { visitors } from '@babel/traverse';
|
||||
import { ignore } from './traverse.js';
|
||||
const explodedVisitors = visitors.explode({
|
||||
Function: { enter: ignore },
|
||||
Class: { enter: ignore },
|
||||
Loop: { enter: ignore },
|
||||
AssignmentExpression(path, state) {
|
||||
const left = path.get('left');
|
||||
if (left.isMemberExpression()) {
|
||||
const first = getMemberExpressionRoot(left);
|
||||
if (first.isIdentifier({ name: state.variableName })) {
|
||||
const [member] = getMembers(left);
|
||||
if (member &&
|
||||
!member.path.has('computed') &&
|
||||
!member.path.isPrivateName()) {
|
||||
const property = classProperty(member.path.node, path.node.right, null, null, false, true);
|
||||
inheritsComments(property, path.node);
|
||||
if (path.parentPath.isExpressionStatement()) {
|
||||
inheritsComments(property, path.parentPath.node);
|
||||
}
|
||||
state.classDefinition.get('body').unshiftContainer('body', property);
|
||||
path.skip();
|
||||
path.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
path.skip();
|
||||
}
|
||||
},
|
||||
});
|
||||
/**
|
||||
* Given a class definition (i.e. `class` declaration or expression), this
|
||||
* function "normalizes" the definition, by looking for assignments of static
|
||||
* properties and converting them to ClassProperties.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* class MyComponent extends React.Component {
|
||||
* // ...
|
||||
* }
|
||||
* MyComponent.propTypes = { ... };
|
||||
*
|
||||
* is converted to
|
||||
*
|
||||
* class MyComponent extends React.Component {
|
||||
* // ...
|
||||
* static propTypes = { ... };
|
||||
* }
|
||||
*/
|
||||
export default function normalizeClassDefinition(classDefinition) {
|
||||
let variableName;
|
||||
if (classDefinition.isClassDeclaration()) {
|
||||
// Class declarations may not have an id, e.g.: `export default class extends React.Component {}`
|
||||
if (classDefinition.node.id) {
|
||||
variableName = classDefinition.node.id.name;
|
||||
}
|
||||
}
|
||||
else if (classDefinition.isClassExpression()) {
|
||||
let parentPath = classDefinition.parentPath;
|
||||
while (parentPath &&
|
||||
parentPath.node !== classDefinition.scope.block &&
|
||||
!parentPath.isBlockStatement()) {
|
||||
if (parentPath.isVariableDeclarator()) {
|
||||
const idPath = parentPath.get('id');
|
||||
if (idPath.isIdentifier()) {
|
||||
variableName = idPath.node.name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (parentPath.isAssignmentExpression()) {
|
||||
const leftPath = parentPath.get('left');
|
||||
if (leftPath.isIdentifier()) {
|
||||
variableName = leftPath.node.name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
parentPath = parentPath.parentPath;
|
||||
}
|
||||
}
|
||||
if (!variableName) {
|
||||
return;
|
||||
}
|
||||
const state = {
|
||||
variableName,
|
||||
classDefinition,
|
||||
};
|
||||
classDefinition.parentPath.scope.path.traverse(explodedVisitors, state);
|
||||
}
|
||||
22
frontend/node_modules/react-docgen/dist/utils/parseJsDoc.d.ts
generated
vendored
Normal file
22
frontend/node_modules/react-docgen/dist/utils/parseJsDoc.d.ts
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
type JsDocType = JsDocBaseType | JsDocElementsType;
|
||||
interface JsDocBaseType {
|
||||
name: string;
|
||||
}
|
||||
interface JsDocElementsType extends JsDocBaseType {
|
||||
elements: JsDocType[];
|
||||
}
|
||||
interface JsDocProperty {
|
||||
description: string | null;
|
||||
type: JsDocType | null;
|
||||
}
|
||||
interface JsDocParam extends JsDocProperty {
|
||||
name: string;
|
||||
optional?: boolean;
|
||||
}
|
||||
interface JsDoc {
|
||||
description: string | null;
|
||||
params: JsDocParam[];
|
||||
returns: JsDocProperty | null;
|
||||
}
|
||||
export default function parseJsDoc(docblock: string): JsDoc;
|
||||
export {};
|
||||
91
frontend/node_modules/react-docgen/dist/utils/parseJsDoc.js
generated
vendored
Normal file
91
frontend/node_modules/react-docgen/dist/utils/parseJsDoc.js
generated
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
import doctrine from 'doctrine';
|
||||
function getType(tagType) {
|
||||
if (!tagType) {
|
||||
return null;
|
||||
}
|
||||
switch (tagType.type) {
|
||||
case 'NameExpression':
|
||||
// {a}
|
||||
return { name: tagType.name };
|
||||
case 'UnionType':
|
||||
// {a|b}
|
||||
return {
|
||||
name: 'union',
|
||||
elements: tagType.elements
|
||||
.map((element) => getType(element))
|
||||
.filter(Boolean),
|
||||
};
|
||||
case 'AllLiteral':
|
||||
// {*}
|
||||
return { name: 'mixed' };
|
||||
case 'TypeApplication':
|
||||
// {Array<string>} or {string[]}
|
||||
return {
|
||||
name: 'name' in tagType.expression ? tagType.expression.name : '',
|
||||
elements: tagType.applications
|
||||
.map((element) => getType(element))
|
||||
.filter(Boolean),
|
||||
};
|
||||
case 'ArrayType':
|
||||
// {[number, string]}
|
||||
return {
|
||||
name: 'tuple',
|
||||
elements: tagType.elements
|
||||
.map((element) => getType(element))
|
||||
.filter(Boolean),
|
||||
};
|
||||
default: {
|
||||
const typeName = 'name' in tagType && tagType.name
|
||||
? tagType.name
|
||||
: 'expression' in tagType &&
|
||||
tagType.expression &&
|
||||
'name' in tagType.expression
|
||||
? tagType.expression.name
|
||||
: null;
|
||||
if (typeName) {
|
||||
return { name: typeName };
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function getOptional(tag) {
|
||||
return !!(tag.type && tag.type.type && tag.type.type === 'OptionalType');
|
||||
}
|
||||
// Add jsdoc @return description.
|
||||
function getReturnsJsDoc(jsDoc) {
|
||||
const returnTag = jsDoc.tags.find((tag) => tag.title === 'return' || tag.title === 'returns');
|
||||
if (returnTag) {
|
||||
return {
|
||||
description: returnTag.description,
|
||||
type: getType(returnTag.type),
|
||||
};
|
||||
}
|
||||
return null;
|
||||
}
|
||||
// Add jsdoc @param descriptions.
|
||||
function getParamsJsDoc(jsDoc) {
|
||||
if (!jsDoc.tags) {
|
||||
return [];
|
||||
}
|
||||
return jsDoc.tags
|
||||
.filter((tag) => tag.title === 'param')
|
||||
.map((tag) => {
|
||||
return {
|
||||
name: tag.name || '',
|
||||
description: tag.description,
|
||||
type: getType(tag.type),
|
||||
optional: getOptional(tag),
|
||||
};
|
||||
});
|
||||
}
|
||||
export default function parseJsDoc(docblock) {
|
||||
const jsDoc = doctrine.parse(docblock);
|
||||
return {
|
||||
description: jsDoc.description || null,
|
||||
params: getParamsJsDoc(jsDoc),
|
||||
returns: getReturnsJsDoc(jsDoc),
|
||||
};
|
||||
}
|
||||
2
frontend/node_modules/react-docgen/dist/utils/postProcessDocumentation.d.ts
generated
vendored
Normal file
2
frontend/node_modules/react-docgen/dist/utils/postProcessDocumentation.d.ts
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
import type { Documentation } from '../Documentation.js';
|
||||
export default function (documentation: Documentation): Documentation;
|
||||
12
frontend/node_modules/react-docgen/dist/utils/postProcessDocumentation.js
generated
vendored
Normal file
12
frontend/node_modules/react-docgen/dist/utils/postProcessDocumentation.js
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
export default function (documentation) {
|
||||
const props = documentation.props;
|
||||
if (props) {
|
||||
Object.values(props).forEach((propInfo) => {
|
||||
// props with default values should not be required
|
||||
if (propInfo.defaultValue) {
|
||||
propInfo.required = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
return documentation;
|
||||
}
|
||||
5
frontend/node_modules/react-docgen/dist/utils/printValue.d.ts
generated
vendored
Normal file
5
frontend/node_modules/react-docgen/dist/utils/printValue.d.ts
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* Prints the given path without leading or trailing comments.
|
||||
*/
|
||||
export default function printValue(path: NodePath): string;
|
||||
18
frontend/node_modules/react-docgen/dist/utils/printValue.js
generated
vendored
Normal file
18
frontend/node_modules/react-docgen/dist/utils/printValue.js
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
import strip from 'strip-indent';
|
||||
function deindent(code) {
|
||||
const firstNewLine = code.indexOf('\n');
|
||||
return (code.slice(0, firstNewLine + 1) +
|
||||
// remove indentation from all lines except first.
|
||||
strip(code.slice(firstNewLine + 1)));
|
||||
}
|
||||
/**
|
||||
* Prints the given path without leading or trailing comments.
|
||||
*/
|
||||
export default function printValue(path) {
|
||||
let source = path.getSource();
|
||||
// variable declarations and interface/type/class members might end with one of these
|
||||
if (source.endsWith(',') || source.endsWith(';')) {
|
||||
source = source.slice(0, -1);
|
||||
}
|
||||
return deindent(source);
|
||||
}
|
||||
3
frontend/node_modules/react-docgen/dist/utils/resolveExportDeclaration.d.ts
generated
vendored
Normal file
3
frontend/node_modules/react-docgen/dist/utils/resolveExportDeclaration.d.ts
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
import type { ExportDefaultDeclaration, ExportNamedDeclaration } from '@babel/types';
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
export default function resolveExportDeclaration(path: NodePath<ExportDefaultDeclaration | ExportNamedDeclaration>): NodePath[];
|
||||
28
frontend/node_modules/react-docgen/dist/utils/resolveExportDeclaration.js
generated
vendored
Normal file
28
frontend/node_modules/react-docgen/dist/utils/resolveExportDeclaration.js
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
export default function resolveExportDeclaration(path) {
|
||||
const definitions = [];
|
||||
if (path.isExportDefaultDeclaration()) {
|
||||
definitions.push(path.get('declaration'));
|
||||
}
|
||||
else if (path.isExportNamedDeclaration()) {
|
||||
if (path.has('declaration')) {
|
||||
const declaration = path.get('declaration');
|
||||
if (declaration.isVariableDeclaration()) {
|
||||
declaration
|
||||
.get('declarations')
|
||||
.forEach((declarator) => definitions.push(declarator));
|
||||
}
|
||||
else if (declaration.isDeclaration()) {
|
||||
definitions.push(declaration);
|
||||
}
|
||||
}
|
||||
else if (path.has('specifiers')) {
|
||||
path.get('specifiers').forEach((specifier) => {
|
||||
if (specifier.isExportSpecifier()) {
|
||||
definitions.push(specifier.get('local'));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
return definitions.map((definition) => resolveToValue(definition));
|
||||
}
|
||||
3
frontend/node_modules/react-docgen/dist/utils/resolveFunctionDefinitionToReturnValue.d.ts
generated
vendored
Normal file
3
frontend/node_modules/react-docgen/dist/utils/resolveFunctionDefinitionToReturnValue.d.ts
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { Expression, Function as BabelFunction } from '@babel/types';
|
||||
export default function resolveFunctionDefinitionToReturnValue(path: NodePath<BabelFunction>): NodePath<Expression> | null;
|
||||
23
frontend/node_modules/react-docgen/dist/utils/resolveFunctionDefinitionToReturnValue.js
generated
vendored
Normal file
23
frontend/node_modules/react-docgen/dist/utils/resolveFunctionDefinitionToReturnValue.js
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
import { visitors } from '@babel/traverse';
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
import { ignore, shallowIgnoreVisitors } from './traverse.js';
|
||||
const explodedVisitors = visitors.explode({
|
||||
...shallowIgnoreVisitors,
|
||||
Function: { enter: ignore },
|
||||
ReturnStatement: {
|
||||
enter: function (nodePath, state) {
|
||||
const argument = nodePath.get('argument');
|
||||
if (argument.hasNode()) {
|
||||
state.returnPath = resolveToValue(argument);
|
||||
return nodePath.stop();
|
||||
}
|
||||
nodePath.skip();
|
||||
},
|
||||
},
|
||||
});
|
||||
export default function resolveFunctionDefinitionToReturnValue(path) {
|
||||
const body = path.get('body');
|
||||
const state = {};
|
||||
body.traverse(explodedVisitors, state);
|
||||
return state.returnPath || null;
|
||||
}
|
||||
7
frontend/node_modules/react-docgen/dist/utils/resolveGenericTypeAnnotation.d.ts
generated
vendored
Normal file
7
frontend/node_modules/react-docgen/dist/utils/resolveGenericTypeAnnotation.d.ts
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* Given an React component (stateless or class) tries to find the
|
||||
* flow or ts type for the props. If not found or not one of the supported
|
||||
* component types returns undefined.
|
||||
*/
|
||||
export default function resolveGenericTypeAnnotation(path: NodePath): NodePath | undefined;
|
||||
33
frontend/node_modules/react-docgen/dist/utils/resolveGenericTypeAnnotation.js
generated
vendored
Normal file
33
frontend/node_modules/react-docgen/dist/utils/resolveGenericTypeAnnotation.js
generated
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
import isUnreachableFlowType from '../utils/isUnreachableFlowType.js';
|
||||
import resolveToValue from '../utils/resolveToValue.js';
|
||||
import { unwrapUtilityType } from './flowUtilityTypes.js';
|
||||
import getTypeIdentifier from './getTypeIdentifier.js';
|
||||
function tryResolveGenericTypeAnnotation(path) {
|
||||
let typePath = unwrapUtilityType(path);
|
||||
const idPath = getTypeIdentifier(typePath);
|
||||
if (idPath) {
|
||||
typePath = resolveToValue(idPath);
|
||||
if (isUnreachableFlowType(typePath)) {
|
||||
return;
|
||||
}
|
||||
if (typePath.isTypeAlias()) {
|
||||
return tryResolveGenericTypeAnnotation(typePath.get('right'));
|
||||
}
|
||||
else if (typePath.isTSTypeAliasDeclaration()) {
|
||||
return tryResolveGenericTypeAnnotation(typePath.get('typeAnnotation'));
|
||||
}
|
||||
return typePath;
|
||||
}
|
||||
return typePath;
|
||||
}
|
||||
/**
|
||||
* Given an React component (stateless or class) tries to find the
|
||||
* flow or ts type for the props. If not found or not one of the supported
|
||||
* component types returns undefined.
|
||||
*/
|
||||
export default function resolveGenericTypeAnnotation(path) {
|
||||
const typePath = tryResolveGenericTypeAnnotation(path);
|
||||
if (!typePath || typePath === path)
|
||||
return;
|
||||
return typePath;
|
||||
}
|
||||
8
frontend/node_modules/react-docgen/dist/utils/resolveHOC.d.ts
generated
vendored
Normal file
8
frontend/node_modules/react-docgen/dist/utils/resolveHOC.d.ts
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* If the path is a call expression, it recursively resolves to the
|
||||
* rightmost argument, stopping if it finds a React.createClass call expression
|
||||
*
|
||||
* Else the path itself is returned.
|
||||
*/
|
||||
export default function resolveHOC(path: NodePath): NodePath;
|
||||
32
frontend/node_modules/react-docgen/dist/utils/resolveHOC.js
generated
vendored
Normal file
32
frontend/node_modules/react-docgen/dist/utils/resolveHOC.js
generated
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
import isReactCreateClassCall from './isReactCreateClassCall.js';
|
||||
import isReactForwardRefCall from './isReactForwardRefCall.js';
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
/**
|
||||
* If the path is a call expression, it recursively resolves to the
|
||||
* rightmost argument, stopping if it finds a React.createClass call expression
|
||||
*
|
||||
* Else the path itself is returned.
|
||||
*/
|
||||
export default function resolveHOC(path) {
|
||||
if (path.isCallExpression() &&
|
||||
!isReactCreateClassCall(path) &&
|
||||
!isReactForwardRefCall(path)) {
|
||||
const node = path.node;
|
||||
const argumentLength = node.arguments.length;
|
||||
if (argumentLength && argumentLength > 0) {
|
||||
const args = path.get('arguments');
|
||||
const firstArg = args[0];
|
||||
// If the first argument is one of these types then the component might be the last argument
|
||||
// If there are all identifiers then we cannot figure out exactly and have to assume it is the first
|
||||
if (argumentLength > 1 &&
|
||||
(firstArg.isLiteral() ||
|
||||
firstArg.isObjectExpression() ||
|
||||
firstArg.isArrayExpression() ||
|
||||
firstArg.isSpreadElement())) {
|
||||
return resolveHOC(resolveToValue(args[argumentLength - 1]));
|
||||
}
|
||||
return resolveHOC(resolveToValue(firstArg));
|
||||
}
|
||||
}
|
||||
return path;
|
||||
}
|
||||
12
frontend/node_modules/react-docgen/dist/utils/resolveObjectKeysToArray.d.ts
generated
vendored
Normal file
12
frontend/node_modules/react-docgen/dist/utils/resolveObjectKeysToArray.d.ts
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
export declare function resolveObjectToNameArray(objectPath: NodePath, raw?: boolean): string[] | null;
|
||||
/**
|
||||
* Returns an ArrayExpression which contains all the keys resolved from an object
|
||||
*
|
||||
* Ignores setters in objects
|
||||
*
|
||||
* Returns null in case of
|
||||
* unresolvable spreads
|
||||
* computed identifier keys
|
||||
*/
|
||||
export default function resolveObjectKeysToArray(path: NodePath): string[] | null;
|
||||
110
frontend/node_modules/react-docgen/dist/utils/resolveObjectKeysToArray.js
generated
vendored
Normal file
110
frontend/node_modules/react-docgen/dist/utils/resolveObjectKeysToArray.js
generated
vendored
Normal file
@@ -0,0 +1,110 @@
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
function isObjectKeysCall(path) {
|
||||
if (!path.isCallExpression() || path.get('arguments').length !== 1) {
|
||||
return false;
|
||||
}
|
||||
const callee = path.get('callee');
|
||||
if (!callee.isMemberExpression()) {
|
||||
return false;
|
||||
}
|
||||
const object = callee.get('object');
|
||||
const property = callee.get('property');
|
||||
return (object.isIdentifier({ name: 'Object' }) &&
|
||||
property.isIdentifier({ name: 'keys' }));
|
||||
}
|
||||
function isWhitelistedObjectProperty(path) {
|
||||
if (path.isSpreadElement())
|
||||
return true;
|
||||
if (path.isObjectProperty() ||
|
||||
(path.isObjectMethod() &&
|
||||
(path.node.kind === 'get' || path.node.kind === 'set'))) {
|
||||
const key = path.get('key');
|
||||
return ((key.isIdentifier() && !path.node.computed) ||
|
||||
key.isStringLiteral() ||
|
||||
key.isNumericLiteral());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function isWhiteListedObjectTypeProperty(path) {
|
||||
return (path.isObjectTypeProperty() ||
|
||||
path.isObjectTypeSpreadProperty() ||
|
||||
path.isTSPropertySignature());
|
||||
}
|
||||
// Resolves an ObjectExpression or an ObjectTypeAnnotation
|
||||
export function resolveObjectToNameArray(objectPath, raw = false) {
|
||||
if ((objectPath.isObjectExpression() &&
|
||||
objectPath.get('properties').every(isWhitelistedObjectProperty)) ||
|
||||
(objectPath.isObjectTypeAnnotation() &&
|
||||
objectPath.get('properties').every(isWhiteListedObjectTypeProperty)) ||
|
||||
(objectPath.isTSTypeLiteral() &&
|
||||
objectPath.get('members').every(isWhiteListedObjectTypeProperty))) {
|
||||
let values = [];
|
||||
let error = false;
|
||||
const properties = objectPath.isTSTypeLiteral()
|
||||
? objectPath.get('members')
|
||||
: objectPath.get('properties');
|
||||
properties.forEach((propPath) => {
|
||||
if (error)
|
||||
return;
|
||||
if (propPath.isObjectProperty() ||
|
||||
propPath.isObjectMethod() ||
|
||||
propPath.isObjectTypeProperty() ||
|
||||
propPath.isTSPropertySignature()) {
|
||||
const key = propPath.get('key');
|
||||
// Key is either Identifier or Literal
|
||||
const name = key.isIdentifier()
|
||||
? key.node.name
|
||||
: raw
|
||||
? key.node.extra?.raw
|
||||
: `${key.node.value}`;
|
||||
values.push(name);
|
||||
}
|
||||
else if (propPath.isSpreadElement() ||
|
||||
propPath.isObjectTypeSpreadProperty()) {
|
||||
let spreadObject = resolveToValue(propPath.get('argument'));
|
||||
if (spreadObject.isGenericTypeAnnotation()) {
|
||||
const typeAliasRight = resolveToValue(spreadObject.get('id')).get('right');
|
||||
if (typeAliasRight.isObjectTypeAnnotation()) {
|
||||
spreadObject = resolveToValue(typeAliasRight);
|
||||
}
|
||||
}
|
||||
const spreadValues = resolveObjectToNameArray(spreadObject);
|
||||
if (!spreadValues) {
|
||||
error = true;
|
||||
return;
|
||||
}
|
||||
values = [...values, ...spreadValues];
|
||||
}
|
||||
});
|
||||
if (!error) {
|
||||
return values;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Returns an ArrayExpression which contains all the keys resolved from an object
|
||||
*
|
||||
* Ignores setters in objects
|
||||
*
|
||||
* Returns null in case of
|
||||
* unresolvable spreads
|
||||
* computed identifier keys
|
||||
*/
|
||||
export default function resolveObjectKeysToArray(path) {
|
||||
if (isObjectKeysCall(path)) {
|
||||
const argument = path.get('arguments')[0];
|
||||
const objectExpression = resolveToValue(
|
||||
// isObjectKeysCall already asserts that there is at least one argument, hence the non-null-assertion
|
||||
argument);
|
||||
const values = resolveObjectToNameArray(objectExpression);
|
||||
if (values) {
|
||||
const nodes = values
|
||||
//filter duplicates
|
||||
.filter((value, index, array) => array.indexOf(value) === index)
|
||||
.map((value) => `"${value}"`);
|
||||
return nodes;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
7
frontend/node_modules/react-docgen/dist/utils/resolveObjectPatternPropertyToValue.d.ts
generated
vendored
Normal file
7
frontend/node_modules/react-docgen/dist/utils/resolveObjectPatternPropertyToValue.d.ts
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
import type { ObjectProperty } from '@babel/types';
|
||||
/**
|
||||
* Resolve and ObjectProperty inside an ObjectPattern to its value if possible
|
||||
* If not found `null` is returned
|
||||
*/
|
||||
export default function resolveObjectPatternPropertyToValue(path: NodePath<ObjectProperty>): NodePath | null;
|
||||
35
frontend/node_modules/react-docgen/dist/utils/resolveObjectPatternPropertyToValue.js
generated
vendored
Normal file
35
frontend/node_modules/react-docgen/dist/utils/resolveObjectPatternPropertyToValue.js
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
import getPropertyValuePath from './getPropertyValuePath.js';
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
function resolveToObjectExpression(path) {
|
||||
if (path.isVariableDeclarator()) {
|
||||
const init = path.get('init');
|
||||
if (init.hasNode()) {
|
||||
return resolveToValue(init);
|
||||
}
|
||||
}
|
||||
else if (path.isAssignmentExpression()) {
|
||||
if (path.node.operator === '=') {
|
||||
return resolveToValue(path.get('right'));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Resolve and ObjectProperty inside an ObjectPattern to its value if possible
|
||||
* If not found `null` is returned
|
||||
*/
|
||||
export default function resolveObjectPatternPropertyToValue(path) {
|
||||
if (!path.parentPath.isObjectPattern()) {
|
||||
return null;
|
||||
}
|
||||
const resolved = resolveToObjectExpression(path.parentPath.parentPath);
|
||||
if (resolved && resolved.isObjectExpression()) {
|
||||
const propertyPath = getPropertyValuePath(resolved,
|
||||
// Always id in ObjectPattern
|
||||
path.get('key').node.name);
|
||||
if (propertyPath) {
|
||||
return resolveToValue(propertyPath);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
11
frontend/node_modules/react-docgen/dist/utils/resolveObjectValuesToArray.d.ts
generated
vendored
Normal file
11
frontend/node_modules/react-docgen/dist/utils/resolveObjectValuesToArray.d.ts
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
import type { NodePath } from '@babel/traverse';
|
||||
/**
|
||||
* Returns an ArrayExpression which contains all the values resolved from an object
|
||||
*
|
||||
* Ignores setters in objects
|
||||
*
|
||||
* Returns null in case of
|
||||
* unresolvable spreads
|
||||
* computed identifier values
|
||||
*/
|
||||
export default function resolveObjectValuesToArray(path: NodePath): string[] | null;
|
||||
86
frontend/node_modules/react-docgen/dist/utils/resolveObjectValuesToArray.js
generated
vendored
Normal file
86
frontend/node_modules/react-docgen/dist/utils/resolveObjectValuesToArray.js
generated
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
import resolveToValue from './resolveToValue.js';
|
||||
function isObjectValuesCall(path) {
|
||||
if (!path.isCallExpression() || path.node.arguments.length !== 1) {
|
||||
return false;
|
||||
}
|
||||
const callee = path.get('callee');
|
||||
if (!callee.isMemberExpression()) {
|
||||
return false;
|
||||
}
|
||||
const object = callee.get('object');
|
||||
const property = callee.get('property');
|
||||
return (object.isIdentifier({ name: 'Object' }) &&
|
||||
property.isIdentifier({ name: 'values' }));
|
||||
}
|
||||
// Resolves an ObjectExpression or an ObjectTypeAnnotation
|
||||
function resolveObjectToPropMap(object) {
|
||||
if (object.isObjectExpression()) {
|
||||
const values = new Map();
|
||||
let error = false;
|
||||
object.get('properties').forEach((propPath) => {
|
||||
if (error || propPath.isObjectMethod())
|
||||
return;
|
||||
if (propPath.isObjectProperty()) {
|
||||
const key = propPath.get('key');
|
||||
let name;
|
||||
// Key is either Identifier or Literal
|
||||
if (key.isIdentifier()) {
|
||||
name = key.node.name;
|
||||
}
|
||||
else if (key.isNumericLiteral() || key.isStringLiteral()) {
|
||||
name = `${key.node.value}`;
|
||||
}
|
||||
else {
|
||||
error = true;
|
||||
return;
|
||||
}
|
||||
const valuePath = resolveToValue(propPath.get('value'));
|
||||
const value = valuePath.isStringLiteral()
|
||||
? `"${valuePath.node.value}"`
|
||||
: valuePath.isNumericLiteral()
|
||||
? `${valuePath.node.value}`
|
||||
: // we return null here because there are a lot of cases and we don't know yet what we need to handle
|
||||
'null';
|
||||
values.set(name, value);
|
||||
}
|
||||
else if (propPath.isSpreadElement()) {
|
||||
const spreadObject = resolveToValue(propPath.get('argument'));
|
||||
const spreadValues = resolveObjectToPropMap(spreadObject);
|
||||
if (!spreadValues) {
|
||||
error = true;
|
||||
return;
|
||||
}
|
||||
for (const entry of spreadValues.entries()) {
|
||||
const [key, value] = entry;
|
||||
values.set(key, value);
|
||||
}
|
||||
}
|
||||
});
|
||||
if (!error) {
|
||||
return values;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Returns an ArrayExpression which contains all the values resolved from an object
|
||||
*
|
||||
* Ignores setters in objects
|
||||
*
|
||||
* Returns null in case of
|
||||
* unresolvable spreads
|
||||
* computed identifier values
|
||||
*/
|
||||
export default function resolveObjectValuesToArray(path) {
|
||||
if (isObjectValuesCall(path)) {
|
||||
const argument = path.get('arguments')[0];
|
||||
const objectExpression = resolveToValue(
|
||||
// isObjectValuesCall already asserts that there is at least one argument, hence the non-null-assertion
|
||||
argument);
|
||||
const values = resolveObjectToPropMap(objectExpression);
|
||||
if (values) {
|
||||
return Array.from(values.values());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user