mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 20:32:10 +00:00
feat(linter) eslint plugin unicorn: no useless promise resolve reject (#1254)
This commit is contained in:
parent
3db074b87c
commit
0fcd0fe28e
3 changed files with 910 additions and 0 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 => 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();
|
||||
}
|
||||
|
|
@ -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`.
|
||||
|
||||
|
||||
Loading…
Reference in a new issue