Skip to content

Commit 1b37f2a

Browse files
authored
fix(upgrade): Make rename map prototype-safe (#7414)
1 parent 84483c2 commit 1b37f2a

File tree

4 files changed

+48
-15
lines changed

4 files changed

+48
-15
lines changed

.changeset/cute-buttons-repair.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/upgrade': patch
3+
---
4+
5+
Update transform-align-experimental-unstable-prefixes to avoid prototype pollution

packages/upgrade/src/codemods/__tests__/__fixtures__/transform-align-experimental-unstable-prefixes.fixtures.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,31 @@ createClerkClient();
6969
`,
7070
output: `
7171
<OrganizationProfile />;
72+
`,
73+
},
74+
{
75+
name: 'Does not rename class constructors',
76+
source: `
77+
export class AppError extends Error {
78+
constructor(
79+
message: string,
80+
public readonly code: string,
81+
public readonly statusCode: number = 500
82+
) {
83+
super(message);
84+
}
85+
}
86+
`,
87+
output: `
88+
export class AppError extends Error {
89+
constructor(
90+
message: string,
91+
public readonly code: string,
92+
public readonly statusCode: number = 500
93+
) {
94+
super(message);
95+
}
96+
}
7297
`,
7398
},
7499
];

packages/upgrade/src/codemods/__tests__/transform-align-experimental-unstable-prefixes.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { fixtures } from './__fixtures__/transform-align-experimental-unstable-p
66

77
describe('transform-align-experimental-unstable-prefixes', () => {
88
it.each(fixtures)('$name', ({ source, output }) => {
9-
const result = applyTransform(transformer, {}, { source });
9+
const result = applyTransform(transformer, {}, { source }) || source.trim();
1010

1111
expect(result).toEqual(output.trim());
1212
});

packages/upgrade/src/codemods/transform-align-experimental-unstable-prefixes.cjs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
const SPECIFIC_RENAMES = {
2-
experimental_createTheme: 'createTheme',
1+
const SPECIFIC_RENAMES = Object.freeze({
32
__experimental_createTheme: 'createTheme',
4-
experimental__simple: 'simple',
53
__experimental_simple: 'simple',
64
__unstable__createClerkClient: 'createClerkClient',
7-
__unstable_invokeMiddlewareOnAuthStateChange: '__internal_invokeMiddlewareOnAuthStateChange',
85
__unstable__environment: '__internal_environment',
9-
__unstable__updateProps: '__internal_updateProps',
10-
__unstable__setEnvironment: '__internal_setEnvironment',
11-
__unstable__onBeforeRequest: '__internal_onBeforeRequest',
126
__unstable__onAfterResponse: '__internal_onAfterResponse',
13-
__unstable__onBeforeSetActive: '__internal_onBeforeSetActive',
147
__unstable__onAfterSetActive: '__internal_onAfterSetActive',
15-
};
8+
__unstable__onBeforeRequest: '__internal_onBeforeRequest',
9+
__unstable__onBeforeSetActive: '__internal_onBeforeSetActive',
10+
__unstable__setEnvironment: '__internal_setEnvironment',
11+
__unstable__updateProps: '__internal_updateProps',
12+
__unstable_invokeMiddlewareOnAuthStateChange: '__internal_invokeMiddlewareOnAuthStateChange',
13+
experimental__simple: 'simple',
14+
experimental_createTheme: 'createTheme',
15+
});
1616

1717
const REMOVED_PROPS = new Set([
1818
'__unstable_manageBillingUrl',
@@ -52,10 +52,10 @@ module.exports = function transformAlignExperimentalUnstablePrefixes({ source },
5252
let dirty = false;
5353

5454
const maybeRename = name => {
55-
if (!name || REMOVED_PROPS.has(name)) {
55+
if (!name || REMOVED_PROPS.has(name) || !Object.hasOwn(SPECIFIC_RENAMES, name)) {
5656
return null;
5757
}
58-
return SPECIFIC_RENAMES[name] ?? null;
58+
return SPECIFIC_RENAMES[name];
5959
};
6060

6161
const renameIdentifier = node => {
@@ -206,9 +206,12 @@ module.exports = function transformAlignExperimentalUnstablePrefixes({ source },
206206
});
207207
});
208208

209-
root.find(j.Identifier).forEach(path => {
210-
renameIdentifier(path.node);
211-
});
209+
root
210+
.find(j.Identifier)
211+
.filter(path => maybeRename(path.node.name))
212+
.forEach(path => {
213+
renameIdentifier(path.node);
214+
});
212215

213216
root.find(j.JSXOpeningElement).forEach(path => {
214217
const attributes = path.node.attributes || [];

0 commit comments

Comments
 (0)