chore: Add eslint rule for no-shadow (#6658)

* chore: Add eslint rule for no-shadow

* fix
This commit is contained in:
Tom Moor
2024-03-09 14:04:27 -07:00
committed by GitHub
parent fc37070ac8
commit fe4c2fb7d6
18 changed files with 52 additions and 48 deletions

View File

@@ -32,11 +32,19 @@
"object-shorthand": "error", "object-shorthand": "error",
"no-mixed-operators": "off", "no-mixed-operators": "off",
"no-useless-escape": "off", "no-useless-escape": "off",
"no-shadow": "off",
"es/no-regexp-lookbehind-assertions": "error", "es/no-regexp-lookbehind-assertions": "error",
"react/self-closing-comp": ["error", { "react/self-closing-comp": ["error", {
"component": true, "component": true,
"html": true "html": true
}], }],
"@typescript-eslint/no-shadow": [
"warn",
{
"hoist": "all",
"ignoreTypeValueShadow": true
}
],
"@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-floating-promises": "error", "@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/await-thenable": "error", "@typescript-eslint/await-thenable": "error",

View File

@@ -390,7 +390,7 @@ export class Editor extends React.PureComponent<
private createPasteParser() { private createPasteParser() {
return this.extensions.parser({ return this.extensions.parser({
schema: this.schema, schema: this.schema,
rules: { linkify: true, emoji: false }, rules: { linkify: true },
plugins: this.rulePlugins, plugins: this.rulePlugins,
}); });
} }

View File

@@ -59,12 +59,9 @@ api.use(apiResponse());
api.use(editor()); api.use(editor());
// Register plugin API routes before others to allow for overrides // Register plugin API routes before others to allow for overrides
const plugins = PluginManager.getEnabledPlugins(PluginType.API).map( PluginManager.getEnabledPlugins(PluginType.API).forEach((plugin) =>
(plugin) => plugin.value router.use("/", plugin.value.routes())
); );
for (const plugin of plugins) {
router.use("/", plugin.routes());
}
// routes // routes
router.use("/", auth.routes()); router.use("/", auth.routes());

View File

@@ -22,8 +22,8 @@ export class PublicEnvironmentRegister {
static registerEnv(env: Environment) { static registerEnv(env: Environment) {
process.nextTick(() => { process.nextTick(() => {
const vars: string[] = Reflect.getMetadata(key, env); const vars: string[] = Reflect.getMetadata(key, env) ?? [];
(vars ?? []).forEach((key: string) => { vars.forEach((key: string) => {
if (isUndefined(this.publicEnv[key])) { if (isUndefined(this.publicEnv[key])) {
this.publicEnv[key] = env[key]; this.publicEnv[key] = env[key];
} }

View File

@@ -19,9 +19,9 @@ export default function fetch(
): Promise<Response> { ): Promise<Response> {
// In self-hosted, webhooks support proxying and are also allowed to connect // In self-hosted, webhooks support proxying and are also allowed to connect
// to internal services, so use fetchWithProxy without the filtering agent. // to internal services, so use fetchWithProxy without the filtering agent.
const fetch = env.isCloudHosted ? nodeFetch : fetchWithProxy; const fetchMethod = env.isCloudHosted ? nodeFetch : fetchWithProxy;
return fetch(url, { return fetchMethod(url, {
...init, ...init,
agent: env.isCloudHosted ? useAgent(url) : undefined, agent: env.isCloudHosted ? useAgent(url) : undefined,
}); });

View File

@@ -32,12 +32,12 @@ if (env.isProduction) {
const manifest = readManifestFile(); const manifest = readManifestFile();
const returnFileAndImportsFromManifest = ( const returnFileAndImportsFromManifest = (
manifest: ManifestStructure, manifestStructure: ManifestStructure,
file: string file: string
): string[] => [ ): string[] => [
manifest[file]["file"], manifestStructure[file]["file"],
...(manifest[file]["imports"] ?? []).map( ...(manifestStructure[file]["imports"] ?? []).map(
(entry: string) => manifest[entry]["file"] (entry: string) => manifestStructure[entry]["file"]
), ),
]; ];

View File

@@ -18,9 +18,9 @@ export function CannotUseWithout(
options: validationOptions, options: validationOptions,
validator: { validator: {
validate<T>(value: T, args: ValidationArguments) { validate<T>(value: T, args: ValidationArguments) {
const object = args.object as unknown as T; const obj = args.object as unknown as T;
const required = args.constraints[0] as string; const required = args.constraints[0] as string;
return object[required] !== undefined; return obj[required] !== undefined;
}, },
defaultMessage(args: ValidationArguments) { defaultMessage(args: ValidationArguments) {
return `${propertyName} cannot be used without ${args.constraints[0]}.`; return `${propertyName} cannot be used without ${args.constraints[0]}.`;

View File

@@ -84,7 +84,7 @@ export default function useDragResize(props: Props): ReturnValue {
}; };
const handlePointerDown = const handlePointerDown =
(dragging: "left" | "right") => (dragDirection: "left" | "right") =>
(event: React.PointerEvent<HTMLDivElement>) => { (event: React.PointerEvent<HTMLDivElement>) => {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
@@ -93,7 +93,7 @@ export default function useDragResize(props: Props): ReturnValue {
height: size.height, height: size.height,
}); });
setOffset(event.pageX); setOffset(event.pageX);
setDragging(dragging); setDragging(dragDirection);
}; };
React.useEffect(() => { React.useEffect(() => {

View File

@@ -134,7 +134,7 @@ export default class ExtensionManager {
plugins, plugins,
}: { }: {
schema: Schema; schema: Schema;
rules?: Record<string, any>; rules?: markdownit.Options;
plugins?: PluginSimple[]; plugins?: PluginSimple[];
}): MarkdownParser { }): MarkdownParser {
const tokens = this.extensions const tokens = this.extensions

View File

@@ -1,10 +1,10 @@
import markdownit, { PluginSimple } from "markdown-it"; import markdownit, { PluginSimple } from "markdown-it";
export default function rules({ export default function makeRules({
rules = {}, rules = {},
plugins = [], plugins = [],
}: { }: {
rules?: Record<string, any>; rules?: markdownit.Options;
plugins?: PluginSimple[]; plugins?: PluginSimple[];
}) { }) {
const markdownIt = markdownit("default", { const markdownIt = markdownit("default", {

View File

@@ -221,7 +221,7 @@ export class MarkdownSerializerState {
}) })
) { ) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars
const [_, lead, inner, trail] = /^(\s*)(.*?)(\s*)$/m.exec(node.text); const [, lead, inner, trail] = /^(\s*)(.*?)(\s*)$/m.exec(node.text);
leading += lead; leading += lead;
trailing = trail; trailing = trail;
if (lead || trail) { if (lead || trail) {
@@ -366,20 +366,20 @@ export class MarkdownSerializerState {
row.forEach((cell, _, j) => { row.forEach((cell, _, j) => {
this.out += j === 0 ? "| " : " | "; this.out += j === 0 ? "| " : " | ";
cell.forEach((node) => { cell.forEach((cellNode) => {
// just padding the output so that empty cells take up the same space // just padding the output so that empty cells take up the same space
// as headings. // as headings.
// TODO: Ideally we'd calc the longest cell length and use that // TODO: Ideally we'd calc the longest cell length and use that
// to pad all the others. // to pad all the others.
if ( if (
node.textContent === "" && cellNode.textContent === "" &&
node.content.size === 0 && cellNode.content.size === 0 &&
node.type.name === "paragraph" cellNode.type.name === "paragraph"
) { ) {
this.out += " "; this.out += " ";
} else { } else {
this.closed = false; this.closed = false;
this.render(node, row, j); this.render(cellNode, row, j);
} }
}); });

View File

@@ -28,11 +28,11 @@ export class SuggestionsMenuPlugin extends Plugin {
// timeout ensures that the delete has been handled by prosemirror // timeout ensures that the delete has been handled by prosemirror
// and any characters removed, before we evaluate the rule. // and any characters removed, before we evaluate the rule.
setTimeout(() => { setTimeout(() => {
const { pos } = view.state.selection.$from; const { pos: fromPos } = view.state.selection.$from;
return this.execute( return this.execute(
view, view,
pos, fromPos,
pos, fromPos,
options.openRegex, options.openRegex,
action((_, match) => { action((_, match) => {
if (match) { if (match) {

View File

@@ -11,7 +11,6 @@ function isHardbreak(token: Token) {
export default function markdownBreakToParagraphs(md: MarkdownIt) { export default function markdownBreakToParagraphs(md: MarkdownIt) {
// insert a new rule after the "inline" rules are parsed // insert a new rule after the "inline" rules are parsed
md.core.ruler.after("inline", "breaks", (state) => { md.core.ruler.after("inline", "breaks", (state) => {
const { Token } = state;
const tokens = state.tokens; const tokens = state.tokens;
// work backwards through the tokens and find text that looks like a br // work backwards through the tokens and find text that looks like a br
@@ -30,8 +29,8 @@ export default function markdownBreakToParagraphs(md: MarkdownIt) {
count++; count++;
} }
for (let i = 0; i < count; i++) { for (let j = 0; j < count; j++) {
const isLast = i === count - 1; const isLast = j === count - 1;
token = new Token("paragraph_open", "p", 1); token = new Token("paragraph_open", "p", 1);
nodes.push(token); nodes.push(token);

View File

@@ -56,9 +56,9 @@ export default function markdownItCheckbox(md: MarkdownIt): void {
// work backwards through the tokens and find text that looks like a checkbox // work backwards through the tokens and find text that looks like a checkbox
for (let i = tokens.length - 1; i > 0; i--) { for (let i = tokens.length - 1; i > 0; i--) {
const matches = looksLikeChecklist(tokens, i); const matchesChecklist = looksLikeChecklist(tokens, i);
if (matches) { if (matchesChecklist) {
const value = matches[1]; const value = matchesChecklist[1];
const checked = value.toLowerCase() === "x"; const checked = value.toLowerCase() === "x";
// convert surrounding list tokens // convert surrounding list tokens

View File

@@ -218,9 +218,9 @@ export enum NotificationChannelType {
} }
export type NotificationSettings = { export type NotificationSettings = {
[key in NotificationEventType]?: [event in NotificationEventType]?:
| { | {
[key in NotificationChannelType]?: boolean; [type in NotificationChannelType]?: boolean;
} }
| boolean; | boolean;
}; };

View File

@@ -35,14 +35,14 @@ export default class ProsemirrorHelper {
* @param schema The schema to use. * @param schema The schema to use.
* @returns The document content as plain text without formatting. * @returns The document content as plain text without formatting.
*/ */
static toPlainText(node: Node, schema: Schema) { static toPlainText(root: Node, schema: Schema) {
const textSerializers = Object.fromEntries( const textSerializers = Object.fromEntries(
Object.entries(schema.nodes) Object.entries(schema.nodes)
.filter(([, node]) => node.spec.toPlainText) .filter(([, node]) => node.spec.toPlainText)
.map(([name, node]) => [name, node.spec.toPlainText]) .map(([name, node]) => [name, node.spec.toPlainText])
); );
return textBetween(node, 0, node.content.size, textSerializers); return textBetween(root, 0, root.content.size, textSerializers);
} }
/** /**

View File

@@ -121,8 +121,8 @@ export function unicodeCLDRtoISO639(locale: string) {
* *
* @returns The current date * @returns The current date
*/ */
export function getCurrentDateAsString(locales?: Intl.LocalesArgument) { export function getCurrentDateAsString(locale?: Intl.LocalesArgument) {
return new Date().toLocaleDateString(locales, { return new Date().toLocaleDateString(locale, {
year: "numeric", year: "numeric",
month: "long", month: "long",
day: "numeric", day: "numeric",
@@ -134,8 +134,8 @@ export function getCurrentDateAsString(locales?: Intl.LocalesArgument) {
* *
* @returns The current time * @returns The current time
*/ */
export function getCurrentTimeAsString(locales?: Intl.LocalesArgument) { export function getCurrentTimeAsString(locale?: Intl.LocalesArgument) {
return new Date().toLocaleTimeString(locales, { return new Date().toLocaleTimeString(locale, {
hour: "numeric", hour: "numeric",
minute: "numeric", minute: "numeric",
}); });
@@ -147,8 +147,8 @@ export function getCurrentTimeAsString(locales?: Intl.LocalesArgument) {
* *
* @returns The current date and time * @returns The current date and time
*/ */
export function getCurrentDateTimeAsString(locales?: Intl.LocalesArgument) { export function getCurrentDateTimeAsString(locale?: Intl.LocalesArgument) {
return new Date().toLocaleString(locales, { return new Date().toLocaleString(locale, {
year: "numeric", year: "numeric",
month: "long", month: "long",
day: "numeric", day: "numeric",

View File

@@ -44,8 +44,8 @@ export function getDataTransferFiles(
return dt.items return dt.items
? Array.prototype.slice ? Array.prototype.slice
.call(dt.items) .call(dt.items)
.filter((dt: DataTransferItem) => dt.kind !== "string") .filter((dti: DataTransferItem) => dti.kind !== "string")
.map((dt: DataTransferItem) => dt.getAsFile()) .map((dti: DataTransferItem) => dti.getAsFile())
.filter(Boolean) .filter(Boolean)
: []; : [];
} }