bytecodealliance/jco

Generated JS has "new" as function name which triggers SyntaxError

Closed this issue · 1 comments

jcbhmr@PIG-2016:~/Documents/semver.wasm$ node --experimental-default-type=module
Welcome to Node.js v21.5.0.
Type ".help" for more information.
> let m
undefined
> m = await import("./out/jco-transpile/semver.js")
file:///home/jcbhmr/Documents/semver.wasm/out/jco-transpile/semver.js:1565
BuildMetadata.new = function new(arg0) {
                             ^^^
Uncaught SyntaxError: Unexpected token 'new'
> 

WIT that I used:

package jcbhmr:semver;

interface semver {
    resource build-metadata {
        empty: static func() -> build-metadata;
        new: static func(text: string) -> result<build-metadata, error>;
        as-str: func() -> string;
        is-empty: func() -> bool;
    }

    record comparator {
        op: op,
        major: u64,
        minor: option<u64>,
        patch: option<u64>,
        pre: prerelease,
    }
    comparator-parse: func(text: string) -> result<comparator, error>;
    comparator-matches: func(self: comparator, version: version) -> bool;

    resource error {}

    resource prerelease {
        empty: static func() -> prerelease;
        new: static func(text: string) -> result<prerelease, error>;
        as-str: func() -> string;
        is-empty: func() -> bool;
    }

    record version {
        major: u64,
        minor: u64,
        patch: u64,
        pre: prerelease,
        build: build-metadata,
    }
    version-new: func(major: u64, minor: u64, patch: u64) -> version;
    version-parse: func(text: string) -> result<version, error>;
    version-cmp-precedence: func(a: version, b: version) -> s8;

    record version-req {
        comparators: list<comparator>,
    }
    version-req-star: func() -> version-req;
    version-req-parse: func(text: string) -> result<version-req, error>;
    version-req-matches: func(self: version-req, version: version) -> bool;

    enum op {
        exact,
        greater,
        greater-eq,
        less,
        less-eq,
        tilde,
        caret,
        wildcard,
    }
}

world host {
    export semver;
}

Then I used cargo component build to get the output WASM file and jco transpile to turn that WASM component into JavaScript:

cargo component build
jco transpile ./target/wasm32-wasi/debug/semver.wasm --out-dir ./out/jco-transpile

For context about the naming: I was unable return a result<...> from a WIT constructor(); so I just used a static constructor TheResource.new() function.

More context: I'm playing around with cargo component and was trying to experiment with the semver Rust library: https://docs.rs/semver

Thanks for posting this case, fixed in #331 for the next release.