packages/babel-plugin-fbt/src/Gender.js (209 lines of code) (raw):
/**
* (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary.
*
* @emails oncall+i18n_fbt_js
* @flow strict
* @format
*/
/* eslint max-len: ["warn", 120] */
/* eslint-disable fb-www/gender-neutral-language */
'use strict';
type GenderConfig = {|
is_male: boolean,
is_female: boolean,
is_neuter: boolean,
is_plural: boolean,
is_mixed: boolean,
is_guess: boolean,
is_unknown: boolean,
subject: string,
possessive: string,
reflexive: string,
object: string,
string: string,
|};
export type GenderConstEnum = $GenderConstEnum;
// Keep this in sync with GenderConst.js (of the fbt npm module)
// TODO(T70508769) Figure out a way to keep this in sync more transparently
const GENDER_CONST = Object.freeze({
NOT_A_PERSON: ((0: $FlowExpectedError): GenderConstEnum),
FEMALE_SINGULAR: ((1: $FlowExpectedError): GenderConstEnum),
MALE_SINGULAR: ((2: $FlowExpectedError): GenderConstEnum),
FEMALE_SINGULAR_GUESS: ((3: $FlowExpectedError): GenderConstEnum),
MALE_SINGULAR_GUESS: ((4: $FlowExpectedError): GenderConstEnum),
// 5 seems to indicate a group of people who may be of mixed gender
MIXED_UNKNOWN: ((5: $FlowExpectedError): GenderConstEnum),
NEUTER_SINGULAR: ((6: $FlowExpectedError): GenderConstEnum),
UNKNOWN_SINGULAR: ((7: $FlowExpectedError): GenderConstEnum),
FEMALE_PLURAL: ((8: $FlowExpectedError): GenderConstEnum),
MALE_PLURAL: ((9: $FlowExpectedError): GenderConstEnum),
NEUTER_PLURAL: ((10: $FlowExpectedError): GenderConstEnum),
UNKNOWN_PLURAL: ((11: $FlowExpectedError): GenderConstEnum),
});
const data: {[GenderConstEnum]: GenderConfig} = {
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.NOT_A_PERSON]: {
is_male: false,
is_female: false,
is_neuter: false,
is_plural: false,
is_mixed: false,
is_guess: false,
is_unknown: true,
subject: 'they',
possessive: 'their',
reflexive: 'themself',
object: 'this',
string: 'unknown',
},
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.UNKNOWN_SINGULAR]: {
is_male: false,
is_female: false,
is_neuter: false,
is_plural: false,
is_mixed: false,
is_guess: false,
is_unknown: true,
subject: 'they',
possessive: 'their',
reflexive: 'themself',
object: 'them',
string: 'unknown singular',
},
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.FEMALE_SINGULAR]: {
is_male: false,
is_female: true,
is_neuter: false,
is_plural: false,
is_mixed: false,
is_guess: false,
is_unknown: false,
subject: 'she',
possessive: 'her',
reflexive: 'herself',
object: 'her',
string: 'female singular',
},
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.FEMALE_SINGULAR_GUESS]: {
is_male: false,
is_female: true,
is_neuter: false,
is_plural: false,
is_mixed: false,
is_guess: true,
is_unknown: false,
subject: 'she',
possessive: 'her',
reflexive: 'herself',
object: 'her',
string: 'female singular',
},
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.MALE_SINGULAR]: {
is_male: true,
is_female: false,
is_neuter: false,
is_plural: false,
is_mixed: false,
is_guess: false,
is_unknown: false,
subject: 'he',
possessive: 'his',
reflexive: 'himself',
object: 'him',
string: 'male singular',
},
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.MALE_SINGULAR_GUESS]: {
is_male: true,
is_female: false,
is_neuter: false,
is_plural: false,
is_mixed: false,
is_guess: true,
is_unknown: false,
subject: 'he',
possessive: 'his',
reflexive: 'himself',
object: 'him',
string: 'male singular',
},
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.NEUTER_SINGULAR]: {
is_male: false,
is_female: false,
is_neuter: true,
is_plural: false,
is_mixed: false,
is_guess: false,
is_unknown: false,
subject: 'they',
possessive: 'their',
reflexive: 'themself',
object: 'them',
string: 'neuter singular',
},
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.MIXED_UNKNOWN]: {
is_male: false,
is_female: false,
is_neuter: false,
is_plural: true,
is_mixed: true,
is_guess: false,
is_unknown: false,
subject: 'they',
possessive: 'their',
reflexive: 'themselves',
object: 'them',
string: 'mixed plural',
},
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.FEMALE_PLURAL]: {
is_male: false,
is_female: true,
is_neuter: false,
is_plural: true,
is_mixed: false,
is_guess: false,
is_unknown: false,
subject: 'they',
possessive: 'their',
reflexive: 'themselves',
object: 'them',
string: 'female plural',
},
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.MALE_PLURAL]: {
is_male: true,
is_female: false,
is_neuter: false,
is_plural: true,
is_mixed: false,
is_guess: false,
is_unknown: false,
subject: 'they',
possessive: 'their',
reflexive: 'themselves',
object: 'them',
string: 'male plural',
},
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.NEUTER_PLURAL]: {
is_male: false,
is_female: false,
is_neuter: true,
is_plural: true,
is_mixed: false,
is_guess: false,
is_unknown: false,
subject: 'they',
possessive: 'their',
reflexive: 'themselves',
object: 'them',
string: 'neuter plural',
},
// $FlowExpectedError[invalid-computed-prop] Tolerate using an opaque type as an object key
[GENDER_CONST.UNKNOWN_PLURAL]: {
is_male: false,
is_female: false,
is_neuter: false,
is_plural: true,
is_mixed: false,
is_guess: false,
is_unknown: true,
subject: 'they',
possessive: 'their',
reflexive: 'themselves',
object: 'them',
string: 'unknown plural',
},
};
function getData(
gender: GenderConstEnum,
usage: $Keys<GenderConfig>,
): boolean | string {
return data[gender]
? data[gender][usage]
: data[GENDER_CONST.NOT_A_PERSON][usage];
}
module.exports = {getData, GENDER_CONST};