📄 misc.ts¶
📊 Analysis Summary¶
| Metric | Count |
|---|---|
| 🔧 Functions | 15 |
| 📦 Imports | 7 |
| 📊 Variables & Constants | 5 |
| 📑 Type Aliases | 4 |
| 🎯 Enums | 1 |
📚 Table of Contents¶
🛠️ File Location:¶
📂 packages/eslint-plugin/src/util/misc.ts
📦 Imports¶
| Name | Source |
|---|---|
TSESLint |
@typescript-eslint/utils |
TSESTree |
@typescript-eslint/utils |
RuleContext |
@typescript-eslint/utils/ts-eslint |
requiresQuoting |
@typescript-eslint/type-utils |
AST_NODE_TYPES |
@typescript-eslint/utils |
getStaticValue |
./astUtils |
isParenthesized |
./astUtils |
Variables & Constants¶
| Name | Type | Kind | Value | Exported |
|---|---|---|---|---|
DEFINITION_EXTENSIONS |
readonly [any, any, any] |
const | `[ | |
| ts.Extension.Dts, | ||||
| ts.Extension.Dcts, | ||||
| ts.Extension.Dmts, | ||||
| ] as const` | ✗ | |||
groups |
Map<Key, T[]> |
const | new Map<Key, T[]>() |
✗ |
name |
string |
const | ${member.key.value} |
✗ |
idx |
number |
let/var | members.length - 1 |
✗ |
key |
any |
const | node.type === AST_NODE_TYPES.MemberExpression ? node.property : node.key |
✗ |
Functions¶
isDefinitionFile(fileName: string): boolean¶
Code
-
JSDoc:
-
Parameters:
fileName: string- Return Type:
boolean - Calls:
fileName.toLowerCaselowerFileName.endsWith/\.d\.(ts|cts|mts|.*\.ts)$/.test
upperCaseFirst(str: string): string¶
Code
-
JSDoc:
-
Parameters:
str: string- Return Type:
string - Calls:
str[0].toUpperCasestr.slice
arrayGroupByToMap(array: T[], getKey: (item: T) => Key): Map<Key, T[]>¶
Code
export function arrayGroupByToMap<T, Key extends number | string>(
array: T[],
getKey: (item: T) => Key,
): Map<Key, T[]> {
const groups = new Map<Key, T[]>();
for (const item of array) {
const key = getKey(item);
const existing = groups.get(key);
if (existing) {
existing.push(item);
} else {
groups.set(key, [item]);
}
}
return groups;
}
- Parameters:
array: T[]getKey: (item: T) => Key- Return Type:
Map<Key, T[]> - Calls:
getKeygroups.getexisting.pushgroups.set
arraysAreEqual(a: T[] | undefined, b: T[] | undefined, eq: (a: T, b: T) => boolean): boolean¶
Code
- Parameters:
a: T[] | undefinedb: T[] | undefinedeq: (a: T, b: T) => boolean- Return Type:
boolean - Calls:
a.everyeq
findFirstResult(inputs: T[], getResult: (t: T) => U | undefined): U | undefined¶
Code
export function findFirstResult<T, U>(
inputs: T[],
getResult: (t: T) => U | undefined,
): U | undefined {
for (const element of inputs) {
const result = getResult(element);
// eslint-disable-next-line @typescript-eslint/internal/eqeq-nullish
if (result !== undefined) {
return result;
}
}
return undefined;
}
-
JSDoc:
-
Parameters:
inputs: T[]getResult: (t: T) => U | undefined- Return Type:
U | undefined - Calls:
getResult- Internal Comments:
getNameFromIndexSignature(node: TSESTree.TSIndexSignature): string¶
Code
export function getNameFromIndexSignature(
node: TSESTree.TSIndexSignature,
): string {
const propName: TSESTree.PropertyName | undefined = node.parameters.find(
(parameter: TSESTree.Parameter): parameter is TSESTree.Identifier =>
parameter.type === AST_NODE_TYPES.Identifier,
);
return propName ? propName.name : '(index signature)';
}
-
JSDoc:
-
Parameters:
node: TSESTree.TSIndexSignature- Return Type:
string - Calls:
node.parameters.find
`getNameFromMember(member: | TSESTree.AccessorProperty¶
| TSESTree.MethodDefinition
| TSESTree.Property
| TSESTree.PropertyDefinition
| TSESTree.TSAbstractAccessorProperty
| TSESTree.TSAbstractMethodDefinition
| TSESTree.TSAbstractPropertyDefinition
| TSESTree.TSMethodSignature
| TSESTree.TSPropertySignature, sourceCode: TSESLint.SourceCode): { name: string; type: MemberNameType }`
Code
export function getNameFromMember(
member:
| TSESTree.AccessorProperty
| TSESTree.MethodDefinition
| TSESTree.Property
| TSESTree.PropertyDefinition
| TSESTree.TSAbstractAccessorProperty
| TSESTree.TSAbstractMethodDefinition
| TSESTree.TSAbstractPropertyDefinition
| TSESTree.TSMethodSignature
| TSESTree.TSPropertySignature,
sourceCode: TSESLint.SourceCode,
): { name: string; type: MemberNameType } {
if (member.key.type === AST_NODE_TYPES.Identifier) {
return {
name: member.key.name,
type: MemberNameType.Normal,
};
}
if (member.key.type === AST_NODE_TYPES.PrivateIdentifier) {
return {
name: `#${member.key.name}`,
type: MemberNameType.Private,
};
}
if (member.key.type === AST_NODE_TYPES.Literal) {
const name = `${member.key.value}`;
if (requiresQuoting(name)) {
return {
name: `"${name}"`,
type: MemberNameType.Quoted,
};
}
return {
name,
type: MemberNameType.Normal,
};
}
return {
name: sourceCode.text.slice(...member.key.range),
type: MemberNameType.Expression,
};
}
-
JSDoc:
-
Parameters:
member: | TSESTree.AccessorProperty | TSESTree.MethodDefinition | TSESTree.Property | TSESTree.PropertyDefinition | TSESTree.TSAbstractAccessorProperty | TSESTree.TSAbstractMethodDefinition | TSESTree.TSAbstractPropertyDefinition | TSESTree.TSMethodSignature | TSESTree.TSPropertySignaturesourceCode: TSESLint.SourceCode- Return Type:
{ name: string; type: MemberNameType } - Calls:
requiresQuoting (from @typescript-eslint/type-utils)sourceCode.text.slice
getEnumNames(myEnum: Record<T, unknown>): T[]¶
Code
- Parameters:
myEnum: Record<T, unknown>- Return Type:
T[] - Calls:
Object.keys(myEnum).filterisNaNNumber
formatWordList(words: string[]): string¶
Code
-
JSDoc:
-
Parameters:
words: string[]- Return Type:
string - Calls:
[words.slice(0, -1).join(', '), words.slice(-1)[0]].joinwords.slice(0, -1).joinwords.slice
findLastIndex(members: T[], predicate: (member: T) => boolean | null | undefined): number¶
Code
-
JSDoc:
-
Parameters:
members: T[]predicate: (member: T) => boolean | null | undefined- Return Type:
number - Calls:
predicate
typeNodeRequiresParentheses(node: TSESTree.TypeNode, text: string): boolean¶
Code
export function typeNodeRequiresParentheses(
node: TSESTree.TypeNode,
text: string,
): boolean {
return (
node.type === AST_NODE_TYPES.TSFunctionType ||
node.type === AST_NODE_TYPES.TSConstructorType ||
node.type === AST_NODE_TYPES.TSConditionalType ||
(node.type === AST_NODE_TYPES.TSUnionType && text.startsWith('|')) ||
(node.type === AST_NODE_TYPES.TSIntersectionType && text.startsWith('&'))
);
}
- Parameters:
node: TSESTree.TypeNodetext: string- Return Type:
boolean - Calls:
text.startsWith
isRestParameterDeclaration(decl: ts.Declaration): boolean¶
Code
- Parameters:
decl: ts.Declaration- Return Type:
boolean - Calls:
ts.isParameter
isParenlessArrowFunction(node: TSESTree.ArrowFunctionExpression, sourceCode: TSESLint.SourceCode): boolean¶
Code
- Parameters:
node: TSESTree.ArrowFunctionExpressionsourceCode: TSESLint.SourceCode- Return Type:
boolean - Calls:
isParenthesized (from ./astUtils)
getStaticMemberAccessValue(node: NodeWithKey, { sourceCode }: RuleContext<string, unknown[]>): string | symbol | undefined¶
Code
export function getStaticMemberAccessValue(
node: NodeWithKey,
{ sourceCode }: RuleContext<string, unknown[]>,
): string | symbol | undefined {
const key =
node.type === AST_NODE_TYPES.MemberExpression ? node.property : node.key;
const { type } = key;
if (
!node.computed &&
(type === AST_NODE_TYPES.Identifier ||
type === AST_NODE_TYPES.PrivateIdentifier)
) {
return key.name;
}
const result = getStaticValue(key, sourceCode.getScope(node));
if (!result) {
return undefined;
}
const { value } = result;
return typeof value === 'symbol' ? value : String(value);
}
-
JSDoc:
/** * Gets a member being accessed or declared if its value can be determined statically, and * resolves it to the string or symbol value that will be used as the actual member * access key at runtime. Otherwise, returns `undefined`. * * ```ts * x.member // returns 'member' * ^^^^^^^^ * * x?.member // returns 'member' (optional chaining is treated the same) * ^^^^^^^^^ * * x['value'] // returns 'value' * ^^^^^^^^^^ * * x[Math.random()] // returns undefined (not a static value) * ^^^^^^^^^^^^^^^^ * * arr[0] // returns '0' (NOT 0) * ^^^^^^ * * arr[0n] // returns '0' (NOT 0n) * ^^^^^^^ * * const s = Symbol.for('symbolName') * x[s] // returns `Symbol.for('symbolName')` (since it's a static/global symbol) * ^^^^ * * const us = Symbol('symbolName') * x[us] // returns undefined (since it's a unique symbol, so not statically analyzable) * ^^^^^ * * var object = { * 1234: '4567', // returns '1234' (NOT 1234) * ^^^^^^^^^^^^ * method() { } // returns 'method' * ^^^^^^^^^^^^ * } * * class WithMembers { * foo: string // returns 'foo' * ^^^^^^^^^^^ * } * ``` */ -
Parameters:
node: NodeWithKey{ sourceCode }: RuleContext<string, unknown[]>- Return Type:
string | symbol | undefined - Calls:
getStaticValue (from ./astUtils)sourceCode.getScopeString
isStaticMemberAccessOfValue(memberExpression: NodeWithKey, context: RuleContext<string, unknown[]>, values: (string | symbol)[]): boolean¶
Code
- Parameters:
memberExpression: NodeWithKeycontext: RuleContext<string, unknown[]>values: (string | symbol)[]- Return Type:
boolean - Calls:
(values as (string | symbol | undefined)[]).includes
Type Aliases¶
Equal<T>¶
/* Return true if both parameters are equal. /
ExcludeKeys<Obj extends Record<string, unknown> extends Record<string, unknown>, Keys extends keyof Obj extends keyof Obj>¶
type ExcludeKeys<Obj extends Record<string, unknown> extends Record<string, unknown>, Keys extends keyof Obj extends keyof Obj> = { [k in Exclude<keyof Obj, Keys>]: Obj[k] };
RequireKeys<Obj extends Record<string, unknown> extends Record<string, unknown>, Keys extends keyof Obj extends keyof Obj>¶
type RequireKeys<Obj extends Record<string, unknown> extends Record<string, unknown>, Keys extends keyof Obj extends keyof Obj> = { [k in Keys]-?: Exclude<Obj[k], undefined> } & ExcludeKeys<Obj, Keys>;
NodeWithKey¶
type NodeWithKey = | TSESTree.AccessorProperty
| TSESTree.MemberExpression
| TSESTree.MethodDefinition
| TSESTree.Property
| TSESTree.PropertyDefinition
| TSESTree.TSAbstractMethodDefinition
| TSESTree.TSAbstractPropertyDefinition;
Enums¶
enum MemberNameType¶
Members¶
| Name | Value | Description |
|---|---|---|
Private |
1 |
|
Quoted |
2 |
|
Normal |
3 |
|
Expression |
4 |