@metamask-previews/config-registry-controller 0.0.1-preview-ab102d86
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/CHANGELOG.md +21 -0
- package/LICENSE +20 -0
- package/README.md +15 -0
- package/dist/ConfigRegistryController.cjs +205 -0
- package/dist/ConfigRegistryController.cjs.map +1 -0
- package/dist/ConfigRegistryController.d.cts +95 -0
- package/dist/ConfigRegistryController.d.cts.map +1 -0
- package/dist/ConfigRegistryController.d.mts +95 -0
- package/dist/ConfigRegistryController.d.mts.map +1 -0
- package/dist/ConfigRegistryController.mjs +201 -0
- package/dist/ConfigRegistryController.mjs.map +1 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.cjs +3 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.cjs.map +1 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.d.cts +47 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.d.cts.map +1 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.d.mts +47 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.d.mts.map +1 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.mjs +2 -0
- package/dist/config-registry-api-service/abstract-config-registry-api-service.mjs.map +1 -0
- package/dist/config-registry-api-service/config-registry-api-service.cjs +124 -0
- package/dist/config-registry-api-service/config-registry-api-service.cjs.map +1 -0
- package/dist/config-registry-api-service/config-registry-api-service.d.cts +36 -0
- package/dist/config-registry-api-service/config-registry-api-service.d.cts.map +1 -0
- package/dist/config-registry-api-service/config-registry-api-service.d.mts +36 -0
- package/dist/config-registry-api-service/config-registry-api-service.d.mts.map +1 -0
- package/dist/config-registry-api-service/config-registry-api-service.mjs +120 -0
- package/dist/config-registry-api-service/config-registry-api-service.mjs.map +1 -0
- package/dist/config-registry-api-service/index.cjs +14 -0
- package/dist/config-registry-api-service/index.cjs.map +1 -0
- package/dist/config-registry-api-service/index.d.cts +6 -0
- package/dist/config-registry-api-service/index.d.cts.map +1 -0
- package/dist/config-registry-api-service/index.d.mts +6 -0
- package/dist/config-registry-api-service/index.d.mts.map +1 -0
- package/dist/config-registry-api-service/index.mjs +3 -0
- package/dist/config-registry-api-service/index.mjs.map +1 -0
- package/dist/config-registry-api-service/transformers.cjs +254 -0
- package/dist/config-registry-api-service/transformers.cjs.map +1 -0
- package/dist/config-registry-api-service/transformers.d.cts +42 -0
- package/dist/config-registry-api-service/transformers.d.cts.map +1 -0
- package/dist/config-registry-api-service/transformers.d.mts +42 -0
- package/dist/config-registry-api-service/transformers.d.mts.map +1 -0
- package/dist/config-registry-api-service/transformers.mjs +247 -0
- package/dist/config-registry-api-service/transformers.mjs.map +1 -0
- package/dist/index.cjs +18 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +6 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +4 -0
- package/dist/index.mjs.map +1 -0
- package/dist/utils/feature-flags.cjs +27 -0
- package/dist/utils/feature-flags.cjs.map +1 -0
- package/dist/utils/feature-flags.d.cts +9 -0
- package/dist/utils/feature-flags.d.cts.map +1 -0
- package/dist/utils/feature-flags.d.mts +9 -0
- package/dist/utils/feature-flags.d.mts.map +1 -0
- package/dist/utils/feature-flags.mjs +23 -0
- package/dist/utils/feature-flags.mjs.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { RpcEndpointType } from "@metamask/network-controller";
|
|
2
|
+
/**
|
|
3
|
+
* @param chainId - The chain ID as a string.
|
|
4
|
+
* @returns The chain ID as Hex, or null if invalid.
|
|
5
|
+
*/
|
|
6
|
+
function toHexChainId(chainId) {
|
|
7
|
+
if (!chainId || typeof chainId !== 'string') {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const trimmed = chainId.trim();
|
|
11
|
+
if (trimmed.startsWith('0x') || trimmed.startsWith('0X')) {
|
|
12
|
+
const hexValue = trimmed.toLowerCase();
|
|
13
|
+
if (!/^0x[0-9a-f]+$/iu.test(hexValue)) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return hexValue;
|
|
17
|
+
}
|
|
18
|
+
const decimal = Number.parseInt(trimmed, 10);
|
|
19
|
+
if (Number.isNaN(decimal) || decimal < 0) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return `0x${decimal.toString(16)}`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* @param endpoint - The RPC endpoint from the API.
|
|
26
|
+
* @returns The transformed RPC endpoint, or null if invalid.
|
|
27
|
+
*/
|
|
28
|
+
function transformRpcEndpoint(endpoint) {
|
|
29
|
+
if (!endpoint || typeof endpoint !== 'object') {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const { url, type, networkClientId, failoverUrls } = endpoint;
|
|
33
|
+
if (!url || typeof url !== 'string') {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
if (!type || typeof type !== 'string') {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
if (!networkClientId || typeof networkClientId !== 'string') {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const baseEndpoint = {
|
|
43
|
+
networkClientId,
|
|
44
|
+
failoverUrls: Array.isArray(failoverUrls)
|
|
45
|
+
? failoverUrls.filter((failoverUrl) => typeof failoverUrl === 'string')
|
|
46
|
+
: undefined,
|
|
47
|
+
};
|
|
48
|
+
if (type === 'infura') {
|
|
49
|
+
return {
|
|
50
|
+
...baseEndpoint,
|
|
51
|
+
type: RpcEndpointType.Infura,
|
|
52
|
+
url: url,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (type === 'custom') {
|
|
56
|
+
return {
|
|
57
|
+
...baseEndpoint,
|
|
58
|
+
type: RpcEndpointType.Custom,
|
|
59
|
+
url,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* @param networkConfig - The network configuration from the API.
|
|
66
|
+
* @returns The transformed network configuration, or null if invalid.
|
|
67
|
+
*/
|
|
68
|
+
export function transformNetworkConfig(networkConfig) {
|
|
69
|
+
if (!networkConfig || typeof networkConfig !== 'object') {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const chainId = toHexChainId(networkConfig.chainId);
|
|
73
|
+
if (!chainId) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
const { name, nativeCurrency, rpcEndpoints, blockExplorerUrls } = networkConfig;
|
|
77
|
+
if (!name || typeof name !== 'string') {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
if (!nativeCurrency || typeof nativeCurrency !== 'string') {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
if (!Array.isArray(rpcEndpoints) || rpcEndpoints.length === 0) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
// Transform endpoints and track original indices to filtered indices mapping
|
|
87
|
+
const transformedEndpoints = [];
|
|
88
|
+
const originalToFilteredIndexMap = new Map();
|
|
89
|
+
rpcEndpoints.forEach((endpoint, originalIndex) => {
|
|
90
|
+
const transformed = transformRpcEndpoint(endpoint);
|
|
91
|
+
if (transformed !== null) {
|
|
92
|
+
originalToFilteredIndexMap.set(originalIndex, transformedEndpoints.length);
|
|
93
|
+
transformedEndpoints.push(transformed);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
if (transformedEndpoints.length === 0) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
// Adjust defaultRpcEndpointIndex to account for filtered endpoints
|
|
100
|
+
const originalDefaultRpcEndpointIndex = networkConfig.defaultRpcEndpointIndex ?? 0;
|
|
101
|
+
const adjustedDefaultRpcEndpointIndex = originalToFilteredIndexMap.get(originalDefaultRpcEndpointIndex);
|
|
102
|
+
if (adjustedDefaultRpcEndpointIndex === undefined) {
|
|
103
|
+
// The original default index pointed to an invalid endpoint
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
if (!Array.isArray(blockExplorerUrls)) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
// Filter block explorer URLs and track original indices to filtered indices mapping
|
|
110
|
+
const validBlockExplorerUrls = [];
|
|
111
|
+
const blockExplorerOriginalToFilteredIndexMap = new Map();
|
|
112
|
+
blockExplorerUrls.forEach((blockExplorerUrl, originalIndex) => {
|
|
113
|
+
if (typeof blockExplorerUrl === 'string' && blockExplorerUrl.length > 0) {
|
|
114
|
+
blockExplorerOriginalToFilteredIndexMap.set(originalIndex, validBlockExplorerUrls.length);
|
|
115
|
+
validBlockExplorerUrls.push(blockExplorerUrl);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
// Adjust defaultBlockExplorerUrlIndex to account for filtered URLs
|
|
119
|
+
const { defaultBlockExplorerUrlIndex } = networkConfig;
|
|
120
|
+
let adjustedDefaultBlockExplorerUrlIndex;
|
|
121
|
+
if (defaultBlockExplorerUrlIndex !== undefined) {
|
|
122
|
+
const adjusted = blockExplorerOriginalToFilteredIndexMap.get(defaultBlockExplorerUrlIndex);
|
|
123
|
+
if (adjusted === undefined) {
|
|
124
|
+
// The original default index pointed to an invalid URL
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
adjustedDefaultBlockExplorerUrlIndex = adjusted;
|
|
128
|
+
}
|
|
129
|
+
else if (validBlockExplorerUrls.length > 0) {
|
|
130
|
+
adjustedDefaultBlockExplorerUrlIndex = 0;
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
chainId,
|
|
134
|
+
name,
|
|
135
|
+
nativeCurrency,
|
|
136
|
+
rpcEndpoints: transformedEndpoints,
|
|
137
|
+
blockExplorerUrls: validBlockExplorerUrls,
|
|
138
|
+
defaultRpcEndpointIndex: adjustedDefaultRpcEndpointIndex,
|
|
139
|
+
defaultBlockExplorerUrlIndex: adjustedDefaultBlockExplorerUrlIndex,
|
|
140
|
+
lastUpdatedAt: networkConfig.lastUpdatedAt,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* @param networks - Array of network configurations to filter.
|
|
145
|
+
* @param options - Filter options.
|
|
146
|
+
* @returns Filtered array of network configurations.
|
|
147
|
+
*/
|
|
148
|
+
export function filterNetworks(networks, options = {}) {
|
|
149
|
+
if (!Array.isArray(networks)) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
return networks.filter((network) => {
|
|
153
|
+
if (!network || typeof network !== 'object') {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
if (options.isFeatured !== undefined) {
|
|
157
|
+
if (network.isFeatured !== options.isFeatured) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (options.isTestnet !== undefined) {
|
|
162
|
+
if (network.isTestnet !== options.isTestnet) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (options.isActive !== undefined) {
|
|
167
|
+
if (network.isActive !== options.isActive) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (options.isDeprecated !== undefined) {
|
|
172
|
+
if (network.isDeprecated !== options.isDeprecated) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (options.isDefault !== undefined) {
|
|
177
|
+
if (network.isDefault !== options.isDefault) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* @param transformedNetworks - Array of transformed network configurations.
|
|
186
|
+
* @param options - Comparison options.
|
|
187
|
+
* @returns Result containing networks to add and existing chain IDs.
|
|
188
|
+
*/
|
|
189
|
+
export function compareWithExistingNetworks(transformedNetworks, options) {
|
|
190
|
+
if (!Array.isArray(transformedNetworks)) {
|
|
191
|
+
return {
|
|
192
|
+
networksToAdd: [],
|
|
193
|
+
existingChainIds: [],
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
const { existingNetworks } = options;
|
|
197
|
+
if (!existingNetworks || typeof existingNetworks !== 'object') {
|
|
198
|
+
return {
|
|
199
|
+
networksToAdd: transformedNetworks,
|
|
200
|
+
existingChainIds: [],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const existingChainIds = new Set(Object.keys(existingNetworks));
|
|
204
|
+
const networksToAdd = [];
|
|
205
|
+
const foundExistingChainIds = [];
|
|
206
|
+
for (const network of transformedNetworks) {
|
|
207
|
+
if (!network?.chainId) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (existingChainIds.has(network.chainId)) {
|
|
211
|
+
foundExistingChainIds.push(network.chainId);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
networksToAdd.push(network);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
networksToAdd,
|
|
219
|
+
existingChainIds: foundExistingChainIds,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* @param networks - Array of network configurations from the API.
|
|
224
|
+
* @param filterOptions - Options for filtering networks.
|
|
225
|
+
* @param comparisonOptions - Options for comparing with existing networks.
|
|
226
|
+
* @returns Result containing networks to add and existing chain IDs.
|
|
227
|
+
*/
|
|
228
|
+
export function processNetworkConfigs(networks, filterOptions = {}, comparisonOptions) {
|
|
229
|
+
if (!Array.isArray(networks) || networks.length === 0) {
|
|
230
|
+
return {
|
|
231
|
+
networksToAdd: [],
|
|
232
|
+
existingChainIds: [],
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const filteredNetworks = filterNetworks(networks, filterOptions);
|
|
236
|
+
const transformedNetworks = filteredNetworks
|
|
237
|
+
.map(transformNetworkConfig)
|
|
238
|
+
.filter((network) => network !== null);
|
|
239
|
+
if (comparisonOptions) {
|
|
240
|
+
return compareWithExistingNetworks(transformedNetworks, comparisonOptions);
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
networksToAdd: transformedNetworks,
|
|
244
|
+
existingChainIds: [],
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=transformers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.mjs","sourceRoot":"","sources":["../../src/config-registry-api-service/transformers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkConfiguration } from '@metamask/network-controller';\nimport { RpcEndpointType } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\n\nimport type { NetworkConfig } from './abstract-config-registry-api-service';\n\ntype RpcEndpoint = NetworkConfiguration['rpcEndpoints'][number];\n\nexport type NetworkFilterOptions = {\n isFeatured?: boolean;\n isTestnet?: boolean;\n isActive?: boolean;\n isDeprecated?: boolean;\n isDefault?: boolean;\n};\n\nexport type NetworkComparisonOptions = {\n existingNetworks: Record<Hex, NetworkConfiguration>;\n};\n\nexport type TransformedNetworkResult = {\n networksToAdd: NetworkConfiguration[];\n existingChainIds: Hex[];\n};\n\n/**\n * @param chainId - The chain ID as a string.\n * @returns The chain ID as Hex, or null if invalid.\n */\nfunction toHexChainId(chainId: string): Hex | null {\n if (!chainId || typeof chainId !== 'string') {\n return null;\n }\n\n const trimmed = chainId.trim();\n\n if (trimmed.startsWith('0x') || trimmed.startsWith('0X')) {\n const hexValue = trimmed.toLowerCase();\n if (!/^0x[0-9a-f]+$/iu.test(hexValue)) {\n return null;\n }\n return hexValue as Hex;\n }\n\n const decimal = Number.parseInt(trimmed, 10);\n if (Number.isNaN(decimal) || decimal < 0) {\n return null;\n }\n\n return `0x${decimal.toString(16)}`;\n}\n\n/**\n * @param endpoint - The RPC endpoint from the API.\n * @returns The transformed RPC endpoint, or null if invalid.\n */\nfunction transformRpcEndpoint(\n endpoint: NetworkConfig['rpcEndpoints'][0],\n): RpcEndpoint | null {\n if (!endpoint || typeof endpoint !== 'object') {\n return null;\n }\n\n const { url, type, networkClientId, failoverUrls } = endpoint;\n\n if (!url || typeof url !== 'string') {\n return null;\n }\n\n if (!type || typeof type !== 'string') {\n return null;\n }\n\n if (!networkClientId || typeof networkClientId !== 'string') {\n return null;\n }\n\n const baseEndpoint = {\n networkClientId,\n failoverUrls: Array.isArray(failoverUrls)\n ? failoverUrls.filter(\n (failoverUrl): failoverUrl is string =>\n typeof failoverUrl === 'string',\n )\n : undefined,\n };\n\n if (type === 'infura') {\n return {\n ...baseEndpoint,\n type: RpcEndpointType.Infura,\n url: url as `https://${string}.infura.io/v3/{infuraProjectId}`,\n } as RpcEndpoint;\n }\n\n if (type === 'custom') {\n return {\n ...baseEndpoint,\n type: RpcEndpointType.Custom,\n url,\n } as RpcEndpoint;\n }\n\n return null;\n}\n\n/**\n * @param networkConfig - The network configuration from the API.\n * @returns The transformed network configuration, or null if invalid.\n */\nexport function transformNetworkConfig(\n networkConfig: NetworkConfig,\n): NetworkConfiguration | null {\n if (!networkConfig || typeof networkConfig !== 'object') {\n return null;\n }\n\n const chainId = toHexChainId(networkConfig.chainId);\n if (!chainId) {\n return null;\n }\n\n const { name, nativeCurrency, rpcEndpoints, blockExplorerUrls } =\n networkConfig;\n\n if (!name || typeof name !== 'string') {\n return null;\n }\n\n if (!nativeCurrency || typeof nativeCurrency !== 'string') {\n return null;\n }\n\n if (!Array.isArray(rpcEndpoints) || rpcEndpoints.length === 0) {\n return null;\n }\n\n // Transform endpoints and track original indices to filtered indices mapping\n const transformedEndpoints: RpcEndpoint[] = [];\n const originalToFilteredIndexMap = new Map<number, number>();\n\n rpcEndpoints.forEach((endpoint, originalIndex) => {\n const transformed = transformRpcEndpoint(endpoint);\n if (transformed !== null) {\n originalToFilteredIndexMap.set(\n originalIndex,\n transformedEndpoints.length,\n );\n transformedEndpoints.push(transformed);\n }\n });\n\n if (transformedEndpoints.length === 0) {\n return null;\n }\n\n // Adjust defaultRpcEndpointIndex to account for filtered endpoints\n const originalDefaultRpcEndpointIndex =\n networkConfig.defaultRpcEndpointIndex ?? 0;\n const adjustedDefaultRpcEndpointIndex = originalToFilteredIndexMap.get(\n originalDefaultRpcEndpointIndex,\n );\n\n if (adjustedDefaultRpcEndpointIndex === undefined) {\n // The original default index pointed to an invalid endpoint\n return null;\n }\n\n if (!Array.isArray(blockExplorerUrls)) {\n return null;\n }\n\n // Filter block explorer URLs and track original indices to filtered indices mapping\n const validBlockExplorerUrls: string[] = [];\n const blockExplorerOriginalToFilteredIndexMap = new Map<number, number>();\n\n blockExplorerUrls.forEach((blockExplorerUrl, originalIndex) => {\n if (typeof blockExplorerUrl === 'string' && blockExplorerUrl.length > 0) {\n blockExplorerOriginalToFilteredIndexMap.set(\n originalIndex,\n validBlockExplorerUrls.length,\n );\n validBlockExplorerUrls.push(blockExplorerUrl);\n }\n });\n\n // Adjust defaultBlockExplorerUrlIndex to account for filtered URLs\n const { defaultBlockExplorerUrlIndex } = networkConfig;\n let adjustedDefaultBlockExplorerUrlIndex: number | undefined;\n\n if (defaultBlockExplorerUrlIndex !== undefined) {\n const adjusted = blockExplorerOriginalToFilteredIndexMap.get(\n defaultBlockExplorerUrlIndex,\n );\n\n if (adjusted === undefined) {\n // The original default index pointed to an invalid URL\n return null;\n }\n\n adjustedDefaultBlockExplorerUrlIndex = adjusted;\n } else if (validBlockExplorerUrls.length > 0) {\n adjustedDefaultBlockExplorerUrlIndex = 0;\n }\n\n return {\n chainId,\n name,\n nativeCurrency,\n rpcEndpoints: transformedEndpoints,\n blockExplorerUrls: validBlockExplorerUrls,\n defaultRpcEndpointIndex: adjustedDefaultRpcEndpointIndex,\n defaultBlockExplorerUrlIndex: adjustedDefaultBlockExplorerUrlIndex,\n lastUpdatedAt: networkConfig.lastUpdatedAt,\n };\n}\n\n/**\n * @param networks - Array of network configurations to filter.\n * @param options - Filter options.\n * @returns Filtered array of network configurations.\n */\nexport function filterNetworks(\n networks: NetworkConfig[],\n options: NetworkFilterOptions = {},\n): NetworkConfig[] {\n if (!Array.isArray(networks)) {\n return [];\n }\n\n return networks.filter((network) => {\n if (!network || typeof network !== 'object') {\n return false;\n }\n\n if (options.isFeatured !== undefined) {\n if (network.isFeatured !== options.isFeatured) {\n return false;\n }\n }\n\n if (options.isTestnet !== undefined) {\n if (network.isTestnet !== options.isTestnet) {\n return false;\n }\n }\n\n if (options.isActive !== undefined) {\n if (network.isActive !== options.isActive) {\n return false;\n }\n }\n\n if (options.isDeprecated !== undefined) {\n if (network.isDeprecated !== options.isDeprecated) {\n return false;\n }\n }\n\n if (options.isDefault !== undefined) {\n if (network.isDefault !== options.isDefault) {\n return false;\n }\n }\n\n return true;\n });\n}\n\n/**\n * @param transformedNetworks - Array of transformed network configurations.\n * @param options - Comparison options.\n * @returns Result containing networks to add and existing chain IDs.\n */\nexport function compareWithExistingNetworks(\n transformedNetworks: NetworkConfiguration[],\n options: NetworkComparisonOptions,\n): TransformedNetworkResult {\n if (!Array.isArray(transformedNetworks)) {\n return {\n networksToAdd: [],\n existingChainIds: [],\n };\n }\n\n const { existingNetworks } = options;\n\n if (!existingNetworks || typeof existingNetworks !== 'object') {\n return {\n networksToAdd: transformedNetworks,\n existingChainIds: [],\n };\n }\n\n const existingChainIds = new Set<Hex>(Object.keys(existingNetworks) as Hex[]);\n const networksToAdd: NetworkConfiguration[] = [];\n const foundExistingChainIds: Hex[] = [];\n\n for (const network of transformedNetworks) {\n if (!network?.chainId) {\n continue;\n }\n\n if (existingChainIds.has(network.chainId)) {\n foundExistingChainIds.push(network.chainId);\n } else {\n networksToAdd.push(network);\n }\n }\n\n return {\n networksToAdd,\n existingChainIds: foundExistingChainIds,\n };\n}\n\n/**\n * @param networks - Array of network configurations from the API.\n * @param filterOptions - Options for filtering networks.\n * @param comparisonOptions - Options for comparing with existing networks.\n * @returns Result containing networks to add and existing chain IDs.\n */\nexport function processNetworkConfigs(\n networks: NetworkConfig[],\n filterOptions: NetworkFilterOptions = {},\n comparisonOptions?: NetworkComparisonOptions,\n): TransformedNetworkResult {\n if (!Array.isArray(networks) || networks.length === 0) {\n return {\n networksToAdd: [],\n existingChainIds: [],\n };\n }\n\n const filteredNetworks = filterNetworks(networks, filterOptions);\n\n const transformedNetworks = filteredNetworks\n .map(transformNetworkConfig)\n .filter((network): network is NetworkConfiguration => network !== null);\n\n if (comparisonOptions) {\n return compareWithExistingNetworks(transformedNetworks, comparisonOptions);\n }\n\n return {\n networksToAdd: transformedNetworks,\n existingChainIds: [],\n };\n}\n"]}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isConfigRegistryApiEnabled = exports.processNetworkConfigs = exports.compareWithExistingNetworks = exports.filterNetworks = exports.transformNetworkConfig = exports.DEFAULT_TIMEOUT = exports.DEFAULT_ENDPOINT_PATH = exports.DEFAULT_API_BASE_URL = exports.ConfigRegistryApiService = exports.DEFAULT_POLLING_INTERVAL = exports.ConfigRegistryController = void 0;
|
|
4
|
+
var ConfigRegistryController_1 = require("./ConfigRegistryController.cjs");
|
|
5
|
+
Object.defineProperty(exports, "ConfigRegistryController", { enumerable: true, get: function () { return ConfigRegistryController_1.ConfigRegistryController; } });
|
|
6
|
+
Object.defineProperty(exports, "DEFAULT_POLLING_INTERVAL", { enumerable: true, get: function () { return ConfigRegistryController_1.DEFAULT_POLLING_INTERVAL; } });
|
|
7
|
+
var config_registry_api_service_1 = require("./config-registry-api-service/index.cjs");
|
|
8
|
+
Object.defineProperty(exports, "ConfigRegistryApiService", { enumerable: true, get: function () { return config_registry_api_service_1.ConfigRegistryApiService; } });
|
|
9
|
+
Object.defineProperty(exports, "DEFAULT_API_BASE_URL", { enumerable: true, get: function () { return config_registry_api_service_1.DEFAULT_API_BASE_URL; } });
|
|
10
|
+
Object.defineProperty(exports, "DEFAULT_ENDPOINT_PATH", { enumerable: true, get: function () { return config_registry_api_service_1.DEFAULT_ENDPOINT_PATH; } });
|
|
11
|
+
Object.defineProperty(exports, "DEFAULT_TIMEOUT", { enumerable: true, get: function () { return config_registry_api_service_1.DEFAULT_TIMEOUT; } });
|
|
12
|
+
Object.defineProperty(exports, "transformNetworkConfig", { enumerable: true, get: function () { return config_registry_api_service_1.transformNetworkConfig; } });
|
|
13
|
+
Object.defineProperty(exports, "filterNetworks", { enumerable: true, get: function () { return config_registry_api_service_1.filterNetworks; } });
|
|
14
|
+
Object.defineProperty(exports, "compareWithExistingNetworks", { enumerable: true, get: function () { return config_registry_api_service_1.compareWithExistingNetworks; } });
|
|
15
|
+
Object.defineProperty(exports, "processNetworkConfigs", { enumerable: true, get: function () { return config_registry_api_service_1.processNetworkConfigs; } });
|
|
16
|
+
var feature_flags_1 = require("./utils/feature-flags.cjs");
|
|
17
|
+
Object.defineProperty(exports, "isConfigRegistryApiEnabled", { enumerable: true, get: function () { return feature_flags_1.isConfigRegistryApiEnabled; } });
|
|
18
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAeA,2EAGoC;AAFlC,oIAAA,wBAAwB,OAAA;AACxB,oIAAA,wBAAwB,OAAA;AAa1B,uFASuC;AARrC,uIAAA,wBAAwB,OAAA;AACxB,mIAAA,oBAAoB,OAAA;AACpB,oIAAA,qBAAqB,OAAA;AACrB,8HAAA,eAAe,OAAA;AACf,qIAAA,sBAAsB,OAAA;AACtB,6HAAA,cAAc,OAAA;AACd,0IAAA,2BAA2B,OAAA;AAC3B,oIAAA,qBAAqB,OAAA;AAEvB,2DAAmE;AAA1D,2HAAA,0BAA0B,OAAA","sourcesContent":["export type {\n RegistryConfigEntry,\n ConfigRegistryState,\n ConfigRegistryControllerOptions,\n ConfigRegistryControllerActions,\n ConfigRegistryControllerGetConfigAction,\n ConfigRegistryControllerSetConfigAction,\n ConfigRegistryControllerGetAllConfigsAction,\n ConfigRegistryControllerGetStateAction,\n ConfigRegistryControllerStartPollingAction,\n ConfigRegistryControllerStopPollingAction,\n ConfigRegistryControllerEvents,\n ConfigRegistryControllerStateChangeEvent,\n ConfigRegistryMessenger,\n} from './ConfigRegistryController';\nexport {\n ConfigRegistryController,\n DEFAULT_POLLING_INTERVAL,\n} from './ConfigRegistryController';\nexport type {\n AbstractConfigRegistryApiService,\n FetchConfigOptions,\n FetchConfigResult,\n NetworkConfig,\n RegistryConfigApiResponse,\n ConfigRegistryApiServiceOptions,\n NetworkFilterOptions,\n NetworkComparisonOptions,\n TransformedNetworkResult,\n} from './config-registry-api-service';\nexport {\n ConfigRegistryApiService,\n DEFAULT_API_BASE_URL,\n DEFAULT_ENDPOINT_PATH,\n DEFAULT_TIMEOUT,\n transformNetworkConfig,\n filterNetworks,\n compareWithExistingNetworks,\n processNetworkConfigs,\n} from './config-registry-api-service';\nexport { isConfigRegistryApiEnabled } from './utils/feature-flags';\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { RegistryConfigEntry, ConfigRegistryState, ConfigRegistryControllerOptions, ConfigRegistryControllerActions, ConfigRegistryControllerGetConfigAction, ConfigRegistryControllerSetConfigAction, ConfigRegistryControllerGetAllConfigsAction, ConfigRegistryControllerGetStateAction, ConfigRegistryControllerStartPollingAction, ConfigRegistryControllerStopPollingAction, ConfigRegistryControllerEvents, ConfigRegistryControllerStateChangeEvent, ConfigRegistryMessenger, } from "./ConfigRegistryController.cjs";
|
|
2
|
+
export { ConfigRegistryController, DEFAULT_POLLING_INTERVAL, } from "./ConfigRegistryController.cjs";
|
|
3
|
+
export type { AbstractConfigRegistryApiService, FetchConfigOptions, FetchConfigResult, NetworkConfig, RegistryConfigApiResponse, ConfigRegistryApiServiceOptions, NetworkFilterOptions, NetworkComparisonOptions, TransformedNetworkResult, } from "./config-registry-api-service/index.cjs";
|
|
4
|
+
export { ConfigRegistryApiService, DEFAULT_API_BASE_URL, DEFAULT_ENDPOINT_PATH, DEFAULT_TIMEOUT, transformNetworkConfig, filterNetworks, compareWithExistingNetworks, processNetworkConfigs, } from "./config-registry-api-service/index.cjs";
|
|
5
|
+
export { isConfigRegistryApiEnabled } from "./utils/feature-flags.cjs";
|
|
6
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,+BAA+B,EAC/B,+BAA+B,EAC/B,uCAAuC,EACvC,uCAAuC,EACvC,2CAA2C,EAC3C,sCAAsC,EACtC,0CAA0C,EAC1C,yCAAyC,EACzC,8BAA8B,EAC9B,wCAAwC,EACxC,uBAAuB,GACxB,uCAAmC;AACpC,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GACzB,uCAAmC;AACpC,YAAY,EACV,gCAAgC,EAChC,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,yBAAyB,EACzB,+BAA+B,EAC/B,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,GACzB,gDAAsC;AACvC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,2BAA2B,EAC3B,qBAAqB,GACtB,gDAAsC;AACvC,OAAO,EAAE,0BAA0B,EAAE,kCAA8B"}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { RegistryConfigEntry, ConfigRegistryState, ConfigRegistryControllerOptions, ConfigRegistryControllerActions, ConfigRegistryControllerGetConfigAction, ConfigRegistryControllerSetConfigAction, ConfigRegistryControllerGetAllConfigsAction, ConfigRegistryControllerGetStateAction, ConfigRegistryControllerStartPollingAction, ConfigRegistryControllerStopPollingAction, ConfigRegistryControllerEvents, ConfigRegistryControllerStateChangeEvent, ConfigRegistryMessenger, } from "./ConfigRegistryController.mjs";
|
|
2
|
+
export { ConfigRegistryController, DEFAULT_POLLING_INTERVAL, } from "./ConfigRegistryController.mjs";
|
|
3
|
+
export type { AbstractConfigRegistryApiService, FetchConfigOptions, FetchConfigResult, NetworkConfig, RegistryConfigApiResponse, ConfigRegistryApiServiceOptions, NetworkFilterOptions, NetworkComparisonOptions, TransformedNetworkResult, } from "./config-registry-api-service/index.mjs";
|
|
4
|
+
export { ConfigRegistryApiService, DEFAULT_API_BASE_URL, DEFAULT_ENDPOINT_PATH, DEFAULT_TIMEOUT, transformNetworkConfig, filterNetworks, compareWithExistingNetworks, processNetworkConfigs, } from "./config-registry-api-service/index.mjs";
|
|
5
|
+
export { isConfigRegistryApiEnabled } from "./utils/feature-flags.mjs";
|
|
6
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,+BAA+B,EAC/B,+BAA+B,EAC/B,uCAAuC,EACvC,uCAAuC,EACvC,2CAA2C,EAC3C,sCAAsC,EACtC,0CAA0C,EAC1C,yCAAyC,EACzC,8BAA8B,EAC9B,wCAAwC,EACxC,uBAAuB,GACxB,uCAAmC;AACpC,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GACzB,uCAAmC;AACpC,YAAY,EACV,gCAAgC,EAChC,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,yBAAyB,EACzB,+BAA+B,EAC/B,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,GACzB,gDAAsC;AACvC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,2BAA2B,EAC3B,qBAAqB,GACtB,gDAAsC;AACvC,OAAO,EAAE,0BAA0B,EAAE,kCAA8B"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { ConfigRegistryController, DEFAULT_POLLING_INTERVAL } from "./ConfigRegistryController.mjs";
|
|
2
|
+
export { ConfigRegistryApiService, DEFAULT_API_BASE_URL, DEFAULT_ENDPOINT_PATH, DEFAULT_TIMEOUT, transformNetworkConfig, filterNetworks, compareWithExistingNetworks, processNetworkConfigs } from "./config-registry-api-service/index.mjs";
|
|
3
|
+
export { isConfigRegistryApiEnabled } from "./utils/feature-flags.mjs";
|
|
4
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACzB,uCAAmC;AAYpC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,2BAA2B,EAC3B,qBAAqB,EACtB,gDAAsC;AACvC,OAAO,EAAE,0BAA0B,EAAE,kCAA8B","sourcesContent":["export type {\n RegistryConfigEntry,\n ConfigRegistryState,\n ConfigRegistryControllerOptions,\n ConfigRegistryControllerActions,\n ConfigRegistryControllerGetConfigAction,\n ConfigRegistryControllerSetConfigAction,\n ConfigRegistryControllerGetAllConfigsAction,\n ConfigRegistryControllerGetStateAction,\n ConfigRegistryControllerStartPollingAction,\n ConfigRegistryControllerStopPollingAction,\n ConfigRegistryControllerEvents,\n ConfigRegistryControllerStateChangeEvent,\n ConfigRegistryMessenger,\n} from './ConfigRegistryController';\nexport {\n ConfigRegistryController,\n DEFAULT_POLLING_INTERVAL,\n} from './ConfigRegistryController';\nexport type {\n AbstractConfigRegistryApiService,\n FetchConfigOptions,\n FetchConfigResult,\n NetworkConfig,\n RegistryConfigApiResponse,\n ConfigRegistryApiServiceOptions,\n NetworkFilterOptions,\n NetworkComparisonOptions,\n TransformedNetworkResult,\n} from './config-registry-api-service';\nexport {\n ConfigRegistryApiService,\n DEFAULT_API_BASE_URL,\n DEFAULT_ENDPOINT_PATH,\n DEFAULT_TIMEOUT,\n transformNetworkConfig,\n filterNetworks,\n compareWithExistingNetworks,\n processNetworkConfigs,\n} from './config-registry-api-service';\nexport { isConfigRegistryApiEnabled } from './utils/feature-flags';\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isConfigRegistryApiEnabled = void 0;
|
|
4
|
+
const FEATURE_FLAG_KEY = 'configRegistryApiEnabled';
|
|
5
|
+
const DEFAULT_FEATURE_FLAG_VALUE = false;
|
|
6
|
+
/**
|
|
7
|
+
* Checks if the config registry API feature flag is enabled.
|
|
8
|
+
*
|
|
9
|
+
* @param messenger - The controller messenger.
|
|
10
|
+
* @returns True if the feature flag is enabled, false otherwise.
|
|
11
|
+
*/
|
|
12
|
+
function isConfigRegistryApiEnabled(messenger) {
|
|
13
|
+
try {
|
|
14
|
+
const state = messenger.call('RemoteFeatureFlagController:getState');
|
|
15
|
+
const featureFlags = state.remoteFeatureFlags;
|
|
16
|
+
const flagValue = featureFlags[FEATURE_FLAG_KEY];
|
|
17
|
+
if (typeof flagValue === 'boolean') {
|
|
18
|
+
return flagValue;
|
|
19
|
+
}
|
|
20
|
+
return DEFAULT_FEATURE_FLAG_VALUE;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return DEFAULT_FEATURE_FLAG_VALUE;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.isConfigRegistryApiEnabled = isConfigRegistryApiEnabled;
|
|
27
|
+
//# sourceMappingURL=feature-flags.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-flags.cjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":";;;AAEA,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AACpD,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAEzC;;;;;GAKG;AACH,SAAgB,0BAA0B,CACxC,SAAkC;IAElC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,KAAK,CAAC,kBAAkB,CAAC;QAE9C,MAAM,SAAS,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAEjD,IAAI,OAAO,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,0BAA0B,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,0BAA0B,CAAC;IACpC,CAAC;AACH,CAAC;AAjBD,gEAiBC","sourcesContent":["import type { ConfigRegistryMessenger } from '../ConfigRegistryController';\n\nconst FEATURE_FLAG_KEY = 'configRegistryApiEnabled';\nconst DEFAULT_FEATURE_FLAG_VALUE = false;\n\n/**\n * Checks if the config registry API feature flag is enabled.\n *\n * @param messenger - The controller messenger.\n * @returns True if the feature flag is enabled, false otherwise.\n */\nexport function isConfigRegistryApiEnabled(\n messenger: ConfigRegistryMessenger,\n): boolean {\n try {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags = state.remoteFeatureFlags;\n\n const flagValue = featureFlags[FEATURE_FLAG_KEY];\n\n if (typeof flagValue === 'boolean') {\n return flagValue;\n }\n\n return DEFAULT_FEATURE_FLAG_VALUE;\n } catch {\n return DEFAULT_FEATURE_FLAG_VALUE;\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConfigRegistryMessenger } from "../ConfigRegistryController.cjs";
|
|
2
|
+
/**
|
|
3
|
+
* Checks if the config registry API feature flag is enabled.
|
|
4
|
+
*
|
|
5
|
+
* @param messenger - The controller messenger.
|
|
6
|
+
* @returns True if the feature flag is enabled, false otherwise.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isConfigRegistryApiEnabled(messenger: ConfigRegistryMessenger): boolean;
|
|
9
|
+
//# sourceMappingURL=feature-flags.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-flags.d.cts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,wCAAoC;AAK3E;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,uBAAuB,GACjC,OAAO,CAeT"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConfigRegistryMessenger } from "../ConfigRegistryController.mjs";
|
|
2
|
+
/**
|
|
3
|
+
* Checks if the config registry API feature flag is enabled.
|
|
4
|
+
*
|
|
5
|
+
* @param messenger - The controller messenger.
|
|
6
|
+
* @returns True if the feature flag is enabled, false otherwise.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isConfigRegistryApiEnabled(messenger: ConfigRegistryMessenger): boolean;
|
|
9
|
+
//# sourceMappingURL=feature-flags.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-flags.d.mts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,wCAAoC;AAK3E;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,uBAAuB,GACjC,OAAO,CAeT"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const FEATURE_FLAG_KEY = 'configRegistryApiEnabled';
|
|
2
|
+
const DEFAULT_FEATURE_FLAG_VALUE = false;
|
|
3
|
+
/**
|
|
4
|
+
* Checks if the config registry API feature flag is enabled.
|
|
5
|
+
*
|
|
6
|
+
* @param messenger - The controller messenger.
|
|
7
|
+
* @returns True if the feature flag is enabled, false otherwise.
|
|
8
|
+
*/
|
|
9
|
+
export function isConfigRegistryApiEnabled(messenger) {
|
|
10
|
+
try {
|
|
11
|
+
const state = messenger.call('RemoteFeatureFlagController:getState');
|
|
12
|
+
const featureFlags = state.remoteFeatureFlags;
|
|
13
|
+
const flagValue = featureFlags[FEATURE_FLAG_KEY];
|
|
14
|
+
if (typeof flagValue === 'boolean') {
|
|
15
|
+
return flagValue;
|
|
16
|
+
}
|
|
17
|
+
return DEFAULT_FEATURE_FLAG_VALUE;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return DEFAULT_FEATURE_FLAG_VALUE;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=feature-flags.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-flags.mjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AACpD,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAAkC;IAElC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,KAAK,CAAC,kBAAkB,CAAC;QAE9C,MAAM,SAAS,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAEjD,IAAI,OAAO,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,0BAA0B,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,0BAA0B,CAAC;IACpC,CAAC;AACH,CAAC","sourcesContent":["import type { ConfigRegistryMessenger } from '../ConfigRegistryController';\n\nconst FEATURE_FLAG_KEY = 'configRegistryApiEnabled';\nconst DEFAULT_FEATURE_FLAG_VALUE = false;\n\n/**\n * Checks if the config registry API feature flag is enabled.\n *\n * @param messenger - The controller messenger.\n * @returns True if the feature flag is enabled, false otherwise.\n */\nexport function isConfigRegistryApiEnabled(\n messenger: ConfigRegistryMessenger,\n): boolean {\n try {\n const state = messenger.call('RemoteFeatureFlagController:getState');\n const featureFlags = state.remoteFeatureFlags;\n\n const flagValue = featureFlags[FEATURE_FLAG_KEY];\n\n if (typeof flagValue === 'boolean') {\n return flagValue;\n }\n\n return DEFAULT_FEATURE_FLAG_VALUE;\n } catch {\n return DEFAULT_FEATURE_FLAG_VALUE;\n }\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@metamask-previews/config-registry-controller",
|
|
3
|
+
"version": "0.0.1-preview-ab102d86",
|
|
4
|
+
"description": "Manages configuration registry for MetaMask",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"MetaMask",
|
|
7
|
+
"Ethereum"
|
|
8
|
+
],
|
|
9
|
+
"homepage": "https://github.com/MetaMask/core/tree/main/packages/config-registry-controller#readme",
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/MetaMask/core/issues"
|
|
12
|
+
},
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "https://github.com/MetaMask/core.git"
|
|
16
|
+
},
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"sideEffects": false,
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"import": {
|
|
22
|
+
"types": "./dist/index.d.mts",
|
|
23
|
+
"default": "./dist/index.mjs"
|
|
24
|
+
},
|
|
25
|
+
"require": {
|
|
26
|
+
"types": "./dist/index.d.cts",
|
|
27
|
+
"default": "./dist/index.cjs"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"./package.json": "./package.json"
|
|
31
|
+
},
|
|
32
|
+
"main": "./dist/index.cjs",
|
|
33
|
+
"types": "./dist/index.d.cts",
|
|
34
|
+
"files": [
|
|
35
|
+
"dist/"
|
|
36
|
+
],
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references",
|
|
39
|
+
"build:all": "ts-bridge --project tsconfig.build.json --verbose --clean",
|
|
40
|
+
"build:docs": "typedoc",
|
|
41
|
+
"changelog:update": "../../scripts/update-changelog.sh @metamask/config-registry-controller",
|
|
42
|
+
"changelog:validate": "../../scripts/validate-changelog.sh @metamask/config-registry-controller",
|
|
43
|
+
"publish:preview": "yarn npm publish --tag preview",
|
|
44
|
+
"since-latest-release": "../../scripts/since-latest-release.sh",
|
|
45
|
+
"test": "NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter",
|
|
46
|
+
"test:clean": "NODE_OPTIONS=--experimental-vm-modules jest --clearCache",
|
|
47
|
+
"test:verbose": "NODE_OPTIONS=--experimental-vm-modules jest --verbose",
|
|
48
|
+
"test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@metamask/base-controller": "^9.0.0",
|
|
52
|
+
"@metamask/controller-utils": "^11.16.0",
|
|
53
|
+
"@metamask/messenger": "^0.3.0",
|
|
54
|
+
"@metamask/network-controller": "^29.0.0",
|
|
55
|
+
"@metamask/polling-controller": "^16.0.0",
|
|
56
|
+
"@metamask/remote-feature-flag-controller": "^4.0.0"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@lavamoat/allow-scripts": "^3.0.4",
|
|
60
|
+
"@metamask/auto-changelog": "^3.4.4",
|
|
61
|
+
"@ts-bridge/cli": "^0.6.4",
|
|
62
|
+
"@types/jest": "^27.4.1",
|
|
63
|
+
"deepmerge": "^4.2.2",
|
|
64
|
+
"jest": "^27.5.1",
|
|
65
|
+
"nock": "^13.3.1",
|
|
66
|
+
"sinon": "^9.2.4",
|
|
67
|
+
"ts-jest": "^27.1.4",
|
|
68
|
+
"typedoc": "^0.24.8",
|
|
69
|
+
"typedoc-plugin-missing-exports": "^2.0.0",
|
|
70
|
+
"typescript": "~5.3.3"
|
|
71
|
+
},
|
|
72
|
+
"engines": {
|
|
73
|
+
"node": "^18.18 || >=20"
|
|
74
|
+
},
|
|
75
|
+
"publishConfig": {
|
|
76
|
+
"access": "public",
|
|
77
|
+
"registry": "https://registry.npmjs.org/"
|
|
78
|
+
}
|
|
79
|
+
}
|