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

Allow better typing for module configuration #940

Open
rmja opened this issue Sep 26, 2019 · 4 comments
Open

Allow better typing for module configuration #940

rmja opened this issue Sep 26, 2019 · 4 comments

Comments

@rmja
Copy link

rmja commented Sep 26, 2019

I'm submitting a feature request

  • Library Version:
    1.3.1

Please tell us about your environment:

  • Operating System:
    Windows 10

  • Node Version:
    12.8.0

  • NPM Version:
    6.11.3

  • Aurelia CLI OR JSPM OR Webpack AND Version
    none

  • Browser:
    all

  • Language:
    TypeScript

Current behavior:
During intial configuration when modules are included, the module configuration argument is of type any:

aurelia.use.plugin("my-module", options?: any)

It is currently not possible for module authors to improve typings for their module, as aurelia.use is of type FrameworkConfiguration, and it is not possible to extend classes with typings in typescript.

Expected/desired behavior:

It would be really neat if the FramworkConfiguration implemented an interface, say IFramworkConfiguration for the builder api instead of the FrameworkConfiguration itself.
The interface should of cause contain all all the properties/methods of FramworkConfiguration, and the return type for the methods should be changed to IFrameworkConfiguration.

This change would enable module authors to include typing aided configuration. Say for example:

import { IFrameworkConfiguration } from "aurelia-framework";
import { CacheOptions } from "./cache-options";

declare module "aurelia-framework" {
    interface IFrameworkConfiguration {
        plugin(plugin: "aurelia-workbox-cachecontrol", configureAction?: (options: CacheOptions) => unknown): FrameworkConfiguration;
    }
}

To make this work with PLATFORM.moduleName() in webpack environments, its typing definitation should be changed from:

moduleName(moduleName: string, options?: ModuleNameOptions): string;
moduleName(moduleName: string, chunk?: string): string;

to:

moduleName<T extends string>(moduleName: T, options?: ModuleNameOptions): T;
moduleName<T extends string>(moduleName: T, chunk?: string): T;

to specifically tell typescript that the same module name is returned.

image

  • What is the motivation / use case for changing the behavior?
    To make for a more robust plugin experience where configuration is typed.
@EisenbergEffect
Copy link
Contributor

I don't think that we'l be able to address this in the current version of Aurelia. However, we've gathered a ton of feedback over the years on our plugin system in general and have made a bunch of improvements for our vNext. I'm going to close this out since we've already addressed this particular concern there.

@EisenbergEffect
Copy link
Contributor

Actually, if all it really takes is the above modification of the types, I think we could do that in vCurrent possibly. I'm a bit nervous that this could break some people. We don't want to do that. If you want to submit a PR for this, we could discuss the implications further there.

@bigopon
Copy link
Member

bigopon commented Sep 26, 2019

Yes, its doable, and a quality of life improvement that can help many typescript users. Can we reopen this?
@rmja maybe you already have in mind ideas how to go forward, pelase help PR for this

@EisenbergEffect
Copy link
Contributor

Re-opened 😄

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

No branches or pull requests

3 participants