-
Notifications
You must be signed in to change notification settings - Fork 178
/
FbtConstants.js
163 lines (137 loc) · 3.57 KB
/
FbtConstants.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/**
* Copyright 2004-present Facebook. All Rights Reserved.
*
* Same set of 'usage' values as in :fbt:pronoun::type. Must match
* PRONOUN_USAGE in fbt.js.
* NOTE: Using 'usage' here, whereas :fbt:pronoun uses 'type'. It's confusing,
* but fbt() already uses 'type' as the tag within the fbt table data for the
* to-be-localized text.
*
* @format
* @emails oncall i18n_fbt_js
* @flow strict-local
*/
/*eslint max-len: ["error", 100]*/
const keyMirror = require('fbjs/lib/keyMirror');
export type FbtOptionValue = string | boolean | BabelNode;
export type FbtOptionValues<K> = {|[K]: ?FbtOptionValue|};
export type FbtOptionConfig<K> = {|[K]: {[optionValue: string]: true} | true|};
// export type FbtCallSiteOptions = {[$Keys<typeof ValidFbtOptions>]: ?FbtOptionValue};
export type FbtCallSiteOptions = $Shape<{|
author?: ?FbtOptionValue,
// TODO(T56277500) Refine to expected type: string
common?: ?FbtOptionValue,
doNotExtract?: ?boolean,
// TODO(T56277500) Refine to expected type: boolean
preserveWhitespace?: ?FbtOptionValue,
project: string,
// TODO(T56277500) Refine to expected type: BabelNode
subject?: ?FbtOptionValue,
|}>;
// JS module names without the "React FBT" variant
export type JSModuleNameType = 'fbt' | 'fbs';
export type ValidPronounUsagesKey = $Keys<typeof ValidPronounUsages>;
const SENTINEL = '__FBT__';
const PluralRequiredAttributes = {
count: true,
};
const ShowCount = {
yes: true,
no: true,
ifMany: true,
};
const ShowCountKeys: $ObjMapi<typeof ShowCount, <K>(K) => K> = keyMirror(
ShowCount,
);
const PluralOptions = {
value: true, // optional value to replace token (rather than count)
showCount: ShowCount,
name: true, // token
many: true,
};
const ValidPluralOptions = {
...PluralOptions,
...PluralRequiredAttributes,
};
const ValidPronounUsages = {
object: 0,
possessive: 1,
reflexive: 2,
subject: 3,
};
const ValidPronounUsagesKeys: $ObjMapi<
typeof ValidPronounUsages,
<K>(K) => K,
> = keyMirror(ValidPronounUsages);
const ValidPronounOptions = {
human: {true: true, false: true},
capitalize: {true: true, false: true},
};
const PronounRequiredAttributes = {
type: true, // See ValidPronounUsages for valid strings
gender: true,
};
/**
* Valid options allowed in the fbt(...) calls.
*/
const ValidFbtOptions = {
author: true,
common: true,
doNotExtract: true,
preserveWhitespace: true,
project: true,
subject: true,
};
const FbtBooleanOptions = {
preserveWhitespace: true,
doNotExtract: true,
};
const FbtCallMustHaveAtLeastOneOfTheseAttributes = ['desc', 'common'];
const FbtRequiredAttributes = {
desc: true,
};
const PLURAL_PARAM_TOKEN = 'number';
const RequiredParamOptions = {
name: true,
};
const ValidParamOptions = {
number: true,
gender: true,
...RequiredParamOptions,
};
const FbtType = {
TABLE: 'table',
TEXT: 'text',
};
const JSModuleName = {
FBT: 'fbt',
REACT_FBT: 'Fbt',
FBS: 'fbs',
};
// Used to help detect the usage of the JS fbt/fbs API inside a JS file
const ModuleNameRegExp: RegExp = new RegExp(
`\\b(?:${Object.values(JSModuleName).join('|')})\\b`,
);
const FBT_ENUM_MODULE_SUFFIX = '$FbtEnum';
module.exports = {
FBT_ENUM_MODULE_SUFFIX,
FbtBooleanOptions,
FbtCallMustHaveAtLeastOneOfTheseAttributes,
FbtRequiredAttributes,
FbtType,
JSModuleName,
ModuleNameRegExp,
PLURAL_PARAM_TOKEN,
PluralOptions,
PluralRequiredAttributes,
PronounRequiredAttributes,
RequiredParamOptions,
SENTINEL,
ShowCountKeys,
ValidFbtOptions,
ValidParamOptions,
ValidPluralOptions,
ValidPronounOptions,
ValidPronounUsages,
ValidPronounUsagesKeys,
};