Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

navigateToRoute return signature change - no longer a Promise? #648

Open
matthewcorven opened this issue Aug 15, 2019 · 15 comments
Open

navigateToRoute return signature change - no longer a Promise? #648

matthewcorven opened this issue Aug 15, 2019 · 15 comments
Assignees

Comments

@matthewcorven
Copy link

  • Overview of the Issue: router navigateToRoute() previously has a return signature type of Promise<PipelineResult | boolean>, then NavigationResult and most recently boolean (version 1.7.1).
  • Motivation or Use Case:
    • Upgrading from earlier versions to latest results in build failure in projects enforcing tslint rule "await-promise".
    • Code relying upon navigateToRoute as an awaitable function require refactoring
  • Library Name and Version(s): aurelia-router, router.ts version 1.7.1 (current)
  • Browsers and Operating System: N/A (build issue)
  • Reproduce the Error: Build an application with lines below using aurelia-router version 1.7.1 and tslint "await-promise" rule turned on
  • Related Issues: None found
  • Suggest a Fix: Revert return signature change, or explain reason for change to return type boolean.

navigateToRoute(route: string, params?: any, options?: NavigationOptions): boolean;

@EisenbergEffect
Copy link
Contributor

Ping @davismj

@bigopon
Copy link
Member

bigopon commented Aug 15, 2019

If i understand correctly, returning a Promise is incorrect, since it's not what the history navigate returns

@davismj
Copy link
Member

davismj commented Aug 15, 2019

The typing is in fact wrong. After quickly tracing through, I want to say it should be boolean | Promise<PipelineResult> but it might be boolean | Promise<boolean | PipelineResult>.

@matthewcorven
Copy link
Author

Thanks for the initial investigation @davismj

@matthewcorven
Copy link
Author

@davismj @EisenbergEffect I'd be happy to submit a PR for this. I'm not sure where the CLA is that I need to sign. The CONTRIBUTING.md in this project sends me to:

http://goo.gl/forms/dI8QDDSyKR

Which says "Sorry, the file you have requested does not exist.":

@EisenbergEffect
Copy link
Contributor

Please feel free to submit a PR :) When you submit the PR, Github will check our CLA sig list and prompt you with the proper way to sign. Sorry about the bad link. I thought I had that updated everywhere after we switched over to CLA Assistant. I'll get that fixed soon.

@Calabonga
Copy link

Calabonga commented Feb 4, 2020

Hi, and again...

Aurelia version:

> au -v
Local aurelia-cli v1.2.3

method this.router.navigateToRoute and this.router.navigate are return both a Promise not the boolean :(
but:

/**
* Navigates to a new location corresponding to the route and params specified. Equivallent to [[Router.generate]] followed
* by [[Router.navigate]].
*
* @param route The name of the route to use when generating the navigation location.
* @param params The route parameters to be used when populating the route pattern.
* @param options The navigation options.
*/
	navigateToRoute(route: string, params?: any, options?: NavigationOptions): boolean;

If the bug is fixed how i can update aurelia-router.d.ts?

@bigopon
Copy link
Member

bigopon commented Feb 5, 2020

@Calabonga let me have a look at this. From what I remember, the signature was wrong, and boolean was a fix

@matthewcorven
Copy link
Author

@bigopon The change I had proposed for this I eventually abandoned because @davismj indicated that he had identical changes (as a Promise) in a local branch that hadn't yet been pushed, which he would carry forward.

@Calabonga
Copy link

@bigopon , @matthewcorven Thanks for your quick answers, but...

  1. What's the correct type for return in fact?
  2. When will I can download the correct version?

@matthewcorven
Copy link
Author

@Calabonga I think this is the best-matching signature, but ultimately I'm looking to @davismj and @bigopon to validate.

export type NavigationResult = boolean | Promise<PipelineResult | boolean>;

@Calabonga
Copy link

@bigopon I think so too! Thanks. I'll be waiting.

@bigopon
Copy link
Member

bigopon commented Feb 6, 2020

@matthewcorven @Calabonga @davismj on the surface, boolean is the sufficient return type as it's the contract that History guarantees. However, the implementation of History doesn't conform this, and actually returns a different type: it's eventually: Promise<PipelineResult> if the pipeline ran successfully, or Promise<void> if there was an error in the pipeline. So final typing could be something along this line, I believe.

export type NavigationResult = boolean | Promise<PipelineResult | void>;

It's not too far off compared to what we have at the moment in the comment #648 (comment), so I think we can keep it in the current shape for now. We could refactor more, but there's concern that big refactoring without major semver change would destabilize the router, while providing not big enough value to justify it.

We will still fix critical bug though. So, ... sorry for the issue 😓

@Calabonga
Copy link

Thanks. I'll try to refactor my logic yet.

@matthewcorven
Copy link
Author

Any update @Calabonga ?
CC @bigopon

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
5 participants