@buoy-gg/env 7.0.28 → 7.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/env/components/EnvStatsOverview.js +25 -0
- package/lib/commonjs/env/components/EnvVarRow.js +23 -4
- package/lib/commonjs/env/components/EnvVarsModal.js +26 -4
- package/lib/module/env/components/EnvStatsOverview.js +25 -0
- package/lib/module/env/components/EnvVarRow.js +23 -4
- package/lib/module/env/components/EnvVarsModal.js +26 -4
- package/lib/typescript/env/components/EnvStatsOverview.d.ts.map +1 -1
- package/lib/typescript/env/components/EnvVarRow.d.ts.map +1 -1
- package/lib/typescript/env/components/EnvVarsModal.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -24,6 +24,9 @@ function EnvStatsOverview({
|
|
|
24
24
|
statusSublabel: healthStatus.toLowerCase(),
|
|
25
25
|
primaryText: "Environment Configuration",
|
|
26
26
|
secondaryText: `${healthPercentage}% healthy`,
|
|
27
|
+
testID: "buoy-env-health",
|
|
28
|
+
statusSublabelTestID: "buoy-env-health-status",
|
|
29
|
+
accessibilityLabel: `Environment configuration ${healthStatus.toLowerCase()}, ${healthPercentage}% healthy`,
|
|
27
30
|
customBadge: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
28
31
|
style: [styles.percentBadge, {
|
|
29
32
|
borderColor: healthColor + "40",
|
|
@@ -33,6 +36,7 @@ function EnvStatsOverview({
|
|
|
33
36
|
style: [styles.percentText, {
|
|
34
37
|
color: healthColor
|
|
35
38
|
}],
|
|
39
|
+
testID: "buoy-env-health-percent",
|
|
36
40
|
children: [healthPercentage, "%"]
|
|
37
41
|
})
|
|
38
42
|
})
|
|
@@ -42,8 +46,15 @@ function EnvStatsOverview({
|
|
|
42
46
|
style: [styles.statCard, activeFilter === "all" && styles.statCardActive],
|
|
43
47
|
onPress: () => onFilterChange?.("all"),
|
|
44
48
|
activeOpacity: 0.8,
|
|
49
|
+
testID: "buoy-env-filter-all",
|
|
50
|
+
accessibilityRole: "button",
|
|
51
|
+
accessibilityLabel: "Show all variables",
|
|
52
|
+
accessibilityState: {
|
|
53
|
+
selected: activeFilter === "all"
|
|
54
|
+
},
|
|
45
55
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
46
56
|
style: [styles.statValue, activeFilter === "all" && styles.statValueActive],
|
|
57
|
+
testID: "buoy-env-filter-all-count",
|
|
47
58
|
children: stats.requiredCount + stats.optionalCount
|
|
48
59
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
49
60
|
style: [styles.statLabel, activeFilter === "all" && styles.statLabelActive],
|
|
@@ -53,8 +64,15 @@ function EnvStatsOverview({
|
|
|
53
64
|
style: [styles.statCard, activeFilter === "missing" && styles.statCardActive],
|
|
54
65
|
onPress: () => onFilterChange?.("missing"),
|
|
55
66
|
activeOpacity: 0.8,
|
|
67
|
+
testID: "buoy-env-filter-missing",
|
|
68
|
+
accessibilityRole: "button",
|
|
69
|
+
accessibilityLabel: "Show missing variables",
|
|
70
|
+
accessibilityState: {
|
|
71
|
+
selected: activeFilter === "missing"
|
|
72
|
+
},
|
|
56
73
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
57
74
|
style: [styles.statValue, activeFilter === "missing" && styles.statValueActive],
|
|
75
|
+
testID: "buoy-env-filter-missing-count",
|
|
58
76
|
children: stats.missingCount
|
|
59
77
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
60
78
|
style: [styles.statLabel, activeFilter === "missing" && styles.statLabelActive],
|
|
@@ -64,8 +82,15 @@ function EnvStatsOverview({
|
|
|
64
82
|
style: [styles.statCard, activeFilter === "issues" && styles.statCardActive],
|
|
65
83
|
onPress: () => onFilterChange?.("issues"),
|
|
66
84
|
activeOpacity: 0.8,
|
|
85
|
+
testID: "buoy-env-filter-issues",
|
|
86
|
+
accessibilityRole: "button",
|
|
87
|
+
accessibilityLabel: "Show variables with issues",
|
|
88
|
+
accessibilityState: {
|
|
89
|
+
selected: activeFilter === "issues"
|
|
90
|
+
},
|
|
67
91
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
68
92
|
style: [styles.statValue, activeFilter === "issues" && styles.statValueActive],
|
|
93
|
+
testID: "buoy-env-filter-issues-count",
|
|
69
94
|
children: issuesCount
|
|
70
95
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
71
96
|
style: [styles.statLabel, activeFilter === "issues" && styles.statLabelActive],
|
|
@@ -66,6 +66,11 @@ function EnvVarRow({
|
|
|
66
66
|
const keyParts = envVar.key.split("_");
|
|
67
67
|
const primaryText = keyParts.map(part => part.toLowerCase()).join(" › ");
|
|
68
68
|
|
|
69
|
+
// The key is the row's identity everywhere a handle is needed. The visible
|
|
70
|
+
// primary text is the prettified "expo › public › api › url" form, which is
|
|
71
|
+
// no use to a test (or to VoiceOver) trying to find one specific variable.
|
|
72
|
+
const rowID = `buoy-env-row-${envVar.key}`;
|
|
73
|
+
|
|
69
74
|
// Create expanded content for value and expected value
|
|
70
75
|
const expandedContent = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
71
76
|
style: styles.expandedContainer,
|
|
@@ -77,6 +82,7 @@ function EnvVarRow({
|
|
|
77
82
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
78
83
|
style: styles.expandedValue,
|
|
79
84
|
numberOfLines: 3,
|
|
85
|
+
testID: `${rowID}-value`,
|
|
80
86
|
children: formatValue(envVar.value) || "undefined"
|
|
81
87
|
})]
|
|
82
88
|
}), envVar.status === "required_wrong_type" && envVar.expectedType && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
@@ -86,7 +92,8 @@ function EnvVarRow({
|
|
|
86
92
|
style: styles.expandedLabel,
|
|
87
93
|
children: "Type:"
|
|
88
94
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TypeBadge, {
|
|
89
|
-
type: (0, _envTypeDetector.getEnvVarType)(envVar.value)
|
|
95
|
+
type: (0, _envTypeDetector.getEnvVarType)(envVar.value),
|
|
96
|
+
testID: `${rowID}-actual-type`
|
|
90
97
|
})]
|
|
91
98
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
92
99
|
style: styles.expandedRow,
|
|
@@ -94,7 +101,8 @@ function EnvVarRow({
|
|
|
94
101
|
style: styles.expandedLabel,
|
|
95
102
|
children: "Expected:"
|
|
96
103
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TypeBadge, {
|
|
97
|
-
type: envVar.expectedType
|
|
104
|
+
type: envVar.expectedType,
|
|
105
|
+
testID: `${rowID}-expected-type`
|
|
98
106
|
})]
|
|
99
107
|
})]
|
|
100
108
|
}), envVar.status === "required_wrong_value" && envVar.expectedValue && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
@@ -104,6 +112,7 @@ function EnvVarRow({
|
|
|
104
112
|
children: "Expected:"
|
|
105
113
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
106
114
|
style: styles.expandedExpected,
|
|
115
|
+
testID: `${rowID}-expected-value`,
|
|
107
116
|
children: String(envVar.expectedValue)
|
|
108
117
|
})]
|
|
109
118
|
}), envVar.description && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
@@ -113,6 +122,7 @@ function EnvVarRow({
|
|
|
113
122
|
children: "Info:"
|
|
114
123
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
115
124
|
style: styles.expandedDescription,
|
|
125
|
+
testID: `${rowID}-description`,
|
|
116
126
|
children: envVar.description
|
|
117
127
|
})]
|
|
118
128
|
})]
|
|
@@ -128,10 +138,19 @@ function EnvVarRow({
|
|
|
128
138
|
isExpanded: isExpanded,
|
|
129
139
|
expandedGlowColor: config.color,
|
|
130
140
|
customBadge: envVar.expectedType ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TypeBadge, {
|
|
131
|
-
type: envVar.expectedType
|
|
141
|
+
type: envVar.expectedType,
|
|
142
|
+
testID: `${rowID}-type-badge`
|
|
132
143
|
}) : undefined,
|
|
133
144
|
showChevron: true,
|
|
134
|
-
onPress: onPress ? () => onPress(envVar) : undefined
|
|
145
|
+
onPress: onPress ? () => onPress(envVar) : undefined,
|
|
146
|
+
testID: rowID,
|
|
147
|
+
statusTestID: `${rowID}-status`,
|
|
148
|
+
statusSublabelTestID: `${rowID}-category`
|
|
149
|
+
// The status is carried by a coloured dot and a two-word label that the
|
|
150
|
+
// row's container merges away on Fabric — spelled out here so the verdict
|
|
151
|
+
// reaches assistive tech (and Maestro) with the key it belongs to.
|
|
152
|
+
,
|
|
153
|
+
accessibilityLabel: `${envVar.key}, ${config.label}, ${config.sublabel}`
|
|
135
154
|
});
|
|
136
155
|
}
|
|
137
156
|
const styles = _reactNative.StyleSheet.create({
|
|
@@ -140,7 +140,15 @@ function EnvVarsModal({
|
|
|
140
140
|
title: isSearchActive ? "" : "Environment Variables",
|
|
141
141
|
noMargin: isSearchActive,
|
|
142
142
|
children: isSearchActive && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
143
|
-
style: styles.headerSearchContainer
|
|
143
|
+
style: styles.headerSearchContainer
|
|
144
|
+
// The field itself is a handle Detox can use but XCUITest
|
|
145
|
+
// cannot: on this RN version a TextInput's testID never
|
|
146
|
+
// reaches the XCUITest element tree — iOS folds the input
|
|
147
|
+
// into the header's accessibility container (the same is
|
|
148
|
+
// true of the network and storage search fields). This
|
|
149
|
+
// wrapper is the handle the a11y lane can actually see.
|
|
150
|
+
,
|
|
151
|
+
testID: "buoy-env-search-field",
|
|
144
152
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
|
|
145
153
|
size: 12,
|
|
146
154
|
color: _sharedUi.night.color.textSecondary
|
|
@@ -152,13 +160,18 @@ function EnvVarsModal({
|
|
|
152
160
|
value: searchQuery,
|
|
153
161
|
onChangeText: setSearchQuery,
|
|
154
162
|
autoCorrect: false,
|
|
155
|
-
autoCapitalize: "none"
|
|
163
|
+
autoCapitalize: "none",
|
|
164
|
+
testID: "buoy-env-search",
|
|
165
|
+
accessibilityLabel: "Search env keys"
|
|
156
166
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
|
|
157
167
|
onPress: () => {
|
|
158
168
|
setIsSearchActive(false);
|
|
159
169
|
setSearchQuery("");
|
|
160
170
|
},
|
|
161
171
|
style: styles.clearButton,
|
|
172
|
+
testID: "buoy-env-search-clear",
|
|
173
|
+
accessibilityRole: "button",
|
|
174
|
+
accessibilityLabel: "Clear search",
|
|
162
175
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.X, {
|
|
163
176
|
size: 12,
|
|
164
177
|
color: _sharedUi.night.color.textSecondary
|
|
@@ -167,7 +180,9 @@ function EnvVarsModal({
|
|
|
167
180
|
})
|
|
168
181
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ModalHeader.Actions, {
|
|
169
182
|
children: !isSearchActive && /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.HeaderSearchButton, {
|
|
170
|
-
onPress: () => setIsSearchActive(true)
|
|
183
|
+
onPress: () => setIsSearchActive(true),
|
|
184
|
+
testID: "buoy-env-search-open",
|
|
185
|
+
accessibilityLabel: "Search env keys"
|
|
171
186
|
})
|
|
172
187
|
})]
|
|
173
188
|
});
|
|
@@ -175,6 +190,7 @@ function EnvVarsModal({
|
|
|
175
190
|
style: styles.scrollContainer,
|
|
176
191
|
contentContainerStyle: styles.contentContainer,
|
|
177
192
|
showsVerticalScrollIndicator: false,
|
|
193
|
+
testID: "buoy-env-scroll",
|
|
178
194
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_EnvStatsOverview.EnvStatsOverview, {
|
|
179
195
|
stats: stats,
|
|
180
196
|
healthPercentage: healthPercentage,
|
|
@@ -188,11 +204,13 @@ function EnvVarsModal({
|
|
|
188
204
|
style: styles.sectionHeader,
|
|
189
205
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
190
206
|
style: styles.sectionTitle,
|
|
207
|
+
testID: "buoy-env-section-title",
|
|
191
208
|
children: activeFilter === "all" ? "ALL VARIABLES" : activeFilter === "missing" ? "MISSING VARIABLES" : "ISSUES TO FIX"
|
|
192
209
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
193
210
|
style: styles.countBadge,
|
|
194
211
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
195
212
|
style: styles.countText,
|
|
213
|
+
testID: "buoy-env-section-count",
|
|
196
214
|
children: filteredVars.length
|
|
197
215
|
})
|
|
198
216
|
})]
|
|
@@ -204,14 +222,17 @@ function EnvVarsModal({
|
|
|
204
222
|
})]
|
|
205
223
|
}) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
206
224
|
style: styles.emptyState,
|
|
225
|
+
testID: "buoy-env-empty",
|
|
207
226
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Search, {
|
|
208
227
|
size: 32,
|
|
209
228
|
color: _sharedUi.night.color.textTertiary
|
|
210
229
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
211
230
|
style: styles.emptyTitle,
|
|
231
|
+
testID: "buoy-env-empty-title",
|
|
212
232
|
children: searchQuery ? "No results found" : "No variables"
|
|
213
233
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
214
234
|
style: styles.emptySubtitle,
|
|
235
|
+
testID: "buoy-env-empty-subtitle",
|
|
215
236
|
children: searchQuery ? `No variables matching "${searchQuery}"` : `No ${activeFilter === "all" ? "" : activeFilter} variables found`
|
|
216
237
|
})]
|
|
217
238
|
})]
|
|
@@ -274,7 +295,8 @@ const styles = _reactNative.StyleSheet.create({
|
|
|
274
295
|
paddingVertical: 8,
|
|
275
296
|
borderBottomWidth: 1,
|
|
276
297
|
borderBottomColor: _sharedUi.buoyColors.border,
|
|
277
|
-
|
|
298
|
+
// Clear, like Bench — the host's hoisted sky shows through the header.
|
|
299
|
+
backgroundColor: "transparent"
|
|
278
300
|
},
|
|
279
301
|
scrollContainer: {
|
|
280
302
|
flex: 1,
|
|
@@ -20,6 +20,9 @@ export function EnvStatsOverview({
|
|
|
20
20
|
statusSublabel: healthStatus.toLowerCase(),
|
|
21
21
|
primaryText: "Environment Configuration",
|
|
22
22
|
secondaryText: `${healthPercentage}% healthy`,
|
|
23
|
+
testID: "buoy-env-health",
|
|
24
|
+
statusSublabelTestID: "buoy-env-health-status",
|
|
25
|
+
accessibilityLabel: `Environment configuration ${healthStatus.toLowerCase()}, ${healthPercentage}% healthy`,
|
|
23
26
|
customBadge: /*#__PURE__*/_jsx(View, {
|
|
24
27
|
style: [styles.percentBadge, {
|
|
25
28
|
borderColor: healthColor + "40",
|
|
@@ -29,6 +32,7 @@ export function EnvStatsOverview({
|
|
|
29
32
|
style: [styles.percentText, {
|
|
30
33
|
color: healthColor
|
|
31
34
|
}],
|
|
35
|
+
testID: "buoy-env-health-percent",
|
|
32
36
|
children: [healthPercentage, "%"]
|
|
33
37
|
})
|
|
34
38
|
})
|
|
@@ -38,8 +42,15 @@ export function EnvStatsOverview({
|
|
|
38
42
|
style: [styles.statCard, activeFilter === "all" && styles.statCardActive],
|
|
39
43
|
onPress: () => onFilterChange?.("all"),
|
|
40
44
|
activeOpacity: 0.8,
|
|
45
|
+
testID: "buoy-env-filter-all",
|
|
46
|
+
accessibilityRole: "button",
|
|
47
|
+
accessibilityLabel: "Show all variables",
|
|
48
|
+
accessibilityState: {
|
|
49
|
+
selected: activeFilter === "all"
|
|
50
|
+
},
|
|
41
51
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
42
52
|
style: [styles.statValue, activeFilter === "all" && styles.statValueActive],
|
|
53
|
+
testID: "buoy-env-filter-all-count",
|
|
43
54
|
children: stats.requiredCount + stats.optionalCount
|
|
44
55
|
}), /*#__PURE__*/_jsx(Text, {
|
|
45
56
|
style: [styles.statLabel, activeFilter === "all" && styles.statLabelActive],
|
|
@@ -49,8 +60,15 @@ export function EnvStatsOverview({
|
|
|
49
60
|
style: [styles.statCard, activeFilter === "missing" && styles.statCardActive],
|
|
50
61
|
onPress: () => onFilterChange?.("missing"),
|
|
51
62
|
activeOpacity: 0.8,
|
|
63
|
+
testID: "buoy-env-filter-missing",
|
|
64
|
+
accessibilityRole: "button",
|
|
65
|
+
accessibilityLabel: "Show missing variables",
|
|
66
|
+
accessibilityState: {
|
|
67
|
+
selected: activeFilter === "missing"
|
|
68
|
+
},
|
|
52
69
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
53
70
|
style: [styles.statValue, activeFilter === "missing" && styles.statValueActive],
|
|
71
|
+
testID: "buoy-env-filter-missing-count",
|
|
54
72
|
children: stats.missingCount
|
|
55
73
|
}), /*#__PURE__*/_jsx(Text, {
|
|
56
74
|
style: [styles.statLabel, activeFilter === "missing" && styles.statLabelActive],
|
|
@@ -60,8 +78,15 @@ export function EnvStatsOverview({
|
|
|
60
78
|
style: [styles.statCard, activeFilter === "issues" && styles.statCardActive],
|
|
61
79
|
onPress: () => onFilterChange?.("issues"),
|
|
62
80
|
activeOpacity: 0.8,
|
|
81
|
+
testID: "buoy-env-filter-issues",
|
|
82
|
+
accessibilityRole: "button",
|
|
83
|
+
accessibilityLabel: "Show variables with issues",
|
|
84
|
+
accessibilityState: {
|
|
85
|
+
selected: activeFilter === "issues"
|
|
86
|
+
},
|
|
63
87
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
64
88
|
style: [styles.statValue, activeFilter === "issues" && styles.statValueActive],
|
|
89
|
+
testID: "buoy-env-filter-issues-count",
|
|
65
90
|
children: issuesCount
|
|
66
91
|
}), /*#__PURE__*/_jsx(Text, {
|
|
67
92
|
style: [styles.statLabel, activeFilter === "issues" && styles.statLabelActive],
|
|
@@ -62,6 +62,11 @@ export function EnvVarRow({
|
|
|
62
62
|
const keyParts = envVar.key.split("_");
|
|
63
63
|
const primaryText = keyParts.map(part => part.toLowerCase()).join(" › ");
|
|
64
64
|
|
|
65
|
+
// The key is the row's identity everywhere a handle is needed. The visible
|
|
66
|
+
// primary text is the prettified "expo › public › api › url" form, which is
|
|
67
|
+
// no use to a test (or to VoiceOver) trying to find one specific variable.
|
|
68
|
+
const rowID = `buoy-env-row-${envVar.key}`;
|
|
69
|
+
|
|
65
70
|
// Create expanded content for value and expected value
|
|
66
71
|
const expandedContent = /*#__PURE__*/_jsxs(View, {
|
|
67
72
|
style: styles.expandedContainer,
|
|
@@ -73,6 +78,7 @@ export function EnvVarRow({
|
|
|
73
78
|
}), /*#__PURE__*/_jsx(Text, {
|
|
74
79
|
style: styles.expandedValue,
|
|
75
80
|
numberOfLines: 3,
|
|
81
|
+
testID: `${rowID}-value`,
|
|
76
82
|
children: formatValue(envVar.value) || "undefined"
|
|
77
83
|
})]
|
|
78
84
|
}), envVar.status === "required_wrong_type" && envVar.expectedType && /*#__PURE__*/_jsxs(_Fragment, {
|
|
@@ -82,7 +88,8 @@ export function EnvVarRow({
|
|
|
82
88
|
style: styles.expandedLabel,
|
|
83
89
|
children: "Type:"
|
|
84
90
|
}), /*#__PURE__*/_jsx(TypeBadge, {
|
|
85
|
-
type: getEnvVarType(envVar.value)
|
|
91
|
+
type: getEnvVarType(envVar.value),
|
|
92
|
+
testID: `${rowID}-actual-type`
|
|
86
93
|
})]
|
|
87
94
|
}), /*#__PURE__*/_jsxs(View, {
|
|
88
95
|
style: styles.expandedRow,
|
|
@@ -90,7 +97,8 @@ export function EnvVarRow({
|
|
|
90
97
|
style: styles.expandedLabel,
|
|
91
98
|
children: "Expected:"
|
|
92
99
|
}), /*#__PURE__*/_jsx(TypeBadge, {
|
|
93
|
-
type: envVar.expectedType
|
|
100
|
+
type: envVar.expectedType,
|
|
101
|
+
testID: `${rowID}-expected-type`
|
|
94
102
|
})]
|
|
95
103
|
})]
|
|
96
104
|
}), envVar.status === "required_wrong_value" && envVar.expectedValue && /*#__PURE__*/_jsxs(View, {
|
|
@@ -100,6 +108,7 @@ export function EnvVarRow({
|
|
|
100
108
|
children: "Expected:"
|
|
101
109
|
}), /*#__PURE__*/_jsx(Text, {
|
|
102
110
|
style: styles.expandedExpected,
|
|
111
|
+
testID: `${rowID}-expected-value`,
|
|
103
112
|
children: String(envVar.expectedValue)
|
|
104
113
|
})]
|
|
105
114
|
}), envVar.description && /*#__PURE__*/_jsxs(View, {
|
|
@@ -109,6 +118,7 @@ export function EnvVarRow({
|
|
|
109
118
|
children: "Info:"
|
|
110
119
|
}), /*#__PURE__*/_jsx(Text, {
|
|
111
120
|
style: styles.expandedDescription,
|
|
121
|
+
testID: `${rowID}-description`,
|
|
112
122
|
children: envVar.description
|
|
113
123
|
})]
|
|
114
124
|
})]
|
|
@@ -124,10 +134,19 @@ export function EnvVarRow({
|
|
|
124
134
|
isExpanded: isExpanded,
|
|
125
135
|
expandedGlowColor: config.color,
|
|
126
136
|
customBadge: envVar.expectedType ? /*#__PURE__*/_jsx(TypeBadge, {
|
|
127
|
-
type: envVar.expectedType
|
|
137
|
+
type: envVar.expectedType,
|
|
138
|
+
testID: `${rowID}-type-badge`
|
|
128
139
|
}) : undefined,
|
|
129
140
|
showChevron: true,
|
|
130
|
-
onPress: onPress ? () => onPress(envVar) : undefined
|
|
141
|
+
onPress: onPress ? () => onPress(envVar) : undefined,
|
|
142
|
+
testID: rowID,
|
|
143
|
+
statusTestID: `${rowID}-status`,
|
|
144
|
+
statusSublabelTestID: `${rowID}-category`
|
|
145
|
+
// The status is carried by a coloured dot and a two-word label that the
|
|
146
|
+
// row's container merges away on Fabric — spelled out here so the verdict
|
|
147
|
+
// reaches assistive tech (and Maestro) with the key it belongs to.
|
|
148
|
+
,
|
|
149
|
+
accessibilityLabel: `${envVar.key}, ${config.label}, ${config.sublabel}`
|
|
131
150
|
});
|
|
132
151
|
}
|
|
133
152
|
const styles = StyleSheet.create({
|
|
@@ -135,7 +135,15 @@ export function EnvVarsModal({
|
|
|
135
135
|
title: isSearchActive ? "" : "Environment Variables",
|
|
136
136
|
noMargin: isSearchActive,
|
|
137
137
|
children: isSearchActive && /*#__PURE__*/_jsxs(View, {
|
|
138
|
-
style: styles.headerSearchContainer
|
|
138
|
+
style: styles.headerSearchContainer
|
|
139
|
+
// The field itself is a handle Detox can use but XCUITest
|
|
140
|
+
// cannot: on this RN version a TextInput's testID never
|
|
141
|
+
// reaches the XCUITest element tree — iOS folds the input
|
|
142
|
+
// into the header's accessibility container (the same is
|
|
143
|
+
// true of the network and storage search fields). This
|
|
144
|
+
// wrapper is the handle the a11y lane can actually see.
|
|
145
|
+
,
|
|
146
|
+
testID: "buoy-env-search-field",
|
|
139
147
|
children: [/*#__PURE__*/_jsx(Search, {
|
|
140
148
|
size: 12,
|
|
141
149
|
color: night.color.textSecondary
|
|
@@ -147,13 +155,18 @@ export function EnvVarsModal({
|
|
|
147
155
|
value: searchQuery,
|
|
148
156
|
onChangeText: setSearchQuery,
|
|
149
157
|
autoCorrect: false,
|
|
150
|
-
autoCapitalize: "none"
|
|
158
|
+
autoCapitalize: "none",
|
|
159
|
+
testID: "buoy-env-search",
|
|
160
|
+
accessibilityLabel: "Search env keys"
|
|
151
161
|
}), /*#__PURE__*/_jsx(TouchableOpacity, {
|
|
152
162
|
onPress: () => {
|
|
153
163
|
setIsSearchActive(false);
|
|
154
164
|
setSearchQuery("");
|
|
155
165
|
},
|
|
156
166
|
style: styles.clearButton,
|
|
167
|
+
testID: "buoy-env-search-clear",
|
|
168
|
+
accessibilityRole: "button",
|
|
169
|
+
accessibilityLabel: "Clear search",
|
|
157
170
|
children: /*#__PURE__*/_jsx(X, {
|
|
158
171
|
size: 12,
|
|
159
172
|
color: night.color.textSecondary
|
|
@@ -162,7 +175,9 @@ export function EnvVarsModal({
|
|
|
162
175
|
})
|
|
163
176
|
}), /*#__PURE__*/_jsx(ModalHeader.Actions, {
|
|
164
177
|
children: !isSearchActive && /*#__PURE__*/_jsx(HeaderSearchButton, {
|
|
165
|
-
onPress: () => setIsSearchActive(true)
|
|
178
|
+
onPress: () => setIsSearchActive(true),
|
|
179
|
+
testID: "buoy-env-search-open",
|
|
180
|
+
accessibilityLabel: "Search env keys"
|
|
166
181
|
})
|
|
167
182
|
})]
|
|
168
183
|
});
|
|
@@ -170,6 +185,7 @@ export function EnvVarsModal({
|
|
|
170
185
|
style: styles.scrollContainer,
|
|
171
186
|
contentContainerStyle: styles.contentContainer,
|
|
172
187
|
showsVerticalScrollIndicator: false,
|
|
188
|
+
testID: "buoy-env-scroll",
|
|
173
189
|
children: [/*#__PURE__*/_jsx(EnvStatsOverview, {
|
|
174
190
|
stats: stats,
|
|
175
191
|
healthPercentage: healthPercentage,
|
|
@@ -183,11 +199,13 @@ export function EnvVarsModal({
|
|
|
183
199
|
style: styles.sectionHeader,
|
|
184
200
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
185
201
|
style: styles.sectionTitle,
|
|
202
|
+
testID: "buoy-env-section-title",
|
|
186
203
|
children: activeFilter === "all" ? "ALL VARIABLES" : activeFilter === "missing" ? "MISSING VARIABLES" : "ISSUES TO FIX"
|
|
187
204
|
}), /*#__PURE__*/_jsx(View, {
|
|
188
205
|
style: styles.countBadge,
|
|
189
206
|
children: /*#__PURE__*/_jsx(Text, {
|
|
190
207
|
style: styles.countText,
|
|
208
|
+
testID: "buoy-env-section-count",
|
|
191
209
|
children: filteredVars.length
|
|
192
210
|
})
|
|
193
211
|
})]
|
|
@@ -199,14 +217,17 @@ export function EnvVarsModal({
|
|
|
199
217
|
})]
|
|
200
218
|
}) : /*#__PURE__*/_jsxs(View, {
|
|
201
219
|
style: styles.emptyState,
|
|
220
|
+
testID: "buoy-env-empty",
|
|
202
221
|
children: [/*#__PURE__*/_jsx(Search, {
|
|
203
222
|
size: 32,
|
|
204
223
|
color: night.color.textTertiary
|
|
205
224
|
}), /*#__PURE__*/_jsx(Text, {
|
|
206
225
|
style: styles.emptyTitle,
|
|
226
|
+
testID: "buoy-env-empty-title",
|
|
207
227
|
children: searchQuery ? "No results found" : "No variables"
|
|
208
228
|
}), /*#__PURE__*/_jsx(Text, {
|
|
209
229
|
style: styles.emptySubtitle,
|
|
230
|
+
testID: "buoy-env-empty-subtitle",
|
|
210
231
|
children: searchQuery ? `No variables matching "${searchQuery}"` : `No ${activeFilter === "all" ? "" : activeFilter} variables found`
|
|
211
232
|
})]
|
|
212
233
|
})]
|
|
@@ -269,7 +290,8 @@ const styles = StyleSheet.create({
|
|
|
269
290
|
paddingVertical: 8,
|
|
270
291
|
borderBottomWidth: 1,
|
|
271
292
|
borderBottomColor: buoyColors.border,
|
|
272
|
-
|
|
293
|
+
// Clear, like Bench — the host's hoisted sky shows through the header.
|
|
294
|
+
backgroundColor: "transparent"
|
|
273
295
|
},
|
|
274
296
|
scrollContainer: {
|
|
275
297
|
flex: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnvStatsOverview.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvStatsOverview.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzD,UAAU,qBAAqB;IAC7B,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,YAAoB,EACpB,cAAc,GACf,EAAE,qBAAqB,+
|
|
1
|
+
{"version":3,"file":"EnvStatsOverview.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvStatsOverview.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzD,UAAU,qBAAqB;IAC7B,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,YAAoB,EACpB,cAAc,GACf,EAAE,qBAAqB,+BAoIvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnvVarRow.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvVarRow.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,UAAU,cAAc;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC;AAkDD,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,cAAc,+
|
|
1
|
+
{"version":3,"file":"EnvVarRow.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvVarRow.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC,UAAU,cAAc;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC;AAkDD,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,cAAc,+BAmGxE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnvVarsModal.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvVarsModal.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAc,MAAM,UAAU,CAAC;AAUtD,UAAU,iBAAiB;IACzB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qFAAqF;IACrF,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,OAAO,EACP,eAAe,EACf,MAAM,EACN,UAAU,EACV,2BAAmC,EACnC,MAAc,GACf,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"EnvVarsModal.d.ts","sourceRoot":"","sources":["../../../../src/env/components/EnvVarsModal.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAc,MAAM,UAAU,CAAC;AAUtD,UAAU,iBAAiB;IACzB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qFAAqF;IACrF,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,OAAO,EACP,eAAe,EACf,MAAM,EACN,UAAU,EACV,2BAAmC,EACnC,MAAc,GACf,EAAE,iBAAiB,sCAsRnB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAC1B,eAAe,GAChB,EAAE;IACD,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC,+BASA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buoy-gg/env",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.29",
|
|
4
4
|
"description": "Environment variable devtool for React Native — auto-discovers EXPO_PUBLIC_ vars, validates types, scores config health. Part of Buoy devtools.",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
],
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@buoy-gg/floating-tools-core": "^7.0.
|
|
30
|
-
"@buoy-gg/shared-ui": "^7.0.
|
|
29
|
+
"@buoy-gg/floating-tools-core": "^7.0.29",
|
|
30
|
+
"@buoy-gg/shared-ui": "^7.0.29"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"react": "*",
|