diff --git a/packages/metro-transform-plugins/src/__tests__/inline-plugin-test.js b/packages/metro-transform-plugins/src/__tests__/inline-plugin-test.js index a1b1010354..aa453bb3ef 100644 --- a/packages/metro-transform-plugins/src/__tests__/inline-plugin-test.js +++ b/packages/metro-transform-plugins/src/__tests__/inline-plugin-test.js @@ -399,6 +399,17 @@ describe('inline constants', () => { }); }); + test('uses the last definition when Platform.select has duplicate keys', () => { + const code = ` + var value = Platform.select({ios: 1, ios: 2}); + `; + + compare([inlinePlugin], code, 'var value = 2;', { + inlinePlatform: true, + platform: 'ios', + }); + }); + test('inlines Platform.select in the code when using an ObjectMethod', () => { const code = ` function a() { diff --git a/packages/metro-transform-plugins/src/inline-plugin.js b/packages/metro-transform-plugins/src/inline-plugin.js index 2cc055d260..d35b977e83 100644 --- a/packages/metro-transform-plugins/src/inline-plugin.js +++ b/packages/metro-transform-plugins/src/inline-plugin.js @@ -90,9 +90,9 @@ export default function inlinePlugin( key: string, fallback: () => Node, ): Node { - let value = null; - - for (const p of objectExpression.properties) { + // Object literal evaluation keeps the last definition of a duplicate key. + for (let i = objectExpression.properties.length - 1; i >= 0; i--) { + const p = objectExpression.properties[i]; if (!isObjectProperty(p) && !isObjectMethod(p)) { continue; } @@ -101,16 +101,14 @@ export default function inlinePlugin( (isStringLiteral(p.key) && p.key.value === key) ) { if (isObjectProperty(p)) { - value = p.value; - break; + return p.value; } else if (isObjectMethod(p)) { - value = t.toExpression(p); - break; + return t.toExpression(p); } } } - return value ?? fallback(); + return fallback(); } function hasStaticProperties(objectExpression: ObjectExpression): boolean {