diff --git a/crates/oxc_linter/src/rules.rs b/crates/oxc_linter/src/rules.rs index cc9cfa619..f839a9742 100644 --- a/crates/oxc_linter/src/rules.rs +++ b/crates/oxc_linter/src/rules.rs @@ -164,6 +164,7 @@ mod unicorn { pub mod no_typeof_undefined; pub mod no_unnecessary_await; pub mod no_useless_fallback_in_spread; + pub mod no_useless_promise_resolve_reject; pub mod prefer_add_event_listener; pub mod prefer_array_flat_map; pub mod prefer_blob_reading_methods; @@ -316,6 +317,7 @@ oxc_macros::declare_all_lint_rules! { unicorn::no_typeof_undefined, unicorn::no_unnecessary_await, unicorn::no_useless_fallback_in_spread, + unicorn::no_useless_promise_resolve_reject, unicorn::prefer_add_event_listener, unicorn::prefer_array_flat_map, unicorn::prefer_blob_reading_methods, diff --git a/crates/oxc_linter/src/rules/unicorn/no_useless_promise_resolve_reject.rs b/crates/oxc_linter/src/rules/unicorn/no_useless_promise_resolve_reject.rs new file mode 100644 index 000000000..af7492645 --- /dev/null +++ b/crates/oxc_linter/src/rules/unicorn/no_useless_promise_resolve_reject.rs @@ -0,0 +1,452 @@ +use oxc_ast::{ast::MemberExpression, AstKind}; +use oxc_diagnostics::{ + miette::{self, Diagnostic}, + thiserror::{self, Error}, +}; +use oxc_macros::declare_oxc_lint; +use oxc_span::{GetSpan, Span}; + +use crate::{ast_util::outermost_paren_parent, context::LintContext, rule::Rule, AstNode}; + +#[derive(Debug, Error, Diagnostic)] +enum NoUselessPromiseResolveRejectDiagnostic { + #[error("eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `{1} value` over `{1} Promise.resolve(value)`.")] + #[diagnostic(severity(warning), help("Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`."))] + Resolve(#[label] Span, &'static str), + #[error("eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `{1} Promise.reject(error)`.")] + #[diagnostic(severity(warning), help("Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`."))] + Reject(#[label] Span, &'static str), +} + +#[derive(Debug, Default, Clone)] +pub struct NoUselessPromiseResolveReject; + +declare_oxc_lint!( + /// ### What it does + /// + /// Disallows returning values wrapped in `Promise.resolve` or `Promise.reject` in an async function or a `Promise#then`/`catch`/`finally` callback. + /// + /// ### Why is this bad? + /// + /// Wrapping a return value in `Promise.resolve` in an async function or a `Promise#then`/`catch`/`finally` callback is unnecessary as all return values in async functions and promise callback functions are already wrapped in a `Promise`. Similarly, returning an error wrapped in `Promise.reject` is equivalent to simply `throw`ing the error. This is the same for `yield`ing in async generators as well. + /// + /// ### Example + /// ```javascript + /// // bad + /// async () => Promise.resolve(bar); + /// + /// // good + /// async () => bar; + /// ``` + NoUselessPromiseResolveReject, + pedantic +); + +impl Rule for NoUselessPromiseResolveReject { + fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) { + let AstKind::CallExpression(call_expr) = node.kind() else { return }; + let Some(member_expr) = call_expr.callee.get_member_expr() else { return }; + + if !member_expr.object().is_specific_id("Promise") { + return; + } + + let MemberExpression::StaticMemberExpression(static_member_expr) = member_expr else { + return; + }; + + if !matches!(static_member_expr.property.name.as_str(), "resolve" | "reject") { + return; + } + + let Some(parent) = ctx.nodes().parent_node(node.id()) else { + return; + }; + + let mut is_yield = false; + + if let AstKind::YieldExpression(yield_expr) = parent.kind() { + is_yield = true; + if yield_expr.delegate { + return; + } + } + + let Some((is_async, function_node)) = get_function_like_node(node, ctx) else { return }; + + if !(is_async || is_promise_callback(function_node, ctx)) { + return; + } + + match static_member_expr.property.name.as_str() { + "resolve" => { + ctx.diagnostic(NoUselessPromiseResolveRejectDiagnostic::Resolve( + node.kind().span(), + if is_yield { "yield" } else { "return" }, + )); + } + "reject" => { + ctx.diagnostic(NoUselessPromiseResolveRejectDiagnostic::Reject( + node.kind().span(), + if is_yield { "yield" } else { "return" }, + )); + } + _ => unreachable!(), + } + } +} + +fn get_function_like_node<'a, 'b>( + node: &'a AstNode<'b>, + ctx: &'a LintContext<'b>, +) -> Option<(bool, &'a AstNode<'b>)> { + let mut parent = node; + + let fnx = loop { + if let Some(grand_parent) = ctx.nodes().parent_node(parent.id()) { + parent = grand_parent; + if parent.kind().is_function_like() { + break parent; + } + } else { + return None; + } + }; + + match fnx.kind() { + AstKind::ArrowExpression(arrow_expr) => Some((arrow_expr.r#async, parent)), + AstKind::Function(func) => Some((func.r#async, parent)), + _ => None, + } +} + +fn is_promise_callback<'a, 'b>(node: &'a AstNode<'b>, ctx: &'a LintContext<'b>) -> bool { + let Some(parent) = outermost_paren_parent(node, ctx) else { + return false; + }; + + let Some(parent) = outermost_paren_parent(parent, ctx) else { + return false; + }; + + let AstKind::CallExpression(call_expr) = parent.kind() else { return false }; + + let Some(member_expr) = call_expr.callee.get_member_expr() else { return false }; + + if member_expr.is_computed() { + return false; + } + let Some(static_prop_name) = member_expr.static_property_name() else { return false }; + + if call_expr.arguments.len() == 1 && matches!(static_prop_name, "then" | "catch" | "finally") { + return true; + } + + if call_expr.arguments.len() == 2 && matches!(static_prop_name, "then") { + if call_expr.arguments[0].is_spread() { + return false; + } + return true; + } + + false +} + +#[test] +fn test() { + use crate::tester::Tester; + + let pass = vec![ + // Async functions returning normal values/throwing values + r#"async () => bar;"#, + r#" + async () => { + return bar; + }; + "#, + r#" + async function foo() { + return bar; + } + "#, + r#" + (async function() { + return bar; + }); + "#, + r#" + async () => { + throw bar; + }; + "#, + r#" + async function foo() { + throw bar; + } + "#, + r#" + (async function() { + throw bar; + }); + "#, + // Async functions returning normal values/throwing values + // Sync function returning Promise.resolve/reject + r#"() => Promise.resolve(bar);"#, + r#" + () => { + return Promise.resolve(bar); + }; + "#, + r#" + function foo() { + return Promise.resolve(bar); + }; + "#, + r#" + (function() { + return Promise.resolve(bar); + }); + "#, + r#"() => Promise.reject(bar);"#, + r#" + () => { + return Promise.reject(bar); + }; + "#, + r#" + function foo() { + return Promise.reject(bar); + }; + "#, + r#" + (function() { + return Promise.reject(bar); + }); + "#, + // Sync generator yielding Promise.resolve/reject + r#" + function * foo() { + yield Promise.$resolve(bar); + } + "#, + r#" + (function * () { + yield Promise.$resolve(bar); + }) + "#, + r#" + function * foo() { + yield Promise.reject(bar); + } + "#, + r#" + (function * () { + yield Promise.reject(bar); + }) + "#, + // Sync function nested in async function + r#" + async function foo() { + function bar() { + return Promise.resolve(baz); + } + } + "#, + // Delegate yield expressions + r#" + async function * foo() { + yield* Promise.resolve(bar); + } + "#, + r#" + async function * foo() { + yield* Promise.reject(bar); + } + "#, + // Promise#then/catch/finally + r#"promise.then(() => foo).catch(() => bar).finally(() => baz)"#, + r#"promise.then(() => foo, () => bar).finally(() => baz)"#, + r#"promise.then(x, y, () => Promise.resolve(foo))"#, + r#"promise.catch(x, () => Promise.resolve(foo))"#, + r#"promise.finally(x, () => Promise.resolve(foo))"#, + r#"promise[then](() => Promise.resolve(foo))"#, + ]; + + let fail = vec![ + r#" + const main = async foo => { + if (foo > 4) { + return Promise.reject(new Error('๐Ÿคช')); + } + return Promise.resolve(result); + }; + "#, + // Async function returning Promise.resolve + r#"async () => Promise.resolve(bar);"#, + r#" + async () => { + return Promise.resolve(bar); + }; + "#, + r#" + async function foo() { + return Promise.resolve(bar); + } + "#, + r#" + (async function() { + return Promise.resolve(bar); + }); + "#, + r#" + async function * foo() { + return Promise.resolve(bar); + } + "#, + r#" + (async function*() { + return Promise.resolve(bar); + }); + "#, + // Async function returning Promise.reject + r#"async () => Promise.reject(bar);"#, + r#" + async () => { + return Promise.reject(bar); + }; + "#, + r#" + async function foo() { + return Promise.reject(bar); + } + "#, + r#" + (async function() { + return Promise.reject(bar); + }); + "#, + r#" + async function * foo() { + return Promise.reject(bar); + } + "#, + r#" + (async function*() { + return Promise.reject(bar); + }); + "#, + // Async generator yielding Promise.resolve + r#" + async function * foo() { + yield Promise.resolve(bar); + } + "#, + r#" + (async function * () { + yield Promise.resolve(bar); + }); + "#, + // Async generator yielding Promise.reject + r#" + async function * foo() { + yield Promise.reject(bar); + } + "#, + r#" + (async function * () { + yield Promise.reject(bar); + }); + "#, + r#"async () => Promise.resolve();"#, + r#" + async function foo() { + return Promise.resolve(); + } + "#, + r#"async () => Promise.reject();"#, + r#" + async function foo() { + return Promise.reject(); + } + "#, + r#" + async function * foo() { + yield Promise.resolve(); + } + "#, + // Multiple arguments + r#"async () => Promise.resolve(bar, baz);"#, + r#"async () => Promise.reject(bar, baz);"#, + // Sequence expressions + r#"async + async function * foo() { + yield Promise.resolve((bar, baz)); + } + "#, + r#"async () => Promise.resolve((bar, baz))"#, + // Arrow function returning an object + r#"async () => Promise.resolve({})"#, + // Try statements + r#" + async function foo() { + try { + return Promise.resolve(1); + } catch {} + } + "#, + r#" + async function foo() { + try { + return Promise.reject(1); + } catch {} + } + "#, + // Spread arguments + r#"async () => Promise.resolve(...bar);"#, + r#"async () => Promise.reject(...bar);"#, + // Yield not in an ExpressionStatement + r"# + async function * foo() { + const baz = yield Promise.resolve(bar); + } + #", + r#" + async function * foo() { + const baz = yield Promise.reject(bar); + } + "#, + // Parenthesized Promise.resolve/reject + r#"async () => (Promise.resolve(bar));"#, + r#"async () => (Promise.reject(bar));"#, + r#"async () => ((Promise.reject(bar)));"#, + r#" + async function * foo() { + (yield Promise.reject(bar)); + } + "#, + r#" + async function * foo() { + ((yield Promise.reject(bar))); + } + "#, + r#"promise.then(() => Promise.resolve(bar))"#, + r#"promise.then(() => { return Promise.resolve(bar); })"#, + r#"promise.then(async () => Promise.reject(bar))"#, + r#"promise.then(async () => { return Promise.reject(bar); })"#, + r#"promise.catch(() => Promise.resolve(bar))"#, + r#"promise.catch(() => { return Promise.resolve(bar); })"#, + r#"promise.catch(async () => Promise.reject(bar))"#, + r#"promise.catch(async () => { return Promise.reject(bar); })"#, + r#"promise.finally(() => Promise.resolve(bar))"#, + r#"promise.finally(() => { return Promise.resolve(bar); })"#, + r#"promise.finally(async () => Promise.reject(bar))"#, + r#"promise.finally(async () => { return Promise.reject(bar); })"#, + r#"promise.then(() => {}, () => Promise.resolve(bar))"#, + r#"promise.then(() => Promise.resolve(bar), () => Promise.resolve(baz))"#, + r#"promise.then(() => {}, () => { return Promise.resolve(bar); })"#, + r#"promise.then(() => {}, async () => Promise.reject(bar))"#, + r#"promise.then(() => {}, async () => { return Promise.reject(bar); })"#, + ]; + + Tester::new_without_config(NoUselessPromiseResolveReject::NAME, pass, fail).test_and_snapshot(); +} diff --git a/crates/oxc_linter/src/snapshots/no_useless_promise_resolve_reject.snap b/crates/oxc_linter/src/snapshots/no_useless_promise_resolve_reject.snap new file mode 100644 index 000000000..7daf03fd6 --- /dev/null +++ b/crates/oxc_linter/src/snapshots/no_useless_promise_resolve_reject.snap @@ -0,0 +1,456 @@ +--- +source: crates/oxc_linter/src/tester.rs +expression: no_useless_promise_resolve_reject +--- + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:3:1] + 3 โ”‚ if (foo > 4) { + 4 โ”‚ return Promise.reject(new Error('๐Ÿคช')); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 5 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:5:1] + 5 โ”‚ } + 6 โ”‚ return Promise.resolve(result); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 7 โ”‚ }; + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => Promise.resolve(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async () => { + 3 โ”‚ return Promise.resolve(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ }; + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function foo() { + 3 โ”‚ return Promise.resolve(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ (async function() { + 3 โ”‚ return Promise.resolve(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ }); + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function * foo() { + 3 โ”‚ return Promise.resolve(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ (async function*() { + 3 โ”‚ return Promise.resolve(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ }); + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => Promise.reject(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async () => { + 3 โ”‚ return Promise.reject(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ }; + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function foo() { + 3 โ”‚ return Promise.reject(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ (async function() { + 3 โ”‚ return Promise.reject(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ }); + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function * foo() { + 3 โ”‚ return Promise.reject(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ (async function*() { + 3 โ”‚ return Promise.reject(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ }); + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `yield value` over `yield Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function * foo() { + 3 โ”‚ yield Promise.resolve(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `yield value` over `yield Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ (async function * () { + 3 โ”‚ yield Promise.resolve(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ }); + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `yield Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function * foo() { + 3 โ”‚ yield Promise.reject(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `yield Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ (async function * () { + 3 โ”‚ yield Promise.reject(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ }); + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => Promise.resolve(); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function foo() { + 3 โ”‚ return Promise.resolve(); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => Promise.reject(); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function foo() { + 3 โ”‚ return Promise.reject(); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `yield value` over `yield Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function * foo() { + 3 โ”‚ yield Promise.resolve(); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => Promise.resolve(bar, baz); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => Promise.reject(bar, baz); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `yield value` over `yield Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function * foo() { + 3 โ”‚ yield Promise.resolve((bar, baz)); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => Promise.resolve((bar, baz)) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => Promise.resolve({}) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:3:1] + 3 โ”‚ try { + 4 โ”‚ return Promise.resolve(1); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 5 โ”‚ } catch {} + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:3:1] + 3 โ”‚ try { + 4 โ”‚ return Promise.reject(1); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 5 โ”‚ } catch {} + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => Promise.resolve(...bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => Promise.reject(...bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + ร— Invalid Character ` + โ”‚ ` + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ # + ยท โ”€ + 2 โ”‚ async function * foo() { + 3 โ”‚ const baz = yield Promise.resolve(bar); + โ•ฐโ”€โ”€โ”€โ”€ + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `yield Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function * foo() { + 3 โ”‚ const baz = yield Promise.reject(bar); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => (Promise.resolve(bar)); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => (Promise.reject(bar)); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ async () => ((Promise.reject(bar))); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `yield Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function * foo() { + 3 โ”‚ (yield Promise.reject(bar)); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `yield Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:2:1] + 2 โ”‚ async function * foo() { + 3 โ”‚ ((yield Promise.reject(bar))); + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + 4 โ”‚ } + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.then(() => Promise.resolve(bar)) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.then(() => { return Promise.resolve(bar); }) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.then(async () => Promise.reject(bar)) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.then(async () => { return Promise.reject(bar); }) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.catch(() => Promise.resolve(bar)) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.catch(() => { return Promise.resolve(bar); }) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.catch(async () => Promise.reject(bar)) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.catch(async () => { return Promise.reject(bar); }) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.finally(() => Promise.resolve(bar)) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.finally(() => { return Promise.resolve(bar); }) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.finally(async () => Promise.reject(bar)) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.finally(async () => { return Promise.reject(bar); }) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.then(() => {}, () => Promise.resolve(bar)) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.then(() => Promise.resolve(bar), () => Promise.resolve(baz)) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.then(() => Promise.resolve(bar), () => Promise.resolve(baz)) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `return value` over `return Promise.resolve(value)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.then(() => {}, () => { return Promise.resolve(bar); }) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the return value in `Promise.Resolve` is needlessly verbose. All return values in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.then(() => {}, async () => Promise.reject(bar)) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + + โš  eslint-plugin-unicorn(no-useless-promise-resolve-reject): Prefer `throw error` over `return Promise.reject(error)`. + โ•ญโ”€[no_useless_promise_resolve_reject.tsx:1:1] + 1 โ”‚ promise.then(() => {}, async () => { return Promise.reject(bar); }) + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€ + help: Wrapping the error in `Promise.reject` is needlessly verbose. All errors thrown in async functions are already wrapped in a `Promise`. + +