Module improperly exporting JS reserved keyword

Client.res I’m running into an issue where exporting a delete function (valid in ReScript) is causing an issue in the compiled JS module -

…
@gentype
let delete = async (client: t, url: string) => {
  await fetch(
    url,
    {
      method: #DELETE,
      headers: headers(client)
    },
  )
}

Client.bs.js my function is being exported as $$delete without being properly aliased -

async function $$delete(client, url) {
  return await $$fetch$1(url, {
              method: "DELETE",
              headers: Caml_option.some(new Headers(Belt_MapString.toArray(client.headers)))
            });
}

export {
  … ,
  $$delete , // ❌ should be export { $$delete as delete }
}

Using delete in this way should be a non-issue because the library consumer has two choices -

import * as Client from "mymodule/client"
Client.delete(…) // ✅ valid

import { delete as delete_ } from "mymodule/client"
delete_(…) // ✅ valid

The situation is worsened when you consider the Client.gen.tsx -

// ❌ invalid `const delete` reserved keyword
export const delete: (client:t, url:string) => Promise<Js_Json_t> = function (Arg1: any, Arg2: any) {
  const result = Curry._2(ClientBS.delete, Arg1, Arg2); // ❌ ClientBs exports $$delete
  return result
};

ClientBS.delete is ironically valid JS however the actual export is ClientBS.$$delete. I would expect gentype to do something like -

// ✅ expected `const $$delete …`
const $$delete: (client:t, url:string) => Promise<Js_Json_t> = function (Arg1: any, Arg2: any) {
  const result = Curry._2(ClientBS.delete, Arg1, Arg2);
  return result
};

export { $$delete as delete } // ✅ expected

At first I tried working around this using @gentype.as("delete_") which fixes the TS error, however the generated function still accesses the incorrect export from the generated JS -

// ✅ valid `const delete_`
export const delete_: (client:t, url:string) => Promise<Js_Json_t> = function (Arg1: any, Arg2: any) {
  const result = Curry._2(ClientBS.delete, Arg1, Arg2); // ❌ ClientBS exports $$delete only
  return result
};

My current solution is to export delete_ instead. This does not meet the API requirement but that’s a problem I’ll have to solve another day.

…
@gentype
let delete_ = async (client: t, url: string) => {
  …
}

I found this thread which is related -

This is exactly the case for me, however the “solution” provided is just to avoid the listed identifiers. Considering export { $$delete as delete } is completely valid, I should think ReScript has a way to do this. The design requirements of the library are not always set by the developer.