nim-lang / RFCs

A repository for your Nim proposals.
135 stars 26 forks source link

Expand the `header` flag in the JS Backend to produce a d.ts file. #552

Open jmgomez opened 1 month ago

jmgomez commented 1 month ago

Abstract

By leveraging on the existing mechanisms in the compiler, produce a d.ts file when the header flag is used. This file will be a header containing all the definitions exported in the Nim code. Just like the existing header works for the C/C++ backends.

Motivation

No response

Description

The main motivation is to improve the ergonomics of js/ts interop by providing type information that IDEs can use.

Code Examples


type 
  UserProfile*  {.exportc.} = object
    id* : int
    firstName*, lastName*, email*, phone*, country*, pictureUrl* : cstring

    proc createDefaultUserProfile*(): UserProfile {.exportc.} =
        UserProfile()

    proc getFullname*(profile: UserProfile): cstring {.exportc.} =    
        formatFullName(profile)

Would produce:

export declare type UserProfile = {
    id : number;
    firstName : string;
    lastName : string;
    email : string;
    phone : string;
    country : string;
    pictureUrl : string;
};

export declare function createDefaultUserProfile(): UserProfile;
export declare function getFullName(profile: UserProfile): string;

Backwards Compatibility

No response

juancarlospaco commented 3 weeks ago

TS has become such a big target that it is worth supporting it somehow for the future of Nim.

evelant commented 2 weeks ago

Would love to see this. I've got a large TS project and being able to write nim and have it "just work" without having to manually declare types would be amazing.