• 
      

    Allow referencing components by class without pre-registering.

    Review Request #13671 — Created March 26, 2024 and submitted

    Information

    Ink
    master

    Reviewers

    One of the features of htm is its ability to let you pass in a class
    or function as the tag name, using the following syntax:

    `<${MyComponent} foo="bar">...</>
    

    This is useful for letting you reference a class that may be internal or
    should otherwise not be registered globally. However, while htm
    supported this syntax, Ink didn't know how to handle it.

    Now, Ink will take these and construct them, making the assumption that
    they are valid component classes. They'll get passed any properties and
    children as normal.

    Since these don't have registered names, it also means their
    subcomponents aren't registered. To allow subcomponent usage, a
    subcomponent name can now be prefixed with ., instead of the parent
    component name. In this particular case, the subcomponent's full name
    and function name will be computed dynamically on use, rather than
    during initial registration of the component.

    We otherwise still register and look up subcomponents as normal. I had
    explored consolidating the logic so that the function name and full name
    were always managed at the last possible minute, but that meant that
    they couldn't be looked up as possible candidates separate from
    components or HTML tags during crafting. It's possible parts of this
    will be revisited in the future.

    Unit tests pass.

    Made use of this in in-progress code in Review Board.

    Summary ID
    Allow referencing components by class without pre-registering.
    One of the features of `htm` is its ability to let you pass in a class or function as the tag name, using the following syntax: ```typescript `<${MyComponent} foo="bar">...</> ``` This is useful for letting you reference a class that may be internal or should otherwise not be registered globally. However, while `htm` supported this syntax, Ink didn't know how to handle it. Now, Ink will take these and construct them, making the assumption that they are valid component classes. They'll get passed any properties and children as normal. Since these don't have registered names, it also means their subcomponents aren't registered. To allow subcomponent usage, a subcomponent name can now be prefixed with `.`, instead of the parent component name. In this particular case, the subcomponent's full name and function name will be computed dynamically on use, rather than during initial registration of the component. We otherwise still register and look up subcomponents as normal. I had explored consolidating the logic so that the function name and full name were always managed at the last possible minute, but that meant that they couldn't be looked up as possible candidates separate from components or HTML tags during crafting. It's possible parts of this will be revisited in the future.
    c4b3456119dd41d26655b193f5a4d0e84c0c84d8
    david
    1. Ship It!
    2. 
        
    chipx86
    Review request changed
    Status:
    Completed
    Change Summary:
    Pushed to master (c153ffe)