@clerk/upgrade 2.0.0-snapshot.v20251204175016 → 2.0.0-snapshot.v20251211120550
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/README.md +35 -5
- package/dist/__tests__/fixtures/expo-old-package/package-lock.json +5 -0
- package/dist/__tests__/fixtures/expo-old-package/package.json +10 -0
- package/dist/__tests__/fixtures/expo-old-package/src/App.tsx +14 -0
- package/dist/__tests__/fixtures/nextjs-v6/package.json +9 -0
- package/dist/__tests__/fixtures/nextjs-v6/pnpm-lock.yaml +2 -0
- package/dist/__tests__/fixtures/nextjs-v6/src/app.tsx +17 -0
- package/dist/__tests__/fixtures/nextjs-v7/package.json +9 -0
- package/dist/__tests__/fixtures/nextjs-v7/pnpm-lock.yaml +2 -0
- package/dist/__tests__/fixtures/nextjs-v7/src/app.tsx +16 -0
- package/dist/__tests__/fixtures/no-clerk/package.json +7 -0
- package/dist/__tests__/fixtures/react-v6/package.json +8 -0
- package/dist/__tests__/fixtures/react-v6/src/App.tsx +19 -0
- package/dist/__tests__/fixtures/react-v6/yarn.lock +2 -0
- package/dist/__tests__/helpers/create-fixture.js +56 -0
- package/dist/__tests__/integration/cli.test.js +275 -0
- package/dist/__tests__/integration/config.test.js +97 -0
- package/dist/__tests__/integration/detect-sdk.test.js +100 -0
- package/dist/__tests__/integration/runner.test.js +58 -0
- package/dist/cli.js +172 -44
- package/dist/codemods/__tests__/__fixtures__/transform-align-experimental-unstable-prefixes.fixtures.js +92 -0
- package/dist/codemods/__tests__/__fixtures__/transform-appearance-layout-to-options.fixtures.js +9 -0
- package/dist/codemods/__tests__/__fixtures__/transform-clerk-react-v6.fixtures.js +13 -0
- package/dist/codemods/__tests__/__fixtures__/transform-remove-deprecated-appearance-props.fixtures.js +63 -0
- package/dist/codemods/__tests__/__fixtures__/transform-themes-to-ui-themes.fixtures.js +41 -0
- package/dist/codemods/__tests__/transform-align-experimental-unstable-prefixes.test.js +15 -0
- package/dist/codemods/__tests__/transform-appearance-layout-to-options.test.js +15 -0
- package/dist/codemods/__tests__/transform-remove-deprecated-appearance-props.test.js +15 -0
- package/dist/codemods/__tests__/transform-themes-to-ui-themes.test.js +15 -0
- package/dist/codemods/index.js +67 -13
- package/dist/codemods/transform-align-experimental-unstable-prefixes.cjs +412 -0
- package/dist/codemods/transform-appearance-layout-to-options.cjs +65 -0
- package/dist/codemods/transform-clerk-react-v6.cjs +15 -7
- package/dist/codemods/transform-remove-deprecated-appearance-props.cjs +109 -0
- package/dist/codemods/transform-remove-deprecated-props.cjs +11 -32
- package/dist/codemods/transform-themes-to-ui-themes.cjs +65 -0
- package/dist/config.js +145 -0
- package/dist/render.js +170 -0
- package/dist/runner.js +98 -0
- package/dist/util/detect-sdk.js +125 -0
- package/dist/util/package-manager.js +94 -0
- package/dist/versions/core-3/changes/clerk-expo-package-rename.md +23 -0
- package/dist/versions/core-3/changes/clerk-react-package-rename.md +22 -0
- package/dist/versions/core-3/index.js +40 -0
- package/package.json +2 -8
- package/dist/app.js +0 -177
- package/dist/components/Codemod.js +0 -149
- package/dist/components/Command.js +0 -56
- package/dist/components/Header.js +0 -11
- package/dist/components/SDKWorkflow.js +0 -278
- package/dist/components/Scan.js +0 -180
- package/dist/components/UpgradeSDK.js +0 -116
- package/dist/util/expandable-list.js +0 -173
- package/dist/util/get-clerk-version.js +0 -22
- package/dist/util/guess-framework.js +0 -69
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { Spinner, StatusMessage } from '@inkjs/ui';
|
|
2
|
-
import { execa } from 'execa';
|
|
3
|
-
import { Text } from 'ink';
|
|
4
|
-
import React, { useEffect, useState } from 'react';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Component that runs a command and handles the result.
|
|
8
|
-
*
|
|
9
|
-
* @component
|
|
10
|
-
* @param {Object} props
|
|
11
|
-
* @param {Function} props.callback - The callback function to be called after the command execution.
|
|
12
|
-
* @param {string} props.cmd - The command to execute.
|
|
13
|
-
* @param {string} props.message - The message to display while the command is running.
|
|
14
|
-
* @returns {JSX.Element} The rendered component.
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* <Command cmd="echo 'hello world'" />
|
|
18
|
-
*/
|
|
19
|
-
export function Command({
|
|
20
|
-
cmd,
|
|
21
|
-
message,
|
|
22
|
-
onError,
|
|
23
|
-
onSuccess
|
|
24
|
-
}) {
|
|
25
|
-
const [error, setError] = useState();
|
|
26
|
-
const [result, setResult] = useState();
|
|
27
|
-
useEffect(() => {
|
|
28
|
-
execa({
|
|
29
|
-
shell: true
|
|
30
|
-
})`${cmd}`.then(res => {
|
|
31
|
-
setResult(res);
|
|
32
|
-
}).catch(err => {
|
|
33
|
-
setError(err);
|
|
34
|
-
});
|
|
35
|
-
}, [cmd]);
|
|
36
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, !result && !error && /*#__PURE__*/React.createElement(Loading, {
|
|
37
|
-
cmd: cmd,
|
|
38
|
-
message: message
|
|
39
|
-
}), result ? onSuccess ? onSuccess() : /*#__PURE__*/React.createElement(StatusMessage, {
|
|
40
|
-
variant: "success"
|
|
41
|
-
}, "Successfully ran: ", /*#__PURE__*/React.createElement(Text, {
|
|
42
|
-
bold: true
|
|
43
|
-
}, cmd)) : null, error ? onError ? onError() : /*#__PURE__*/React.createElement(StatusMessage, {
|
|
44
|
-
variant: "error"
|
|
45
|
-
}, "Failed running: ", /*#__PURE__*/React.createElement(Text, {
|
|
46
|
-
bold: true
|
|
47
|
-
}, cmd)) : null);
|
|
48
|
-
}
|
|
49
|
-
function Loading({
|
|
50
|
-
cmd,
|
|
51
|
-
message
|
|
52
|
-
}) {
|
|
53
|
-
return message ? message : /*#__PURE__*/React.createElement(Spinner, {
|
|
54
|
-
label: `Running command: ${cmd}`
|
|
55
|
-
});
|
|
56
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import BigText from 'ink-big-text';
|
|
2
|
-
import Gradient from 'ink-gradient';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
export function Header() {
|
|
5
|
-
return /*#__PURE__*/React.createElement(Gradient, {
|
|
6
|
-
name: "vice"
|
|
7
|
-
}, /*#__PURE__*/React.createElement(BigText, {
|
|
8
|
-
text: "Clerk Upgrade",
|
|
9
|
-
font: "tiny"
|
|
10
|
-
}));
|
|
11
|
-
}
|
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
import { Select, Spinner, StatusMessage } from '@inkjs/ui';
|
|
2
|
-
import { Newline, Text } from 'ink';
|
|
3
|
-
import Link from 'ink-link';
|
|
4
|
-
import React, { useState } from 'react';
|
|
5
|
-
import { getClerkSdkVersion } from '../util/get-clerk-version.js';
|
|
6
|
-
import { Codemod } from './Codemod.js';
|
|
7
|
-
import { Command } from './Command.js';
|
|
8
|
-
import { Header } from './Header.js';
|
|
9
|
-
import { UpgradeSDK } from './UpgradeSDK.js';
|
|
10
|
-
const CODEMODS = {
|
|
11
|
-
ASYNC_REQUEST: 'transform-async-request',
|
|
12
|
-
CLERK_REACT_V6: 'transform-clerk-react-v6',
|
|
13
|
-
REMOVE_DEPRECATED_PROPS: 'transform-remove-deprecated-props'
|
|
14
|
-
};
|
|
15
|
-
function versionNeedsUpgrade(sdk, version) {
|
|
16
|
-
if (sdk === 'clerk-react' && version === 5) {
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
19
|
-
if (sdk === 'clerk-expo' && version === 2) {
|
|
20
|
-
return true;
|
|
21
|
-
}
|
|
22
|
-
if (sdk === 'react-router' && version === 2) {
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
if (sdk === 'tanstack-react-start' && version === 0) {
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* SDKWorkflow component handles the upgrade process for a given SDK.
|
|
33
|
-
* It checks the current version of the SDK and provides the necessary steps
|
|
34
|
-
* to upgrade or run codemods based on the version.
|
|
35
|
-
*
|
|
36
|
-
* @component
|
|
37
|
-
* @param {Object} props
|
|
38
|
-
* @param {string} props.sdk - The SDK to be upgraded.
|
|
39
|
-
*
|
|
40
|
-
* @returns {JSX.Element} The rendered component.
|
|
41
|
-
*/
|
|
42
|
-
export function SDKWorkflow(props) {
|
|
43
|
-
const {
|
|
44
|
-
sdk
|
|
45
|
-
} = props;
|
|
46
|
-
const detectedVersion = getClerkSdkVersion(sdk);
|
|
47
|
-
const [done, setDone] = useState(false);
|
|
48
|
-
const [runCodemod, setRunCodemod] = useState(false);
|
|
49
|
-
const [upgradeComplete, setUpgradeComplete] = useState(false);
|
|
50
|
-
const [version, setVersion] = useState(detectedVersion);
|
|
51
|
-
const [versionConfirmed, setVersionConfirmed] = useState(Boolean(detectedVersion));
|
|
52
|
-
if (!['nextjs', 'clerk-react', 'clerk-expo', 'react-router', 'tanstack-react-start'].includes(sdk)) {
|
|
53
|
-
return /*#__PURE__*/React.createElement(StatusMessage, {
|
|
54
|
-
variant: "error"
|
|
55
|
-
}, "The SDK upgrade functionality is not available for ", /*#__PURE__*/React.createElement(Text, {
|
|
56
|
-
bold: true
|
|
57
|
-
}, "@clerk/", sdk), " at the moment.");
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// If we cannot automatically determine the installed version, let the user
|
|
61
|
-
// pick the major version they are on so we can still run the appropriate
|
|
62
|
-
// upgrade / codemods instead of silently doing nothing.
|
|
63
|
-
if (!versionConfirmed) {
|
|
64
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Header, null), /*#__PURE__*/React.createElement(Text, null, "We couldn't automatically detect which major version of ", /*#__PURE__*/React.createElement(Text, {
|
|
65
|
-
bold: true
|
|
66
|
-
}, "@clerk/", sdk), " you're using."), /*#__PURE__*/React.createElement(Newline, null), /*#__PURE__*/React.createElement(StatusMessage, {
|
|
67
|
-
variant: "warning"
|
|
68
|
-
}, "Please select the major version below. If you're not sure, picking v7 (Core 3) will run the latest codemods and is generally safe to re-run."), /*#__PURE__*/React.createElement(Newline, null), /*#__PURE__*/React.createElement(Text, null, "Please select your current @clerk/", sdk, " major version:"), /*#__PURE__*/React.createElement(Select, {
|
|
69
|
-
options: [{
|
|
70
|
-
label: 'v5 (upgrade to v6)',
|
|
71
|
-
value: 5
|
|
72
|
-
}, {
|
|
73
|
-
label: 'v6 (upgrade to v7 / Core 3)',
|
|
74
|
-
value: 6
|
|
75
|
-
}, {
|
|
76
|
-
label: 'v7 (already on Core 3, just run codemods)',
|
|
77
|
-
value: 7
|
|
78
|
-
}],
|
|
79
|
-
onChange: value => {
|
|
80
|
-
const numeric = typeof value === 'number' ? value : Number(value);
|
|
81
|
-
setVersion(Number.isNaN(numeric) ? 7 : numeric);
|
|
82
|
-
setVersionConfirmed(true);
|
|
83
|
-
}
|
|
84
|
-
}));
|
|
85
|
-
}
|
|
86
|
-
if (sdk === 'nextjs') {
|
|
87
|
-
return /*#__PURE__*/React.createElement(NextjsWorkflow, {
|
|
88
|
-
done: done,
|
|
89
|
-
runCodemod: runCodemod,
|
|
90
|
-
sdk: sdk,
|
|
91
|
-
setDone: setDone,
|
|
92
|
-
setRunCodemod: setRunCodemod,
|
|
93
|
-
setUpgradeComplete: setUpgradeComplete,
|
|
94
|
-
upgradeComplete: upgradeComplete,
|
|
95
|
-
version: version
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
if (['clerk-react', 'clerk-expo', 'react-router', 'tanstack-react-start'].includes(sdk)) {
|
|
99
|
-
return /*#__PURE__*/React.createElement(ReactSdkWorkflow, {
|
|
100
|
-
done: done,
|
|
101
|
-
runCodemod: runCodemod,
|
|
102
|
-
sdk: sdk,
|
|
103
|
-
setDone: setDone,
|
|
104
|
-
setRunCodemod: setRunCodemod,
|
|
105
|
-
setUpgradeComplete: setUpgradeComplete,
|
|
106
|
-
upgradeComplete: upgradeComplete,
|
|
107
|
-
version: version
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
function NextjsWorkflow({
|
|
112
|
-
done,
|
|
113
|
-
runCodemod,
|
|
114
|
-
sdk,
|
|
115
|
-
setDone,
|
|
116
|
-
setRunCodemod,
|
|
117
|
-
setUpgradeComplete,
|
|
118
|
-
upgradeComplete,
|
|
119
|
-
version
|
|
120
|
-
}) {
|
|
121
|
-
const [v6CodemodComplete, setV6CodemodComplete] = useState(false);
|
|
122
|
-
const [glob, setGlob] = useState();
|
|
123
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Header, null), /*#__PURE__*/React.createElement(Text, null, "Clerk SDK used: ", /*#__PURE__*/React.createElement(Text, {
|
|
124
|
-
color: "green"
|
|
125
|
-
}, "@clerk/", sdk)), /*#__PURE__*/React.createElement(Text, null, "Migrating from version: ", /*#__PURE__*/React.createElement(Text, {
|
|
126
|
-
color: "green"
|
|
127
|
-
}, version)), runCodemod ? /*#__PURE__*/React.createElement(Text, null, "Executing codemod: ", /*#__PURE__*/React.createElement(Text, {
|
|
128
|
-
color: "green"
|
|
129
|
-
}, "yes")) : null, /*#__PURE__*/React.createElement(Newline, null), version === 5 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(UpgradeSDK, {
|
|
130
|
-
callback: setUpgradeComplete,
|
|
131
|
-
sdk: sdk
|
|
132
|
-
}), upgradeComplete ? /*#__PURE__*/React.createElement(Codemod, {
|
|
133
|
-
callback: setV6CodemodComplete,
|
|
134
|
-
sdk: sdk,
|
|
135
|
-
transform: CODEMODS.ASYNC_REQUEST,
|
|
136
|
-
onGlobResolved: setGlob
|
|
137
|
-
}) : null, v6CodemodComplete ? /*#__PURE__*/React.createElement(Codemod, {
|
|
138
|
-
callback: setDone,
|
|
139
|
-
sdk: sdk,
|
|
140
|
-
transform: CODEMODS.REMOVE_DEPRECATED_PROPS,
|
|
141
|
-
glob: glob
|
|
142
|
-
}) : null), version === 6 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(UpgradeSDK, {
|
|
143
|
-
callback: setUpgradeComplete,
|
|
144
|
-
sdk: sdk
|
|
145
|
-
}), upgradeComplete ? /*#__PURE__*/React.createElement(Codemod, {
|
|
146
|
-
callback: setV6CodemodComplete,
|
|
147
|
-
sdk: sdk,
|
|
148
|
-
transform: CODEMODS.CLERK_REACT_V6,
|
|
149
|
-
onGlobResolved: setGlob
|
|
150
|
-
}) : null, v6CodemodComplete ? /*#__PURE__*/React.createElement(Codemod, {
|
|
151
|
-
callback: setDone,
|
|
152
|
-
sdk: sdk,
|
|
153
|
-
transform: CODEMODS.REMOVE_DEPRECATED_PROPS,
|
|
154
|
-
glob: glob
|
|
155
|
-
}) : null), version === 7 && /*#__PURE__*/React.createElement(React.Fragment, null, runCodemod ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Codemod, {
|
|
156
|
-
callback: setV6CodemodComplete,
|
|
157
|
-
sdk: sdk,
|
|
158
|
-
transform: CODEMODS.CLERK_REACT_V6,
|
|
159
|
-
onGlobResolved: setGlob
|
|
160
|
-
}), v6CodemodComplete ? /*#__PURE__*/React.createElement(Codemod, {
|
|
161
|
-
callback: setDone,
|
|
162
|
-
sdk: sdk,
|
|
163
|
-
transform: CODEMODS.REMOVE_DEPRECATED_PROPS,
|
|
164
|
-
glob: glob
|
|
165
|
-
}) : null) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Text, null, "Looks like you are already on the latest version of ", /*#__PURE__*/React.createElement(Text, {
|
|
166
|
-
bold: true
|
|
167
|
-
}, "@clerk/", sdk), ". Would you like to run the associated codemods?"), /*#__PURE__*/React.createElement(Select, {
|
|
168
|
-
onChange: value => {
|
|
169
|
-
if (value === 'yes') {
|
|
170
|
-
setRunCodemod(true);
|
|
171
|
-
} else {
|
|
172
|
-
setDone(true);
|
|
173
|
-
}
|
|
174
|
-
},
|
|
175
|
-
options: [{
|
|
176
|
-
label: 'yes',
|
|
177
|
-
value: 'yes'
|
|
178
|
-
}, {
|
|
179
|
-
label: 'no',
|
|
180
|
-
value: 'no'
|
|
181
|
-
}]
|
|
182
|
-
}))), done && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(StatusMessage, {
|
|
183
|
-
variant: "success"
|
|
184
|
-
}, "Done upgrading ", /*#__PURE__*/React.createElement(Text, {
|
|
185
|
-
bold: true
|
|
186
|
-
}, "@clerk/nextjs")), /*#__PURE__*/React.createElement(Command, {
|
|
187
|
-
cmd: 'grep -rE "import.*\\\\{.*useAuth.*\\\\}.*from.*[\'\\\\\\"]@clerk/nextjs[\'\\\\\\"]" . --exclude-dir={node_modules,dist}',
|
|
188
|
-
message: /*#__PURE__*/React.createElement(Spinner, {
|
|
189
|
-
label: 'Checking for `useAuth` usage in your project...'
|
|
190
|
-
}),
|
|
191
|
-
onError: () => null,
|
|
192
|
-
onSuccess: NextjsUseAuthWarning
|
|
193
|
-
})));
|
|
194
|
-
}
|
|
195
|
-
function NextjsUseAuthWarning() {
|
|
196
|
-
return /*#__PURE__*/React.createElement(StatusMessage, {
|
|
197
|
-
variant: "warning"
|
|
198
|
-
}, /*#__PURE__*/React.createElement(Text, null, "We have detected that your application might be using the ", /*#__PURE__*/React.createElement(Text, {
|
|
199
|
-
bold: true
|
|
200
|
-
}, "useAuth"), " hook from", ' ', /*#__PURE__*/React.createElement(Text, {
|
|
201
|
-
bold: true
|
|
202
|
-
}, "@clerk/nextjs"), "."), /*#__PURE__*/React.createElement(Newline, null), /*#__PURE__*/React.createElement(Text, null, "If usages of this hook are server-side rendered, you might need to add the ", /*#__PURE__*/React.createElement(Text, {
|
|
203
|
-
bold: true
|
|
204
|
-
}, "dynamic"), " prop to your application's root ", /*#__PURE__*/React.createElement(Text, {
|
|
205
|
-
bold: true
|
|
206
|
-
}, "ClerkProvider"), "."), /*#__PURE__*/React.createElement(Newline, null), /*#__PURE__*/React.createElement(Text, null, "You can find more information about this change in the Clerk documentation at", ' ', /*#__PURE__*/React.createElement(Link, {
|
|
207
|
-
url: "https://clerk.com/docs/references/nextjs/rendering-modes"
|
|
208
|
-
}, "https://clerk.com/docs/references/nextjs/rendering-modes"), "."));
|
|
209
|
-
}
|
|
210
|
-
function ReactSdkWorkflow({
|
|
211
|
-
done,
|
|
212
|
-
runCodemod,
|
|
213
|
-
sdk,
|
|
214
|
-
setDone,
|
|
215
|
-
setRunCodemod,
|
|
216
|
-
setUpgradeComplete,
|
|
217
|
-
upgradeComplete,
|
|
218
|
-
version
|
|
219
|
-
}) {
|
|
220
|
-
const [v6CodemodComplete, setV6CodemodComplete] = useState(false);
|
|
221
|
-
const [glob, setGlob] = useState();
|
|
222
|
-
const replacePackage = sdk === 'clerk-react' || sdk === 'clerk-expo';
|
|
223
|
-
const needsUpgrade = versionNeedsUpgrade(sdk, version);
|
|
224
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Header, null), /*#__PURE__*/React.createElement(Text, null, "Clerk SDK used: ", /*#__PURE__*/React.createElement(Text, {
|
|
225
|
-
color: "green"
|
|
226
|
-
}, "@clerk/", sdk)), /*#__PURE__*/React.createElement(Text, null, "Migrating from version: ", /*#__PURE__*/React.createElement(Text, {
|
|
227
|
-
color: "green"
|
|
228
|
-
}, version)), runCodemod ? /*#__PURE__*/React.createElement(Text, null, "Executing codemod: ", /*#__PURE__*/React.createElement(Text, {
|
|
229
|
-
color: "green"
|
|
230
|
-
}, "yes")) : null, /*#__PURE__*/React.createElement(Newline, null), needsUpgrade && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(UpgradeSDK, {
|
|
231
|
-
callback: setUpgradeComplete,
|
|
232
|
-
replacePackage: replacePackage,
|
|
233
|
-
sdk: sdk
|
|
234
|
-
}), upgradeComplete ? /*#__PURE__*/React.createElement(Codemod, {
|
|
235
|
-
callback: setV6CodemodComplete,
|
|
236
|
-
sdk: sdk,
|
|
237
|
-
transform: CODEMODS.CLERK_REACT_V6,
|
|
238
|
-
onGlobResolved: setGlob
|
|
239
|
-
}) : null, v6CodemodComplete ? /*#__PURE__*/React.createElement(Codemod, {
|
|
240
|
-
callback: setDone,
|
|
241
|
-
sdk: sdk,
|
|
242
|
-
transform: CODEMODS.REMOVE_DEPRECATED_PROPS,
|
|
243
|
-
glob: glob
|
|
244
|
-
}) : null), !needsUpgrade && /*#__PURE__*/React.createElement(React.Fragment, null, runCodemod ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Codemod, {
|
|
245
|
-
callback: setV6CodemodComplete,
|
|
246
|
-
sdk: sdk,
|
|
247
|
-
transform: CODEMODS.CLERK_REACT_V6,
|
|
248
|
-
onGlobResolved: setGlob
|
|
249
|
-
}), v6CodemodComplete ? /*#__PURE__*/React.createElement(Codemod, {
|
|
250
|
-
callback: setDone,
|
|
251
|
-
sdk: sdk,
|
|
252
|
-
transform: CODEMODS.REMOVE_DEPRECATED_PROPS,
|
|
253
|
-
glob: glob
|
|
254
|
-
}) : null) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Text, null, "Looks like you are already on the latest version of ", /*#__PURE__*/React.createElement(Text, {
|
|
255
|
-
bold: true
|
|
256
|
-
}, "@clerk/", sdk), ". Would you like to run the associated codemods?"), /*#__PURE__*/React.createElement(Select, {
|
|
257
|
-
onChange: value => {
|
|
258
|
-
if (value === 'yes') {
|
|
259
|
-
setRunCodemod(true);
|
|
260
|
-
} else {
|
|
261
|
-
setDone(true);
|
|
262
|
-
}
|
|
263
|
-
},
|
|
264
|
-
options: [{
|
|
265
|
-
label: 'yes',
|
|
266
|
-
value: 'yes'
|
|
267
|
-
}, {
|
|
268
|
-
label: 'no',
|
|
269
|
-
value: 'no'
|
|
270
|
-
}]
|
|
271
|
-
}))), done && /*#__PURE__*/React.createElement(StatusMessage, {
|
|
272
|
-
variant: "success"
|
|
273
|
-
}, replacePackage ? /*#__PURE__*/React.createElement(React.Fragment, null, "Done upgrading to ", /*#__PURE__*/React.createElement(Text, {
|
|
274
|
-
bold: true
|
|
275
|
-
}, "@clerk/", sdk.replace('clerk-', ''))) : /*#__PURE__*/React.createElement(React.Fragment, null, "Done upgrading ", /*#__PURE__*/React.createElement(Text, {
|
|
276
|
-
bold: true
|
|
277
|
-
}, "@clerk/", sdk))));
|
|
278
|
-
}
|
package/dist/components/Scan.js
DELETED
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { ProgressBar } from '@inkjs/ui';
|
|
2
|
-
import fs from 'fs/promises';
|
|
3
|
-
import { convertPathToPattern, globby } from 'globby';
|
|
4
|
-
import indexToPosition from 'index-to-position';
|
|
5
|
-
import { Newline, Text } from 'ink';
|
|
6
|
-
import path from 'path';
|
|
7
|
-
import React, { useEffect, useState } from 'react';
|
|
8
|
-
import ExpandableList from '../util/expandable-list.js';
|
|
9
|
-
export function Scan(props) {
|
|
10
|
-
const {
|
|
11
|
-
fromVersion,
|
|
12
|
-
toVersion,
|
|
13
|
-
sdks,
|
|
14
|
-
dir,
|
|
15
|
-
ignore,
|
|
16
|
-
noWarnings,
|
|
17
|
-
uuid,
|
|
18
|
-
disableTelemetry
|
|
19
|
-
} = props;
|
|
20
|
-
// NOTE: if the difference between fromVersion and toVersion is greater than 1
|
|
21
|
-
// we need to do a little extra work here and import two matchers,
|
|
22
|
-
// sequence them after each other, and clearly mark which version migration
|
|
23
|
-
// applies to each log.
|
|
24
|
-
//
|
|
25
|
-
// This is not yet implemented though since the current state of the script
|
|
26
|
-
// only handles a single version.
|
|
27
|
-
const [status, setStatus] = useState('Initializing');
|
|
28
|
-
const [progress, setProgress] = useState(0);
|
|
29
|
-
const [complete, setComplete] = useState(false);
|
|
30
|
-
const [matchers, setMatchers] = useState();
|
|
31
|
-
const [files, setFiles] = useState();
|
|
32
|
-
const [results, setResults] = useState([]);
|
|
33
|
-
|
|
34
|
-
// Load matchers
|
|
35
|
-
// -------------
|
|
36
|
-
// result = `matchers` set to format:
|
|
37
|
-
// { sdkName: [{ title: 'x', matcher: /x/, slug: 'x', ... }] }
|
|
38
|
-
useEffect(() => {
|
|
39
|
-
setStatus(`Loading data for ${toVersion} migration`);
|
|
40
|
-
void import(`../versions/${toVersion}/index.js`).then(version => {
|
|
41
|
-
setMatchers(sdks.reduce((m, sdk) => {
|
|
42
|
-
m[sdk] = version.default[sdk];
|
|
43
|
-
return m;
|
|
44
|
-
}, {}));
|
|
45
|
-
});
|
|
46
|
-
}, [toVersion, sdks]);
|
|
47
|
-
|
|
48
|
-
// Get all files from the glob matcher
|
|
49
|
-
// -----------------------------------
|
|
50
|
-
// result = `files` set to format: ['/filename', '/other/filename']
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
setStatus('Collecting files to scan');
|
|
53
|
-
const pattern = convertPathToPattern(path.resolve(dir));
|
|
54
|
-
void globby(pattern, {
|
|
55
|
-
ignore: ['node_modules/**', '**/node_modules/**', '.git/**', 'package.json', '**/package.json', 'package-lock.json', '**/package-lock.json', 'yarn.lock', '**/yarn.lock', 'pnpm-lock.yaml', '**/pnpm-lock.yaml', '**/*.(png|webp|svg|gif|jpg|jpeg)+', '**/*.(mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg)+', ...ignore].filter(Boolean)
|
|
56
|
-
}).then(files => {
|
|
57
|
-
setFiles(files);
|
|
58
|
-
});
|
|
59
|
-
}, [dir, ignore]);
|
|
60
|
-
|
|
61
|
-
// Read files and scan regexes
|
|
62
|
-
// ---------------------------
|
|
63
|
-
// result = `results` set to format
|
|
64
|
-
useEffect(() => {
|
|
65
|
-
if (!matchers || !files) {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const allResults = {};
|
|
69
|
-
void Promise.all(
|
|
70
|
-
// first we read all the files
|
|
71
|
-
files.map(async (file, idx) => {
|
|
72
|
-
const content = await fs.readFile(file, 'utf8');
|
|
73
|
-
|
|
74
|
-
// then we run each of the matchers against the file contents
|
|
75
|
-
for (const sdk in matchers) {
|
|
76
|
-
// returns [{ ...matcher, instances: [{sdk, file, position}] }]
|
|
77
|
-
matchers[sdk].map(matcherConfig => {
|
|
78
|
-
// run regex against file content, return array of matches
|
|
79
|
-
// matcher can be an array or string
|
|
80
|
-
let matches = [];
|
|
81
|
-
if (Array.isArray(matcherConfig.matcher)) {
|
|
82
|
-
matcherConfig.matcher.map(m => {
|
|
83
|
-
matches = matches.concat(Array.from(content.matchAll(m)));
|
|
84
|
-
});
|
|
85
|
-
} else {
|
|
86
|
-
matches = Array.from(content.matchAll(matcherConfig.matcher));
|
|
87
|
-
}
|
|
88
|
-
if (matches.length < 1) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// for each match, add to `instances` array
|
|
93
|
-
matches.map(match => {
|
|
94
|
-
if (noWarnings && matcherConfig.warning) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// create if not exists
|
|
99
|
-
if (!allResults[matcherConfig.title]) {
|
|
100
|
-
allResults[matcherConfig.title] = {
|
|
101
|
-
instances: [],
|
|
102
|
-
...matcherConfig
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
const position = indexToPosition(content, match.index, {
|
|
106
|
-
oneBased: true
|
|
107
|
-
});
|
|
108
|
-
const fileRelative = path.relative(process.cwd(), file);
|
|
109
|
-
|
|
110
|
-
// when scanning for multiple SDKs, you can get a double match, this logic ensures you don't
|
|
111
|
-
if (allResults[matcherConfig.title].instances.filter(i => {
|
|
112
|
-
return i.position.line === position.line && i.position.column === position.column && i.file === fileRelative;
|
|
113
|
-
}).length > 0) {
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
allResults[matcherConfig.title].instances.push({
|
|
117
|
-
sdk,
|
|
118
|
-
position,
|
|
119
|
-
file: fileRelative
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
setStatus(`Scanning ${file}`);
|
|
125
|
-
setProgress(Math.ceil(idx / files.length * 100));
|
|
126
|
-
})).then(() => {
|
|
127
|
-
const aggregatedResults = Object.keys(allResults).map(k => allResults[k]);
|
|
128
|
-
setResults(prevResults => [...prevResults, ...aggregatedResults]);
|
|
129
|
-
|
|
130
|
-
// Anonymously track how many instances of each breaking change item were encountered.
|
|
131
|
-
// This only tracks the name of the breaking change found, and how many instances of it
|
|
132
|
-
// were found. It does not send any part of the scanned codebase or any PII.
|
|
133
|
-
// It is used internally to help us understand what the most common sticking points are
|
|
134
|
-
// for our users so we can appropriate prioritize support/guidance/docs around them.
|
|
135
|
-
if (!disableTelemetry) {
|
|
136
|
-
void fetch('https://api.segment.io/v1/batch', {
|
|
137
|
-
method: 'POST',
|
|
138
|
-
headers: {
|
|
139
|
-
Authorization: `Basic ${Buffer.from('5TkC1SM87VX2JRJcIGBBmL7sHLRWaIvc:').toString('base64')}`,
|
|
140
|
-
'Content-Type': 'application/json'
|
|
141
|
-
},
|
|
142
|
-
body: JSON.stringify({
|
|
143
|
-
batch: aggregatedResults.map(item => {
|
|
144
|
-
return {
|
|
145
|
-
type: 'track',
|
|
146
|
-
userId: 'clerk-upgrade-tool',
|
|
147
|
-
event: 'Clerk Migration Tool_CLI_Breaking Change Found',
|
|
148
|
-
properties: {
|
|
149
|
-
appId: `cmt_${uuid}`,
|
|
150
|
-
surface: 'Clerk Migration Tool',
|
|
151
|
-
location: 'CLI',
|
|
152
|
-
title: item.title,
|
|
153
|
-
instances: item.instances.length,
|
|
154
|
-
fromVersion,
|
|
155
|
-
toVersion
|
|
156
|
-
},
|
|
157
|
-
timestamp: new Date().toISOString()
|
|
158
|
-
};
|
|
159
|
-
})
|
|
160
|
-
})
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
setComplete(true);
|
|
164
|
-
if (Object.keys(allResults).length < 1) {
|
|
165
|
-
setStatus('It looks like you have nothing you need to change, upgrade away!');
|
|
166
|
-
} else {
|
|
167
|
-
setStatus('File scan complete. See results below!');
|
|
168
|
-
}
|
|
169
|
-
}).catch(err => {
|
|
170
|
-
console.error(err);
|
|
171
|
-
});
|
|
172
|
-
}, [matchers, files, noWarnings, disableTelemetry, fromVersion, toVersion, uuid]);
|
|
173
|
-
return complete ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Text, {
|
|
174
|
-
color: "green"
|
|
175
|
-
}, "\u2713 ", status), /*#__PURE__*/React.createElement(Newline, null), !!results.length && /*#__PURE__*/React.createElement(ExpandableList, {
|
|
176
|
-
items: results
|
|
177
|
-
})) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ProgressBar, {
|
|
178
|
-
value: progress
|
|
179
|
-
}), /*#__PURE__*/React.createElement(Text, null, status));
|
|
180
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { Select, Spinner, StatusMessage } from '@inkjs/ui';
|
|
2
|
-
import { execa } from 'execa';
|
|
3
|
-
import { existsSync } from 'fs';
|
|
4
|
-
import { Newline, Text } from 'ink';
|
|
5
|
-
import React, { useEffect, useState } from 'react';
|
|
6
|
-
function detectPackageManager() {
|
|
7
|
-
if (existsSync('package-lock.json')) {
|
|
8
|
-
return 'npm';
|
|
9
|
-
} else if (existsSync('yarn.lock')) {
|
|
10
|
-
return 'yarn';
|
|
11
|
-
} else if (existsSync('pnpm-lock.yaml')) {
|
|
12
|
-
return 'pnpm';
|
|
13
|
-
}
|
|
14
|
-
return undefined;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
*
|
|
19
|
-
* @param {string} sdk
|
|
20
|
-
* @param {string} packageManager
|
|
21
|
-
* @param {boolean} replacePackage
|
|
22
|
-
* @returns
|
|
23
|
-
*/
|
|
24
|
-
function upgradeCommand(sdk, packageManager, replacePackage = false) {
|
|
25
|
-
let packageName = `@clerk/${sdk}`;
|
|
26
|
-
if (replacePackage) {
|
|
27
|
-
packageName = packageName.replace('clerk-', '');
|
|
28
|
-
}
|
|
29
|
-
switch (packageManager) {
|
|
30
|
-
case 'yarn':
|
|
31
|
-
return `yarn add ${packageName}@latest`;
|
|
32
|
-
case 'pnpm':
|
|
33
|
-
return `pnpm add ${packageName}@latest`;
|
|
34
|
-
default:
|
|
35
|
-
return `npm install ${packageName}@latest`;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Component that runs an upgrade command for a given SDK and handles the result.
|
|
41
|
-
*
|
|
42
|
-
* @component
|
|
43
|
-
* @param {Object} props
|
|
44
|
-
* @param {Function} props.callback - The callback function to be called after the command execution.
|
|
45
|
-
* @param {string} props.sdk - The SDK for which the upgrade command is run.
|
|
46
|
-
* @param {boolean} props.replacePackage - Whether to replace legacy `clerk-` packages with their new versions.
|
|
47
|
-
* @returns {JSX.Element} The rendered component.
|
|
48
|
-
*
|
|
49
|
-
* @example
|
|
50
|
-
* <UpgradeCommand sdk="example-sdk" callback={handleUpgrade} />
|
|
51
|
-
*/
|
|
52
|
-
export function UpgradeSDK({
|
|
53
|
-
callback,
|
|
54
|
-
sdk,
|
|
55
|
-
replacePackage = false
|
|
56
|
-
}) {
|
|
57
|
-
const [command, setCommand] = useState();
|
|
58
|
-
const [error, setError] = useState();
|
|
59
|
-
const [packageManager, setPackageManager] = useState(detectPackageManager());
|
|
60
|
-
const [result, setResult] = useState();
|
|
61
|
-
useEffect(() => {
|
|
62
|
-
if (!packageManager) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
setCommand(previous => {
|
|
66
|
-
if (previous) {
|
|
67
|
-
return previous;
|
|
68
|
-
}
|
|
69
|
-
return upgradeCommand(sdk, packageManager, replacePackage);
|
|
70
|
-
});
|
|
71
|
-
if (!command) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
execa({
|
|
75
|
-
shell: true
|
|
76
|
-
})`${command}`.then(res => {
|
|
77
|
-
setResult(res);
|
|
78
|
-
}).catch(err => {
|
|
79
|
-
setError(err);
|
|
80
|
-
}).finally(() => {
|
|
81
|
-
callback(true);
|
|
82
|
-
});
|
|
83
|
-
}, [callback, command, packageManager, replacePackage, sdk]);
|
|
84
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, packageManager ? null : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Text, null, "We could not detect the package manager used in your project. Please select the package manager you are using"), /*#__PURE__*/React.createElement(Select, {
|
|
85
|
-
options: [{
|
|
86
|
-
label: 'npm',
|
|
87
|
-
value: 'npm'
|
|
88
|
-
}, {
|
|
89
|
-
label: 'pnpm',
|
|
90
|
-
value: 'pnpm'
|
|
91
|
-
}, {
|
|
92
|
-
label: 'yarn',
|
|
93
|
-
value: 'yarn'
|
|
94
|
-
}],
|
|
95
|
-
onChange: setPackageManager
|
|
96
|
-
})), packageManager && !result && !error && /*#__PURE__*/React.createElement(Spinner, {
|
|
97
|
-
label: `Running upgrade command: ${command}`
|
|
98
|
-
}), result && /*#__PURE__*/React.createElement(StatusMessage, {
|
|
99
|
-
variant: "success"
|
|
100
|
-
}, /*#__PURE__*/React.createElement(Text, {
|
|
101
|
-
bold: true
|
|
102
|
-
}, "@clerk/", sdk), " upgraded successfully to ", /*#__PURE__*/React.createElement(Text, {
|
|
103
|
-
bold: true
|
|
104
|
-
}, "latest!")), error && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(StatusMessage, {
|
|
105
|
-
variant: "error"
|
|
106
|
-
}, "Running the upgrade command failed:", ' ', /*#__PURE__*/React.createElement(Text, {
|
|
107
|
-
bold: true,
|
|
108
|
-
color: "red"
|
|
109
|
-
}, command)), /*#__PURE__*/React.createElement(StatusMessage, {
|
|
110
|
-
variant: "info"
|
|
111
|
-
}, "Please manually upgrade ", /*#__PURE__*/React.createElement(Text, {
|
|
112
|
-
bold: true
|
|
113
|
-
}, "@clerk/", sdk), " to ", /*#__PURE__*/React.createElement(Text, {
|
|
114
|
-
bold: true
|
|
115
|
-
}, "latest"), " in your project."), /*#__PURE__*/React.createElement(Newline, null)));
|
|
116
|
-
}
|