@clerk/upgrade 2.0.0-snapshot.v20251204175016 → 2.0.0-snapshot.v20251208202852

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.
Files changed (54) hide show
  1. package/dist/__tests__/fixtures/expo-old-package/package-lock.json +5 -0
  2. package/dist/__tests__/fixtures/expo-old-package/package.json +10 -0
  3. package/dist/__tests__/fixtures/expo-old-package/src/App.tsx +14 -0
  4. package/dist/__tests__/fixtures/nextjs-v6/package.json +9 -0
  5. package/dist/__tests__/fixtures/nextjs-v6/pnpm-lock.yaml +2 -0
  6. package/dist/__tests__/fixtures/nextjs-v6/src/app.tsx +17 -0
  7. package/dist/__tests__/fixtures/nextjs-v7/package.json +9 -0
  8. package/dist/__tests__/fixtures/nextjs-v7/pnpm-lock.yaml +2 -0
  9. package/dist/__tests__/fixtures/nextjs-v7/src/app.tsx +16 -0
  10. package/dist/__tests__/fixtures/no-clerk/package.json +7 -0
  11. package/dist/__tests__/fixtures/react-v6/package.json +8 -0
  12. package/dist/__tests__/fixtures/react-v6/src/App.tsx +19 -0
  13. package/dist/__tests__/fixtures/react-v6/yarn.lock +2 -0
  14. package/dist/__tests__/helpers/create-fixture.js +56 -0
  15. package/dist/__tests__/integration/cli.test.js +230 -0
  16. package/dist/__tests__/integration/config.test.js +76 -0
  17. package/dist/__tests__/integration/detect-sdk.test.js +100 -0
  18. package/dist/__tests__/integration/runner.test.js +79 -0
  19. package/dist/cli.js +159 -45
  20. package/dist/codemods/__tests__/__fixtures__/transform-align-experimental-unstable-prefixes.fixtures.js +68 -0
  21. package/dist/codemods/__tests__/__fixtures__/transform-appearance-layout-to-options.fixtures.js +9 -0
  22. package/dist/codemods/__tests__/__fixtures__/transform-clerk-react-v6.fixtures.js +13 -0
  23. package/dist/codemods/__tests__/__fixtures__/transform-remove-deprecated-appearance-props.fixtures.js +63 -0
  24. package/dist/codemods/__tests__/__fixtures__/transform-themes-to-ui-themes.fixtures.js +41 -0
  25. package/dist/codemods/__tests__/transform-align-experimental-unstable-prefixes.test.js +15 -0
  26. package/dist/codemods/__tests__/transform-appearance-layout-to-options.test.js +15 -0
  27. package/dist/codemods/__tests__/transform-remove-deprecated-appearance-props.test.js +15 -0
  28. package/dist/codemods/__tests__/transform-themes-to-ui-themes.test.js +15 -0
  29. package/dist/codemods/index.js +67 -13
  30. package/dist/codemods/transform-align-experimental-unstable-prefixes.cjs +400 -0
  31. package/dist/codemods/transform-appearance-layout-to-options.cjs +65 -0
  32. package/dist/codemods/transform-clerk-react-v6.cjs +15 -7
  33. package/dist/codemods/transform-remove-deprecated-appearance-props.cjs +109 -0
  34. package/dist/codemods/transform-remove-deprecated-props.cjs +11 -32
  35. package/dist/codemods/transform-themes-to-ui-themes.cjs +65 -0
  36. package/dist/config.js +122 -0
  37. package/dist/render.js +164 -0
  38. package/dist/runner.js +98 -0
  39. package/dist/util/detect-sdk.js +125 -0
  40. package/dist/util/package-manager.js +94 -0
  41. package/dist/versions/core-3/changes/clerk-expo-package-rename.md +23 -0
  42. package/dist/versions/core-3/changes/clerk-react-package-rename.md +23 -0
  43. package/dist/versions/core-3/index.js +40 -0
  44. package/package.json +2 -8
  45. package/dist/app.js +0 -177
  46. package/dist/components/Codemod.js +0 -149
  47. package/dist/components/Command.js +0 -56
  48. package/dist/components/Header.js +0 -11
  49. package/dist/components/SDKWorkflow.js +0 -278
  50. package/dist/components/Scan.js +0 -180
  51. package/dist/components/UpgradeSDK.js +0 -116
  52. package/dist/util/expandable-list.js +0 -173
  53. package/dist/util/get-clerk-version.js +0 -22
  54. package/dist/util/guess-framework.js +0 -69
@@ -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
- }
@@ -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
- }