discord-api-types icon indicating copy to clipboard operation
discord-api-types copied to clipboard

GuildFeature is not a two-way enum

Open MattIPv4 opened this issue 2 years ago • 5 comments

Please describe the problem you are having in as much detail as possible:

Many of the enums exported from discord-api-types are two-way enums, meaning that you can pass a key into the enum, and than that result back into the enum again to get the original key. This is true of the ChannelType enum for example, which has both the integer and string values as keys.

However, the GuildFeature enum only has the PascalCase values as keys, with the SCREAMING_SNAKE_CASE values missing from the keys. This means that you cannot convert the snake case values back to the pascal case values using the enum.

Include a reproducible code sample here, if possible:

import { ChannelType, GuildFeature } from 'discord-api-types';

console.log(ChannelType[ChannelType[0]]); // 0
console.log(GuildFeature[GuildFeature['Banner']]); // undefined

Further details:

  • Runtime:
    • Node.js version: 16.17.0
  • Priority this issue should have – please be realistic and elaborate if possible: P3, I can manually patch in my own enum for now, but inconsistency in the exports is no fun :(

MattIPv4 avatar Sep 05 '22 21:09 MattIPv4

Isn't that just how enumerations work? String-valued enumerations do not return numbers in the first place.

Jiralite avatar Sep 05 '22 21:09 Jiralite

This is outside of my power / control, this is how TS turns string enums into objects. So, sadly, can't easily add these without doing it manually. But there should be modules to easily convert snake_case to PascalCase

vladfrangu avatar Sep 05 '22 21:09 vladfrangu

I'm just running this to patch it locally, rather annoying that TS is inconsistent with how enums get exported w/ strings vs numbers:

Object.entries(GuildFeature).forEach(([key, value]) => {
  GuildFeature[value] = key;
});

MattIPv4 avatar Sep 05 '22 21:09 MattIPv4

I doubt we'd change the enums themselves but I'd be willing to merge a utility method for getting the PascalCase name 👍

vladfrangu avatar Dec 11 '22 10:12 vladfrangu

I'm just running this to patch it locally, rather annoying that TS is inconsistent with how enums get exported w/ strings vs numbers:

This is the way it has to be. There's nothing to stop you having an enum like

enum StringEnum {
  Foo = 'Bar',
  Bar = 'Baz',
  Baz = 'Foo'
}

and there's no way of creating a bidirectional key-to-value map when the keys and values are allowed to overlap.

I doubt we'd change the enums themselves but I'd be willing to merge a utility method for getting the PascalCase name 👍

Is there a significant usage case for this? Besides users wanting to use PascalCase strings for logging purposes or whatnot, but there are plenty of case converter packages in the npm ecosystem that they can use.

Renegade334 avatar Sep 28 '23 12:09 Renegade334