Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
bac9b4e
Adds codemod to transform clerk/themes to clerk/ui/themes
brkalow Dec 4, 2025
1392ce5
Adds codemod to transform experimental and unstable prefixes
brkalow Dec 4, 2025
2205f80
Adds codemod to transform appearance.layout -> appearance.options
brkalow Dec 4, 2025
e6b18d3
Adds codemod to transform appearance prop changes
brkalow Dec 5, 2025
a2f1e49
refactor upgrade CLI to not use ink
brkalow Dec 5, 2025
4e06115
Tweaks to codemod output
brkalow Dec 5, 2025
6640fb0
adjust complete output
brkalow Dec 5, 2025
fb05d75
updates lockfile
brkalow Dec 5, 2025
f3750b4
Adds changeset
brkalow Dec 5, 2025
ec24828
don't hardcode release id
brkalow Dec 5, 2025
5a34413
remove unused file
brkalow Dec 5, 2025
7820fed
format
brkalow Dec 5, 2025
6ef9538
Ajdust output and fix tests. Undo fixture changes
brkalow Dec 6, 2025
5520100
undo codemod changes
brkalow Dec 6, 2025
e00579e
cleanup codemod output
brkalow Dec 6, 2025
698157f
fix lint
brkalow Dec 6, 2025
68be931
Merge branch 'vincent-and-the-doctor' into brk.feat/upgrade-cli-core-3
brkalow Dec 8, 2025
a06f038
use chalk
brkalow Dec 8, 2025
202e28c
Adds new flags for easier testing
brkalow Dec 8, 2025
7f3abaa
Merge branch 'main' into brk.feat/upgrade-cli-core-3
brkalow Dec 8, 2025
1b7a75e
Update packages/upgrade/src/__tests__/integration/runner.test.js
brkalow Dec 8, 2025
955f685
Update packages/upgrade/src/codemods/transform-align-experimental-uns…
brkalow Dec 8, 2025
243fc07
fix glob patterns for extensions
brkalow Dec 8, 2025
3c2e9bd
update tests
brkalow Dec 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/busy-tires-admire.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@clerk/upgrade': major
---

Updates the upgrade CLI to support Core 3 changes. If you need to upgrade to an older release, use the previous major version of this package.
3 changes: 2 additions & 1 deletion eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ export default tseslint.config([
'packages/clerk-js/rspack.config.js',
'packages/shared/src/compiled/path-to-regexp/index.js',
'packages/shared/tsdown.config.mjs',
'packages/upgrade/src/__tests__/fixtures/**/*',
],
},
{
Expand Down Expand Up @@ -488,7 +489,7 @@ export default tseslint.config([
name: 'packages/upgrade',
files: ['packages/upgrade/src/**/*'],
rules: {
'import/no-unresolved': ['error', { ignore: ['^#', '^~', '@inkjs/ui', '^ink'] }],
'custom-rules/no-unstable-methods': 'off',
'react/no-unescaped-entities': 'off',
'@typescript-eslint/no-floating-promises': 'warn',
},
Expand Down
8 changes: 1 addition & 7 deletions packages/upgrade/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,15 @@
]
},
"dependencies": {
"@inkjs/ui": "^2.0.0",
"@jescalan/ink-markdown": "^2.0.0",
"chalk": "^5.3.0",
"ejs": "3.1.10",
"execa": "9.4.1",
"globby": "^14.0.1",
"gray-matter": "^4.0.3",
"index-to-position": "^0.1.2",
"ink": "^5.0.1",
"ink-big-text": "^2.0.0",
"ink-gradient": "^3.0.0",
"ink-link": "^4.1.0",
"jscodeshift": "^17.0.0",
"marked": "^11.1.1",
"meow": "^11.0.0",
"react": "catalog:react",
"read-pkg": "^9.0.1",
"semver-regex": "^4.0.5",
"temp-dir": "^3.0.0"
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "test-expo-old",
"version": "1.0.0",
"dependencies": {
"@clerk/clerk-expo": "^2.0.0",
"expo": "^50.0.0",
"react": "^18.0.0",
"react-native": "^0.73.0"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { ClerkProvider, useAuth } from '@clerk/clerk-expo';

export default function App() {
return (
<ClerkProvider publishableKey='pk_test_xxx'>
<AuthStatus />
</ClerkProvider>
);
}

function AuthStatus() {
const { isSignedIn } = useAuth();
return <Text>{isSignedIn ? 'Signed in' : 'Signed out'}</Text>;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "test-nextjs-v6",
"version": "1.0.0",
"dependencies": {
"@clerk/nextjs": "^6.0.0",
"next": "^14.0.0",
"react": "^18.0.0"
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions packages/upgrade/src/__tests__/fixtures/nextjs-v6/src/app.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { ClerkProvider, useAuth } from '@clerk/nextjs';
import { useUser } from '@clerk/clerk-react';

export default function App({ children }) {
return <ClerkProvider>{children}</ClerkProvider>;
}

export function UserProfile() {
const { isSignedIn } = useAuth();
const { user } = useUser();

if (!isSignedIn) {
return <div>Not signed in</div>;
}

return <div>Hello, {user?.firstName}</div>;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "test-nextjs-v7",
"version": "1.0.0",
"dependencies": {
"@clerk/nextjs": "^7.0.0",
"next": "^14.0.0",
"react": "^18.0.0"
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions packages/upgrade/src/__tests__/fixtures/nextjs-v7/src/app.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { ClerkProvider, useAuth, useUser } from '@clerk/nextjs';

export default function App({ children }) {
return <ClerkProvider>{children}</ClerkProvider>;
}

export function UserProfile() {
const { isSignedIn } = useAuth();
const { user } = useUser();

if (!isSignedIn) {
return <div>Not signed in</div>;
}

return <div>Hello, {user?.firstName}</div>;
}
7 changes: 7 additions & 0 deletions packages/upgrade/src/__tests__/fixtures/no-clerk/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"name": "test-no-clerk",
"version": "1.0.0",
"dependencies": {
"react": "^18.0.0"
}
}
8 changes: 8 additions & 0 deletions packages/upgrade/src/__tests__/fixtures/react-v6/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "test-react-v6",
"version": "1.0.0",
"dependencies": {
"@clerk/clerk-react": "^5.0.0",
"react": "^18.0.0"
}
}
19 changes: 19 additions & 0 deletions packages/upgrade/src/__tests__/fixtures/react-v6/src/App.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { ClerkProvider, useUser } from '@clerk/react';

export default function App() {
return (
<ClerkProvider publishableKey='pk_test_xxx'>
<UserInfo />
</ClerkProvider>
);
}

function UserInfo() {
const { user, isSignedIn } = useUser();

if (!isSignedIn) {
return <div>Please sign in</div>;
}

return <div>Welcome, {user?.firstName}</div>;
}
2 changes: 2 additions & 0 deletions packages/upgrade/src/__tests__/fixtures/react-v6/yarn.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# yarn lockfile v1

60 changes: 60 additions & 0 deletions packages/upgrade/src/__tests__/helpers/create-fixture.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import fs from 'node:fs';
import os from 'node:os';
import path from 'node:path';
import { fileURLToPath } from 'node:url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const FIXTURES_DIR = path.join(__dirname, '..', 'fixtures');

export function getFixturePath(fixtureName) {
return path.join(FIXTURES_DIR, fixtureName);
}

export function createTempFixture(fixtureName) {
const sourcePath = getFixturePath(fixtureName);
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), `clerk-upgrade-test-${fixtureName}-`));

copyDirSync(sourcePath, tempDir);

return {
path: tempDir,
cleanup() {
fs.rmSync(tempDir, { recursive: true, force: true });
},
};
}

function copyDirSync(src, dest) {
fs.mkdirSync(dest, { recursive: true });

const entries = fs.readdirSync(src, { withFileTypes: true });

for (const entry of entries) {
const srcPath = path.join(src, entry.name);
const destPath = path.join(dest, entry.name);

if (entry.isDirectory()) {
copyDirSync(srcPath, destPath);
} else {
fs.copyFileSync(srcPath, destPath);
}
}
}

export function readFixtureFile(fixtureName, filePath) {
return fs.readFileSync(path.join(getFixturePath(fixtureName), filePath), 'utf8');
}

export function writeFixtureFile(tempPath, filePath, content) {
const fullPath = path.join(tempPath, filePath);
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
fs.writeFileSync(fullPath, content, 'utf8');
}

export function readTempFile(tempPath, filePath) {
return fs.readFileSync(path.join(tempPath, filePath), 'utf8');
}

export function fileExists(tempPath, filePath) {
return fs.existsSync(path.join(tempPath, filePath));
}
Loading
Loading