From 04d02a6f4ebe7aa3c5c4147992a886a920894799 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 3 Jan 2024 15:13:13 -0500 Subject: [PATCH 001/159] feat(upgrade): Add initial spec of upgrade package --- .eslintignore | 1 + packages/upgrade/.editorconfig | 12 + packages/upgrade/.gitattributes | 1 + packages/upgrade/.gitignore | 2 + packages/upgrade/.prettierignore | 1 + packages/upgrade/README.md | 25 + packages/upgrade/package-lock.json | 6810 +++++++++++++++++ packages/upgrade/package.json | 61 + packages/upgrade/source/app.js | 214 + packages/upgrade/source/cli.js | 43 + packages/upgrade/source/constants/sdks.js | 17 + packages/upgrade/source/constants/versions.js | 4 + packages/upgrade/source/scan.js | 129 + .../upgrade/source/util/get-clerk-version.js | 8 + .../upgrade/source/util/guess-framework.js | 11 + packages/upgrade/source/util/load-change.js | 32 + .../upgrade/source/util/step-sequencer.js | 31 + .../v5/expo/clerkprovider-frontendapi.md | 17 + .../v5/fastify/api-url-value-change.md | 6 + .../v5/fastify/clerkplugin-frontendapi.md | 17 + .../v5/fastify/createclerkclient-apikey.md | 17 + .../fastify/createclerkclient-frontendapi.md | 17 + .../v5/gatsby/api-url-value-change.md | 6 + .../v5/gatsby/apikey-to-publishable-key.md | 6 + .../v5/gatsby/createclerkclient-apikey.md | 17 + .../gatsby/createclerkclient-frontendapi.md | 17 + .../v5/gatsby/withserverauth-return-type.md | 43 + packages/upgrade/source/versions/v5/index.js | 142 + .../v5/js/afterswitchorganizationurl.md | 15 + ...rganizationpreview-organizationswitcher.md | 8 + .../v5/js/experimental-canusecaptcha.md | 6 + .../v5/js/experimental-captchasitekey.md | 6 + .../versions/v5/js/experimental-captchaurl.md | 6 + .../v5/js/external-account-avatarurl.md | 7 + .../v5/js/getorganizationmemberships.md | 14 + .../js/lastorganizationinvitation-member.md | 6 + .../v5/js/organization-create-string.md | 15 + .../js/organization-getpendinginvitations.md | 14 + .../versions/v5/js/organization-logourl.md | 7 + .../source/versions/v5/js/redirecttohome.md | 13 + ...b3walletverification-generatedsignature.md | 20 + .../v5/js/unstable-invitationupdate.md | 6 + .../v5/js/unstable-membershipupdate.md | 6 + .../v5/js/useorganization-invitationlist.md | 25 + .../v5/js/useorganization-membershiplist.md | 24 + .../source/versions/v5/js/useorganizations.md | 26 + .../user-createexternalaccount-redirecturl.md | 7 + .../js/user-orgpublicdata-profileimageurl.md | 7 + .../versions/v5/js/user-update-password.md | 19 + .../source/versions/v5/js/userprofile-prop.md | 7 + .../versions/v5/next/api-url-value-change.md | 6 + .../v5/next/auth-middleware-deprecated.md | 10 + .../versions/v5/next/authmiddleware-apikey.md | 17 + .../v5/next/authmiddleware-frontendapi.md | 9 + .../v5/next/clerk-js-version-next-public.md | 8 + .../v5/next/createclerkclient-apikey.md | 17 + .../v5/next/createclerkclient-frontendapi.md | 17 + .../source/versions/v5/next/getauth-apikey.md | 9 + .../source/versions/v5/next/import-api-url.md | 6 + .../versions/v5/next/import-api-version.md | 6 + .../versions/v5/next/import-clerk-js-url.md | 6 + .../v5/next/import-clerk-js-version.md | 6 + .../source/versions/v5/next/import-domain.md | 6 + .../versions/v5/next/import-is-satellite.md | 6 + .../versions/v5/next/import-nextjs-api.md | 22 + .../v5/next/import-nextjs-app-beta.md | 10 + .../v5/next/import-nextjs-edge-middleware.md | 6 + .../import-nextjs-edge-middlewarefiles.md | 6 + .../versions/v5/next/import-nextjs-ssr.md | 7 + .../versions/v5/next/import-proxy-url.md | 6 + .../v5/next/import-publishable-key.md | 6 + .../versions/v5/next/import-secret-key.md | 6 + .../versions/v5/next/import-sign-in-url.md | 6 + .../versions/v5/next/import-sign-up-url.md | 6 + .../v5/next/with-clerk-middleware-removed.md | 10 + .../versions/v5/node/cjs-esm-instance.md | 16 + .../v5/node/clerkexpressrequireauth-apikey.md | 17 + .../clerkexpressrequireauth-frontendapi.md | 17 + .../v5/node/clerkexpresswithauth-apikey.md | 17 + .../node/clerkexpresswithauth-frontendapi.md | 17 + .../v5/node/createclerkclient-apikey.md | 17 + .../v5/node/createclerkclient-frontendapi.md | 17 + .../createclerkexpressrequireauth-apikey.md | 17 + ...eateclerkexpressrequireauth-frontendapi.md | 17 + .../node/createclerkexpresswithauth-apikey.md | 17 + .../createclerkexpresswithauth-frontendapi.md | 17 + .../source/versions/v5/node/package-rename.md | 6 + .../source/versions/v5/node/setclerkapikey.md | 17 + .../versions/v5/node/setclerkapiversion.md | 17 + .../versions/v5/node/setclerkhttpoptions.md | 17 + .../versions/v5/node/setclerkserverapiurl.md | 20 + .../navigate-to-routerpush-routerreplace.md | 19 + .../v5/shared/api-key-to-secret-key.md | 6 + .../v5/shared/clerkprovider-frontendapi.md | 7 + .../shared/frontend-api-to-publishable-key.md | 6 + .../v5/shared/handlemagiclinkverification.md | 7 + .../versions/v5/shared/ismagiclinkerror.md | 7 + .../versions/v5/shared/magiclinkerror.md | 7 + .../versions/v5/shared/magiclinkerrorcode.md | 7 + .../source/versions/v5/shared/setsession.md | 27 + .../source/versions/v5/shared/usemagiclink.md | 7 + packages/upgrade/test.js | 17 + 102 files changed, 8571 insertions(+) create mode 100644 packages/upgrade/.editorconfig create mode 100644 packages/upgrade/.gitattributes create mode 100644 packages/upgrade/.gitignore create mode 100644 packages/upgrade/.prettierignore create mode 100644 packages/upgrade/README.md create mode 100644 packages/upgrade/package-lock.json create mode 100644 packages/upgrade/package.json create mode 100644 packages/upgrade/source/app.js create mode 100644 packages/upgrade/source/cli.js create mode 100644 packages/upgrade/source/constants/sdks.js create mode 100644 packages/upgrade/source/constants/versions.js create mode 100644 packages/upgrade/source/scan.js create mode 100644 packages/upgrade/source/util/get-clerk-version.js create mode 100644 packages/upgrade/source/util/guess-framework.js create mode 100644 packages/upgrade/source/util/load-change.js create mode 100644 packages/upgrade/source/util/step-sequencer.js create mode 100644 packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/fastify/api-url-value-change.md create mode 100644 packages/upgrade/source/versions/v5/fastify/clerkplugin-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/fastify/createclerkclient-apikey.md create mode 100644 packages/upgrade/source/versions/v5/fastify/createclerkclient-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/gatsby/api-url-value-change.md create mode 100644 packages/upgrade/source/versions/v5/gatsby/apikey-to-publishable-key.md create mode 100644 packages/upgrade/source/versions/v5/gatsby/createclerkclient-apikey.md create mode 100644 packages/upgrade/source/versions/v5/gatsby/createclerkclient-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/gatsby/withserverauth-return-type.md create mode 100644 packages/upgrade/source/versions/v5/index.js create mode 100644 packages/upgrade/source/versions/v5/js/afterswitchorganizationurl.md create mode 100644 packages/upgrade/source/versions/v5/js/appearance-organizationpreview-organizationswitcher.md create mode 100644 packages/upgrade/source/versions/v5/js/experimental-canusecaptcha.md create mode 100644 packages/upgrade/source/versions/v5/js/experimental-captchasitekey.md create mode 100644 packages/upgrade/source/versions/v5/js/experimental-captchaurl.md create mode 100644 packages/upgrade/source/versions/v5/js/external-account-avatarurl.md create mode 100644 packages/upgrade/source/versions/v5/js/getorganizationmemberships.md create mode 100644 packages/upgrade/source/versions/v5/js/lastorganizationinvitation-member.md create mode 100644 packages/upgrade/source/versions/v5/js/organization-create-string.md create mode 100644 packages/upgrade/source/versions/v5/js/organization-getpendinginvitations.md create mode 100644 packages/upgrade/source/versions/v5/js/organization-logourl.md create mode 100644 packages/upgrade/source/versions/v5/js/redirecttohome.md create mode 100644 packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md create mode 100644 packages/upgrade/source/versions/v5/js/unstable-invitationupdate.md create mode 100644 packages/upgrade/source/versions/v5/js/unstable-membershipupdate.md create mode 100644 packages/upgrade/source/versions/v5/js/useorganization-invitationlist.md create mode 100644 packages/upgrade/source/versions/v5/js/useorganization-membershiplist.md create mode 100644 packages/upgrade/source/versions/v5/js/useorganizations.md create mode 100644 packages/upgrade/source/versions/v5/js/user-createexternalaccount-redirecturl.md create mode 100644 packages/upgrade/source/versions/v5/js/user-orgpublicdata-profileimageurl.md create mode 100644 packages/upgrade/source/versions/v5/js/user-update-password.md create mode 100644 packages/upgrade/source/versions/v5/js/userprofile-prop.md create mode 100644 packages/upgrade/source/versions/v5/next/api-url-value-change.md create mode 100644 packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md create mode 100644 packages/upgrade/source/versions/v5/next/authmiddleware-apikey.md create mode 100644 packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/next/clerk-js-version-next-public.md create mode 100644 packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md create mode 100644 packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/next/getauth-apikey.md create mode 100644 packages/upgrade/source/versions/v5/next/import-api-url.md create mode 100644 packages/upgrade/source/versions/v5/next/import-api-version.md create mode 100644 packages/upgrade/source/versions/v5/next/import-clerk-js-url.md create mode 100644 packages/upgrade/source/versions/v5/next/import-clerk-js-version.md create mode 100644 packages/upgrade/source/versions/v5/next/import-domain.md create mode 100644 packages/upgrade/source/versions/v5/next/import-is-satellite.md create mode 100644 packages/upgrade/source/versions/v5/next/import-nextjs-api.md create mode 100644 packages/upgrade/source/versions/v5/next/import-nextjs-app-beta.md create mode 100644 packages/upgrade/source/versions/v5/next/import-nextjs-edge-middleware.md create mode 100644 packages/upgrade/source/versions/v5/next/import-nextjs-edge-middlewarefiles.md create mode 100644 packages/upgrade/source/versions/v5/next/import-nextjs-ssr.md create mode 100644 packages/upgrade/source/versions/v5/next/import-proxy-url.md create mode 100644 packages/upgrade/source/versions/v5/next/import-publishable-key.md create mode 100644 packages/upgrade/source/versions/v5/next/import-secret-key.md create mode 100644 packages/upgrade/source/versions/v5/next/import-sign-in-url.md create mode 100644 packages/upgrade/source/versions/v5/next/import-sign-up-url.md create mode 100644 packages/upgrade/source/versions/v5/next/with-clerk-middleware-removed.md create mode 100644 packages/upgrade/source/versions/v5/node/cjs-esm-instance.md create mode 100644 packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-apikey.md create mode 100644 packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/node/clerkexpresswithauth-apikey.md create mode 100644 packages/upgrade/source/versions/v5/node/clerkexpresswithauth-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/node/createclerkclient-apikey.md create mode 100644 packages/upgrade/source/versions/v5/node/createclerkclient-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-apikey.md create mode 100644 packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-apikey.md create mode 100644 packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/node/package-rename.md create mode 100644 packages/upgrade/source/versions/v5/node/setclerkapikey.md create mode 100644 packages/upgrade/source/versions/v5/node/setclerkapiversion.md create mode 100644 packages/upgrade/source/versions/v5/node/setclerkhttpoptions.md create mode 100644 packages/upgrade/source/versions/v5/node/setclerkserverapiurl.md create mode 100644 packages/upgrade/source/versions/v5/react/navigate-to-routerpush-routerreplace.md create mode 100644 packages/upgrade/source/versions/v5/shared/api-key-to-secret-key.md create mode 100644 packages/upgrade/source/versions/v5/shared/clerkprovider-frontendapi.md create mode 100644 packages/upgrade/source/versions/v5/shared/frontend-api-to-publishable-key.md create mode 100644 packages/upgrade/source/versions/v5/shared/handlemagiclinkverification.md create mode 100644 packages/upgrade/source/versions/v5/shared/ismagiclinkerror.md create mode 100644 packages/upgrade/source/versions/v5/shared/magiclinkerror.md create mode 100644 packages/upgrade/source/versions/v5/shared/magiclinkerrorcode.md create mode 100644 packages/upgrade/source/versions/v5/shared/setsession.md create mode 100644 packages/upgrade/source/versions/v5/shared/usemagiclink.md create mode 100644 packages/upgrade/test.js diff --git a/.eslintignore b/.eslintignore index 6276b094853..35f35d63cc9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,6 +2,7 @@ **/node_modules/** packages/*/dist/** packages/eslint-config-custom/** +packages/upgrade **/dist/* **/build/* **/.turbo/* diff --git a/packages/upgrade/.editorconfig b/packages/upgrade/.editorconfig new file mode 100644 index 00000000000..1c6314a3183 --- /dev/null +++ b/packages/upgrade/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = tab +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.yml] +indent_style = space +indent_size = 2 diff --git a/packages/upgrade/.gitattributes b/packages/upgrade/.gitattributes new file mode 100644 index 00000000000..6313b56c578 --- /dev/null +++ b/packages/upgrade/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/packages/upgrade/.gitignore b/packages/upgrade/.gitignore new file mode 100644 index 00000000000..76add878f8d --- /dev/null +++ b/packages/upgrade/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/packages/upgrade/.prettierignore b/packages/upgrade/.prettierignore new file mode 100644 index 00000000000..1521c8b7652 --- /dev/null +++ b/packages/upgrade/.prettierignore @@ -0,0 +1 @@ +dist diff --git a/packages/upgrade/README.md b/packages/upgrade/README.md new file mode 100644 index 00000000000..da2dcb2c747 --- /dev/null +++ b/packages/upgrade/README.md @@ -0,0 +1,25 @@ +# @clerk/upgrade + +A tool that helps with upgrading major versions of Clerk's SDKs. + +## Usage + +```bash +$ npx @clerk/upgrade +``` + +## Caveats + +This tool uses regular expressions to scan for patterns that match breaking changes. This makes it run substantially faster and makes it more accessible for us at Clerk to author matchers for each breaking change, however it means that _we cannot gurarantee 100% accuracy of the results_. As such, it's important to treat this as a tool that can help you to complete your major version upgrades, rather than an automatic fix to all issues. + +The main thing that this tool will miss is cases where _unusual import patterns_ are used in your codebase.As an example, if we made a breaking change to the `getAuth` function exported from `@clerk/nextjs`, we would likely look for something like `import { getAuth } from "@clerk/nextjs"` in order to detect whether you need to make some changes. If you were running your imports like `import * as ClerkNext from "@clerk/nextjs"`, you could use `getAuth` without us detecting it with our matcher. + +It will also be very likely to miss if you bind a method on an object to a separate variable and call it from there, or pass a bound method through a function param. For example, something like this: + +```js +const updateUser = user.update.bind(user); + +updateUser({ username: 'foo' }); +``` + +Overall, there's a very good chance that this tool catches everything, but it's not a guarantee, so make sure that you also test your app before deploying, and that you have good e2e test coverage, which are good practices normally anyway, rather than blindly trusting that since the clerk upgrade tool was run, you are for sure covered. diff --git a/packages/upgrade/package-lock.json b/packages/upgrade/package-lock.json new file mode 100644 index 00000000000..4373569ce75 --- /dev/null +++ b/packages/upgrade/package-lock.json @@ -0,0 +1,6810 @@ +{ + "name": "clerk-upgrade", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "clerk-upgrade", + "version": "0.0.0", + "license": "MIT", + "dependencies": { + "@inkjs/ui": "^1.0.0", + "globby": "^14.0.0", + "gray-matter": "^4.0.3", + "index-to-position": "^0.1.2", + "ink": "^4.1.0", + "ink-confirm-input": "^2.0.0", + "ink-link": "^3.0.0", + "ink-markdown": "^1.0.4", + "ink-select-input": "^5.0.0", + "ink-spinner": "^5.0.0", + "ink-text-input": "^5.0.1", + "meow": "^11.0.0", + "react": "^18.2.0", + "read-pkg": "^9.0.1", + "semver-regex": "^4.0.5" + }, + "bin": { + "clerk-upgrade": "dist/cli.js" + }, + "devDependencies": { + "@babel/cli": "^7.21.0", + "@babel/preset-react": "^7.18.6", + "@vdemedes/prettier-config": "^2.0.1", + "ava": "^5.2.0", + "chalk": "^5.2.0", + "eslint-config-xo-react": "^0.27.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "import-jsx": "^5.0.0", + "ink-testing-library": "^3.0.0", + "prettier": "^2.8.7" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alcalzone/ansi-tokenize": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz", + "integrity": "sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=14.13.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/cli": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", + "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "commander": "^4.0.1", + "convert-source-map": "^2.0.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true, + "peer": true + }, + "node_modules/@inkjs/ui": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@inkjs/ui/-/ui-1.0.0.tgz", + "integrity": "sha512-JAVX5ntXG3QokXsGelobIc1ORkTQiJU4XiemUoMUzVaZkBpwzOD7NkMm0qzKvysDyrE1nD6keFHRhwsRvhVamw==", + "dependencies": { + "chalk": "^5.2.0", + "cli-spinners": "^2.9.0", + "deepmerge": "^4.3.1", + "figures": "^5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "ink": "^4.2.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", + "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/marked-terminal": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/marked-terminal/-/marked-terminal-3.1.7.tgz", + "integrity": "sha512-bKbVK9E6ADmxDsSQAQmEA9NToAfsCTC7TeCiZ5Nl1BCi/IbJqlzSfRTdYrq0PxWL3Lb+dxhWVbHwF9l48neOsA==", + "dependencies": { + "chalk": "^2.4.1", + "marked": "^6.0.0" + } + }, + "node_modules/@types/marked-terminal/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/marked-terminal/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/marked-terminal/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@types/marked-terminal/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/marked-terminal/node_modules/marked": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-6.0.0.tgz", + "integrity": "sha512-7E3m/xIlymrFL5gWswIT4CheIE3fDeh51NV09M4x8iOc7NDYlyERcQMLAIHcSlrvwliwbPQ4OGD+MpPSYiQcqw==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/@types/marked-terminal/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "peer": true + }, + "node_modules/@vdemedes/prettier-config": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vdemedes/prettier-config/-/prettier-config-2.0.1.tgz", + "integrity": "sha512-lcHyyLfS2ro282qsXKpxw+canUkOlFIGoanxt3BaNCm5K1NR8k4hGvYbFO54/+QWq12d0y/EYRz68yNQkqWFrw==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "dependencies": { + "type-fest": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/arr-rotate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/arr-rotate/-/arr-rotate-1.0.0.tgz", + "integrity": "sha512-yOzOZcR9Tn7enTF66bqKorGGH0F36vcPaSWg8fO0c0UYb3LX3VMXj5ZxEqQLNOecAhlRJ7wYZja5i4jTlnbIfQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrgv": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", + "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ava": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ava/-/ava-5.3.1.tgz", + "integrity": "sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2", + "acorn-walk": "^8.2.0", + "ansi-styles": "^6.2.1", + "arrgv": "^1.0.2", + "arrify": "^3.0.0", + "callsites": "^4.0.0", + "cbor": "^8.1.0", + "chalk": "^5.2.0", + "chokidar": "^3.5.3", + "chunkd": "^2.0.1", + "ci-info": "^3.8.0", + "ci-parallel-vars": "^1.0.1", + "clean-yaml-object": "^0.1.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.4", + "currently-unhandled": "^0.4.1", + "debug": "^4.3.4", + "emittery": "^1.0.1", + "figures": "^5.0.0", + "globby": "^13.1.4", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", + "is-error": "^2.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "matcher": "^5.0.0", + "mem": "^9.0.2", + "ms": "^2.1.3", + "p-event": "^5.0.1", + "p-map": "^5.5.0", + "picomatch": "^2.3.1", + "pkg-conf": "^4.0.0", + "plur": "^5.1.0", + "pretty-ms": "^8.0.0", + "resolve-cwd": "^3.0.0", + "stack-utils": "^2.0.6", + "strip-ansi": "^7.0.1", + "supertap": "^3.0.1", + "temp-dir": "^3.0.0", + "write-file-atomic": "^5.0.1", + "yargs": "^17.7.2" + }, + "bin": { + "ava": "entrypoints/cli.mjs" + }, + "engines": { + "node": ">=14.19 <15 || >=16.15 <17 || >=18" + }, + "peerDependencies": { + "@ava/typescript": "*" + }, + "peerDependenciesMeta": { + "@ava/typescript": { + "optional": true + } + } + }, + "node_modules/ava/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ava/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.1.0.tgz", + "integrity": "sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz", + "integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==", + "dependencies": { + "camelcase": "^7.0.0", + "map-obj": "^4.3.0", + "quick-lru": "^6.1.1", + "type-fest": "^2.13.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", + "dependencies": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + }, + "bin": { + "cdl": "bin/cdl.js" + } + }, + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chunkd": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", + "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", + "dev": true + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/ci-parallel-vars": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", + "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clean-stack/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "dependencies": { + "convert-to-spaces": "^2.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concordance": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", + "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", + "dev": true, + "dependencies": { + "date-time": "^3.1.0", + "esutils": "^2.0.3", + "fast-diff": "^1.2.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.17.15", + "md5-hex": "^3.0.1", + "semver": "^7.3.2", + "well-known-symbols": "^2.0.0" + }, + "engines": { + "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" + } + }, + "node_modules/concordance/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/concordance/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/concordance/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "dev": true, + "dependencies": { + "time-zone": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "peer": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.613", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.613.tgz", + "integrity": "sha512-r4x5+FowKG6q+/Wj0W9nidx7QO31BJwmR2uEo+Qh3YLGQ8SbBAFuDFpTxzly/I2gsbrFwBuIjrMp423L3O5U3w==", + "dev": true + }, + "node_modules/emittery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.0.1.tgz", + "integrity": "sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-xo-react": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo-react/-/eslint-config-xo-react-0.27.0.tgz", + "integrity": "sha512-wiV215xQIn71XZyyVfaOXHaFpR1B14IJttwOjMi/eqUK1s+ojJdHr7eHqTLaGUfh6FKgWha1QNwePlIXx7mBUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "eslint": ">=8.6.0", + "eslint-plugin-react": ">=7.29.0", + "eslint-plugin-react-hooks": ">=4.3.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "peer": true + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "peer": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "peer": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "peer": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true, + "peer": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", + "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", + "dependencies": { + "@sindresorhus/merge-streams": "^1.0.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "peer": true + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", + "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", + "dev": true, + "engines": { + "node": ">=10 <11 || >=12 <13 || >=14" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-jsx": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/import-jsx/-/import-jsx-5.0.0.tgz", + "integrity": "sha512-IovW6KNUJDAJCuzvG8Y3+srknbwgdLMCScqKe51Z0lrHogDu+Zw4g2wJQeV1KMLDwB4S6EGEXCFphconrrY4qg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.0", + "@babel/preset-react": "^7.18.6", + "find-cache-dir": "^4.0.0", + "make-dir": "^3.1.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/import-jsx/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/index-to-position": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", + "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ink": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/ink/-/ink-4.4.1.tgz", + "integrity": "sha512-rXckvqPBB0Krifk5rn/5LvQGmyXwCUpBfmTwbkQNBY9JY8RSl3b8OftBNEYxg4+SWUhEKcPifgope28uL9inlA==", + "dependencies": { + "@alcalzone/ansi-tokenize": "^0.1.3", + "ansi-escapes": "^6.0.0", + "auto-bind": "^5.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "cli-cursor": "^4.0.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", + "indent-string": "^5.0.0", + "is-ci": "^3.0.1", + "is-lower-case": "^2.0.2", + "is-upper-case": "^2.0.2", + "lodash": "^4.17.21", + "patch-console": "^2.0.0", + "react-reconciler": "^0.29.0", + "scheduler": "^0.23.0", + "signal-exit": "^3.0.7", + "slice-ansi": "^6.0.0", + "stack-utils": "^2.0.6", + "string-width": "^5.1.2", + "type-fest": "^0.12.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0", + "ws": "^8.12.0", + "yoga-wasm-web": "~0.3.3" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "react": ">=18.0.0", + "react-devtools-core": "^4.19.1" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-devtools-core": { + "optional": true + } + } + }, + "node_modules/ink-confirm-input": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ink-confirm-input/-/ink-confirm-input-2.0.0.tgz", + "integrity": "sha512-YCd7a9XW0DIIbOhF3XiLo3WF86mOart9qI1qN56wT5IDJxU+j8BanEZh5/QXoazyIPSv1iXlHPIlRB5cbZIMIA==", + "dependencies": { + "ink-text-input": "^3.2.1", + "prop-types": "^15.5.10", + "yn": "^3.1.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ink": ">=2", + "react": ">=16" + } + }, + "node_modules/ink-confirm-input/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ink-confirm-input/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ink-confirm-input/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ink-confirm-input/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/ink-confirm-input/node_modules/ink-text-input": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ink-text-input/-/ink-text-input-3.3.0.tgz", + "integrity": "sha512-gO4wrOf2ie3YuEARTIwGlw37lMjFn3Gk6CKIDrMlHb46WFMagZU7DplohjM24zynlqfnXA5UDEIfC2NBcvD8kg==", + "dependencies": { + "chalk": "^3.0.0", + "prop-types": "^15.5.10" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "ink": "^2.0.0", + "react": "^16.5.2" + } + }, + "node_modules/ink-link": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ink-link/-/ink-link-3.0.0.tgz", + "integrity": "sha512-S8jbyJQhYluCYn+O2dZ9I+Ts0OfpuXmRVJ3qNU+L4XCQEE2k4Vb0dO1Wu/QsArEXabQK7Q/DLtZ1ozLVBNGypQ==", + "dependencies": { + "prop-types": "^15.8.1", + "terminal-link": "^3.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "ink": ">=4" + } + }, + "node_modules/ink-markdown": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ink-markdown/-/ink-markdown-1.0.4.tgz", + "integrity": "sha512-MZ0o5wSCp9bTSZkSGAvBE3zd8U6r45z3V5YqNwOXjwaGxS5Mjxz+xHh4HDqtgo+q+aRHqXESpyku946AGVWm0A==", + "dependencies": { + "@types/marked-terminal": "^3.1.4", + "marked": "^9.0.3", + "marked-terminal": "^6.0.0" + }, + "peerDependencies": { + "ink": ">=2.0.0", + "react": ">=16.8.0" + } + }, + "node_modules/ink-select-input": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ink-select-input/-/ink-select-input-5.0.0.tgz", + "integrity": "sha512-VkLEogN3KTgAc0W/u9xK3+44x8JyKfmBvPQyvniJ/Hj0ftg9vWa/YecvZirevNv2SAvgoA2GIlTLCQouzgPKDg==", + "dependencies": { + "arr-rotate": "^1.0.0", + "figures": "^5.0.0", + "lodash.isequal": "^4.5.0" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "ink": "^4.0.0", + "react": "^18.0.0" + } + }, + "node_modules/ink-spinner": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-5.0.0.tgz", + "integrity": "sha512-EYEasbEjkqLGyPOUc8hBJZNuC5GvXGMLu0w5gdTNskPc7Izc5vO3tdQEYnzvshucyGCBXc86ig0ujXPMWaQCdA==", + "dependencies": { + "cli-spinners": "^2.7.0" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "ink": ">=4.0.0", + "react": ">=18.0.0" + } + }, + "node_modules/ink-testing-library": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ink-testing-library/-/ink-testing-library-3.0.0.tgz", + "integrity": "sha512-ItyyoOmcm6yftb7c5mZI2HU22BWzue8PBbO3DStmY8B9xaqfKr7QJONiWOXcwVsOk/6HuVQ0v7N5xhPaR3jycA==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "@types/react": ">=18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/ink-text-input": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ink-text-input/-/ink-text-input-5.0.1.tgz", + "integrity": "sha512-crnsYJalG4EhneOFnr/q+Kzw1RgmXI2KsBaLFE6mpiIKxAtJLUnvygOF2IUKO8z4nwkSkveGRBMd81RoYdRSag==", + "dependencies": { + "chalk": "^5.2.0", + "type-fest": "^3.6.1" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "ink": "^4.0.0", + "react": "^18.0.0" + } + }, + "node_modules/ink-text-input/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ink/node_modules/slice-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-6.0.0.tgz", + "integrity": "sha512-6bn4hRfkTvDfUoEQYkERg0BVF1D0vrX9HEkMl08uDiNWvVvjylLHvZFZWkDo6wjT8tUctbYl1nCOuE66ZTaUtA==", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/irregular-plurals": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", + "dev": true + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", + "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", + "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "peer": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "peer": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "peer": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "peer": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/marked-terminal": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.2.0.tgz", + "integrity": "sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==", + "dependencies": { + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.3.0", + "cli-table3": "^0.6.3", + "node-emoji": "^2.1.3", + "supports-hyperlinks": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <12" + } + }, + "node_modules/marked-terminal/node_modules/supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/matcher": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/matcher/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/md5-hex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "dev": true, + "dependencies": { + "blueimp-md5": "^2.10.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mem": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sindresorhus/mem?sponsor=1" + } + }, + "node_modules/meow": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-11.0.0.tgz", + "integrity": "sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==", + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^8.0.2", + "decamelize": "^6.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^4.0.1", + "read-pkg-up": "^9.1.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^3.1.0", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "peer": true + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/normalize-package-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "dependencies": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "peer": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "dev": true, + "dependencies": { + "p-timeout": "^5.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-console": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", + "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", + "dev": true, + "dependencies": { + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-conf/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/plur": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", + "dev": true, + "dependencies": { + "irregular-plurals": "^3.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-ms": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", + "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", + "dev": true, + "dependencies": { + "parse-ms": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz", + "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-reconciler": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.0.tgz", + "integrity": "sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg-up/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/read-pkg-up/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", + "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "index-to-position": "^0.1.2", + "type-fest": "^4.7.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", + "dependencies": { + "esprima": "~4.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "peer": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supertap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", + "serialize-error": "^7.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/supertap/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/supertap/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/terminal-link": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-3.0.0.tgz", + "integrity": "sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==", + "dependencies": { + "ansi-escapes": "^5.0.0", + "supports-hyperlinks": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "peer": true + }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", + "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/well-known-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", + "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ws": { + "version": "8.15.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.1.tgz", + "integrity": "sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoga-wasm-web": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz", + "integrity": "sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==" + } + } +} diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json new file mode 100644 index 00000000000..fc7790ffae6 --- /dev/null +++ b/packages/upgrade/package.json @@ -0,0 +1,61 @@ +{ + "name": "@clerk/upgrade", + "version": "0.0.0", + "license": "MIT", + "bin": "dist/cli.js", + "type": "module", + "engines": { + "node": ">=16" + }, + "scripts": { + "build": "babel --out-dir=dist source --copy-files", + "dev": "babel --out-dir=dist --watch source --copy-files", + "test": "prettier --check . && xo && ava" + }, + "files": [ + "dist" + ], + "dependencies": { + "@inkjs/ui": "^1.0.0", + "globby": "^14.0.0", + "gray-matter": "^4.0.3", + "index-to-position": "^0.1.2", + "ink": "^4.4.1", + "ink-confirm-input": "^2.0.0", + "ink-link": "^3.0.0", + "ink-markdown": "^1.0.4", + "ink-select-input": "^5.0.0", + "ink-spinner": "^5.0.0", + "ink-text-input": "^5.0.1", + "meow": "^11.0.0", + "react": "^18.2.0", + "read-pkg": "^9.0.1", + "semver-regex": "^4.0.5" + }, + "devDependencies": { + "@babel/cli": "^7.21.0", + "@babel/preset-react": "^7.18.6", + "@vdemedes/prettier-config": "^2.0.1", + "ava": "^5.2.0", + "chalk": "^5.2.0", + "eslint-config-xo-react": "^0.27.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "import-jsx": "^5.0.0", + "ink-testing-library": "^3.0.0", + "prettier": "^2.8.7" + }, + "ava": { + "environmentVariables": { + "NODE_NO_WARNINGS": "1" + }, + "nodeArguments": [ + "--loader=import-jsx" + ] + }, + "babel": { + "presets": [ + "@babel/preset-react" + ] + } +} diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js new file mode 100644 index 00000000000..181a4d7b7fa --- /dev/null +++ b/packages/upgrade/source/app.js @@ -0,0 +1,214 @@ +import React, { useState } from 'react'; +import { Text, Newline } from 'ink'; +import { Select, MultiSelect, TextInput } from '@inkjs/ui'; +import SDKS from './constants/sdks.js'; +import VERSIONS from './constants/versions.js'; +import Scan from './scan.js'; +import guessFrameworks from './util/guess-framework.js'; +import getClerkMajorVersion from './util/get-clerk-version.js'; + +export default function App({ _fromVersion, _toVersion, _sdk, _dir = '', _ignore = '' }) { + const [sdks, setSdks] = useState(_sdk ? [_sdk] : []); + const [sdkGuessAttempted, setSdkGuessAttempted] = useState(false); + const [fromVersion, setFromVersion] = useState(_fromVersion); + const [fromVersionGuessAttempted, fromVersionSdkGuessAttempted] = useState(false); + const [toVersion, setToVersion] = useState(_toVersion); + const [dir, setDir] = useState(_dir); + const [ignore, setIgnore] = useState(_ignore); + const [configComplete, setConfigComplete] = useState(false); + const [configVerified, setConfigVerified] = useState(false); + let sdkGuesses = []; + let fromVersionGuess = false; + + // We try to guess which SDK they are using + if (isEmpty(sdks) && isEmpty(sdkGuesses) && !sdkGuessAttempted) { + sdkGuesses = guessFrameworks(); + setSdkGuessAttempted(true); + } + + // We try to guess which version of Clerk they are using + if (!fromVersion && !fromVersionGuess && !fromVersionGuessAttempted) { + fromVersionGuess = getClerkMajorVersion(); + setFromVersionGuessAttempted(true); + } + + // No support for v3 or below, sadly + if (parseInt(fromVersion) < 4) { + return We're so sorry, but this tool only supports migration from version 4 and above.; + } + + // If they are trying to/from the same version, that's an error + if (parseInt(fromVersion) === parseInt(toVersion)) { + return You are already on version {toVersion}, so there's no need to migrate!; + } + + return ( + <> + {/* Welcome to the upgrade script! */} + {!configComplete && ( + <> + + Hello friend! We're excited to help you upgrade Clerk + {fromVersion ? ` from v${fromVersion}` : ''} + {toVersion ? ` to v${toVersion}` : ''}. Before we get started, a couple questions... + + + + )} + + {/* Verify our guess at what their SDK is, if we have one */} + {isEmpty(sdks) && !isEmpty(sdkGuesses) && !sdkGuessAttempted && ( + <> + It looks like you are using {sdkGuesses.toString()}. Is that right? + { + setFromVersionGuessAttempted(true); + // if true, we were right so we set the fromVersion + if (item.value) setFromVersion(item.value); + }} + /> + + )} */} + {/* If we tried to guess and failed, user must manually select */} + {/* {fromVersionGuessAttempted && !fromVersion && ( + <> + + Please select which major version of the Clerk {sdk} SDK you are + currently using: + + setToVersion(item.value)} + /> + + )} */} + {!isEmpty(sdks) > 0 && fromVersion && toVersion && !dir && ( + <> + Where would you like for us to scan for files in your project? + (globstar syntax supported) + setDir(val)} + /> + + )} + {!isEmpty(sdks) && fromVersion && toVersion && dir && !ignore && ( + <> + + Are there any files or directories you'd like to ignore? If so, you can add them below, separated by commas. + We ignore "node_modules" and ".git" by default. + + (globstar syntax supported) + { + setIgnore(val.split(',')); + setConfigComplete(true); + }} + /> + + )} + {configComplete && !configVerified && ( + <> + Ok, here's our configuration: + + + Clerk {sdks.length > 1 ? 'SDKs' : 'SDK'} used: + {sdks.toString()} + + + Migrating from + v{fromVersion} + to + v{toVersion} + + + Looking in the directory + {dir} + and ignoring + {ignore.join(', ')} + + + Does this look right? + { setSdkGuessAttempted(true); // if true, we were right so we set the sdk - if (item.value) setSdk(sdkGuesses); + if (item === 'yes') setSdks(sdkGuesses.map(guess => guess.value)); }} /> diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index 656359ee3c6..eff08bf0b1b 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -60,8 +60,6 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { useEffect(() => { if (!matchers || !files) return; - console.log(files); - Promise.all( // first we read all the files files.map(async file => { diff --git a/packages/upgrade/source/util/guess-framework.js b/packages/upgrade/source/util/guess-framework.js index ec8491672e1..fde7c09fd9d 100644 --- a/packages/upgrade/source/util/guess-framework.js +++ b/packages/upgrade/source/util/guess-framework.js @@ -1,12 +1,13 @@ import { readPackageSync } from 'read-pkg'; import SDKS from '../constants/sdks.js'; -export default function guessFrameworks() { - const pkg = readPackageSync(); +export default function guessFrameworks(dir) { + const pkg = readPackageSync({ cwd: dir }); if (!pkg.dependencies) return []; // no guessing if there are no deps const deps = Object.keys(pkg.dependencies); - return SDKS.filter((pkgName, value) => { - if (deps.includes(pkgName)) return value; - }); + return SDKS.reduce((m, { label, value }) => { + if (deps.includes(label)) m.push({ label, value }); + return m; + }, []); } diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index ab7cf5ffcfa..4c49af36cc4 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -145,6 +145,9 @@ export default { 'useorganizationlist-organizationlist', // shared outside this pkg? ]), chromeExtension: load('chromeExtension', ['clerkprovider-tokencache']), + localization: [], + types: [], + backend: [], // backend: load('backend', [ // 'createclerkclient-frontendapi', // 'clerk-import', From 1a0b30adbb806b00542bb6f05ddee940e35617c3 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Mon, 8 Jan 2024 14:07:56 -0500 Subject: [PATCH 010/159] fix(upgrade): Fix incomplete getRequestUrl matcher, react keys warning --- packages/upgrade/source/scan.js | 1 + packages/upgrade/source/versions/v5/shared/buildrequesturl.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index eff08bf0b1b..75cbcfeae00 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -118,6 +118,7 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { flexDirection='column' paddingX={2} paddingY={1} + key={result.position} > {result.title} diff --git a/packages/upgrade/source/versions/v5/shared/buildrequesturl.md b/packages/upgrade/source/versions/v5/shared/buildrequesturl.md index 58b8cdf43db..5dd826c4e73 100644 --- a/packages/upgrade/source/versions/v5/shared/buildrequesturl.md +++ b/packages/upgrade/source/versions/v5/shared/buildrequesturl.md @@ -1,6 +1,6 @@ --- title: '`getRequestUrl` -> `buildRequestUrl` from `@clerk/backend`' -matcher: +matcher: "getRequestUrl\\(" --- ```js From 9c4a1c904334b99e67a02a9fecc8bae91c4f785d Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Mon, 8 Jan 2024 14:19:28 -0500 Subject: [PATCH 011/159] fix(upgrade): Fix ignore value rendering in recap --- packages/upgrade/source/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index b83b4152f36..0724a95a0fa 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -7,7 +7,7 @@ import Scan from './scan.js'; import guessFrameworks from './util/guess-framework.js'; import getClerkMajorVersion from './util/get-clerk-version.js'; -export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ignore = '' }) { +export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ignore = [] }) { const [sdks, setSdks] = useState(_sdk ? [_sdk] : []); const [sdkGuessAttempted, setSdkGuessAttempted] = useState(false); const [fromVersion, setFromVersion] = useState(_fromVersion); @@ -157,7 +157,7 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign /> )} - {!isEmpty(sdks) && fromVersion && toVersion && dir && !ignore && ( + {!isEmpty(sdks) && fromVersion && toVersion && dir && isEmpty(ignore) && !configComplete && ( <> Are there any files or directories you'd like to ignore? If so, you can add them below, separated by commas. @@ -168,7 +168,7 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign placeholder='docs/**, images/**' defaultValue={ignore} onSubmit={val => { - setIgnore(val.split(',')); + setIgnore(val); setConfigComplete(true); }} /> From bd091a35aaa636f069ef62534588a693646ccf1f Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 9 Jan 2024 16:45:09 -0500 Subject: [PATCH 012/159] fix(upgrade): Implement 'virtualization' on expandable list, fix re-render issue, fix ignore issues --- package-lock.json | 163 ++++++++++++++++-- packages/upgrade/package.json | 1 + packages/upgrade/source/app.js | 16 +- packages/upgrade/source/scan.js | 24 +-- .../upgrade/source/util/expandable-list.js | 152 ++++++++++++++++ packages/upgrade/test.js | 17 -- 6 files changed, 315 insertions(+), 58 deletions(-) create mode 100644 packages/upgrade/source/util/expandable-list.js delete mode 100644 packages/upgrade/test.js diff --git a/package-lock.json b/package-lock.json index 0e780e5367c..5a3f0168f2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,6 @@ "name": "@clerk/javascript", "version": "0.0.0", "license": "MIT", - "dependencies": { - "dedent": "^1.5.1" - }, "devDependencies": { "@actions/core": "^1.10.1", "@arethetypeswrong/cli": "^0.12.1", @@ -2864,7 +2861,6 @@ }, "node_modules/@colors/colors": { "version": "1.5.0", - "dev": true, "license": "MIT", "optional": true, "engines": { @@ -7648,7 +7644,6 @@ }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -10019,7 +10014,6 @@ }, "node_modules/ansicolors": { "version": "0.3.2", - "dev": true, "license": "MIT" }, "node_modules/any-eslint-parser": { @@ -11963,7 +11957,6 @@ }, "node_modules/cardinal": { "version": "2.1.1", - "dev": true, "license": "MIT", "dependencies": { "ansicolors": "~0.3.2", @@ -12063,7 +12056,6 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -12257,7 +12249,6 @@ }, "node_modules/cli-table3": { "version": "0.6.3", - "dev": true, "license": "MIT", "dependencies": { "string-width": "^4.2.0" @@ -13861,6 +13852,7 @@ }, "node_modules/dedent": { "version": "1.5.1", + "devOptional": true, "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -14571,6 +14563,11 @@ "version": "9.2.2", "license": "MIT" }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + }, "node_modules/emojis-list": { "version": "3.0.0", "dev": true, @@ -20147,6 +20144,130 @@ "ink": ">=4" } }, + "node_modules/ink-markdown": { + "version": "1.0.4", + "resolved": "git+ssh://git@github.com/jescalan/ink-markdown.git#15c393345871288c7fcadf131966300ec62586a1", + "license": "MIT", + "dependencies": { + "marked": "^11.1.0", + "marked-terminal": "^6.2.0" + }, + "peerDependencies": { + "ink": "^4.4.1", + "react": ">=16.8.0" + } + }, + "node_modules/ink-markdown/node_modules/ansi-escapes": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "dependencies": { + "type-fest": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ink-markdown/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ink-markdown/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ink-markdown/node_modules/marked": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-11.1.1.tgz", + "integrity": "sha512-EgxRjgK9axsQuUa/oKMx5DEY8oXpKJfk61rT5iY3aRlgU6QJtUcxU5OAymdhCvWvhYcd9FKmO5eQoX8m9VGJXg==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/ink-markdown/node_modules/marked-terminal": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.2.0.tgz", + "integrity": "sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==", + "dependencies": { + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.3.0", + "cli-table3": "^0.6.3", + "node-emoji": "^2.1.3", + "supports-hyperlinks": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <12" + } + }, + "node_modules/ink-markdown/node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ink-markdown/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ink-markdown/node_modules/supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/ink-markdown/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ink-spinner": { "version": "5.0.0", "license": "MIT", @@ -28663,7 +28784,6 @@ }, "node_modules/redeyed": { "version": "2.1.1", - "dev": true, "license": "MIT", "dependencies": { "esprima": "~4.0.0" @@ -29901,6 +30021,17 @@ "devOptional": true, "license": "MIT" }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/slash": { "version": "3.0.0", "license": "MIT", @@ -30689,7 +30820,6 @@ }, "node_modules/string-width": { "version": "4.2.3", - "devOptional": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -30729,12 +30859,10 @@ }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", - "devOptional": true, "license": "MIT" }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -32544,6 +32672,14 @@ "node": ">=4" } }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "engines": { + "node": ">=4" + } + }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", "dev": true, @@ -35288,6 +35424,7 @@ "index-to-position": "^0.1.2", "ink": "^4.4.1", "ink-link": "^3.0.0", + "ink-markdown": "jescalan/ink-markdown#release", "ink-spinner": "^5.0.0", "marked": "^11.1.1", "meow": "^11.0.0", diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 993f40bda9f..f74a821d9d7 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -32,6 +32,7 @@ "index-to-position": "^0.1.2", "ink": "^4.4.1", "ink-link": "^3.0.0", + "ink-markdown": "jescalan/ink-markdown#release", "ink-spinner": "^5.0.0", "marked": "^11.1.1", "meow": "^11.0.0", diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index 0724a95a0fa..44ad36aa9df 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -9,6 +9,8 @@ import getClerkMajorVersion from './util/get-clerk-version.js'; export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ignore = [] }) { const [sdks, setSdks] = useState(_sdk ? [_sdk] : []); + const [sdkGuesses, setSdkGuesses] = useState([]); + const [sdkGuessConfirmed, setSdkGuessConfirmed] = useState(false); const [sdkGuessAttempted, setSdkGuessAttempted] = useState(false); const [fromVersion, setFromVersion] = useState(_fromVersion); const [fromVersionGuessAttempted, fromVersionSdkGuessAttempted] = useState(false); @@ -17,13 +19,13 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign const [ignore, setIgnore] = useState(_ignore); const [configComplete, setConfigComplete] = useState(false); const [configVerified, setConfigVerified] = useState(false); - const [sdkGuesses, setSdkGuesses] = useState([]); let fromVersionGuess = false; // We try to guess which SDK they are using if (isEmpty(sdks) && isEmpty(sdkGuesses) && !sdkGuessAttempted) { if (!dir) return setDir(process.cwd()); - setSdkGuesses(guessFrameworks(dir)); + setSdkGuesses(guessFrameworks(dir)); // this is the suspect line + setSdkGuessAttempted(true); } // We try to guess which version of Clerk they are using @@ -42,6 +44,8 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign return You are already on version {toVersion}, so there's no need to migrate!; } + console.log(ignore); + return ( <> {/* Welcome to the upgrade script! */} @@ -57,7 +61,7 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign )} {/* Verify our guess at what their SDK is, if we have one */} - {isEmpty(sdks) && !isEmpty(sdkGuesses) && !sdkGuessAttempted && ( + {isEmpty(sdks) && !isEmpty(sdkGuesses) && !sdkGuessConfirmed && ( <> {sdkGuesses.length > 1 ? ( <> @@ -79,7 +83,7 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign { label: 'no', value: 'no' }, ]} onChange={item => { - setSdkGuessAttempted(true); + setSdkGuessConfirmed(true); // if true, we were right so we set the sdk if (item === 'yes') setSdks(sdkGuesses.map(guess => guess.value)); }} @@ -88,7 +92,7 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign )} {/* If we tried to guess and failed, user must manually select */} - {isEmpty(sdks) && sdkGuessAttempted && ( + {isEmpty(sdks) && isEmpty(sdkGuesses) && ( <> Please select which Clerk SDK(s) you're using for your app: (multiple can be selected using the space bar, press enter when finished) @@ -168,7 +172,7 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign placeholder='docs/**, images/**' defaultValue={ignore} onSubmit={val => { - setIgnore(val); + setIgnore(val.includes(',') ? val.split(/\s*,\s*/) : [].concat(val)); setConfigComplete(true); }} /> diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index 75cbcfeae00..c5d90c402f8 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -5,6 +5,7 @@ import { globby } from 'globby'; import fs from 'fs/promises'; import Spinner from 'ink-spinner'; import indexToPosition from 'index-to-position'; +import ExpandableList from './util/expandable-list.js'; export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { // NOTE: if the difference between fromVersion and toVersion is greater than 1 @@ -110,28 +111,7 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { {' ' + status} - {results.map(result => { - return ( - - {result.title} - - Location: {result.file}:{result.position.line}:{result.position.column} - - changed in {result.sdk} SDK - - Migration guide entry » - - {result.content} - - ); - })} + {!!results.length && } ); } diff --git a/packages/upgrade/source/util/expandable-list.js b/packages/upgrade/source/util/expandable-list.js new file mode 100644 index 00000000000..27b71baddb4 --- /dev/null +++ b/packages/upgrade/source/util/expandable-list.js @@ -0,0 +1,152 @@ +import React, { useReducer, useMemo } from 'react'; +import { Text, Newline, useInput, Box } from 'ink'; +import Link from 'ink-link'; +import Markdown from 'ink-markdown'; + +// A listing of items which can be navigated with arrow keys and expanded/contracted +// with space bar. Limits the number visible at a time to prevent rendering issues with +// super long lists +export default function ExpandableList({ items, numberVisible = 10 }) { + // set up our little state machine + const [state, dispatch] = useReducer(reducer, items, items => { + // add focused/expanded state on the set of items + const all = items.map((i, idx) => { + i.focused = idx === 0 ? true : false; + i.expanded = false; + return i; + }); + + // start idx, end idx + const visible = [0, numberVisible]; + + return { numberVisible, all, visible }; + }); + + // this is what lets us respond to keyboard input + useInput((input, key) => { + if (key.downArrow) { + dispatch({ type: 'focus-next-option' }); + } + + if (key.upArrow) { + dispatch({ type: 'focus-previous-option' }); + } + + if (input === ' ') { + dispatch({ type: 'toggle-focused-option' }); + } + }); + + // and here's the actual markup we render for each list item! + // make sure to render an indicator like "showing items 1-5 of 20" at bottom + return ( + <> + {state.all.reduce((memo, item, idx) => { + if (idx < state.visible[0] || idx >= state.visible[1]) return memo; + + const loc = `${item.file}:${item.position.line}:${item.position.column}`; + memo.push( + + {item.title} + Location: {loc} + {item.expanded && ( + <> + + {/* changed in {item.sdk} SDK */} + {item.content} + + See in migration guide » + + + )} + , + ); + return memo; + }, [])} + {state.all.length > state.numberVisible && ( + + Showing {state.visible[0] + 1} - {Math.min(state.visible[1], state.all.length)} of {state.all.length} + + )} + + ); +} + +// I'd like to recognize that this logic is kinda crazy, but it works 💖 +function reducer(state, action) { + // if the current item is focused and a next item exists + // un-focus it and tee up the next one to be focused + // also shift the visible window if needed + if (action.type === 'focus-next-option') { + let nextIdx; + const all = state.all.map((item, idx) => { + if (item.focused && state.all[idx + 1]) { + nextIdx = idx + 1; + item.focused = false; + return item; + } + + if (idx === nextIdx) { + item.focused = true; + return item; + } + + return item; + }); + + // if we're scrolling past the last item in the list, shift the visible window + let visible = state.visible; + if (nextIdx >= state.visible[1]) { + visible = [state.visible[0] + state.numberVisible, state.visible[1] + state.numberVisible]; + } + + return { all, visible, numberVisible: state.numberVisible }; + } + + // if the next item is focused, focus this one and tee up the next one to be un-focused + if (action.type === 'focus-previous-option') { + let nextIdx; + const all = state.all.map((item, idx) => { + if (state.all[idx + 1]?.focused) { + item.focused = true; + nextIdx = idx + 1; + return item; + } + + if (idx === nextIdx) { + item.focused = false; + return item; + } + + return item; + }); + + // if we're scrolling to before the first item in the list, shift the visible window + let visible = state.visible; + if (nextIdx - 1 < state.visible[0]) { + visible = [state.visible[0] - state.numberVisible, state.visible[1] - state.numberVisible]; + } + + return { all, visible, numberVisible: state.numberVisible }; + } + + // if the space bar is hit, toggle expand/contract on the currently focused item + if (action.type === 'toggle-focused-option') { + const all = state.all.map(item => { + if (item.focused) { + item.expanded = !item.expanded; + } + return item; + }); + return { all, visible: state.visible, numberVisible: state.numberVisible }; + } + + if (action.type === 'update-visible') { + // update which items are currently visible + } +} diff --git a/packages/upgrade/test.js b/packages/upgrade/test.js deleted file mode 100644 index b3c7585db9c..00000000000 --- a/packages/upgrade/test.js +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; -import chalk from 'chalk'; -import test from 'ava'; -import { render } from 'ink-testing-library'; -import App from './source/app.js'; - -test('greet unknown user', t => { - const { lastFrame } = render(); - - t.is(lastFrame(), `Hello, ${chalk.green('Stranger')}`); -}); - -test('greet user with a name', t => { - const { lastFrame } = render(); - - t.is(lastFrame(), `Hello, ${chalk.green('Jane')}`); -}); From 07cc0f485c7440a7651d4ba4c2933156e9e3b309 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 9 Jan 2024 16:56:20 -0500 Subject: [PATCH 013/159] fix(upgrade): Console log :hocho: --- packages/upgrade/source/app.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index 44ad36aa9df..0360edc89f9 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -44,8 +44,6 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign return You are already on version {toVersion}, so there's no need to migrate!; } - console.log(ignore); - return ( <> {/* Welcome to the upgrade script! */} From f5f9c178a01477f975ff52063ddae20dcfb1f02c Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 9 Jan 2024 17:22:38 -0500 Subject: [PATCH 014/159] fix(upgrade): Add progress bar to scan process, copy edits based on alexis feedback --- package-lock.json | 15 ---------- packages/upgrade/package.json | 1 - packages/upgrade/source/app.js | 4 +-- packages/upgrade/source/scan.js | 30 +++++++++---------- .../upgrade/source/util/expandable-list.js | 20 ++++++------- 5 files changed, 25 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5a3f0168f2c..227dd1557ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20268,20 +20268,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ink-spinner": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "cli-spinners": "^2.7.0" - }, - "engines": { - "node": ">=14.16" - }, - "peerDependencies": { - "ink": ">=4.0.0", - "react": ">=18.0.0" - } - }, "node_modules/ink-testing-library": { "version": "3.0.0", "dev": true, @@ -35425,7 +35411,6 @@ "ink": "^4.4.1", "ink-link": "^3.0.0", "ink-markdown": "jescalan/ink-markdown#release", - "ink-spinner": "^5.0.0", "marked": "^11.1.1", "meow": "^11.0.0", "react": "^18.2.0", diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index f74a821d9d7..1ce8805cbff 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -33,7 +33,6 @@ "ink": "^4.4.1", "ink-link": "^3.0.0", "ink-markdown": "jescalan/ink-markdown#release", - "ink-spinner": "^5.0.0", "marked": "^11.1.1", "meow": "^11.0.0", "react": "^18.2.0", diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index 0360edc89f9..a26db4a57ac 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -93,7 +93,7 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign {isEmpty(sdks) && isEmpty(sdkGuesses) && ( <> Please select which Clerk SDK(s) you're using for your app: - (multiple can be selected using the space bar, press enter when finished) + (select with space bar, multiple can be selected, press enter when finished) setSdks(value)} @@ -205,7 +205,7 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign Date: Wed, 10 Jan 2024 12:23:12 -0500 Subject: [PATCH 023/159] chore(upgrade): Improve regexes for nextjs matcher --- packages/upgrade/source/scan.js | 2 ++ .../upgrade/source/versions/v5/next/api-url-value-change.md | 2 +- .../source/versions/v5/next/auth-middleware-deprecated.md | 2 +- .../upgrade/source/versions/v5/next/authmiddleware-apikey.md | 2 +- .../source/versions/v5/next/authmiddleware-frontendapi.md | 2 +- .../source/versions/v5/next/createclerkclient-apikey.md | 2 +- .../source/versions/v5/next/createclerkclient-frontendapi.md | 2 +- packages/upgrade/source/versions/v5/next/getauth-apikey.md | 2 +- packages/upgrade/source/versions/v5/next/import-api-url.md | 3 ++- packages/upgrade/source/versions/v5/next/import-api-version.md | 3 ++- .../upgrade/source/versions/v5/next/import-clerk-js-url.md | 3 ++- .../upgrade/source/versions/v5/next/import-clerk-js-version.md | 3 ++- packages/upgrade/source/versions/v5/next/import-domain.md | 3 ++- .../upgrade/source/versions/v5/next/import-is-satellite.md | 3 ++- packages/upgrade/source/versions/v5/next/import-proxy-url.md | 3 ++- .../upgrade/source/versions/v5/next/import-publishable-key.md | 3 ++- packages/upgrade/source/versions/v5/next/import-secret-key.md | 3 ++- packages/upgrade/source/versions/v5/next/import-sign-in-url.md | 3 ++- packages/upgrade/source/versions/v5/next/import-sign-up-url.md | 2 +- 19 files changed, 30 insertions(+), 18 deletions(-) diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index fef7d7d7588..a3cd9e93aef 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -61,6 +61,8 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { useEffect(() => { if (!matchers || !files) return; + console.log(matchers); + Promise.all( // first we read all the files files.map(async (file, idx) => { diff --git a/packages/upgrade/source/versions/v5/next/api-url-value-change.md b/packages/upgrade/source/versions/v5/next/api-url-value-change.md index e24981e5fb3..f9444ae18c2 100644 --- a/packages/upgrade/source/versions/v5/next/api-url-value-change.md +++ b/packages/upgrade/source/versions/v5/next/api-url-value-change.md @@ -1,6 +1,6 @@ --- title: '`API_URL` value has changed' -matcher: "API_URL.*?from\\s['\"]@clerk\\/nextjs\\/server['\"]" +matcher: "API_URL[\\s\\S]+?from\\s+['\"]@clerk\\/nextjs\\/server['\"]" --- The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md b/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md index ff7b2b743d4..719a3d1e8fb 100644 --- a/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md +++ b/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md @@ -1,6 +1,6 @@ --- title: '`authMiddleware` deprecated' -matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/nextjs['\"]" +matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/nextjs.*?['\"]" --- `authMiddleware` is now deprecated, and we recommend instead using `clerkMiddleware`. Here’s how code could look before and after migration: diff --git a/packages/upgrade/source/versions/v5/next/authmiddleware-apikey.md b/packages/upgrade/source/versions/v5/next/authmiddleware-apikey.md index 506550da120..d39c0321794 100644 --- a/packages/upgrade/source/versions/v5/next/authmiddleware-apikey.md +++ b/packages/upgrade/source/versions/v5/next/authmiddleware-apikey.md @@ -1,6 +1,6 @@ --- title: '`apiKey` -> `secretKey` as param to authMiddleware' -matcher: "authMiddleware\\({.*?apiKey:.*?}\\)" +matcher: "authMiddleware\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md b/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md index 90174a14e80..7f2f0ede54d 100644 --- a/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md +++ b/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md @@ -1,6 +1,6 @@ --- title: '`frontendApi` -> `publishableKey` as param to authMiddleware' -matcher: "authMiddleware\\({.*?frontendApi:.*?}\\)" +matcher: "authMiddleware\\({[\\s\\S]*?frontendApi:[\\s\\S]*?}\\)" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md index 62af082b227..cbe87e31b40 100644 --- a/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md @@ -1,6 +1,6 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkClient' -matcher: "createClerkClient\\({.*?apiKey:.*?}\\)" +matcher: "createClerkClient\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md index 17625a13b7f..6d55766a93c 100644 --- a/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md @@ -1,6 +1,6 @@ --- title: '`frontendApi` -> `publishableKey` as param to createClerkClient' -matcher: "createClerkClient\\({.*?frontendApi:.*?}\\)" +matcher: "createClerkClient\\({[\\s\\S]*?frontendApi:[\\s\\S]*?}\\)" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/getauth-apikey.md b/packages/upgrade/source/versions/v5/next/getauth-apikey.md index d4212e0439c..57a33df3e50 100644 --- a/packages/upgrade/source/versions/v5/next/getauth-apikey.md +++ b/packages/upgrade/source/versions/v5/next/getauth-apikey.md @@ -1,6 +1,6 @@ --- title: '`apiKey` -> `secretKey` as param to getAuth' -matcher: "getAuth\\({.*?apiKey:.*?}\\)" +matcher: "getAuth\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-api-url.md b/packages/upgrade/source/versions/v5/next/import-api-url.md index 8e7d4c294e8..89f159cdd4f 100644 --- a/packages/upgrade/source/versions/v5/next/import-api-url.md +++ b/packages/upgrade/source/versions/v5/next/import-api-url.md @@ -1,6 +1,7 @@ --- title: '`API_URL` constant removed' -matcher: "API_URL.*?from\\s['\"]@clerk\\/nextjs['\"]" +matcher: "API_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `CLERK_API_URL` environment variable and using this instead. diff --git a/packages/upgrade/source/versions/v5/next/import-api-version.md b/packages/upgrade/source/versions/v5/next/import-api-version.md index a28604a4af5..ccc269a00d1 100644 --- a/packages/upgrade/source/versions/v5/next/import-api-version.md +++ b/packages/upgrade/source/versions/v5/next/import-api-version.md @@ -1,6 +1,7 @@ --- title: '`API_VERSION` constant removed' -matcher: "API_VERSION.*?from\\s['\"]@clerk\\/nextjs['\"]" +matcher: "API_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `CLERK_API_VERSION` environment variable and using this instead. diff --git a/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md b/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md index 9416ee4fc3c..c468b465387 100644 --- a/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md +++ b/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md @@ -1,6 +1,7 @@ --- title: '`CLERK_JS_URL` constant removed' -matcher: "CLERK_JS_URL.*?from\\s['\"]@clerk\\/nextjs['\"]" +matcher: "CLERK_JS_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_JS` environment variable and using this instead. diff --git a/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md b/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md index b3b301b5e07..ce3fd5433a8 100644 --- a/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md +++ b/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md @@ -1,6 +1,7 @@ --- title: '`CLERK_JS_VERSION` constant removed' -matcher: "CLERK_JS_VERSION.*?from\\s['\"]@clerk\\/nextjs['\"]" +matcher: "CLERK_JS_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_JS_VERSION` environment variable and using this instead. diff --git a/packages/upgrade/source/versions/v5/next/import-domain.md b/packages/upgrade/source/versions/v5/next/import-domain.md index 94ec8672e0e..729cb7d101e 100644 --- a/packages/upgrade/source/versions/v5/next/import-domain.md +++ b/packages/upgrade/source/versions/v5/next/import-domain.md @@ -1,6 +1,7 @@ --- title: '`DOMAIN` constant removed' -matcher: "DOMAIN.*?from\\s['\"]@clerk\\/nextjs['\"]" +matcher: "DOMAIN[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_DOMAIN` environment variable and using this instead. diff --git a/packages/upgrade/source/versions/v5/next/import-is-satellite.md b/packages/upgrade/source/versions/v5/next/import-is-satellite.md index 42259099758..d3faef1f0e2 100644 --- a/packages/upgrade/source/versions/v5/next/import-is-satellite.md +++ b/packages/upgrade/source/versions/v5/next/import-is-satellite.md @@ -1,6 +1,7 @@ --- title: '`IS_SATELLITE` constant removed' -matcher: "IS_SATELLITE.*?from\\s['\"]@clerk\\/nextjs['\"]" +matcher: "IS_SATELLITE[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_IS_SATELLITE` environment variable and using this instead. diff --git a/packages/upgrade/source/versions/v5/next/import-proxy-url.md b/packages/upgrade/source/versions/v5/next/import-proxy-url.md index 9e4269b35bc..5cff14915ed 100644 --- a/packages/upgrade/source/versions/v5/next/import-proxy-url.md +++ b/packages/upgrade/source/versions/v5/next/import-proxy-url.md @@ -1,6 +1,7 @@ --- title: '`PROXY_URL` constant removed' -matcher: "PROXY_URL.*?from\\s['\"]@clerk\\/nextjs['\"]" +matcher: "PROXY_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_PROXY_URL` environment variable and using this instead. diff --git a/packages/upgrade/source/versions/v5/next/import-publishable-key.md b/packages/upgrade/source/versions/v5/next/import-publishable-key.md index b494936ad81..4b8cee827ec 100644 --- a/packages/upgrade/source/versions/v5/next/import-publishable-key.md +++ b/packages/upgrade/source/versions/v5/next/import-publishable-key.md @@ -1,6 +1,7 @@ --- title: '`PUBLISHABLE_KEY` constant removed' -matcher: "PUBLISHABLE_KEY.*?from\\s['\"]@clerk\\/nextjs['\"]" +matcher: "PUBLISHABLE_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` environment variable and using this instead. diff --git a/packages/upgrade/source/versions/v5/next/import-secret-key.md b/packages/upgrade/source/versions/v5/next/import-secret-key.md index 7a000e869a3..cfc34e999af 100644 --- a/packages/upgrade/source/versions/v5/next/import-secret-key.md +++ b/packages/upgrade/source/versions/v5/next/import-secret-key.md @@ -1,6 +1,7 @@ --- title: '`SECRET_KEY` constant removed' -matcher: "SECRET_KEY.*?from\\s['\"]@clerk\\/nextjs['\"]" +matcher: "SECRET_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `CLERK_SECRET_KEY` environment variable and using this instead. diff --git a/packages/upgrade/source/versions/v5/next/import-sign-in-url.md b/packages/upgrade/source/versions/v5/next/import-sign-in-url.md index 260f2c7bcae..5df3f1eff73 100644 --- a/packages/upgrade/source/versions/v5/next/import-sign-in-url.md +++ b/packages/upgrade/source/versions/v5/next/import-sign-in-url.md @@ -1,6 +1,7 @@ --- title: '`SIGN_IN_URL` constant removed' -matcher: "SIGN_IN_URL.*?from\\s['\"]@clerk\\/nextjs['\"]" +matcher: "SIGN_IN_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_SIGN_IN_URL` environment variable and using this instead. diff --git a/packages/upgrade/source/versions/v5/next/import-sign-up-url.md b/packages/upgrade/source/versions/v5/next/import-sign-up-url.md index ebeb982391d..6862becc922 100644 --- a/packages/upgrade/source/versions/v5/next/import-sign-up-url.md +++ b/packages/upgrade/source/versions/v5/next/import-sign-up-url.md @@ -1,6 +1,6 @@ --- title: '`SIGN_UP_URL` constant removed' -matcher: "SIGN_UP_URL.*?from\\s['\"]@clerk\\/nextjs['\"]" +matcher: "SIGN_UP_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_SIGN_UP_URL` environment variable and using this instead. From 6f45f070cfd35bf39490115d266e15afb03cb828 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 10 Jan 2024 12:24:40 -0500 Subject: [PATCH 024/159] fix(upgrade): Match against devDeps as well as dependencies --- packages/upgrade/source/util/guess-framework.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/upgrade/source/util/guess-framework.js b/packages/upgrade/source/util/guess-framework.js index fde7c09fd9d..e6b15d00355 100644 --- a/packages/upgrade/source/util/guess-framework.js +++ b/packages/upgrade/source/util/guess-framework.js @@ -3,11 +3,14 @@ import SDKS from '../constants/sdks.js'; export default function guessFrameworks(dir) { const pkg = readPackageSync({ cwd: dir }); - if (!pkg.dependencies) return []; // no guessing if there are no deps + + // no guessing if there are no deps + if (!pkg.dependencies && !pkg.devDependencies) return []; const deps = Object.keys(pkg.dependencies); + const devDeps = Object.keys(pkg.devDependencies); return SDKS.reduce((m, { label, value }) => { - if (deps.includes(label)) m.push({ label, value }); + if (deps.includes(label) || devDeps.includes(label)) m.push({ label, value }); return m; }, []); } From f47cfd8122bf00fee72227d528a81623a95fd969 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 10 Jan 2024 12:33:47 -0500 Subject: [PATCH 025/159] fix(upgrade): Fix logic issue with devdep detection --- packages/upgrade/source/util/guess-framework.js | 4 ++-- .../versions/v5/chromeExtension/clerkprovider-tokencache.md | 1 + .../v5/common/navigate-to-routerpush-routerreplace.md | 2 +- .../source/versions/v5/expo/clerkprovider-frontendapi.md | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/upgrade/source/util/guess-framework.js b/packages/upgrade/source/util/guess-framework.js index e6b15d00355..63e2d81375b 100644 --- a/packages/upgrade/source/util/guess-framework.js +++ b/packages/upgrade/source/util/guess-framework.js @@ -6,8 +6,8 @@ export default function guessFrameworks(dir) { // no guessing if there are no deps if (!pkg.dependencies && !pkg.devDependencies) return []; - const deps = Object.keys(pkg.dependencies); - const devDeps = Object.keys(pkg.devDependencies); + const deps = pkg.dependencies ? Object.keys(pkg.dependencies) : []; + const devDeps = pkg.devDependencies ? Object.keys(pkg.devDependencies) : []; return SDKS.reduce((m, { label, value }) => { if (deps.includes(label) || devDeps.includes(label)) m.push({ label, value }); diff --git a/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md b/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md index fa793281e8f..956a9ab3555 100644 --- a/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md +++ b/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md @@ -1,6 +1,7 @@ --- title: '`tokenCache` -> `storageCache` as `` props' matcher: "" +matcherFlags: 'm' --- The `tokenCache` prop has been renamed to `storageCache` in order to accomodate the new [WebSSO feature](https://github.com/clerk/javascript/pull/2277). With the prop change from `tokenCache` to `storageCache`, the interface has been expanded to allow for more flexibility. The new interface is as follows: diff --git a/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md b/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md index ff8adb7f08b..0f1c968a51a 100644 --- a/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md +++ b/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md @@ -1,6 +1,6 @@ --- title: '`navigate` prop replaced by `routerPush` and `routerReplace`' -matcher: '' +matcher: "" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md b/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md index d4fcea6817d..ee8cf2bcfc2 100644 --- a/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md +++ b/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md @@ -1,6 +1,6 @@ --- title: '`frontendApi` -> `publishableKey` as prop to `ClerkProvider`' -matcher: '' +matcher: "" matcherFlags: 'm' --- From d86cee627221e13e4919fa1df3bdc1f38a3183ac Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 10 Jan 2024 12:34:36 -0500 Subject: [PATCH 026/159] fix(upgrade): Remove console.log --- packages/upgrade/source/scan.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index a3cd9e93aef..fef7d7d7588 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -61,8 +61,6 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { useEffect(() => { if (!matchers || !files) return; - console.log(matchers); - Promise.all( // first we read all the files files.map(async (file, idx) => { From b31e7c82fb6a6e39bf68e759e3ccaececdafff0a Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 10 Jan 2024 12:47:35 -0500 Subject: [PATCH 027/159] fix(upgrade): Typo in localizations package name --- packages/upgrade/source/versions/v5/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 4c49af36cc4..ffecf87a4a2 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -145,7 +145,7 @@ export default { 'useorganizationlist-organizationlist', // shared outside this pkg? ]), chromeExtension: load('chromeExtension', ['clerkprovider-tokencache']), - localization: [], + localizations: [], types: [], backend: [], // backend: load('backend', [ From 5f3332cf7a4d36cde0f95e87aa9970dbb8877609 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 10 Jan 2024 13:22:13 -0500 Subject: [PATCH 028/159] chore(upgrade): Package access update --- packages/upgrade/package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 00e7731cb2f..e44a97e848d 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.0.0", + "version": "0.0.1", "license": "MIT", "type": "module", "bin": "dist/cli.js", @@ -56,5 +56,8 @@ }, "engines": { "node": ">=16" + }, + "publishConfig": { + "access": "public" } } From dbe7290ea067654ab7cf56093489a1a2165fae32 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 10 Jan 2024 16:59:54 -0500 Subject: [PATCH 029/159] fix(upgrade): Update ink-markdown pkg to improve highlighting --- package-lock.json | 414 ++++++++++++------ packages/upgrade/package.json | 2 +- .../upgrade/source/util/expandable-list.js | 2 +- 3 files changed, 279 insertions(+), 139 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3d60259a34f..09698d1b09a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4819,6 +4819,130 @@ "node": ">=8" } }, + "node_modules/@jescalan/ink-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jescalan/ink-markdown/-/ink-markdown-2.0.0.tgz", + "integrity": "sha512-f3pBRRgqoYL+88wHJXxhN/2hf/zi2tY5eJdVXEzd/5tvexNsePw9ITo2N2htQ64vL+ujuC8Noseep53Rt75BEA==", + "dependencies": { + "marked": "^11.1.0", + "marked-terminal": "github:jescalan/marked-terminal" + }, + "peerDependencies": { + "ink": "^4.4.1", + "react": ">=16.8.0" + } + }, + "node_modules/@jescalan/ink-markdown/node_modules/ansi-escapes": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "dependencies": { + "type-fest": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jescalan/ink-markdown/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jescalan/ink-markdown/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jescalan/ink-markdown/node_modules/marked": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-11.1.1.tgz", + "integrity": "sha512-EgxRjgK9axsQuUa/oKMx5DEY8oXpKJfk61rT5iY3aRlgU6QJtUcxU5OAymdhCvWvhYcd9FKmO5eQoX8m9VGJXg==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@jescalan/ink-markdown/node_modules/marked-terminal": { + "version": "6.2.0", + "resolved": "git+ssh://git@github.com/jescalan/marked-terminal.git#44f5ab42076e16937f56d645d3d7264675558ea1", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.2.0", + "chalk": "^5.3.0", + "cli-highlight": "^2.1.11", + "cli-table3": "^0.6.3", + "node-emoji": "^2.1.3", + "supports-hyperlinks": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <12" + } + }, + "node_modules/@jescalan/ink-markdown/node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@jescalan/ink-markdown/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jescalan/ink-markdown/node_modules/supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@jescalan/ink-markdown/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@jest/console": { "version": "29.7.0", "devOptional": true, @@ -10027,6 +10151,7 @@ }, "node_modules/ansicolors": { "version": "0.3.2", + "dev": true, "license": "MIT" }, "node_modules/any-eslint-parser": { @@ -10038,7 +10163,6 @@ }, "node_modules/any-promise": { "version": "1.3.0", - "dev": true, "license": "MIT" }, "node_modules/anymatch": { @@ -11970,6 +12094,7 @@ }, "node_modules/cardinal": { "version": "2.1.1", + "dev": true, "license": "MIT", "dependencies": { "ansicolors": "~0.3.2", @@ -12287,6 +12412,130 @@ "node": ">=8" } }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cli-highlight/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/cli-highlight/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, "node_modules/cli-spinners": { "version": "2.9.2", "license": "MIT", @@ -18754,7 +19003,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "devOptional": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -19468,6 +19716,14 @@ "tslib": "^2.0.3" } }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "license": "BSD-3-Clause", @@ -20239,130 +20495,6 @@ "ink": ">=4" } }, - "node_modules/ink-markdown": { - "version": "1.0.4", - "resolved": "git+ssh://git@github.com/jescalan/ink-markdown.git#15c393345871288c7fcadf131966300ec62586a1", - "license": "MIT", - "dependencies": { - "marked": "^11.1.0", - "marked-terminal": "^6.2.0" - }, - "peerDependencies": { - "ink": "^4.4.1", - "react": ">=16.8.0" - } - }, - "node_modules/ink-markdown/node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dependencies": { - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ink-markdown/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ink-markdown/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ink-markdown/node_modules/marked": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-11.1.1.tgz", - "integrity": "sha512-EgxRjgK9axsQuUa/oKMx5DEY8oXpKJfk61rT5iY3aRlgU6QJtUcxU5OAymdhCvWvhYcd9FKmO5eQoX8m9VGJXg==", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/ink-markdown/node_modules/marked-terminal": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.2.0.tgz", - "integrity": "sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==", - "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.3.0", - "cli-table3": "^0.6.3", - "node-emoji": "^2.1.3", - "supports-hyperlinks": "^3.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "marked": ">=1 <12" - } - }, - "node_modules/ink-markdown/node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/ink-markdown/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ink-markdown/node_modules/supports-hyperlinks": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", - "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/ink-markdown/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ink-testing-library": { "version": "3.0.0", "dev": true, @@ -25252,7 +25384,6 @@ }, "node_modules/mz": { "version": "2.7.0", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0", @@ -26703,6 +26834,19 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, "node_modules/parseurl": { "version": "1.3.3", "dev": true, @@ -28904,6 +29048,7 @@ }, "node_modules/redeyed": { "version": "2.1.1", + "dev": true, "license": "MIT", "dependencies": { "esprima": "~4.0.0" @@ -29182,7 +29327,6 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -31777,7 +31921,6 @@ }, "node_modules/thenify": { "version": "3.3.1", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0" @@ -31785,7 +31928,6 @@ }, "node_modules/thenify-all": { "version": "1.6.0", - "dev": true, "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" @@ -34225,7 +34367,6 @@ }, "node_modules/wrap-ansi": { "version": "7.0.0", - "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -34288,7 +34429,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", - "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -34302,7 +34442,6 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", - "devOptional": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -34313,7 +34452,6 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", - "devOptional": true, "license": "MIT" }, "node_modules/wrappy": { @@ -34455,7 +34593,6 @@ }, "node_modules/y18n": { "version": "5.0.8", - "devOptional": true, "license": "ISC", "engines": { "node": ">=10" @@ -35577,10 +35714,11 @@ }, "packages/upgrade": { "name": "@clerk/upgrade", - "version": "0.0.0", + "version": "0.0.1", "license": "MIT", "dependencies": { "@inkjs/ui": "^1.0.0", + "@jescalan/ink-markdown": "^2.0.0", "globby": "^14.0.0", "gray-matter": "^4.0.3", "index-to-position": "^0.1.2", @@ -35588,7 +35726,6 @@ "ink-big-text": "^2.0.0", "ink-gradient": "^3.0.0", "ink-link": "^3.0.0", - "ink-markdown": "jescalan/ink-markdown#release", "marked": "^11.1.1", "meow": "^11.0.0", "react": "^18.2.0", @@ -35615,6 +35752,9 @@ "node": ">=16" } }, + "packages/upgrade/@jescalan/ink-markdown": { + "extraneous": true + }, "packages/upgrade/node_modules/@types/normalize-package-data": { "version": "2.4.4", "license": "MIT" diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index e44a97e848d..19b4923063f 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -27,6 +27,7 @@ }, "dependencies": { "@inkjs/ui": "^1.0.0", + "@jescalan/ink-markdown": "^2.0.0", "globby": "^14.0.0", "gray-matter": "^4.0.3", "index-to-position": "^0.1.2", @@ -34,7 +35,6 @@ "ink-big-text": "^2.0.0", "ink-gradient": "^3.0.0", "ink-link": "^3.0.0", - "ink-markdown": "jescalan/ink-markdown#release", "marked": "^11.1.1", "meow": "^11.0.0", "react": "^18.2.0", diff --git a/packages/upgrade/source/util/expandable-list.js b/packages/upgrade/source/util/expandable-list.js index 41b69813d65..4b51ae3b79f 100644 --- a/packages/upgrade/source/util/expandable-list.js +++ b/packages/upgrade/source/util/expandable-list.js @@ -1,7 +1,7 @@ import React, { useReducer, useMemo } from 'react'; import { Text, Newline, useInput, Box } from 'ink'; import Link from 'ink-link'; -import Markdown from 'ink-markdown'; +import Markdown from '@jescalan/ink-markdown'; // A listing of items which can be navigated with arrow keys and expanded/contracted // with space bar. Limits the number visible at a time to prevent rendering issues with From 76ae0fba12998f18865bc3e850423b147c16caf2 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 10 Jan 2024 17:28:07 -0500 Subject: [PATCH 030/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 19b4923063f..414da2008f8 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.0.1", + "version": "0.0.2", "license": "MIT", "type": "module", "bin": "dist/cli.js", From 54f384b2eb267351c1e2c876f6f45b794d5dc07e Mon Sep 17 00:00:00 2001 From: LekoArts Date: Thu, 11 Jan 2024 13:46:41 +0100 Subject: [PATCH 031/159] chore(repo): Move react stuff from js to react --- packages/upgrade/source/versions/v5/index.js | 12 ++++++------ .../v5/{js => react}/afterswitchorganizationurl.md | 0 ...rance-organizationpreview-organizationswitcher.md | 0 .../{js => react}/useorganization-invitationlist.md | 0 .../{js => react}/useorganization-membershiplist.md | 0 .../versions/v5/{js => react}/useorganizations.md | 0 .../versions/v5/{js => react}/userprofile-prop.md | 0 7 files changed, 6 insertions(+), 6 deletions(-) rename packages/upgrade/source/versions/v5/{js => react}/afterswitchorganizationurl.md (100%) rename packages/upgrade/source/versions/v5/{js => react}/appearance-organizationpreview-organizationswitcher.md (100%) rename packages/upgrade/source/versions/v5/{js => react}/useorganization-invitationlist.md (100%) rename packages/upgrade/source/versions/v5/{js => react}/useorganization-membershiplist.md (100%) rename packages/upgrade/source/versions/v5/{js => react}/useorganizations.md (100%) rename packages/upgrade/source/versions/v5/{js => react}/userprofile-prop.md (100%) diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index ffecf87a4a2..441659bd92c 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -14,6 +14,12 @@ const reactChangesList = [ 'clerkprovider-frontendapi', 'setsession', 'navigate-to-routerpush-routerreplace', + 'afterswitchorganizationurl', + 'appearance-organizationpreview-organizationswitcher', + 'useorganization-invitationlist', + 'useorganization-membershiplist', + 'useorganizations', + 'userprofile-prop', ]; export default { @@ -114,11 +120,8 @@ export default { 'external-account-avatarurl', // shared w/ all 'organization-logourl', // shared w/ all 'user-orgpublicdata-profileimageurl', // shared w/ all - 'useorganizations', - 'userprofile-prop', 'setsession', 'user-update-password', // shared w/ all - 'afterswitchorganizationurl', // shared w/ all 'experimental-canusecaptcha', 'experimental-captchaurl', 'experimental-captchasitekey', @@ -128,11 +131,8 @@ export default { 'unstable-membershipupdate', 'organization-create-string', // maybe shared with all? 'organization-getpendinginvitations', // maybe shared with all? - 'useorganization-invitationlist', // maybe shared with all? - 'useorganization-membershiplist', // maybe shared with all? 'user-createexternalaccount-redirecturl', // maybe shared with all? 'signup-attemptweb3walletverification-generatedsignature', - 'appearance-organizationpreview-organizationswitcher', // shared w/ all 'redirecttohome', ]), shared: load('shared', [ diff --git a/packages/upgrade/source/versions/v5/js/afterswitchorganizationurl.md b/packages/upgrade/source/versions/v5/react/afterswitchorganizationurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/afterswitchorganizationurl.md rename to packages/upgrade/source/versions/v5/react/afterswitchorganizationurl.md diff --git a/packages/upgrade/source/versions/v5/js/appearance-organizationpreview-organizationswitcher.md b/packages/upgrade/source/versions/v5/react/appearance-organizationpreview-organizationswitcher.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/appearance-organizationpreview-organizationswitcher.md rename to packages/upgrade/source/versions/v5/react/appearance-organizationpreview-organizationswitcher.md diff --git a/packages/upgrade/source/versions/v5/js/useorganization-invitationlist.md b/packages/upgrade/source/versions/v5/react/useorganization-invitationlist.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/useorganization-invitationlist.md rename to packages/upgrade/source/versions/v5/react/useorganization-invitationlist.md diff --git a/packages/upgrade/source/versions/v5/js/useorganization-membershiplist.md b/packages/upgrade/source/versions/v5/react/useorganization-membershiplist.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/useorganization-membershiplist.md rename to packages/upgrade/source/versions/v5/react/useorganization-membershiplist.md diff --git a/packages/upgrade/source/versions/v5/js/useorganizations.md b/packages/upgrade/source/versions/v5/react/useorganizations.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/useorganizations.md rename to packages/upgrade/source/versions/v5/react/useorganizations.md diff --git a/packages/upgrade/source/versions/v5/js/userprofile-prop.md b/packages/upgrade/source/versions/v5/react/userprofile-prop.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/userprofile-prop.md rename to packages/upgrade/source/versions/v5/react/userprofile-prop.md From 4ebadb3aaa372e233056c3a7e8a32dd22e975381 Mon Sep 17 00:00:00 2001 From: LekoArts Date: Thu, 11 Jan 2024 14:21:23 +0100 Subject: [PATCH 032/159] chore(repo): Fix typos --- .../source/versions/v5/react/useorganization-invitationlist.md | 2 +- .../source/versions/v5/react/useorganization-membershiplist.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/upgrade/source/versions/v5/react/useorganization-invitationlist.md b/packages/upgrade/source/versions/v5/react/useorganization-invitationlist.md index 3e6691407c8..c60ba2e74cd 100644 --- a/packages/upgrade/source/versions/v5/react/useorganization-invitationlist.md +++ b/packages/upgrade/source/versions/v5/react/useorganization-invitationlist.md @@ -8,7 +8,7 @@ The `invitationList` param to the `useOrganizations` hook has been replaced by ` ```js // before -const { invitationList } = useOrganizations({ +const { invitationList } = useOrganization({ invitationList: { limit: 10, offset: 1 }, }); diff --git a/packages/upgrade/source/versions/v5/react/useorganization-membershiplist.md b/packages/upgrade/source/versions/v5/react/useorganization-membershiplist.md index 9ec472179aa..bf216afe9f0 100644 --- a/packages/upgrade/source/versions/v5/react/useorganization-membershiplist.md +++ b/packages/upgrade/source/versions/v5/react/useorganization-membershiplist.md @@ -7,7 +7,7 @@ The `membershipList` param from the `useOrganization` hook has been removed. Ins ```js // before -const { membershipList } = useOrganizations({ +const { membershipList } = useOrganization({ membershipList: { limit: 10, offset: 1 }, }); From 6635385d110966eb881520c1618b38e1a74cba88 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 11 Jan 2024 15:55:01 -0500 Subject: [PATCH 033/159] fix(upgrade): Fix file moves into react --- .../versions/v5/{react => common}/afterswitchorganizationurl.md | 0 .../appearance-organizationpreview-organizationswitcher.md | 0 .../v5/{react => common}/useorganization-invitationlist.md | 0 .../v5/{react => common}/useorganization-membershiplist.md | 0 .../source/versions/v5/{react => common}/useorganizations.md | 0 .../source/versions/v5/{react => common}/userprofile-prop.md | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename packages/upgrade/source/versions/v5/{react => common}/afterswitchorganizationurl.md (100%) rename packages/upgrade/source/versions/v5/{react => common}/appearance-organizationpreview-organizationswitcher.md (100%) rename packages/upgrade/source/versions/v5/{react => common}/useorganization-invitationlist.md (100%) rename packages/upgrade/source/versions/v5/{react => common}/useorganization-membershiplist.md (100%) rename packages/upgrade/source/versions/v5/{react => common}/useorganizations.md (100%) rename packages/upgrade/source/versions/v5/{react => common}/userprofile-prop.md (100%) diff --git a/packages/upgrade/source/versions/v5/react/afterswitchorganizationurl.md b/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/react/afterswitchorganizationurl.md rename to packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md diff --git a/packages/upgrade/source/versions/v5/react/appearance-organizationpreview-organizationswitcher.md b/packages/upgrade/source/versions/v5/common/appearance-organizationpreview-organizationswitcher.md similarity index 100% rename from packages/upgrade/source/versions/v5/react/appearance-organizationpreview-organizationswitcher.md rename to packages/upgrade/source/versions/v5/common/appearance-organizationpreview-organizationswitcher.md diff --git a/packages/upgrade/source/versions/v5/react/useorganization-invitationlist.md b/packages/upgrade/source/versions/v5/common/useorganization-invitationlist.md similarity index 100% rename from packages/upgrade/source/versions/v5/react/useorganization-invitationlist.md rename to packages/upgrade/source/versions/v5/common/useorganization-invitationlist.md diff --git a/packages/upgrade/source/versions/v5/react/useorganization-membershiplist.md b/packages/upgrade/source/versions/v5/common/useorganization-membershiplist.md similarity index 100% rename from packages/upgrade/source/versions/v5/react/useorganization-membershiplist.md rename to packages/upgrade/source/versions/v5/common/useorganization-membershiplist.md diff --git a/packages/upgrade/source/versions/v5/react/useorganizations.md b/packages/upgrade/source/versions/v5/common/useorganizations.md similarity index 100% rename from packages/upgrade/source/versions/v5/react/useorganizations.md rename to packages/upgrade/source/versions/v5/common/useorganizations.md diff --git a/packages/upgrade/source/versions/v5/react/userprofile-prop.md b/packages/upgrade/source/versions/v5/common/userprofile-prop.md similarity index 100% rename from packages/upgrade/source/versions/v5/react/userprofile-prop.md rename to packages/upgrade/source/versions/v5/common/userprofile-prop.md From f58b27365585d211bf7288b3d7f8e3465105a513 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 11 Jan 2024 17:24:52 -0500 Subject: [PATCH 034/159] fix(upgrade): Fix ignores and progress bar --- packages/upgrade/source/scan.js | 24 ++++++++++++++----- .../js/lastorganizationinvitation-member.md | 2 +- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index fef7d7d7588..d6a61e5b5d9 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react'; import { Text, Newline, Box } from 'ink'; import { globby } from 'globby'; import fs from 'fs/promises'; +import path from 'path'; import { ProgressBar } from '@inkjs/ui'; import indexToPosition from 'index-to-position'; import ExpandableList from './util/expandable-list.js'; @@ -47,11 +48,19 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { '**/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)+', // common image files + '**/*.(mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg)+', // common video files ); - globby(dir, { ignore: [...ignore.filter(x => x)] }).then(files => setFiles(files)); + globby(path.resolve(dir), { ignore: [...ignore.filter(x => x)] }).then(files => { + setFiles(files); + }); }, [dir, ignore]); // Read files and scan regexes @@ -64,8 +73,6 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { Promise.all( // first we read all the files files.map(async (file, idx) => { - setStatus(`Scanning ${file}`); - setProgress(Math.ceil((idx / files.length) * 100)); const content = await fs.readFile(file, 'utf8'); // then we run each of the matchers against the file contents @@ -87,6 +94,9 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { }); }); } + + setStatus(`Scanning ${file}`); + setProgress(Math.ceil((idx / files.length) * 100)); }), ) .then(() => { @@ -105,15 +115,17 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { return ( <> {complete ? ( - ✓ {status} + <> + ✓ {status} + + {!!results.length && } + ) : ( <> {status} )} - - {!!results.length && } ); } diff --git a/packages/upgrade/source/versions/v5/js/lastorganizationinvitation-member.md b/packages/upgrade/source/versions/v5/js/lastorganizationinvitation-member.md index 94c6a1df878..ef6daa3c61a 100644 --- a/packages/upgrade/source/versions/v5/js/lastorganizationinvitation-member.md +++ b/packages/upgrade/source/versions/v5/js/lastorganizationinvitation-member.md @@ -1,6 +1,6 @@ --- title: '`lastOrganizationInvitation` and `lastOrganizationMember` dropped from event emitter' -matcher: "[\\.lastOrganizationInvitation|\\.lastOrganizationMember]" +matcher: "(?:\\.lastOrganizationInvitation|\\.lastOrganizationMember)" --- If you are using [`Clerk.addListener`](https://clerk.com/docs/references/javascript/clerk/clerk#add-listener) or `OrganizationContext` and utilizing either the `lastOrganizationInvitation` and/or `lastOrganizationMember` emitted events, these properties have been removed, as they were only relevant for internal use. We are not providing a way to backfill this functionality at the moment. If you are using it and this is an issue for you, please [reach out to Clerk support](https://clerk.com/support) and we can find a way to resolve the issue! From 85f47d106b5573d1b31963d21266f2f4a7c44e94 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 11 Jan 2024 23:21:29 -0500 Subject: [PATCH 035/159] fix(upgrade): Implement batching, fix a number of regexes --- packages/upgrade/source/scan.js | 24 +++++++------ .../upgrade/source/util/expandable-list.js | 35 ++++++++++++++++--- .../source/versions/v5/next/import-api-url.md | 2 +- .../versions/v5/next/import-api-version.md | 2 +- .../versions/v5/next/import-clerk-js-url.md | 2 +- .../v5/next/import-clerk-js-version.md | 2 +- .../source/versions/v5/next/import-domain.md | 2 +- .../versions/v5/next/import-is-satellite.md | 2 +- .../versions/v5/next/import-proxy-url.md | 2 +- .../v5/next/import-publishable-key.md | 2 +- .../versions/v5/next/import-secret-key.md | 2 +- .../versions/v5/next/import-sign-in-url.md | 2 +- .../versions/v5/next/import-sign-up-url.md | 2 +- 13 files changed, 56 insertions(+), 25 deletions(-) diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index d6a61e5b5d9..964c8b3b8fa 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -69,6 +69,7 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { // useEffect(() => { if (!matchers || !files) return; + const allResults = {}; Promise.all( // first we read all the files @@ -76,21 +77,22 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { const content = await fs.readFile(file, 'utf8'); // then we run each of the matchers against the file contents - // TODO: combine results on the same match, add multiple file/positions for (const sdk in matchers) { + // returns [{ ...matcher, instances: [{sdk, file, position}] }] matchers[sdk].map(matcher => { - const matches = content.matchAll(matcher.matcher); - if (!matches) return; + // run regex against file content, return array of matches + const matches = Array.from(content.matchAll(matcher.matcher)); + if (matches.length < 1) return; - Array.from(matches).map(match => { - // TODO: index should be converted to line/col - results.push({ + // for each match, add to `instances` array of a key, create if not exists + matches.map(match => { + if (!allResults[matcher.title]) allResults[matcher.title] = { instances: [], ...matcher }; + + allResults[matcher.title].instances.push({ sdk, - file, - position: indexToPosition(content, match.index), - ...matcher, + file: path.relative(process.cwd(), file), + position: indexToPosition(content, match.index, { oneBased: true }), }); - setResults(results); }); }); } @@ -100,6 +102,8 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { }), ) .then(() => { + setResults([...results, ...Object.keys(allResults).map(k => allResults[k])]); + setComplete(true); if (results.length < 1) { setStatus('It looks like you have nothing you need to change, upgrade away!'); diff --git a/packages/upgrade/source/util/expandable-list.js b/packages/upgrade/source/util/expandable-list.js index 4b51ae3b79f..0afa589dd81 100644 --- a/packages/upgrade/source/util/expandable-list.js +++ b/packages/upgrade/source/util/expandable-list.js @@ -51,24 +51,50 @@ export default function ExpandableList({ items, numberVisible = 10 }) { {state.all.reduce((memo, item, idx) => { if (idx < state.visible[0] || idx >= state.visible[1]) return memo; - const loc = `${item.file}:${item.position.line}:${item.position.column}`; + const locations = item.instances.map( + instance => `${instance.file}:${instance.position.line}:${instance.position.column}`, + ); + memo.push( {item.title} - Location: {loc} + {locations.length > 1 ? ( + Found {locations.length} instances, expand for detail + ) : ( + Location: {locations[0]} + )} {item.expanded && ( <> + + + {locations.length > 1 && ( + <> + Locations: + {locations.map(loc => ( + + {' '}- {loc} + + ))} + + )} + {/* changed in {item.sdk} SDK */} {item.content} + - See in migration guide » + Open in migration guide » )} @@ -153,6 +179,7 @@ function reducer(state, action) { } return item; }); + console.log(''); // this is strange but seems to solve a rendering bug return { all, visible: state.visible, numberVisible: state.numberVisible }; } } diff --git a/packages/upgrade/source/versions/v5/next/import-api-url.md b/packages/upgrade/source/versions/v5/next/import-api-url.md index 89f159cdd4f..26a8abcc7de 100644 --- a/packages/upgrade/source/versions/v5/next/import-api-url.md +++ b/packages/upgrade/source/versions/v5/next/import-api-url.md @@ -1,6 +1,6 @@ --- title: '`API_URL` constant removed' -matcher: "API_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?API_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-api-version.md b/packages/upgrade/source/versions/v5/next/import-api-version.md index ccc269a00d1..7415621c2e7 100644 --- a/packages/upgrade/source/versions/v5/next/import-api-version.md +++ b/packages/upgrade/source/versions/v5/next/import-api-version.md @@ -1,6 +1,6 @@ --- title: '`API_VERSION` constant removed' -matcher: "API_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?API_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md b/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md index c468b465387..b39d29ca841 100644 --- a/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md +++ b/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md @@ -1,6 +1,6 @@ --- title: '`CLERK_JS_URL` constant removed' -matcher: "CLERK_JS_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?CLERK_JS_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md b/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md index ce3fd5433a8..167cab1fc81 100644 --- a/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md +++ b/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md @@ -1,6 +1,6 @@ --- title: '`CLERK_JS_VERSION` constant removed' -matcher: "CLERK_JS_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?CLERK_JS_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-domain.md b/packages/upgrade/source/versions/v5/next/import-domain.md index 729cb7d101e..31ccd8d8a91 100644 --- a/packages/upgrade/source/versions/v5/next/import-domain.md +++ b/packages/upgrade/source/versions/v5/next/import-domain.md @@ -1,6 +1,6 @@ --- title: '`DOMAIN` constant removed' -matcher: "DOMAIN[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?DOMAIN[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-is-satellite.md b/packages/upgrade/source/versions/v5/next/import-is-satellite.md index d3faef1f0e2..c6a14ab4661 100644 --- a/packages/upgrade/source/versions/v5/next/import-is-satellite.md +++ b/packages/upgrade/source/versions/v5/next/import-is-satellite.md @@ -1,6 +1,6 @@ --- title: '`IS_SATELLITE` constant removed' -matcher: "IS_SATELLITE[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?IS_SATELLITE[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-proxy-url.md b/packages/upgrade/source/versions/v5/next/import-proxy-url.md index 5cff14915ed..ab5854c1ac1 100644 --- a/packages/upgrade/source/versions/v5/next/import-proxy-url.md +++ b/packages/upgrade/source/versions/v5/next/import-proxy-url.md @@ -1,6 +1,6 @@ --- title: '`PROXY_URL` constant removed' -matcher: "PROXY_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?PROXY_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-publishable-key.md b/packages/upgrade/source/versions/v5/next/import-publishable-key.md index 4b8cee827ec..cfb9070155e 100644 --- a/packages/upgrade/source/versions/v5/next/import-publishable-key.md +++ b/packages/upgrade/source/versions/v5/next/import-publishable-key.md @@ -1,6 +1,6 @@ --- title: '`PUBLISHABLE_KEY` constant removed' -matcher: "PUBLISHABLE_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?PUBLISHABLE_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-secret-key.md b/packages/upgrade/source/versions/v5/next/import-secret-key.md index cfc34e999af..c51bcd53762 100644 --- a/packages/upgrade/source/versions/v5/next/import-secret-key.md +++ b/packages/upgrade/source/versions/v5/next/import-secret-key.md @@ -1,6 +1,6 @@ --- title: '`SECRET_KEY` constant removed' -matcher: "SECRET_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?SECRET_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-sign-in-url.md b/packages/upgrade/source/versions/v5/next/import-sign-in-url.md index 5df3f1eff73..59f3575ff55 100644 --- a/packages/upgrade/source/versions/v5/next/import-sign-in-url.md +++ b/packages/upgrade/source/versions/v5/next/import-sign-in-url.md @@ -1,6 +1,6 @@ --- title: '`SIGN_IN_URL` constant removed' -matcher: "SIGN_IN_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?SIGN_IN_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-sign-up-url.md b/packages/upgrade/source/versions/v5/next/import-sign-up-url.md index 6862becc922..cf92e5ff240 100644 --- a/packages/upgrade/source/versions/v5/next/import-sign-up-url.md +++ b/packages/upgrade/source/versions/v5/next/import-sign-up-url.md @@ -1,6 +1,6 @@ --- title: '`SIGN_UP_URL` constant removed' -matcher: "SIGN_UP_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?SIGN_UP_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_SIGN_UP_URL` environment variable and using this instead. From 7c4ad9b4cb5ea2342b7297af6e7c355541a9f4b8 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 12:08:39 -0500 Subject: [PATCH 036/159] chore(upgrade): Add separators --- .../upgrade/source/util/expandable-list.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/upgrade/source/util/expandable-list.js b/packages/upgrade/source/util/expandable-list.js index 0afa589dd81..eb4a2782e5c 100644 --- a/packages/upgrade/source/util/expandable-list.js +++ b/packages/upgrade/source/util/expandable-list.js @@ -71,12 +71,7 @@ export default function ExpandableList({ items, numberVisible = 10 }) { )} {item.expanded && ( <> - + {locations.length > 1 && ( <> @@ -92,7 +87,7 @@ export default function ExpandableList({ items, numberVisible = 10 }) { {/* changed in {item.sdk} SDK */} {item.content} - + Open in migration guide » @@ -112,6 +107,15 @@ export default function ExpandableList({ items, numberVisible = 10 }) { ); } +const Line = () => ( + +); + // I'd like to recognize that this logic is kinda crazy, but it works 💖 function reducer(state, action) { if (action.type === 'focus-next-option') { From d919d40e803758dc5416f3cc795d9bf1e7c140d4 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 12:09:18 -0500 Subject: [PATCH 037/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 414da2008f8..f4671dab82c 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.0.2", + "version": "0.0.3", "license": "MIT", "type": "module", "bin": "dist/cli.js", From bee3cbcf95c5821f696c3ecfe5c13752665c7019 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 12:51:31 -0500 Subject: [PATCH 038/159] fix(upgrade): Patch a small text output error --- packages/upgrade/source/scan.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index 964c8b3b8fa..49844e56759 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -105,7 +105,7 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { setResults([...results, ...Object.keys(allResults).map(k => allResults[k])]); setComplete(true); - if (results.length < 1) { + if (allResults.length < 1) { setStatus('It looks like you have nothing you need to change, upgrade away!'); } else { setStatus('File scan complete. See results below!'); From ea7550ef283f811cc9fa738d46590893ee1b6a35 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 13:11:33 -0500 Subject: [PATCH 039/159] fix(upgrade): Result text fix for real, handle if no package.json found --- packages/upgrade/source/scan.js | 2 +- packages/upgrade/source/util/guess-framework.js | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index 49844e56759..070913fb214 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -105,7 +105,7 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { setResults([...results, ...Object.keys(allResults).map(k => allResults[k])]); setComplete(true); - if (allResults.length < 1) { + if (Object.keys(allResults).length < 1) { setStatus('It looks like you have nothing you need to change, upgrade away!'); } else { setStatus('File scan complete. See results below!'); diff --git a/packages/upgrade/source/util/guess-framework.js b/packages/upgrade/source/util/guess-framework.js index 63e2d81375b..0acfe4513ef 100644 --- a/packages/upgrade/source/util/guess-framework.js +++ b/packages/upgrade/source/util/guess-framework.js @@ -2,7 +2,12 @@ import { readPackageSync } from 'read-pkg'; import SDKS from '../constants/sdks.js'; export default function guessFrameworks(dir) { - const pkg = readPackageSync({ cwd: dir }); + let pkg; + try { + pkg = readPackageSync({ cwd: dir }); + } catch (err) { + return []; + } // no guessing if there are no deps if (!pkg.dependencies && !pkg.devDependencies) return []; From 1183079c311e049668c3dc3fd853486e3acaba79 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 14:46:03 -0500 Subject: [PATCH 040/159] fix(upgrade): Fix regex, add organization settings change from retheme --- .../source/util/generate-export-change.js | 28 +++++++++++++++++++ .../v5/backend/createclerkclient-apikey.md | 2 +- .../v5/common/organizationprofile-settings.md | 11 ++++++++ packages/upgrade/source/versions/v5/index.js | 4 +++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 packages/upgrade/source/util/generate-export-change.js create mode 100644 packages/upgrade/source/versions/v5/common/organizationprofile-settings.md diff --git a/packages/upgrade/source/util/generate-export-change.js b/packages/upgrade/source/util/generate-export-change.js new file mode 100644 index 00000000000..9ddcbcd65d3 --- /dev/null +++ b/packages/upgrade/source/util/generate-export-change.js @@ -0,0 +1,28 @@ +import fs from 'fs'; +import path from 'path'; + +// WIP, a util script used for quickly generating a large number of nearly identical change files +const movedToServer = [ + 'MultisessionAppSupport', + 'auth', + 'currentUser', + 'authMiddleware', // deprecated + 'clerkMiddleware', // new + 'redirectToSignIn', + 'redirectToSignUp', + 'buildClerkProps', + 'verifyToken', + 'isClerkAPIResponseError', + 'isEmailLinkError', + 'isKnownError', + 'isMetamaskError', + 'EmailLinkErrorCode', + 'withClerk', + 'withSession', + 'withUser', + 'WithClerk', + 'WithSession', + 'WithUser', +]; + +const clerkBackendExports = ['createClerkClient', 'verifyToken']; diff --git a/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md index ec02fae412e..fd6f0051fbd 100644 --- a/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md @@ -1,6 +1,6 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkClient' -matcher: "[createClerkClient|Clerk]\\(\\s*{[\\s\\S]*?frontendApi:[\\s\\S]*?\\)" +matcher: "(?:createClerkClient|Clerk)\\(\\s*{[\\s\\S]*?frontendApi:[\\s\\S]*?\\)" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md b/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md new file mode 100644 index 00000000000..ca5a20b85f4 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md @@ -0,0 +1,11 @@ +--- +title: '`Settings` -> `General` tab in `OrganizationProfile`' +matcher: '` component has been renamed to "General". If you are linking directly to `/organization-settings` from anywhere, the link will need to be updated to `/organization-general`. + +If you are [customizing the component](https://clerk.com/docs/components/customization/organization-profile) by re-ordering the pages, the label used to target this page must be changed from `settings` to `general` as well. + +If you are using the [appearance prop](https://clerk.com/docs/components/customization/overview) to customize the appearance of the `` component, please note that the `cl-profilePage__organizationSettings` key has also been changed to `cl-profilePage__organizationGeneral` to be consistent with the naming change. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 441659bd92c..91dafae6187 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -20,6 +20,7 @@ const reactChangesList = [ 'useorganization-membershiplist', 'useorganizations', 'userprofile-prop', + 'organizationprofile-settings', ]; export default { @@ -56,6 +57,7 @@ export default { 'usemagiclink', 'magiclinkerrorcode', 'setsession', + 'organizationprofile-settings', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -80,6 +82,7 @@ export default { 'usemagiclink', 'magiclinkerrorcode', 'setsession', + 'organizationprofile-settings', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -134,6 +137,7 @@ export default { 'user-createexternalaccount-redirecturl', // maybe shared with all? 'signup-attemptweb3walletverification-generatedsignature', 'redirecttohome', + 'organizationprofile-settings', ]), shared: load('shared', [ 'magiclinkerror', From 194175cf915295cc5746a255337655e83e119e89 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 15:39:52 -0500 Subject: [PATCH 041/159] chore(upgrade): Add security in userprofile change, images --- .../source/img/organizationprofile-settings.png | Bin 0 -> 98431 bytes .../upgrade/source/img/userprofile-security.png | Bin 0 -> 60983 bytes .../v5/common/organizationprofile-settings.md | 1 + .../versions/v5/common/userprofile-security.md | 8 ++++++++ packages/upgrade/source/versions/v5/index.js | 4 ++++ 5 files changed, 13 insertions(+) create mode 100644 packages/upgrade/source/img/organizationprofile-settings.png create mode 100644 packages/upgrade/source/img/userprofile-security.png create mode 100644 packages/upgrade/source/versions/v5/common/userprofile-security.md diff --git a/packages/upgrade/source/img/organizationprofile-settings.png b/packages/upgrade/source/img/organizationprofile-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..a7fe954110384f866affc0f0bbff0831743f85f7 GIT binary patch literal 98431 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ȏd}~j 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�DDu2)>AeM*k^M8JY8j$7800+Wnx^ej~ zoYEJK^7~A6@|b;FBb}M-NnTVVo%njzG0E?4v}^ki)d#x$X`wm5r0F<%?NY(++_If+ z=`{R$%rQNqj(y6|lM7#N#Jjuf@@ip1Vb?}MTOB>iJ>Z()Nf5S?J4$j=@~KwHa_1^( zN(=t+1zi#b1cGpXbPYziG#KS}ekaO-j@v)qAx?4X#doEjpk7xoY6ClgSQ4ZaM(=gX zb6C{b=ILDy6eBK0DQK{`^|tJe9_-(i1VP3Mfpeq%F2VXLKq`Bzjojf6l=xn9YWfw% zwq4?sRY>6e&{A8o76(CyiOJ$%kuEbLL3kGHf7p!E&3=5 zmjB#o8<3SXjqi#jA%cCX5H{b$h3pJptWp%tGCpbaC7xiiVd$C|&F-p5o006f7k zVpW|{7Yejzs%k+a4CHp+R>ZHEJ7S)^5}R zUZV}7N~B}myIZyRba+wA{VQOTl$5-E|EPCDc?Xp5+;PNPV}*YtD=#=6on)Bh|{I@9?$X*!kwEOJH5zz(y4F+G$AU(F#@og zo#`lB27c9}GDcyse4=jQ^=Osp2fRwr!oBqN7#Q3Hch2@)9RZoOvn|Q96pk#IF?E|k z&X0np5T6~BlYQxJLmD8d((@zu-64> z7;#zFxiOrk>9cV?>`tP>7{;rnbHqrO=?@F$Jc0+$z z_4|!VPS?QFe|lK|>0$lqcEcw8U-lyY)5H2d>R~PUJ@ETvK|!cuh6VmRtEQv+LfJg< F{{bmC!KeTL literal 0 HcmV?d00001 diff --git a/packages/upgrade/source/img/userprofile-security.png b/packages/upgrade/source/img/userprofile-security.png new file mode 100644 index 0000000000000000000000000000000000000000..212b7dee9a7fa2c07abf52d2eb9d97d77afa6e95 GIT binary patch literal 60983 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 $EcG4B57XsK3m*e+TT4xz!DrMu&@Oql}LT_e_ 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 PYmTX0R#z;LM?L&M*_J$# literal 0 HcmV?d00001 diff --git a/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md b/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md index ca5a20b85f4..20305e10bea 100644 --- a/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md +++ b/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md @@ -2,6 +2,7 @@ title: '`Settings` -> `General` tab in `OrganizationProfile`' matcher: '` component has been renamed to "General". If you are linking directly to `/organization-settings` from anywhere, the link will need to be updated to `/organization-general`. diff --git a/packages/upgrade/source/versions/v5/common/userprofile-security.md b/packages/upgrade/source/versions/v5/common/userprofile-security.md new file mode 100644 index 00000000000..f7ea7db7066 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/userprofile-security.md @@ -0,0 +1,8 @@ +--- +title: 'Within ``, Account and Security Pages Separated' +matcher: '(?:` component (which is also rendered by ``), the "Account" and "Security" pages now live within their own tabs. Previously, "Security" was a section within the "Account" tab. The "Security" page can now be directly linked to under the `/security` path if desired. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 91dafae6187..1950b822a59 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -21,6 +21,7 @@ const reactChangesList = [ 'useorganizations', 'userprofile-prop', 'organizationprofile-settings', + 'userprofile-security', ]; export default { @@ -58,6 +59,7 @@ export default { 'magiclinkerrorcode', 'setsession', 'organizationprofile-settings', + 'userprofile-security', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -83,6 +85,7 @@ export default { 'magiclinkerrorcode', 'setsession', 'organizationprofile-settings', + 'userprofile-security', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -138,6 +141,7 @@ export default { 'signup-attemptweb3walletverification-generatedsignature', 'redirecttohome', 'organizationprofile-settings', + 'userprofile-security', ]), shared: load('shared', [ 'magiclinkerror', From f9cf8baa25d476728398d4ad2adda43a598e5433 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 15:46:23 -0500 Subject: [PATCH 042/159] chore(upgrade): Add mfa dropdown change --- packages/upgrade/source/img/mfa-dropdown.png | Bin 0 -> 36038 bytes .../source/versions/v5/common/mfa-dropdown.md | 10 ++++++++++ packages/upgrade/source/versions/v5/index.js | 4 ++++ 3 files changed, 14 insertions(+) create mode 100644 packages/upgrade/source/img/mfa-dropdown.png create mode 100644 packages/upgrade/source/versions/v5/common/mfa-dropdown.md diff --git a/packages/upgrade/source/img/mfa-dropdown.png b/packages/upgrade/source/img/mfa-dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa70fd98710ef77859833b4860ffc3671a30b2a GIT binary patch literal 36038 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, Multi-Factor Auth is Added via Dropdown' +matcher: '(?:` component (which is also rendered by ``), adding a multi-factor auth (MFA) method is now rendered as a dropdown instead of a modal. If you were relying on the modal for any sort of customizations, these customizations will need to be adjusted to the new form factor. + +Two new appearance prop keys were added to aid with this process: `cl-menuList__mfa` for styling the list of MFA factors, and `cl-menuItem__mfa` for styling individual items. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 1950b822a59..8dd79aad606 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -22,6 +22,7 @@ const reactChangesList = [ 'userprofile-prop', 'organizationprofile-settings', 'userprofile-security', + 'mfa-dropdown', ]; export default { @@ -60,6 +61,7 @@ export default { 'setsession', 'organizationprofile-settings', 'userprofile-security', + 'mfa-dropdown', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -86,6 +88,7 @@ export default { 'setsession', 'organizationprofile-settings', 'userprofile-security', + 'mfa-dropdown', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -142,6 +145,7 @@ export default { 'redirecttohome', 'organizationprofile-settings', 'userprofile-security', + 'mfa-dropdown', ]), shared: load('shared', [ 'magiclinkerror', From 89d76dd6d4062ebfb42db7d7d795236f0d73c5d0 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 15:58:02 -0500 Subject: [PATCH 043/159] chore(upgrade): Add connected accounts and web3 dropdown change --- .../source/img/connected-accounts-dropdown.png | Bin 0 -> 55749 bytes .../v5/common/connected-accounts-dropdown.md | 15 +++++++++++++++ packages/upgrade/source/versions/v5/index.js | 4 ++++ 3 files changed, 19 insertions(+) create mode 100644 packages/upgrade/source/img/connected-accounts-dropdown.png create mode 100644 packages/upgrade/source/versions/v5/common/connected-accounts-dropdown.md diff --git a/packages/upgrade/source/img/connected-accounts-dropdown.png b/packages/upgrade/source/img/connected-accounts-dropdown.png new file mode 100644 index 0000000000000000000000000000000000000000..a280d13b8cf06e33805bba0d73cc34dbb1800e33 GIT binary patch literal 55749 zcmeFZXHZsI*DVSv25ehx5fu~@C@4WdKt#ZZK1z^`L=^$aN)8elQ>z38Bqt?jk(>=J zK|n;3@Q@VANpglW7Si9_Z=JeT_x!kjZXK$+8sTB@wb!0u%rVDYk1k7}-$2hqPeVhq zfpX!j91RVf1q}`Dm$j?$6UoIh`|!VYw=P^Ur=ekFBmdD-dQ zwqa1D77uHkW~cq*^tQDtXnXRlH`A^9`@xMG3B`Xrxs}b^9VMd7(QE;2aS&(|Mdx)H|8~;>3)6h zeEOZ%%Lm-czhGFsaK&`R@;}(uuI*m_{^Z_M8~(Ei|62UL*dH$1oe9bH%a1@4!cS+h z>%Sg;=f9R3_Mbcb@qh1h|NrCNTfu73&3NO{qeq7n;}}l;+}A%hJvuX1EyG6HdRVFE z%tle~%Kg7y@X1qKuNHpq>e8dnn7PrM+s)1RNFw+wq%1UW3a;r8>&X2nO;c-Xtktg16%t8hoAD??h{J!gWcLvp@tZVa&J>SiL zt&pA`&$3B;e#|S!dT5ZL+_)t#8!M7bmI^pZS-Ix-nvOExQM13!eW^=S8}AG>?X3`M zt%*~NAF)5i9yS%UWYW$q#MVt5pSZczetvOAD%oM`+rx{Jk~J;)_LePh8zcK(=fU{%!^+-IpYEX?QceoG=*_;Da@?xl@Aute2>}9z zy*YhJ@;zT7Q}bASxi#d@p1t=nJbddPf4t1G?2D6dW4bco6;bBP!|V{R5c^WMA|U%j zlyTlf{rt!0hsir*jg|E0Gby$k>y`~ZcKdW`X(|1N4T|p{Y*2iCqm;AQ=jqchJYILG z(*keO!-3-+N_KWR3k$QRyM)co>U{K;t&WmvE~s}uk*}K+By2A6?Af!&j~>Z3=UCQa z`E;vnCMqvliG}Lx>*w712BWx9>Pi3m@1HCJMWV;rNs{_C#hGxy}QP8ut_*`mIPxOnv!Ql<$>zfebu~2#hLpPUS4U3ef##g8lOIMCJ|fsdSZZDAM2E9(wuPKgT=B}-015O?ZD~LF12l( zDpwQbA|J~y?%>x|sjjZp2vIwI+GRX8I>bzPu)tw9=R{Hk-c^E!_(E1$K}DcY<^paP zHL%;Rd#^9Galw^Ew6SNqVO>IsplM5!J~b?CPhU-}e6xFnLAq+IhU}Ps*-;-@T6O96?)_7fpiwpA_69d)J9^=V{3uaWIgQ1mL zj?*8$M(I_Ca8KsijT>kOYUbPdH};D^DfZZ%DK^<;Ee*(IGh;pNX2f*J zHN@tAp7C`c77`+A-y7~B#;2Jot|epCTA(4+Y~h79cGWO$+ZHVwE}@S<0u5IrNT1{(F@$`V@fwQ&!3JF0{_ zO!!w>e|>eWw>I9FL;)_e(Rx|#1g~0zkhgQS+8Neqc2d%RH;5m!)+Wn z>gLb3w{dEjNp%TV+8G!Uu_f+1h4;ziO}5xGiQ1*zmV#R(;uZCFSB0zQ*`#C`Q+16D z7qdV12zW)nQF`HfLXCG_T*iLB-x%*OJJFb;{jgxB_wfF17AB^+EeEAbT3fZ`2E{_* zk+ML0tQ3Tk8rX7hQgNmDVuF~%%mq)o@!m*8zlNLfs_Ah(WzMf&9l`EPj`!A9Ba8?b z)^Ua>IxQ}!7Tn2Z)#)?;5+%jF|FQ$sI8(p>Ysw+{DAx>=<~Y4jhq_}!8^xwh%7~78 zk22HKID70Au_9L~8@dKtd85{UXWjPT0O4zF>u{Xr7)tJD6Mf zRar&FZ~Wc;^-&YZ*M2OtTJVu7tEr#YWkL9R?cH>r9$+uH;(w={oer zMytE;Myz`A1CZck)pyg~P3fu?r8xzf4_!;2v&K@q4rDj_&hH=8x-)$L^y$-*12BPF zL=J<5MOe7Wq=46)u`^4z=V{RR$YUqeE=Iuaj>DcF~7tG4Wo%C*ivN z1CIFp8Df%(iK?|VlP?~!ds z_qFH&N`R1Qh*kgB7XTsMMa-s0)9Kc%F`WAOttiK#$k-&w-$D3Kp%$AniE5dG;|Nzd zVvBR;;mNs%�ApCV2oIIh_H9lF7vPi_8GFcu$2z?<|Y>>Ld~A+Lw3j{c7W{uTJg0 z^YfJ8`QMge)z4%aj{V!OrK^s1M#sD`P+zLB-j zgDTctAAWwLZ?SP*g1^}Gk1d()73D~)QuUU#af;lTPaZ$!^O+oMjvs8!?HlWh`{Gc5a*v>TeIf7^NN zG9cj5{LTUF#j({d*kVyBMU9smoXwR>)s?#c-~m(U-6W0NI0TTK4j(lHz=P@f)dz|r zmmyw1-GxQnPpIK;)F`Akr0RKWp8CW+`zYw$yLSxRw|AR~%;tQ+W1446A(=kjdbo2e zCz>`Eh${C^bF*JRztH~u`^Tr+J@j&%W^YsL9|82HoNq64M|kn8OJxdV9cV4oYRRq_FqrSO$x=Xjoyz5gfvuWN77>38}kFkIc#l?Z2N)eOP=_n?sRC(7L@kG~`FYx;W z7Tg~g?TKaNQf1$_@AUd@+%?;@?p!-$z8UZ9N~*3t0=g;|o>aInb7v>V(qh@m=Tci% z6_ARedPYWk-diUWnLO68KB>1cJ-)Lt6nFBwv1RMl$ivD>S^f5idfM5@f5JOn*P{d} zRarocPq!Y@^mR&5il2ZL!Ev@zslL{)Dp|%EXZx5K7$UI!S-YsEUI)nsk)Rwr%LSg{ zRRORJjci}@`_7VytWUurdi0%e$@s=Xr$TOxoCxv7Ie8JQ{?GC7 zxM?>pqIbHk);iAu5A1hN3cIfLnu4yF?}uk-^K=eoqFkNzsS zFEdPCTC7W}=nE~0X>N#?*{wZ~cqF7VA>5d6pBW_;7=^cBINDiZP#gE0m4lV_@3E|z z2OF5xCl)(=wOnAWP z-B+*WWZ57jRG)C>;qOHw$n_e7i+#z3OBc5v%CA3`+2kmOn!=QG_X(TNIt`4)BijqU za~~OsG3)r)+geyyFx|<_rB%>m;{Z4qRr>vxJ-&XwRBkbgJLc&-0G%HPcCWUgW*Ao| zX0{k4O!hZad(#0&>1o>{&`EnGaH(fq2BthxH?Y!vx|Gq|Cjt?<2P?5^>;!)B3JndN zo12r|;W6Q0JsTVHcw&ZPGS6=^JGYJsozq-%-aC~K{ z>kfW~ojViS+OCfG)yu@j#ztAquA>7uQHYY<5$d*eX^R+)qh9(UA4Oe_m#NDaS=jdi zkl7BIj(}ncsqNyF661<@JE^10m6eoqU6^X$7%lk;?p2kx&}f*f|KaggvaJBW@o>MJ zZEyaJ)5y&bG;X}n>r^Q^+5Ldoquh*2X#Dp6VW7K4wDc}*VQy||#F;Mu z5w)p$GR+p%Ql5NCeFz(t6a80^wl5hsrd4TJH%At^G4~;e*T9VQB=6P2jpT!y@!~W{ zQ8BTbkueH5q!&+8i+iQR{da2c&oU+4zJ0qFg$}@a#A}_hUi^Uooy4w=&VXiz$>soY zr-Ek`YP>QJ($NLr)oPRoX*R>xwW+Xzc)X_~I}@?c$V-cBT4+(_nVj7-Cl3*++jw3C^CM+C@Fl zP*hN%G4WzvaABcydJ2wy)PBN9D(G01f^}UK%tbX-*A3>>Rnytk746Tj*E?RXW!=k+ zIFBXkqljQSdh@A#D?BdoN~#2MN*V~FCii5-kQscmHq%rq+F=zPo&Ma^aAU4@vO!%! zPmN<&u(bi+07wvld={9aPMOaRuNa+rxV?a7uR`?vM1O;PprEl_nGcs+eSdPk_pD(C z;x7Tnv56O-A0nC9YN#a<(M34DYiyK*qLFJ=i!fY^+9%o(6?!D8N88iO`L6CtzVGI6 zg|686#B`8k&@oxmA-AU|g%Gbv<(gsInuKB`cNg=L!JSl^yRNN0nn3UJ!QgrAb=f<2 z^5o>@rMy_*_M-qgj+aBc9*>)Tv+8ucroC~7%Qs&hEhQAJo}QixFHX~eO*#YEH2Ezi ze?J$O6wp86YOY=lL!!~4&#-M2I(AG2+4MI3ryT8c)#rYG>`y+tgu~@D4E|{uA=at-B^JNCu1-;pRUSK>wqI%nc!D;!zT#o1fohkW2Un+fQ^lf+lR%{IyF{X}E%DeWle=jJZKYkTSd`QJxbGi-{GpI*WemjI)d0J?WzqkY z7o-qR;X^_z^Xv^HWI4mNC3f*KW91jL4Ss!1yEEl1e|!1D)TJE)dq>+3F8|<-d6eh+ z{{tS}<=>am%U`#AnXo;3mTph}`CnZ9zq#!Hd#C?D?%uwW=#23B=1gwX@SlC8ui^PP z^Je&WF4aq(ADb306u55qWg=MttA0$_o~fr! zb%AXL<~oDLIa5vT{;SP3D1NgkpPFkll{+2#!=Ej8Pn3lWy5IfyZtih-uP<%Gy+yiv z%fGPkEj+tH<3_J>@_t5kRaRm$&)AMRHbB1(M)4_yA{>P$EOpV zQ}A&UYLa^P_YAJRd*2$XHN4ho&Ok=XG)6kchZ@FDn0LBTGnfPnvWyR3c^yH`02!8P z?6f$aNzFjw%rP$O-??H%Q{|3;hQfow#w*DtzmcbvljuySHK+&--6x+JR?6uYsOX$g zzSwBI+!NjXw)IB>?Sn08MY42!ggimj1 zj`!=B>WdnGV^T%m&&YMD)MG^dtnes^I|Cqg&j^rQs6i?@{0{3#{u~3D*oR(`>Z_}N zI!=9C1L~i(nzI@A>qb_jU%U1)Lc984eek_|t3U%@M29I3jKm?OgzhT6R)h53rfl=a z?(Ry@4=E}nstR~`_&>+OQIB$niD@FPD@R^@o|j?z>p`bNh-v$6HT~|WWJ8%T(|&9c zbcc=VG!b%PveZU=wx3_y7DnV>S2R94T77Tb7T0lJW%1L5La<^{1 zGRYg30CU))vpW!m&^tjjRrcr8Q7CkDAXySzy%Jg-Q_fn`eSk$QC?fry1yc*1oCHjoj+Kdl{F6s=Myp35!{|!%1X8mhC{ONL(lj6t zCEa#Z7mbgG*!iE|-s4VzvI}oDQ3SBq{@DEC!-pO;3M>s40a-18T8`&C0&8#BbzC92 zU?y%@)xf|Ys_Q1t-o2+XTkPV&jds>pb${MVAabk2WN?{wSKW&<51TS{CNu&28;q%d zP)!-g-#Nx08y-_LfFv@F!Qh)vxi#~;Gq_UCOUl7{4Q3>Q5?yxc0WhPt;l;-^=I39P z_CN88iD6%MZL11_PhR|uSpof@4+sl47zYltu2JSz&uYV!%BMh-WgF)X=JYjXEcr~^ zhJ}g4OWFDS!t3N0f!ikL2IhZj1|_GREfpxpG8r!${s1r~5^PI=rWV+P&E=#OBR18x zlJFKH)`K-_rujNX)}s|df$m(CXqiw1qkPw^gYn4)aWLjS>|p@Eo_lY7G7kme#=Br) z#!$YMScQ+832)s&selMvsSh#_v z>k4&B0&hwo1y4GnpV1JANb+U-geix;rk{T!FmXuVyy)}~uc8qwS@P6(yn#4W<~j2d zRKi<v`W)U>4MQLBEH`MJ@` z2C-kgGnx@;=d*DC=dei)-5yn*gh@)neV_UqCrROG!hLWG8GZfSA&8Dr4z+kJ9$4>o zdlAJGp~>|R+ARkpZ}|_~6LK3(08;s)k7Z<#s`J*WudafjJUv!E+C54pG->mG33k+k zP7Bk~!!{G3G*~GsSO0c|&fGZQsQ$|(9vpbQZ1h&KSf3TzHPQok$+cxXg$ZD13_%HC z-zA>z__e8YGAHW-!(v9(_YCrd<@QgR<_LH>o0J(op)@xQSr4@`hDtei66&GI44Amg z7%kWJ=OiR@jN;KU*!;N}JkGEknCK>!R1g|u)dVP4N6W;+kS|gwyeo1D(MZh%zgaYb z+R>ufvc3mFOG4K)S~|FCiPxkGS_6-paGEx}{?H+q!P!M9H3I=cq3Wo5_6YFdr$ zVp2E5Wd2~f$h*eE&~TEP9-}D9WsqH&k$?MjU#UM|pO-w!P640AnLZw*qqq8jB7<3H za2vk-iE0^fVJY<>~E09wvKMJKj+h)eChT2&V|aLl~2ZQR=;g%>GEZk zS1)jM%KR?Oe1oxnWeyS=ccv}cM?sqLS5l+!wiV))xO^Q>%)6>`GJ0f`85N=!7hGC( zrUSpB`3Hma0GGN!zK4~;BGI5M(Jw!Tq}Fi!A2VYVut+w`Eo+L^==wdtCEIgs_^s=s zwAWi|n(g;#mCx43!hFo0ct}O*^~aa-^$Y}QBk`6u_jS9olg@x9htI|g~fzE ztueK-D1F?tCg$02Bbvd@EZ~xj;;Yp1?JN~z<<6l2S&M1{+mrmTZyn&vIBGPIi}7|7 z{jpfLZhWE8z5DlV9YWD&21v=vn&tT&9RU*j{3%kFi~gVbTVIz?_&02$tyed9qh_GN zoN0`9n*~)VP9b*ZI55Z|g&2e`wh!amL_CA|+6U-XWjWo9P~n~2vEc7O>(wx;i6EY7 zjI3defarVp&b6hI;io`#|9SVqzh>-qO;?KdZ;ig1R8hQUoBpRi&#?^X4L!1On>kc! zJiD^_;*Xnmu5c(N_!YVC*iRuOj@WE}D(CDRh|MCiRNV^K4zL-_W&U(B#_48g=3igs z04>0^nr6!&&We_$ZUlABQ{#qIw7%*3ws&bL&~7gSjvD&ERgmjRrqVlY74zTOZDTw~;$@ zSTUO}5DkpC>|1}<$jj&tfB#^TN%R}zP3D!9k84YQ-+tuH&Gq#3e7)^U1S*=s@{7Bj z=48QTdi_v;_a>tNy(prxkaqCcEuN$oVq0{~$07SK(jHS8tWOR_Ef`7U2EY~Io{}vP z%=H2qy4|_fA451Rx@Fn6A?h@WF-SW$oA);&)(n&g;ocEI1B4u;sA?)nrg4_8)9xqgoHU54^T-8Xv&BOA@lFV2fag2)aK zu}&H+Ty&&-@sbhiu?Qi3Lfvw|XNiX92)D5^p<=4}b|4-DB7gk2L2?2Kn27abz%JY0 zb|DPKB0V-VF2CFnA1xyzqmal7)dZz0T#RTY92O8z1OZeTe`f!Bry$W7kB!_PkH+-H zdTuija>+5&;`ZvBw995zNTmsrmsC6bXPv$i(U7NhoCz-DWtW}V&BiJ9f&p}A^8-cut3&2 zP%Xv-9SoWn`T(3J#SEZYAQ8}26*_v*)3eF3H0fT#(Tz)(OA zK34pe8bR5TX-xA}i*OGJ{vDG?U_NbZ(4M)(p9(xAb#(T@I)5Lnp9*HvY&q(av{L!? z4sSkf1Nj~W+A3Z-S<@u52L!h}i)gQ)-(d=R2$==*6Ke8O8i9D0p3GK9^Bv{SBk%_X z^E2a7a=!~+yLOGh4(in;R#EseAyEL~>XNmRamB+24oDEImZCj9+ppQv>KxqO=Sg^C z#dxKjXXjaN8^E2u5Cjt}Vr?htw_HFD?LV_kx^w4LX5MM(uP*PWIZ*GQm!)W9lZEaF z0TFmOoq(;q7mbV(2rY9ZQ3>SF{%TH{^TWf#WDRKLfTT%4^EQi1$P9H2QXpkvVZi`V zw`{<1c0ee6=ig{>*8->*1wZkA=4RVl!=aIFb`DFcu#jvy`2a7dJ4XT%zNytaNDX@K z32ZJwAlaZ>mF>!xYRis~TO%VPHht!5d(HecUFwx?e9HRD{NW;I!aTF;kNhZQ;@5SJ zokynatqOk#nO6kNCl~_9>OC6QtY^mbGmY=Fc^yloxv^9>KIibV*11SSqr7It((Tso z$SL^}v~tHOjp9euMt@T4o(INAJwLF@%zQ7l71&;|4vv)wR1*(NB?Os1UnZ)do4E5d zZ~2KcC%4hi3@x!qm(%>@=8XK)#55)cr=G20F%Fo`$th7sVUh+6PWt^|cZtXaiinQ1 zW>i*VKfGi*->>~u@Lk^Iw<5=Vd=E69ZCZF!b)b?_U+la8@L?Y`9l#i9X1Ue8*12Ta z|5X;H$;Y8WcK`*q>K}n0w5tE+zy9k^%bdjj$(`8WaWY=|^(2}< zLdOp*|E;r&^FLKO4Z|P*y2-!UCO>E=bUz{8F8@)RFiCTS75SeP$o}hb4F02O{r3Oj zPD>mRF68`@RK&m3x5>QE)o=Z`o|bmGm|2qCYQ1{v|X%^1r>IDCeaA7AlATON;z3(|U*7F0Y7&j`m;D?|;3?e@nLipYJ4V zL(=x$H5-ZiaMYfihCU1Gjou%nUjMlJ<5dRT`>0XU!EyKnWA9ZH1Zn9|vBZ1#?#;2# zUyeXkcmWZu7P6A{vI8I+BdeTkU{-`?Gy zKKkz6K~Yf+vU;w}rk7|q@)kZcuRU%z7Gsj#!Psn8#szxll;g%?3M3Kw!C}9wBYO)( z>oj+`K=dFr=0ch3R*%{{0tz^iv(z$-st}&pDBUyf936SilzqNh?^k(QzU+{dq zjVGisJlhUQLDPPs{~2quO}pE)$o6e`jM!6mR}&0cWSHS>f&yy9P-W?v7*s(HN~y)y z1_+6t+o16y5qhyohH|8?NXTV%8#_^E)&Q`uQ9$-ozuzdHfYPy}=h&YwA1|-EWeeP8 z+c{-alSHSYJ&#VBHGSvBFDo~m2t!?Q379s8Rln4ejR+PcsjLSM7@!?Q)0n0ojs~s)%ECjk zFYl!c#K?wAZuv;E5741ED`}GUw&dqhC;x6ii|(JyRPt;;(fU4NgIN~uvW@||c`<+kz0J9qWtI25=O^dz zmaFmKVTv6@-LoCv^^lF!sFXV2}nS27Kt6WONt z!oQ?uYy*`Pgha|lVLEcvnaCu)tzOlm`{V#1l|8683QTN(qJX=&0a68Qlnm;`qxm6z zelhlg*~J~VS!2=gn}PZVr70Wblcnr{RLF@dldVpLRI9*j^R8ZqIIO5*y5-yVUobL# zcW<3UTeB>X#!>4*bx^-eV>2k;#!L2lWQo>621Rs{{+eZ__PBkhAzaxr!n9yo0&tCY zd>Xou@xQmoT=3NW6ckG}$(54()G`VZpc{*{vX>_PM0)mZs}9P99Hq02bam!Fr9tyE zxNvb{Hm-08ag+U`q`OhmO_ z=4^_X6yi9ezyFmo9*>aWpe^gsU5$Wpo5-5>OSsi-un5@Pr-((%nvKZMUdKH@7}$n!U2<=4A<|*!`3g(w=R~pwzeKCe765Q z6YbyVuIfYFh#XcA%8LQAG+?b>n0Sp)>z(}+0xLmP#z36C-2p|S7)1^q&Y%BDPU2^i zn4idvl1=yT-(TWSplM;#SrrAA%dUC>d#6v|*o7;VxzXYZLp}VJC&DqXpoD)3B~eUTM}tPjL^t9RJhGU)U+eT930 zSmUG+&KFYun`sX7PIud|A*)CathRkiMjG%ZOy)$)- zvQ%&Y_oD(Y@btdDOM}iLwR#A6N8)K3bZGGGP}jh(Xs*Z+r43e^u-kF!6apB(i!ant zsdY&jeIs)Rq=RDMb%!AVL-||>?lclvh*a6Y3H&Q^&}goLpl@hcpgB$7OSZGkUoS*< zNl^+lh2fV7if05Kgo(Bp1Zxk*H;!hgr5il25`^Qp?G|q-(bPz}et-2w7EX%Y@P}<~ zV(^M6)Lps>C@j@MB6zbxKlC~4K#N_a`A4tG6RfOf2^m6Iyj2#^N+l82AznL082ehk zA}7hHIp;ax<(p^(4^m`PNaW}oJL^&5%^}aQV+RMtZmjBj?aOoPeW_BRVj3v8p0g4$ z55`$4hri0n$+;fFIva+z9G0O`h5Vlnlg@YH<< z4sl{EK~Ku>$SJuZQ7?y+)?j}mUS&eFLV(OUuxPRo;N+Rg@E$)^iS?)6A=23D{Sycn zU(oU(@(hY6Gzsl|S;QgtpFBwBNQek)bHtKhLt8Jp73_vv2U3uq$yJa;Nf5JlM+KUA zddrs8GUhcw`;gKM#zm@Y+onxn2vl0)b3gA!xT+?%+#-gt!G#bzYr7jmt0B&D?LYt( z(OH2PJ&Nklo0IX0>_MaYBL_ZL)|3Sa&PoOh#F#86&YnNt z_eo^vsHp5g3bT+&4a6U86i@<0=q@=aR-%q(3a-z_(XPo=7Qt$74g z{U&;5V!&|KaS-usW`RHves#);s*!|O($B@M_JenT5-5M$dGHFAA&Q8uQj>Y08HiRM z@*l&z1rW)k(Rln;8;y*#9XrB}jT|Q@C*nWNp4QEu?_ct7j*tvKUc0s%662JUt)CT= z)EiX9%zpg!>_xyXQ01Q9!^U^eC<|(Qvh{Ej9D)PE;@h`x@LY4dv!BFX8Oehe<@5*+ zcAVIe0A$8XXS{2d*qyH`8FUv(M1S+<4QKI>4JZnT0*LTz95F z?BUVjHhCi2Z01VodUPwwEkD;P_N+c|ZY9l+`;fxQl15g9Yt9(da)&hYvh)KnB2$r8 zU|7!`ENZW$7^lFSZxTvNB{K!zzs?cG*Z!N#Q1%ZM%zhd>H;m-JG_@dCIVPIG;~jxsuR zZXM@$JJjerdIW=uhn$#Z*cqMHxT9s-2Q$xT5RGJ5%$_L zgryfAfWvqcw~rRtn}li@nWy^(lE}lzqiJMEim5%xX>jqh0!UM<<&VfoOvHsFxEK-( zsVDk9&fNH5drYMPg0UYzu8MSt_id74m;-jK8&Hl6a~agcynt>_gzklL!Q99t?P(Z- zrCqNc)azs@!_{0J8TLGFGnogIS$qH9y<@u;0X8mPxbT#fj*d>)VRJBi@CLsxhkOyc zo6byKjIwv`Ua_LevGBsjl zEV^R?H$T7Wuw6;>RDR(PgfR;O-HS#xiqBn*+tzmzo(PjRu&$iqFgC2)IDJjz0)6t!6zk`8Elg0&P zbD~T}ft3Vw*ITD%s)%Yr5n|NlTkkha3vOFM6V^SPsdama*l05Z%om`uM4rEfjV{&C z^*SgMU~&>&2S@D&$9=A3o{Hn9u9j&Qa9_)IEBCK!cnZ;n!?;sGqxSXdN8t@5%fa%5 zG&47P7oZA~?h-;D9KLl4O;{_nqPI#`Z?*ucyWMzT6B)-DUi*XClegR}Vf5B>EP7rd9r|B<_yag>{d#^M<1HRvBO)W0B*V5Q z+1D0_;^tY+=+?ber#X45D%aXnyCKCrX@0Sp%yJ$$r}6s6BmG=#l028q>@+Lri19Zo zH{L`_=JqHw>$o`HQ+=>3dl#9oA_$~s93Le$JvNR%Uo%047kG6(l(eJ)=_)#^&){KH z0a8*1x4T*tF9bl^*-!&rOcc0Drap|pnf026Rv2j+PT`VOcQ=aNj5}wv1?cT-3I@DK-T}h7 zb^wWMKu1TUyMiW7F<6W~3KlZ6_3ROt)JyVD2cZMLoNiFdN+B{CXicMWQGKXmnIO&v zi*S%~NG&4)p~TnvU}qTE0ST)Cn_j``h9oxvmn|GF1L6K}kzoId; z755m2J>LWtY|OJwJs|0K^~QBHR4xI@3C^IB-Tw9q$~WwuCbOW?5mC?1i;w~`WKo5Wle*JGY~}(M%b$^tNh7xoQXQ0S z6dij?f*!DyOzWLdH_|%~HwKx?olLQ68O7?E%1BR;Oi3ha?Gd%rkNpjRt)dp;q&#+YtpQtd-J9c<4j`H*pGydl9I@E6(e8i4Ng=w7 zvS`!>Dx4(BlC0nKWDHmAIGd34RVx*cFQAbmbo!FPrtE499zPsXKqfp@GMg`%v=%gv zotwl^LL_XV2S8frd8P`c;K~wuf=Wv5s}t3PDni9uEkbud5ep@}Aza=LbdGDiI5>^{ zpHbX6kcS40C4`b&m=my83uaK0gErE%^-65em^yokzUASA2ZR738u18M$yzj@RS5f0 zoq;e=wPyF7t4vOSqGM32#A6EXv4=-JXbW{QlMF(CKX{PC#r3_%PI`8FdRiY_Kqfiy zzi@O(4dM9G?K|-UlY(j8@X+>YL_O;n)NMgC`G^ihtvZ3AiS+U4o<#SrkJeNGX5#Q7 zJ8N27@L|2CAk3XrD|~+^*x(mG8Yp1sLloNs4XNi*!&}(i6-TL{n5@~{J&8HQ9@Nq^ z{i&6tY(#)O4rh**iK_p*dNL1bo;)8Tw>mpTHN(iCh~bS|0W0KvZke>2Q{qthV)VyV z>$6dzN&>{hWbBE_T+>{DRux^s^)-c?fo0Fb=oKR`ZY9_RdiBSD{dHuaFij^J+Uav} z-Ongt5+Lh64eQa*;4#TGYPjB?jJ{sc2mrN|%7+8*FCQj-TMg$=b2gqZ8lcIOx>_sOr4DMKf6!n z#N_2pN>jC&~`YriKF-@1X2M0IS0UMxVuRvsZ^v)$6ai-B%kQ4Iy3kpKDkyqw;~$ zCoCc&Vg-K>7fskL2q#}xDC!17sxZ%SGskLx0Hqy5zV1X!Oh$HLoN?;eujTDA<5;k` zU=JNrO-YkC-wGS3;J%G%5P*IpvYnKC zqB2MO9O=nLk9zUBG!@QI1mb?Z7I{PmhjCZ_ivIpAQ{}pozmPSvQZBtxlgvoEc0fwwx8i}PMTJ1UpFs(RZih^Yr@;q` zG-sw6)P6h~o1o3XVUH#>4DK?JHHRM+O2-Y`kL*!-xfg_iasXY>eaf2 zt|=)gkDok|M+#HGIR!@J`8LBZafpHf#``>G53sTIfL4zKLI6M#6;rZmH3y>%$Z`lA zHYyE^D`lUkC|m(-;TF8nG?tD8i$}Pw`?j`o#mR+Zwj)0jom!2D0!<65p6)%vO7S=` z@)vSwIQBuEWE$3<+@XSM43cngw3l5_yUfSNb`F|%Sqyx!>D(9z5jHQH`ePh<;WIu5 z_UOqqTe!$yBy#ifo@y_-rRdnq^n=y&tI&P43*Ub1TCP1Sk$>JT81<< zC%((3f0U^eCtuugH(@b1a}=&PT2e8)88hrp zpFTAj=K!UU1Yw}j?!&qDf8%hSrAY=4FJ{nV4Zp|C25_CJ7n9#c<2-jmoY$9&TIZvG z$UoJ@G=E%ae;ARtK*%ut9yrhKE=;w3!7Qtr=T*q7$cw6S1d-m2wmz@Up{2U$ zOQA<6rc9^Ywb!kZStQ+ya}5IZ>fu0OI6Gtz5?NFkj-KAU>wM;YzfB03VXDQD{`zsT zj3E`PI3z{x#jlM<0yi|!rn8>TK`oo87i}a@2IvFcc#c5?Y%}-wRpe*aVa)T$!Y?IW z2_8MFfc$lY?p-}J2$<_7`ASY=$NJe;TB0vR8~zxb`I$3k+>XC(`B5=h6by?r#QP`m zUo@IKY8JrP6K)hC_u?mM)YKxhDDa;Ak;H`uc$$r*y<>}2g&*(x7=A-7EoD!n)L1n3 zp;*<&+mD)An4p#92tRR`>*O>M9D@)PX3>IlL6-YX3rI4z4wOFK0ftG>ym^NkKwYuv zoKUPm{pmYv8MM9~jRNknJy~B0ot*a1T0o71;Qu_rl~b2O{GFG!A1-QSXHX(`guB%5 zs^mxZ*q@<`bLT<697#%cc(lg!XQ#cFKWVgMc#ougxX%~>>`e@{5uwKL4#KpLBNUSJ zmBeTAfz%5)*n@C(v5=CG{(}60WH*PCDxTG>N&YE?x|e)7 zc@OBM7V2g;nLXikoPG4R|B_%3j?{rVg0D`m-0ua(mIGWmGLC1pe6N`7gmi+%SUJZ+ zAL&$zoc<8&m@+nW;|>kY4{sc~vwhRp_;E9jlcX8nINU_C1#VHH}W{81?L)QXM=Ad)ntS#-yiTeANk9Z zjl8sTbo2ko}vQY6Y9^FWr9p^5)mI8&+6ZI#vrqI z-J=Zse4uhtor^5fg2x#bmMk(;CGCN#48-ia5?ja*GZ6lC>QfAU_lU z7N1?q!I4f}DzDz?=aSLFfnnAj^rq^NI>BBZ4==x)kEO{%wr|#`hd~brd$}pF>OdkU zH(L}=+;5ME4qTA~r4xU8F8$1LX_kW&oD(Bt@I&IPsG;tjSL zqivVhJCr+m20b@&s1queH*Zb?j$Qim&p#U)AJ!Vw0+w5V6hy1>gTj+KuXb`c4CeaC z&@U<$N!m)6edxWT&3YM=!Ir>~KT3JcXIofVSxXGkLE*|t|EbN zgDovh5(`;lU0&P^!{;|BGWEdw7$P*QZB+qk>73kzw{iLJ%|vO;t_tzS!=$>=Wfex- zt|&c|oqb!T?dA=>B{2@x+KG~Php!*5BqCXijoZok)<)?5N2qb$nH2<^zZ=8`d1 zn}MMro+lqX*MygfE30i<7S{h{b9%&-)6&^9ogJ__{Ya_~D|K;Mz|tm4J1y$`@_@)G zNx)s;3`wxgVmoCAH~TG1S?E`<$kFundZTypPXB}UKBPhOfmdb2(W6CL@XK6I(Z9H%(RfQAEcoPrnbUNPTjM3%i z=$Abs6gXngkI8YU9sN);`tTH2#=3}!E#LXb`Vu>@cs0jW?Cb4fAG-)HE6CamPMxej zb!u&!?zo-io}0_!LWUE|$}zoDI1R*2obH>Stteyh@Fo&q$QON7e8Gdk+JI+jPh0Lb zu^;MMei1hBFnoOFk&zb08}ezM7*6pAm+ z%F7Q4eSGnVQ2fHQWre5+_uF3z4w^k8D3Bm zy;@#IUQb;73$;xy*$unSIMUr-FZCwF`L|`6($93~1R;*&BO>MkBE^%I9CXU_!CGa9 z$*Gjj?`CccM1L#IP09UZC|2)zY7iLuMa#GQHJDc zj=pn-?`h!dOm4Q##wLq&)x>G0gvb$+d+_x*XP?#?A#s=NmP3h8t7%eZ2ZGOp_zzZ} zyH^u&nh^*Xg@;pKtCRu+;ikcGbjjwOO#oP}k4u4a&4lJ4>Y7eD?g$I?uhvUTx^K zJN&fIPHkgSY-{0sqEElpe&zGGn%18}?j&DttRJgyXnx03UJ)mXqY}VSqMfb`5eXD` z8AZz`5cU%Wvn9(DqSb?5F%XS&V2lXpv0?X~rHkP3$%oD+zu!10BA9yBMEBG;WN$W< zGkuUkAf`m3CZkNx&c>^xTo>cffO$B-&;$EtLG2NN4SdsRdk~9L9DIAm9mdyo%^F9PJ-<|=TaULGwClj0;bvqj;&1+ld0z$KWk^<2!`}JiLcbU#& zJpxFd@lHOIc{A(fP)qZaUUoxs-fs_dgB|*EJRFYHJC5+rCa6Y+L>3 zaor>J%wA#Hs@A^#eF{86+uD~eean)6Su>b(aD@M74<%nsc}p1h2j92q4fQo_{|tfe z36!MOkl~Zf&kosYx<*tq`Om=od11?8bDXooPQ9LDbLY3^E57153cC-;eUoI~u(n=@ zai`|T+u8q&mA~S6gD3LTyzWRmSo;!MR^rC zLiV?#Gj`3gjyhePX(mb95#`Y+*Va~v{EPDah*)H`0d4zR&N0gjAR(EP)NNaaoVPKkNCI& zLs;Bfy3AEXP4Qw4zzoRcO=ReLL|*z5*VoC^^qhdpT&Zs?W$Akt zhOKkNTD;?SPex`p>sIal-B_Hpudb8UF2eA3dUl4N$9ZyI1%nvWc-2s=Kow;1EgK~J zIiM&KV!&*8_C=qSmzUqVY18GfuKT5~xqY|W-q4a$O*}2ixH4l9Q>KL_X`CO@pFJs5 z_}ZMm&x^{du|bFN3)h#!WuA&JTtk!MzlU0`S+lilO8>*3M;!`9q_(W_R!Hd|BF>U^ z2*)rcztQcELU4mJ@cD=9vY^Mvkf<+}Oj8iC9}XW3$8c0`Q>U9y3z-dM?ZHPCuU@_C zUX(_T^TI)ho=0tdUPbbsXZ3`F39RTvl#OzjqF^QaWbpOX3v&KOTU*;sH!kt4Toy9Q z2quV)0=ek{81((K&N$Gs&LF+BLZ(AwLv#6!%o>+k1IxhRK(9yj^!B$VFQ=Vb)bNhD zTlLAmG-T$EVO&aHd$PrRYnz;bx?2pft;>E4JeulY_^L5E&PstM0w~i{KM<`loPt%Q zBL0haxz>0Bvm6$>;A7*_IJyoKw_ITXL?P00{6%PxtsQ-A5`q}X|IQ%4ff*B+9l?mTwujfx45 ze41SCD}~Jv@If0(ij0tw&Yel_fFP;R3D-mzXmpP|>W@G{##^1bv0;Nmr&TlcPC&3> z>6KWzA@{?JqN(g0=ifGUnH<_n>1CKO9f(VO*7LvUdJCwk+wEO+fuJZBimixEN`oL} zfgqrSgrrhRcbC`-h=7Eoih!aZAT4D8l1ewyT}miHjg--O5RGko3C-alG*ME5vOp(#Cv;Dg`F$xVAt6-% zQXmyAH-O>Lf}GCRuw=9qqP2L+I6B#E9xmkr4$NDAUf--b0r5F76XpyQ5g z`?{_JfFi2X!#AL1AVAL#2dD+yA*2n6B}s0;Pvi1I=%_&xKzuEvX?7Ar>m#xJ=Ox@a zZvb@R1xWO!3Bs-*I~YrMEd!#w1lFY`%lhSu7cWT80b<~!fDfo(-O0&l5}Xxvi`+!d z$%&7LJYn26Yr2F8&G;#oYu8?o6gKQL2r?3op-a>^fTCVO+xWcj@GUCIQ}*=@-|dea znjGF+VPEj>x9M#1j`Y#C#^7V7D?_7()#8rIYY&BvB-pC+gdEvE8=X3s-uKOAEI2@T zcRV~$0UsR3u0U}h1ubR`ZeJ4Vizf~rv=q^HleC(&p3i(}?Y`rw4o=O23Af5`xKjQA z!Ez9OY6QeGiMb>g$aK1o=M8}&A`HplA%KzxvDFJNALr)2L})2&HUegXm3_*osj5_b z=+D361<1DsAwG37pK_l+f1b3nhYjUKjXWW zW?Blh5SD-4VDXnP*U=#b#6p$+)oF>CvH_rye5-@A4Hw3-3N4lqbj_wllTP>fL1by^ujHvlovJD@|u zuR?U#_~*V-{P$DGzEC{V7}A`YWHMkhcS3{Kl|JXpkL}ya`$IlPetwv}q2K68LQwR^ zbDD0vGA*#t^Mh%u-S9lfdR6*=qZQq!pOE)N6euGl1`J8@`+IbAPm@4{w5?VCGRY0M1rWx{zG=!w5c#;q`;#zKXCt(k{x5{qF2vX-DtBNNhrTU@oqerz6x|_A-W|}rCK&IRXQNaxG=?ekH ze)|%kkxjr}I9_5%-`^6&1}#A@!+Lj+?feKdjhAWD0-{Vrwmv<0EmfFe<%5^5e7Js< zWB&;&NfNl5ViBGF5vM1dlCM$n2UMirH$TFHN)+}56Q2SgWn`Zb_X5Bvb{-x@DE7e4 zRN5_!Wf}_$I^rigpkzE0x(Cib@P;htFvtynm7Z?Zb^0;{X>@{}kPHzhgM34wp*v-2 zK-j4XVrg3WP^fFIyb#gSAj;?m4ob3?@o7nh-DNyCTTu@R%W$a0FHf!2 z>Pw>KU+h~u9hPyENUHO-WSl;UPf8 z$FSS}nt|VpE2-s6LzbmnCJ|MGz}B|hz$raCGRP!iS4vkg-js4iNs96TI0Fgm^;lVQ z9Ba!~MrQNllssSerM5ftJ9h6%!GcL90)m%gkZ^nt<DAJ6eT*SeaFF}NiYfr@M#vKJC*Y7q+xLyp4xvtuhUOkts3crE1^po83jDM~fq{XM zWy*UI?3ZOR+xTTW<1!Wvw05lE>@N~<6f%Baa}a~^B-0R@hR@k+2V0Ccg3ne0!zNg! zPx3b}icZ}oT5O^wCCViDH0ohNA-)LYEMm3ddQg6_Wo20>lqk-o1aH)wC9&~88bDqW zy*%C_1kVP3B^xPfw-VW6!tGVf`u}E*U$NcV#<@P}u;xtV{@1An`h(byuhX>iv|N+Q zII>!bJ1;&v5p%mNXjWq>sl%hz|`NmY~?PYtRzIzW!l!+0L5 z@yo!(nTR?kdU8yW^Pe z_y?=WSDI8M@hFdK`p#ZQEnJI4Kk|=CN>Y{YDyVY^A&qb`z{aFWN6l&GSqzbnVT!sP zP{;&zp2nM2mb3C$r#P#FV4lEX0|kH$(|#`8+9(^@z{Hc%@m)%P2tagJl#5t_LQGeG zpT%E_ukjctUA%{ZZ!_t_h~LC&3msd|{wwOzlQv59^h6trpM0a1JU+!m{s8ROcN{O5 zkyi?$)!D5gB7b1EWIdiOZW{S!mi*wTs3crY9g=fJ_1aZMU;I8!tt&`~NKz93JpuTtcCusNA%j zE;9t5j?`Y@`)d)`OV%*4^P+bK!u#A23+!b)O`z^6_DL5+&Mdk3%AZ{%hZ#}LgH|0P zMlFQ$5CL1*QT{CCFB1V;kEWC5bb7YkPyoU3AwzwplZ*iiWb1(is~i(R@AL@&%Cb#e zc16L12Y@|nAG?ylQ|nlMoVxp(WSLrUT!b1CX+<`!9G3TSR}u+Z-IlbqAbmCnwZ)K_ z)3MP4xPHmaTN}F(@1dU1O8g7&tugQg}v!A-_*T(!4$VK=TYkU0kPPHqa~k2?lO zs*nrCkJC#=2{bZ4B6%MhYl=fNhmie4@y+k|z@QEDT6W&@_DAPP7!MHv=Xl_!9^m`GvBxtK!Rb2jY!!%57lf>N)_&c>OQV65>E-Dic>}*FkN)& z%T_WRf@rEp!tFCe+3>LXRG!%+77JFroX)%C%a@&xKeTXYq@D%a2uB?ZM#R{l9d(FO zn8};ye$ui-^iWJISV3yVV?yjCxf7@T5yPN0O}HM>dnjnW7rL{mwvE?S8^XdQaQ`OW}I=n8qe{OVNttzcqo5iTp1Wzhv$krc8da8 zkf;o?-tWtm9Ql^8jl<9YJo)z`m51Hn#{z?_qphF|Auhb)+1Vp3u|76*xM>`oZT%9C zsxf1M)-hF+>1stNj|=(%U%di%;V1t7o7=5R_Caq(r+aCYaXZWYvlq9&kR&V z38*9##)#Sge;BEAQBIEEXlKSmcvO`0q~7*{`nRT@OY(d?{}d7A^P8lI~rww2Y52w+nW*G%1~jB zz7c7!z1G~0I3Qqu3nbRXH^I=f4toy^YSC}lfw4q9ah7Nud1y!0QJi(y>@krrD(_mVuFUa4eCFE|S? z64C9E3m4_Z&?Bz=OW2^qhlRwYLc3ZgEE*KtXe1FLMU0zd*bOAC=?34nkb(#)zl6_L z$#-)mc|HUZgV4=4pOh|BS?Z{7q$f@(5LGE%|HfUsXK{Qg;SY&rFWO^X26Xt90*^fO z*5+j{Vz`pAjLko0p1HeT5#JG!C=tvI9ikdO0>qXH@RhtqqmZ4SKTE>6;71sQ5Lyv! zryVXQf@mRQE~wXKdw-i7Q{I$@!w1C29Aa*Tgc(}$qL(F`U-?M(A&kLihU{4MaL|$c zz>B zkEo>s1}sQ$(_4)eaRYr*;k^R>x|f&p?XpR)NvzvR&96LuLD+7xD4cPeB~Y&r|+QSz=`kTk06Pz z6Kq$%d-pDpgSw2Sl#oIY$LSDxQRhQ7aNS~1jIEUBopsyzQMLD^3}T~XuOIA>od9_c zJ?QH7JN4#+k)f=DHdBZxa~Y;}h=(nAjjhait{8I^%(j@ut^Wb5SRzre3-;rI3cv{Z zltV*_SQ@nFaCar5a!%rUvj#ZPv!M;z=mXGx3KQCkl~o20P??}XkHgeR@JSMCexW6s z6v&%<^4u{uf*;Dcm+zq19mdEE28t#;1PpEEl{5CF08rkLikHTTQp)mq5{q)@OysLJ zcc#1r^X@?iFN%Ba5?T0b9W87wLZjsY91P%PTJ<5%kxV^6 znZm)^v!e(Kh1$~8*N6rau^VItGDYe_R4e!=|0&_BAy*HSZ9O4*_+&$<5rwELP&|{0 zkx*MiXiXI7#Cq5c+bfeU{Y8MBvPAZf(t!qy2=#Si(F0yWTL?{%?fk+HM#iATfEr_d(+Ja-W*oL^I_b#?;WZVJgxGC&!%a>u1Kn-l9UY10+*XPkxrtj z3#Cqh8%iK}tiX(vY>KUd2x=ik*t}9hzJ;aHMP1?4YVj!Kc^|fQZ-d6g6rwBw`&sWF z+es&Z1eX-ET+7sE)FF*!+<5YmI88zhV=>pgZo9{M>U0?kpP}c9iD!WmZf)gOq9)UG zzpDL6NwSq#wh`G7^)qJ(CN zdFn}-D;8vciMoT@nR4X}jtUgOITc&7FkWLC)@w2qh#aH15Ve_p`<)!OTIYvunLz5W z!RBg-OGVb^&!*LhL#(W@kO(m2?#6v@(95&Ie)Na>D4NTrM&!h6i;s8W$&-p4_g|dP zI?J@`H+F_7YRFI`#?71c-ZYLRV40zxiNe}9db5UO>Et6D6qrOGF8pr@NQYC;1~P#s z?%Qq~7x#UnY(IW1Xy*y57?L-H>mKtMKGg+>SHH{@FISTCHPqZpz7UtceIaS?s}OhH zuj1OQgJ3~mWVlDC=&PVHx?%Pku?*R62EU-zQ^j3rn0`gRZ@$!>Z;dJso=IM8M0r{y}QqJ6E($u2M#ntHW>o=#y_|*c42eViPfgBd^j{T zU#F1KLnNLX_uNtBO#^h5CkBpKAIVXDIB;!5(H6N3y$Y#AVmC0#2B&o;$Sl_>wn1_= z8g)a19dI-R{&R-`z+wZC1oL$+$>cYiF!{vmn3Okrh1@N;5Tt}pEZAny=8Xj&Bp`f? zH10UxUo^m_YLL@Ic0CY|>Y)2iG_jERibYTgBf=;F&jFEwVJ*bmpOA|&0X;c(BMrpfXYeVF^)r2T#j3X+abF`023%Z5 zKRtWBAXmNRS?bXvx_<7)7be`!jul+a+%#?!vLu(AWK^D>vXZfgdc$rP4Ouwl`5Aj+ z$oPwPPlp92Vzv~=ZZFSAU+W*FSaSfYnsmst@3fG!I6pUmjNas|^1Z$g7@-V+%+aUW z)BL8^Le6stQ>4DXLv3j>hwk!ZyxfBb9bM`1q!a|4l8ce76gY99qd_g9o`jxek%J_F z{dtuD{Xg;9D{mNxxR1GcXurr^edO?A7IE>8>uJerP51XYs8zjyDk%r%9QowFez8nL zYMH8L9zhtBiC!O`r0X<(c_cOUc!?IyqaMXZM8_uY-$C(r-0SJd!clPMM2F@F%g&Cz zCi5e7W>^^gAGGl$5tx-AIsvhyph3xa^QKGJogIg>m&FqC9g&lwJbNQ?{*WfUZi39y z!Nw$)AGEZ)F1{2dfgMICpBGO7xu})}WAOx=-C zsgc+5;<~9p!&ZH5&7!miL8;et(`L{$DDZuCDf7r^u8B zOE-_1Vuu#RBBfNkcIm<{`(m6K7G-+&JI+?Iqjt!teTiVi{bQL|-Vs9;xdq}mv>Zp% zo~79)WoPI6X;qeun#d8}A-z#2Jn`RY5g@ngIKIC)xrR~LMZW|1BuIDd*&|^ow1#l} z_VOw>M51u=E8zfe(>g}HA}Gk%uqdadrkZ!_s`4hDi>xm=MDgA(iHi4C0E> z_UkQr4zc}KElYT5T1!wZTH5TkBvijxd!e`k;z8kjR#A-so&%IiJ?`Q|5*K+T%j!94 zn?E*uxS?!6(a~=BAPrUXASC%eh#_TB!Xg<|30Z^M!S_pLQD@^&L#r8?dZ{(t)R@K& zY{Nud0Zvp>CE}|$a-k-(+lb#|8ZM+^cxn|2xUv?yMbaK1=3({L>XuV4etq@-pJ?(v&nJ1n^gy6nWFeneN%SGXaFf5E5Q5!S>qjM^Cv# zLAa5WMSe>8n`BFqfq7@U(ZoB)sI)C#tEaq3G1DzCS6g>w%3~qC13g<-TR&7CB(x3p ztdEb;LSclvlz|7VDt2)<`N9!5L#84Gz1xh}fpnS${Yz0%5!npN5)0uPkB+#eP4!LB zi~O3l4Q%&3WAod&!lIMJMZnh;*YY)L9t-6kf$_Eq^{Z5jAiVJ^X;sCu^pD(&(~sHw zj)DgIbz8?mE47iIfE>MuW>{!9(7SqvmGCMqT1`3kCCJc!57S!>G#PZ*)yhs4Pu zA_y|TL}G77WT($>YsdCua-lze&7k~NCR|*rK0&5&4+b12Qg+mA1V;@1eHd0cHI$2& z!483KQ2vRAvtt;ZW9;M^oT@AUc!6QCSrtfwth?Nc>h%LeNsliFd1u(O8%G|=72s`G z34X4u&SSrkuT#tXfn2r2=EgvM*H6nlqd?YKh+B703gE3hk8OZgoWj$~LA~iaTVc}H zvL?1o%r8<6T`b9cBPRfO#X8b6SnDphBmr`myy2^5DGa=ip<)c^a+J$3Yy5*~k|U{~ zO221ePVnTZl{PJ1X-{OKlgRbdF>GGmU`X?iu&PB%TY3Z&r#*`Ge=7?|JPE$Vyb>Wz zfxg3GMxV%YL_UVuydk@oSi7NQCI}xg#f9MVsGD3x>1`D{ZCQIdgFu+ziy^^x~pP9|EqfKw+8vCt` zC?s1qPMc5pf=ThIZ*HLomZ=rng@C%a>tQ{aS0Q;Evx8hs`Rt{%Sa<294v=60hIb2FRx`p#nKrgku`jmW03%mhF$%w;Pb(J0LZ=|;aLN(?P{;_Pb9RYqR zi-6Z)aKH?^2=8pAVpr2##ZDw(v=$_yNv$E2*EiwV2wh$2q~RQy{?v`cE5WOXO*7qZ z{1>&A8twwttwu!atM~qxnZPtwr5%R8o}`s*m*+6rf8D`x12~j)_=Vr8r+i`&dJ;a@ zwj4U!SgHehPf@vfIYe^d=L8&?+Ow78>E#bbjrdnlw9@MLrLREr_VYrVmxaTs&}{8$ z-;XSr{jARU6@y7yO#D{Ie> z5nB4~J2f6*ee#PPw4|?qtUwaBA=_b3@V0n>7nF)$F4G=Jtl#d2x|P4U|2lXOG60X@ zjytzHp);zX8$OPxF_M`uj4n`$u$Irn-E)+=EA##0m%d!hH&}5j&u8?m#N$HhuDmQ_ zBzQ4%eUen}$j;?AOb}rLI)%XdIELT3;%KQAv?R54igh;4gyT6AHBKiz}*Xd8&34hu1+Rl1me1 zdoO0ypbkaA>^YLXg9H~#gZ8}1PxPd({xOHcP7O{NAO^1pK)iPVzrqOrCb6qvmXpqq z=1Zv!Wb`hHH;35|&_n!|BeDq?t1IF@|A9;rBtx?ZafE##0R8z(OZ*=&lx#A)idvyx ze}lq|P^Cbqr%})EF3JR2NQB^0onWRQ2sp1KrN@Dzk?cbh*wX1Ggv3R9&*gwRI11v; zG|8DZ4bb9znNwRHytAl#|E2p7=mN^AS1Dt}!vunV*9a^b(2RsL?%$sbT!ICk8fGLV zh)&2*OkfXtiarruE|i-?sBsR&BFP_1L7DCFltuA0YD*FdN8Y?UMizl;e1mYNRMyXY zLeV8{(*$Aim>)VOQzH)ul!g_PbYG%6CWR{oP&9z5wa1EdoxUxF05L!y@wh0-cp5NX zB)K1^IsuF~tPSDDxy*m`8yP+U8_Ne+$VmDxR4gP*4cSkLgfzhps>PRsDRl1<2{oxz zFpyC_34aOsWY}ut3qXK%9V))pz$AB;yv5=sBO!a}H$s$7Jn1C;0}#Y342MEw!)4Ug zBwI?^!4{E6a*t0O*UXS3UmN_da4~fMx^f%R;%`!^ZLOBz~KcmhZyi(h^$HXEwgf1m(2J26)5 zMsz+5aO7J#blx->+io|8u@0r90UAQN_-}+ah}X&}vDQ8wqJV&RplbRGNpWCUC}x7nOXkX-vd06OP=?GUYs=QH zGr&=@DuO;D3Zot|_xfT&jg7<(PR6~Bz{_LRybL4{HYM4(MsjS|8xxyZ1Nmy;o-skk zN1SY!uG_(}Kr%^)35Z;Y_<`mi1`NE2>iYAn5?oIboF&5mWl01ssR%{Pm65PSxB&dc z^HCRS(6-wzFFF$}ZOtYoJB{F2JPnr~U!jPjpIm`v5q#i$0D(5+M}MM3&waaNbOUj& zn5?cwZXCf^@iG=ZYbZajT>Y~T4hpS(ANTW=ugd=zR%RYipFQn8GTQcOFkMsjjmCyf zPlIQd=Ne5j4a7}N6dq0?O8X~XwLmJN@1I3C#$B#qo+4e$uLkClv_$hAX_0iB9z zLP2$5JkvXZPfef)WThR?95Bi42wRGLpPV*22n#9+;=VCI zS6N%2OR*Ao@c{xtmh1mUaE*?Cxt3mLl7g032d%V)v0SyRg-Kn@8jT~n`nH?3E`(() zAZ3+j>~ns5ex-ABwet%a!)bX1*??Hl$T0rQPu1#n3!`Vh9x+^I5`_vZ{#kCux9_}L zRmv`2kXrrbhk)}|trIxT5kB}5gfS^+aXlzxT)2s(Nj5-cq%lXz5Gs##i!@%ScnQ@G z(>BGebSjam^l7R#gfKeQn<6cKg zorxS*?#V~KzUlKz$rPTaYGONe#on9 z-Hjt@N38+}2fqDTcdxj9F@1Qb#>G%0l`ZJoiIlfxtS3?pCyS40xU2q4w)KBlEOr9c zhu+QK?Jt`YhKx8@zHakwHE&CHZQ;rtyQ9eCIpo_aYtq;`H1DKrk}*HOAQR7ZMc~B+ zYk}Eoab%RtCB}(7XsXSq5C8q>kTeu88r{{Qcr}-Y-K?kbbwlI!+Iw@1wWgWsGZ&nm zEk8(m11VwTM?J;LUn{FkO@rqeZH1m*YA;(JM#Wtg#L={s%ukE4%DysQ;Qqjrjv`sK zgLzvL>_y!&*MDed(+(K!a4kP`4*zk+E?`PPri8s7~ZdV=spH=o#uAEC^xTgdx>;ZDEsLy|_2 zi|eb^W)uBxzDnr$JNjA}AtbxHEepDdTVckVLr6$3DoB$>RE_*hsVA+Nq--!L`q<-k z=lBURLX_hS*DNl4Cl~?5MM*LYgzDWLaqhTs_Xem4(ae zDyzefTpS)SniS=)s3e+Q|8#GsPB($z0Q?>;f`wN~j_H@hww*4@B`+yiq~z~m$s+rT z@nM-W=GCRIgL}q6+DJ&c?F9MEQQsz92P&c~*#E5S3B{`!C(U~$2^~FVt0^J0r$t6$rmp~AI z=OVG6Oo=ajv|Z$w>$=3!m?1WU2rCo>GHzC)MqTIk;vcx-XPEr`o3GvA5AmtZWskPm zIj5SRirPt@`DFUy#@>GWSv)qcOk{y;xa*IN&3yE?uBf;m>Lik6WFJB8Zl9H{>zoIm4VS^Ivd)(J$jyK6gF9p1`)$iVLe+x*`7c1Sr}Rw zzc6=uVBmZMEDz^S;T?x>b+$jLe5q;&`TU!lg@1%4`-SOV+`r{5%mRMYsU5w;-B0)M z3C$_dIN<$TrL+1JX*n+a&Wxp|B1Yh@H}r!pJx43*#pxQzw_xN9C(1eIMzw*TA3H_q zn)SS1T z7}u()ZP4D47T_!rjL+PC_u<+f_${k+mcgR7w$;{YEmb4UnHo>+dUkA}P?Fd%>F>YC zMA)wxUxVUh?RzHQ#_>vp^(Jkmd0$kkvc1k*4*7m=5+<)Kf3hc=@PI_%xwIv ztka&=>#E9&*YKBKXTmL%ds9o7##+90KKuIb_O^ZEufCUQkd_1=xa{yQ-|u{#ADp}KVHfBiEMEN9SQDpdgP%@$|)R`ELR|N=qmr?J3~iD zQspF{WA>V;oj}A&gL$if{rp0lz07c3%B`V+1moqvxm!33BySp}UlGe!bI3F|N`~JE z@A(^E7Z)jB_uBYs*opi%{VPK_a;~RbF-%t{JqWrAkX!Z|vs1lytCr-$wT~xt7PS7& z9vpBwGniC4%h$uhEs<;ZjVs)L{N=VBgR3`WH_~;unAGvD z{F_twQy-xfZxHRFHaGN$=FTXM?U6>qU2RJ`dag@lPiY_*`1dH3Uabp^#F2LT!NZl( zr>|=})vk}ZG;f4mE4_LUyFjw2KT*%Z!Rd;Aqj+d|l!fB8Yu<-nL*x3Nr*Zj<>EOJM z;_+zzr>D-0&&YB+3{TGqTrbVj*~x(CxGsD&_y{raU6!8fY+MZT_h+a;x5gpx?@{)1 zA*H)H&AxSZuW?_0pE%amrT2z&bKVt4Puea$i#{xY#|JRr8?3khM1^;wkk0*T8g3?#dZ za>A|c`FhJ|5;eOxPIm3I8mmh=lXO&Y1mB{F{iy#C&#%)6%#Yf?H9I77js%~Rgi^?x z2u-rzuPjp`;>2?lpd|i^sc{nxB_`(E_{7>Mh0xgv2amW$C1pfdqxUXd*2Cvn7fNA0 zWcwdS&bD{Eb2O#`Ra8DTDaRK~sB9_P{(av}g(p9jk%EA|dC`>;j|}k)!3E~=|5;qw z>llrXpztHQYH%pa1$nNIAHAtqp)7}8-K= zoU*z1`6eo2Jrv{5^g(R^oi7A&bnl}0UmA2+lF+CNjP+8f+jBPrIx~qnZ3cpJgrbM} zL3C@^S_=>G8CRVjgFU7{)9ZM>xrT-Y`S4T}=)R04qwWv;v~29pVM}M${UaA8dtkNg z%{O=I)Gcn_zkh%DR*ZIsfVy{n5%1%cxE&P&-E4Y^jui<@lf4B8#?mf|i65)A~Ljn7|3MMfr9O}9QR>H#W^Zdaa8q^fx#z|k5gDCF| zMk`t`@M$l=&fNF&ld`tv0o>{fZw4NdT$Jc8G<{znczv_82PP-!^XKU}w$r2AO7f}* zER6(ma(*HmVkGXE3uo<5$K1;97;m)HSNgEyR(7{IPt3^prhngz{i*M(?O3y%wtk;! zY#Qd>kiUh73J)eI1A~+l(6LI{jbOItQbq#2%?4 zEgp6?uG~2rwk0Vnl9`ZQ2|4dy4@Ij8Wv%OXQ4%lOr}k>w;;uUFJQsnts_c{)P!3Lj ztL#S-fFoUnpr~dR-Hx`OrmE^)?1|pqUJ{IUMb{0KvVU~+rtnJDL+n%j$e}4^SMP=-S5W=Ui@o*KcK@P1IY9^^zH*alI*a{p>G` zldw0vd8~dWrV<$qA$h8-T3JuNNVrl@IHUj zh_aJgj{r@X)Nu$7j79Lb!i;f+MQwK{)a%*bI0?L(X%&q);I6T0^1$L&mml*of-zI>rj@U`56opKcgI<)&Bp9?B$HGx!q#jXW4SWx2 zEXaxe3_$<9z|(Ue!D@O?#6W_o;&}Y*+4SdeFwoOj`Ywb9wH}?Z{%V2m@`cM8MVlf6 zrH&*EjO{GN-YKiR}a4^#yx{^5|=KNWK@} zEo1GQG0U9J4H9>Cm10HXL8XipVFK=I7_aEmL_%FDIpHI3tq2rMp&R$ks9l`{=Rn<#zNU?Il zk{~)zdZ$Wp0s!?L;-0foQrCcxspF*h_3PJrfUv;p)+0W?(dPgiHOgilXvx|jTh1DO zljt83at~J+wih!O*CwQ;76NWus%h-9(!=6a;&wzpY!)Cth^uem93>YF3kSy+JnHvI z^}(cK#o_R zeB?*&g{tO=Z_fh)*1Eji*uM+YJ`aFN7dLPec&c&l5$s+Sfd%56xJFSys%)WqspEXC6Gax4^4si z+_ozk*Qpe&mPoK%PbmZxehcFXFwpWjT-^^F#Y9AQ6Cww1(Vdo>2i=p~dlO1tg?nD55Mo4NiL6!sxj*0rbtoREF?D)lgG z8)+q_Ee_*tYf?Bw%uxViL@saunRNb(r)={p5X7%6%XODRdBS-XY-6cjIn zjaEbmE3=*a4&-=xxSrl9Z5N#0(h3S2H|{;boVT(#BRqXaDEc$Zv$#=Ns58mi53)IM z@Qu7cq}%iTZ|xf!XiCTb+Qz(z4ezd!+*EReTvLz8HFacj*oT{CRkShcb;y57`gMbY zr#u~tH%CAlVtZMV6CTQEyb)JBj(7WNVJs7QFPMk6Lm9mapXWhao7QJxr&cu&`X!hq z-t9^Tx407%t+9M>zJ1Fvw29lB`MkdGUSXxV*(IdGljVKFaeOb)i=8mG#F@>yP{Wca za`NOJkYedwJ7F(Xr8&8DPWwTJ5q#_%9c8q$U_a&iYvp5$eO#VDrp=pEk04~rkL)`Jx)5W%g6WzIIRXaJAd)cP zmwMy9RYqwVEfdNA_jMlL@=;t!By%?RR%%4}&erR8<>aD!3Zl5yVzyZoBx$y7IKL4GKg0^OBC3 z((>@U7IYnU(ad14@#Z$2_q?kL%?IK^;Lcvl+PhAX~R)zR^T3cH&;W6xz#gvNT| z?Z}jjIh+KzeMwRAz*5mqv=2fR-tw}tH5@fZHwl)PyOlzbO-Ia4qrV3RzVFC)yZhk& z@X3`mO6i8%d#N<1;@7V4-NL}2xK!eG{BrBX){F(tpCXRSCvz5-1o9UJ2e1b0a1dYV z*$a)T%jg@sTcTEWkWjZ_aK*E~2|GBqlIY@yTbb_rHr@+5wU$D7$MPwvpEypg<4a0S zOMB%mRg@?RbJjjyKE5X*A@Qy-%=ABNNdQD%1Y(d{BpJHKZ{}Xppf#yB4T6Iyn+#o? zdm0`67-LmhUh;S%K$~3uMc9#ICS290XJ*9?uJ+c~C!KefwS=cTj~l3e5fKqy z(OgZ#XCJ+yr!d2Tn<+0NvlbVRe`qL+A%FR;V8L+C_knfR;QtQs@ogo|2|IhBNzOwe zn3Rh+p_np(g?l@?!w|rp5#(eLdJKIU+9G9B; zsOmn|kFqk^b`&-U(XrwwkWv7K2i7_=z}K86Bi{+@u{H_n$F&Cwa=C2fBv zetu1Qp5pZ@$ir09Z{`E3*+J_Hy z<|`OAb`YYpxhABB$CltzSd@?`RK^NlU*E5AhWTOFvUtBBMF)ubZA-n$DVd%eL*JjT z!l0Y=I1RxH9^~b%dFin{zjuCqek()$nwwe2=j`Ov#)2Nj+<447KkQaAX;dUY%CQ_N zMH;2ZO2)yl@>A|vZg$&L?6>*M+|FHIUNMN%UtbFBe2V_jwbBaj!xzXV?@c zvMb+nzBW3x1V`dI4UMq!S@aW48RmN^6P7(Y>dzicJ&}wJx4Y^TlfS^hh9{Q;Lz*#r z>!tLJZC^nrD!R=G3$9xX&%K|}WmI8G-o{D$cWM$*->@$nZHdQYjo98f}Q z0zuMllqUYNoPXwpryEBm5?e}Ljvai%?jy^Y#hw-;u@P%oap?u!;BZF+W8ql2X1fb# zuSOP^pSw5=3lV9JST)V%1uWcP?KF!u@i2i*At{`Sft^Uc=R;;rZa(ADQOnSuu^=WXV7kVBR zxjFV`CJb|)hA!;D=bW7GZnNg*=0Brp)%+zG>B@~%+=^%k-IVvwL`y~B7#ngwHix|5 zJpdFw<1pM-;HoQrZ`oxj@yxPL;F<^=Z}clh17%K|E9w`z?-f!8Hr!(PQYIMuPsNY zg7w#JYK120-8k3Cdt+>V2oN#kS_CRVf^Cq363`XES#M-XF!SE>4i^QYaYg!p7v> z%K(&P6@H^B*O7}1+Iu|))3Whb=j5#Jbwg8-TRcW81tbr&=vSV(WJy7&dlw1n)G*bc z>{~-RNaTFbAe~?XK`wBr!?LiMgvwZ?z*qML-jSZEk)FrSE@z_tk~!l(`%Z3$cZ*!- z*vzAXx3nzKw~*T(a+td{HA=XxR$=GR{#R%l>zd32F~Qe9^{7*L|KcR}>-v6T&8eB9x)&GF|KMwR9L8!m^@{M|WTwT%v< z$kWcw*^GLS!O^0?dEP20F3yBaD*`w$u4zA72gnDzkcxhbnNB^`U@g#{7egx;?k!`; zWD@@MS`n_QhZy$AAS^80lx2O0jFY&rW5Fm|32XN@=H|4_#22jTP zTFP<9MV^b6T3CrY`LAzAp?TZen_3QbU29R)ak$%ZnqS&L0M3j@Z?w}aQrPw=WH4gS zl%brOUbE@cW^Sk;kuR z@yF&|w_-T(EG9o(zC+qW#gfCLk(u0dRlo1A8On*^eKS8j{)(>Q;jZi((e7+duWsI- zyZdwCZyL53Q^9Z^m+9*tp&EU7r=}MMQ!Dge%mM=2h=0Vq7Nf|~%dR1*uX`Uodh{8~ z-Wqu0NL1&(l#bVn4Q9Fv)ROp?xv{v{!;xppfp>^}^35b(0zk)gzqzs29mMr~?FoO1 zF0M-dXU|M_e#G#OkS7rlZ&@_aD8*q7kh_QIl|EApot#cYc`iGD#GnrX!U~l1*&EF0 zTyXq7eN=KZDfyehC-N@H+eAcxHH1z&p%74i&}~=C7lUQp2eUo+qyXda0C9WG=p9dj z!U;zAd-pMve=ExqE2QFWA6P>H8uSH+-4FOWDzkvxmPjm5Z6euTbB-&J&M-qR_FELs zWHMf2X)Q@NKA5Pg(q8?%K*#e?lK4GbEulh|OeE7PY%7DJ{BPr*wc#lrMUoX9k`fOy zjkPmp-NI+@mS{aSrMr#3sRw#| zOwT2y5Yab%E47#2OoJZrlTjK8^+lh&ZvLm7v$HS~*{$Kp!Voi8fdSMI-S}eZHf%VD zD6f(wGr>KOAkp3XtoZJ0SuYC0dl3Wr)~nHY{hFUs-THf)n2fN|l5jkplWbN- zI{<)z9A-$wdWb$gy7LzH8~%$u0%Pw3HTSR8xAA?!thg3HjiN+uyB|t=z>hR&^>mgL z+_ALh=hf8Coue%)E8Dz#_iq0hrn6^>1qbG0yYHjPz7SyKWOUEuc4x^nm(VPk+DbaV z(=WL`ngl~ZJP#TT<68)gaUZqQFDFsoqc2wq< z)T*?-8d+jAYm2lro{@D(fVqo=li7hqku-#Gc}j%a<6=3nu@>5keP2getz zI7Ak2(0tl5Usw8f*5kx>>BoD&YS%VoS<2y6)4g})q?X*=IQS;bal}S)2e-~oj*0Ub z;+&#nQ{fsutliMXzo1FRkro3PUUDk!eMBG2?@<5OgoL_YnfFwd4HO__i}Qn zi>3VUw}Gh(`H_#5CpML&tetvD>_Kj6MFUfK&n(=GcQ&+hGXIm96>s;Ad6l{>+Iqx>MgCQQDyJYgAipY4~A;w&u3h*59M05+jAa#+e6~ zl_Z5YoX+w&Ks`W!nB|?Sabaa#@w_14Rz~JFB9S zTjqZAgdb!l7uoP?`k1_*uU|)#4~9=hGwPzVEf0#B1EJ#^*WZq4*VJa}^kCiGns}M+ zG^b>O{~F5s=#z1+9qS9tsPG5pj!gbtmX%jcYRP=Gawk5=b9||nJja-d@$kC+>6dHO zuB2r~HPjFY;b2VPms~TIK9>i;qDuZBWa2_*|b7c5quV;34HlX%>a!0o&N}G9%Yv>v%I_@yJtf}HX+o;Ys!fx~sK8>O- zD`q&p5*y1q|2MKt)zo$>6F+ekcL40`DvKVZ&H;&mOmYO;t+sn$_x^4Yl_hn?`f(i3 z3=G)=RwqQ+(l51-w#_qE>^os1+R-Ucktn`Wp7GMt6*=CAzHZz*^`8G$Jm4cQ&*k6I zn`us^AlCI7O4O#0&U_?D0{tojkkq-6Y%U={UZf+U{6t$gBXZsYsR_Umby~>KF$QE& zD0Y&M1*oEC7W0$(GQBKRRkwRA&8Sfd(X21+ek%$Q_jJVEc>Bm@Nk;;1b%IlAFp&&d zENQG}P~=t&(z>+f=&IDQ&cCjbE8ZzNZM2s1+(lj88f9ru$-#4f_)s$S>!VAvE(@a$ zxvhe+6Q0dcAy+nUaI^c^l>$8ND#Fog98^>oVRZ3^c>gDw5x^p!aP(7AfYlYE0)G+^ z(7p6!EyW798pL(bP`)EiFM5?CPG?T=(qbqs`{!HHm&Fdi((LbL7~S9Be+`T$p1NIY z#)l6o42v1+>aSDtC+7z4CkV1G8~&P^eU;;ptIW)6UT=7eywUr^Y`V$DzNxl-K7I|E z6HMca`3us?3wv2JK1Yw}42-tC(Uex(OhW*@mV8KVd0@elA8P|kNejLNW#jn^7tWyQ z{SIcMpz`q>OGrg`io0dC%C*9`wF(}B z%6fjafvL{E$mR1Dh5vS_&6%f>BgxEW+MD{RC37v7K91X-)9;yJj!c>q|8B~t0$KV0 zn`YZ_`hu+Nr_tuLSLV(QFQZaZd9nNtfph`;RzEMcosp4QLSnyQ_}s2<^+TE(8V^uR z-l*z;dFLw-04uBw%lKhF^z~?bv&`qfuDS{&;d)b4WB|;gsIH#y?akcN&s~LJtgSJQ zTSZmXrJiK`x^(93UO_h2oJkuXkG&@y)+4WddRWXft=S4cm%LCkv?OPE-hgNwc zK?ZvOZwrBjpoq>DR!cK-sGn(E)4>s}DiOs)Ho_Cre65i^^;Pylafv-MeYy9pgc}|G zaKoth$+eSyj3>Xdcld<2>@PZ^N)hOw8*B$`-+!@{~xkWe)<1E*1gvF z$wHW@V2&bq>b5OFl1Y+rz?rM_jiVdB4`TiR%4_8BtR=y0aBH1oc)#cWMASXAp~3zs z#uN}A&}z+-0?j%0?5M@>qISN4K^`YCZ|NbJ7HE=BwM0L8aua0>`~1a7k;^WN#d|Dc z&@$c~u<1iQg_VYy>Smg^NalZ;f)WU!g|~=GXJjX+KA6M^rv$(*(cPv%&M_E`$HvAc z)*X=LVBPDj#B24zytQF+FBzeA^mjI(Y(m-szovg&wdur)`vrOVrycjexj8||tu-4a z?k>X1%Zm{;UXbCN_+7+tgMlxSW@a4X#GjJ-tf>IRZ_PDxFTVFV2nR4QFkl%rDJd!G z$!N9s+_^j}6k55QdrJ?8A{wm+-7{+KPq(g>kg`eUZ2X zIrrbJn4Ek+RQ+3bBb8R3(we2#doi91o8|KP7++d^i1BpglWMmS>~oxLeRds|J1>x}aMaCL;=xue~J| zUj=E0GR&G^xF4Wk;n1QfRE5CDcoN5u`A+D(UnJ+6bqyOFl$id0h7xgv$8W!cMbo(F z%0l$?AEXyr3HRgnd5_0dIl_WYl1s-2)CTKpZg{3>nj=nmu%bUISzveGj4wZKfr$Y} z{8fO=6fYS0+6)`shn{2Fv*!^!GrKZ0v#bt)xs6?Wbe*>sm=gj)Hz9E^t`qnHH$rvW zdAH+jeFon$Wc`31`V9CwFS_iO>U5KwiNw%his zO6&3D;SO=F)@<$dm5+93zl|qF<5_!O&m>*>oK5as;#r!Gf$XbA=Xp~bD^IP=9>}3m zqnvPV*p)D&lB{~*g!A_62QG-3*H+wC6cQ=e&BW^P)3aIdL&3n2_GJv%tLec_>}*#B zR=r)W@x_aSq-S175yLY_X5ku`Hd27-*iVwDqblc-uJsY*` z>o1p~4@M4&;ZscYzZu7OEa zf3HV{2r8DD%8Cj?M^aAgcmidh6s}V=FBre=hrxzK9TLV%3%|};J3D^pBkn!$a@#iBt!bw;`)5Ri5L;zely6{JQ$p?0H%U|WR8r0Aj00Cyfbu8v($^BZ3K z5-246peR81M#N3(`EJ4>qkyb>5gvc3th}6nj+83q-?!IpMXajy>&375>zL`NgO6)J zB)J}wGpi#eJ`>+-Squ};H5$@DKMwe2k=3<&$QqRj5^XrmClEOI!vXGnLR^1v$AvTW zn{B@_bQDV565vsxhB$@t0=}nvK-<7o;MQ}r6}%NtwA zLV^V=<^I%0&p+>Z*<)Yw1k-+3iPe+C{nMw@ltQ2pWb*ih641uhn8Eq;b$paJC~I{4 zB=D$xBH(|gSdSV$1r@C(6r&lL55E>4&T7a&I^BgZy!B`T0J@1FkT&m#3S zqYbz~?-8gR*3e5IzLk{)r0&NHJOr@No+2wN8yjOt2x|Bf`OTU(Q^-;T+q91yx}ZP_ zG6SfFX8R*rJVF#;muPB$UOs0nv4#Xg%eGRWMzr_HL4XO5fLRllQ%!`g_Z>n3R1{+ z{^2=EM=ZF98RP-OKc#a+GfIrZXdW7+ZcruXWo1tz(cobCNz5sl3L{5uHB~#(9jUGI z9~)yX`%=mQppQ5}@3dQxqZ1m5o0z@$9EB0p-@Od=f_zra_1`b+QdEv*jhaWh>@Pe@ zu0fjvml{`Qgiop&FyemtWwW(P_dWYE-wO+4o2eEp?VNVdYTL&WlXA)`N42-6Y2{)F z5MBSnr2k=qDG|*dr243E_Q(CL+O}s8yWwV($-AqHTJ!Ox1u(&0TKkMdcHTlcC|iBe z?J>yw|Esbu4~M!7-yaHv>|RT@HcGNoc8a1BqJ^;yBKsa=E3%ZgNb0qWr4T92WE9!P zUZL#CGbv1K7=bX=Tp69;r=RWbsV@zKW+g*F>RuzJ+ zAqjXUbu}AdZ0Q8s3bY375sM`NeZTmohKSUqKj20DFsdR4ZfFOR{9HfX`p=-jxpQ@J zg&{)1219EXUU^mb&riTeSnEP6H{g&EZ1PmeNSX!9C>{NE+Y;zC6NfI>Ca4AQw@e&D z*mPDl9@Tb$a}2j}E!2^Q9aJ;L-;j5GfS|~PK>{Rfz0Jki@b=XnI%WcZErRXw{A$867IlQq4jZ`Z1?|QpEK(syNDVXd-%A*C)TXep568xLasruV&R4g%W z>eU-vysrC1SM;Hmf{aCmWkF_^b!|N5)_SwhRt?;8XS4apAC(7lqwh5g_Aw4zre&@r zwv0V}>a2I1U4Qxxk&+~sEPdN5siQXMlE~}(t^%#9FMw953{|#~SIHh9`fEU6lq7+?hRfzb*MU)s&I5W9c6Hv~ zpD%@41=qJo=_% z;-r)m*vib1{1fPo+^~z9vpYbR1dZ+^zG|;Q?1J%4bF#LwiiP+G9D{Bs?!)hUw#M#0 zAGdu229GkYT7i@VFBW-Oj)6T$e}Bf!LGn&BU25H5JT%wOaN5uk;?AMhWv@vvzQCs| z#kzC%`?7iN_6R2&*POX$+RQ?5@M+D_^bGsrJEMA656B*luU$O81D|5y%Hw_}_l&f~ zDdKO+N1sO>ZEgDSWF+MWT9?0=O|ynzP-iYmua7Uju~;I+fJY`?oy})WLyW88$mIV^ zjl=r53FwjCV2&CfAiue_84e1jbCF-c!}5arG1%w?$B)~bL8=kk?@wvTq56ZfBPwnI zsZWU_Qz0LH0C|`YP$CV``F9V!leL?OS&BHeuN;sQ??v4Covcxgd5>|nbd~kK$p=76c?|gq>oyRa4XBrN`4DD0_I9Gk*63B0UCu@BvG@d z3_OAkc0@)&7In$j*7l^3Z@3CtIS?bT96xM+Vi}sf-`rfePMDn#Vdyb-c}x-i{Kxx4 z{i1bYj5%#>m-+GwREj}TycB& zbT>c$K5g;^-*)Tz0f3x% z(7>6qw=%VNF+r2PeA7c08_{Zsh~i~;h`OWeWA~7d0thsjg$3gI1kloju=z}&T2s|0seT_0dT>bmvsq5_gq-Q9&kUt zLR*G~WWv0Bs}G7I@WhG(N#(asGSF$C$_q>xFicjWq@p4|=*WCzd%8|U%V(%c9n4jt zP##+(LEW?Y1F9A`clkIl8bmGB25HNBj7Kc_lF9)j{<{nn9~#L&pOwb3eBM}O1c3-S zQWG;Jm9^yc>fKG_G=CbaNmNDXQjK|P8})|xQnNe~$AvylOS=bk`+GU;XSn5VkJI&K zxIU1d=epULxx~jrf?fVD=|ltB%bowH29@|N=y8|1eRB7dXhr603ppfe1GX#*fUa-g z358(3y#6`uL)t(Nu^qDb4bW3XTkP^zbWB&X0bKKoR=Xhx%hBbR(e~X;rwq0hD3m!s zJ+h^Q1IY~yWpBDb%&M9f%1Q}WUu=%+^5ia=H*@QGD_a+VYJG0Yc1`v~O%!4cR^q%a2?Eg(mUZ+j9O93DlzPfJUSS?88KA*bz4BR?T@ z)NTHs?4hE1MM9=<_hE(p>}5Cv?Ll#y-as7xyR!ZZ%#)HNHesljlO%l2X0ZFYiz?Y$ zZ=9MBxu@F>6*lS;PM31Qd%vuOVvh*}Rf29{pb7vE+v+L~rd6GJn+eB(;XDlqzF;Z7 z{?&a?U9&s_Y#Lm9g{oVL@IP1GYEvsnUm+zx?a}O0P+o%W`1Bj!v=<+)A417Qkw3sH zdG?;r#Gh19=|Pi!X$%owVC*g)&xF`4{#F25e;XTT%YlS=w*orEYM#5@EO=e+DimmT)C33FiWlxs}({m;lE~H36^L_Kr zKzArzz!$?XvIYc}cD#!GKA+)eNn*Zt9Xw`qpooJk|FCe8RRiYv|CcO6$0Tz_)-JUT z3$7NI%<15viNxQ`7_hjKNLX!&{(5)~wgy>E(A&)uacs?e4sfLHBR5Ur{LKl$zQ5DqZio7r3K6$~ z@;6HwU@j@#^uTR19xlvmgi->DKp;1|;wNXCwJ)d7p7pI|zA~e@w7YSIQ54vaH8C-v zd_wYnXFEq@;vc$3zgd{64RhNq8FulH&1BQRGByG0tB;cp%qaS3s3-J;=GrW%pVPi;6ftfsI1!-{uQ1!7;$X|1DaRe(Vi?^=4pqvE=J2zi< z?Hz~0xdgi~h8YMASfTp7lrn`-&@uYRs36v6k2bn09BE(0z~0v?EzNy&UcY7}HTBNy z1#nXP31%-CU+2&oV0ckvhZ_`pq5MGL0Fatzy}jj;S4D-st?gI<*qnonlO+20>0=74 z0wCl@1U`r*K_K%FI&q&FBtCrf=o@3P#6qqd9Jd5JD!|nj!ccO54GMXZdr{es5Jr$P z1Niv|z!N2q!04y(RKPLo2nP)kbUZf#ALUk~q~zqMuU>J2KNn#`2gDQ;pWk_QXf57P zn#jz|ly?%n(R}TwK}l$XdfdF%qty7r5}@_yzGl!ObPhnf2FMknVCud>97Z~C&dr|} zanL-$1iJWy8Mr9*4&CJwOdW zc}BLZI|zI)tj;_C4sAAFp4VVD3%QZrmrbaD7u4#6U7=`1+8K051?szik`ne%?sJ@t zjaXxXWMK~tn03^31F1j^C_2C+ZB89_*j+d@WS8OIgYEFLegMGKzQhW}OxOXb#A4ZM zbTtE9_hYDA35(a^HO*9k6wBZ-(+I`N!?ZLvi|h8QOVjCoP+LVofwLnj0usEdP*z|f zKt&9CI#D?1G;97Y7(&aJXWv_c#B~kOvcJD?fklW?gXC_lwsWiz2-5|@4d!uLfkPmv zQhh5n49^hT=OCHmF791#>xP=T4yo{5GDBE_$p!;pJ>thyR1_~&6%`fz1Z(Ys4*+}<1+eOsc?hRA)C5fcu^=%BLZ;vb4$5ri%>{$D z#hv3ohde*Dk?d2rXh%$KBXe_z>*gc8s|ur8{cgdB%Wp=VM5=1Z_OVZ%or|0HHzQ6x3@ukVsIxzzpLKFl9(t zo$d&#Ct=M%Ib>`Qf!T;-fFm#gv zP3Lp)pCG<9_`qG@P7zZ-1NoN-KpL^x`7eeOCps+WZ&0+d!FbG`uud(^0)YSoNfZ#y z<#CRKp>70{vIQ}b0R2Kxa5U?#uKPRHw#CASL5<(FB#sXdZHWfGB`IgFEQU z_$>k$l_0oDj%ooVQ^?$adYiw}Uha({(Bo1##F{7fbuBg(X1XGhSLH`kmwtgV3{P;ny$=oYo*2RcoSy$#96)i4jaq2PvwXGCwpbeA9Y)+|AiAel(3#h*|))c2KUZKy*#sK-0am`QXZ;%Jc!m$_qaY=T9okqTf{c5 zBwW=F9n0Jzd9}4!n?W#2K3M2GqPMv5x?z8|uIs_Q{N8mV`9$7O@1;1kO!nLiWzOLa1lh)80&vhJJdoJ z_QSD>?ER^0W<1;B0swaK5kBSV>DgIJ(*`Qp7o?ex<=KGFkWzd07Pyc^!pNZu5N=g? z0NG%0w?ZmVADOQ)W_cL*aha&aLdlvW%g)^#owhynS=EfT*Zs4AP6MY-xy7^v2eF&i z$lv{*aGgV5l5H5vop7gQCfa{`wF%y_&hjE*7Y9}yjFdoTV?$9~jN_A9UnUt2lWmU( z^xM({cUjLa32F0p%%T{wTIFg9g0ZuBqi6%z;>7hTXini35t+uZ#MGap97s7IM13&!#~P1YO?qzOeYCv>DmNPtQJ`;Cc%|*8O}^@ZPN_ zD%bLu(pcJ7z7R&;`BP)fwIfe8^Up_56+_)YP{khyW7&h-h7kO(w=uqX*p~nJflm4# zrxH>Tn=xzEU1^LQZ-FnRP9$}qfQn`3F5y-vx7ghY#=CHnO1)=}P(LRpjQOfPGk`7$SavlruG|0q zn+vjr*6uBGH;aW5Lw>=4F4Y+a9qW_Wo1SkAPCU;~yfJM<4|`xJQi(5#A(uV4HhaqZ ztM{N|fhPWR#)UzTz*8_y0z3?I40-0#&Z4;UPo(KJHAy(rYu`oTSC{qXndwZ}dq^5c zGTMsQRCVdPt1gXRQYF*f;$9l~e;G?V+mw|4S8-C)QXDgPV2ITdN3i-y{t;#CitPsZ3#+9|1fd{)G+JM&us<} zp3(_klG4^s?pvCKTslj0<&tPKOv&T;C@*I${qjdtupHbaC0lC>*bV^1sA~r>Pe7NW zdp(`MZ^7tjH9k9?;}s0}Ep+{s58FPa)8^xDJeC=Gq+LUz@pKEDhFge6^D;nc58WMEWt{+j&L`(5DhGsdf2=5< z9ZvA?^vEqU!KuQu*m_`x%r>lI!;FZY_PbXfvvV|6U#wjs|8(7bkE&I^*iXm1j>$FPD z>WgBWnK-Um&R$I_8Q-ZbKddl!^kBVIR#v$7Fi}ZMp&G;epu#S=-POoMF@K9nM4yOH zwyb$da1;4BtFu72;hLXx?jA~{)g8QSSz|ZYc+elKux8o%G1+CF*zrQGOm>m>`boR+ zrBd?g-bOV|+PV_p#CS3JXsbRh`w0!49S}FCZRU$1{ z{a~>xsp!TNp*$|NYbBw^()?n9E`g-dg1~P|E9LaQa(bL?2t}Y74xO)^OVlK)p(~~smA~0a~`?Ka8vEaq}z_&XmVWx2s zQIiS1kw(osViwWNQ*XCG4B2y*!CYE%ZJJK4G;vI&cbax7OzTDN6}X&YP*|+jx)S?8W#UjUMwllz=0@$0 zl$%2s&ZG#>$RwQ=p|EyO{yN~gJHJk@cKg=r#AR3bJ~a)kEyMB&*VO8}VWAK@r!_;} z#%ZWeJaj_fvDf$k*={FcVyXD0?4JC;QCj(jCGC7NWBo&Td(1jMzYwJmg}uD4eK{Jv zCAQmE*=F8<`Dgmody3I2XyOTpEk!UTX1y%A_C(b@5v`r{bo)!)mDKwohjw8(yPA&$ zlA_9*f7lJ$&*m)(w;2zb{HoI4@uT^7MPK2G=RpH^oll_8+4@0v6be>5#o#j#ms{a6 zd34Oo#mI#Iy?I}0C?nv>*ufTsyN>s~p7C*dGgrtPo-g0=gP8S#Bt^c6p$*RbAcRsl zS)mCZdTU$zVC&_yMCOb~$uJzkh64R+=s(x=Gi+1H?IBfdT`X4^epkEX9zV~h_TUjn zo+q$*f}bTl*kpAetF$LC2xDIE z2jdJP)~cRqBFdFsS9qLDET*v7d&FF@2QTzNx%Gqcjyd9*D;WR0X!`P-Q=td2w5jVZ zN7L+!dwKZyF7;pDDI7#w8wLE3HEyB^CzK9fNWX_>+<&e(p!%x7c4~^5;`F?#TN7V` zdUlm-GFx!Na=TRFOlS?=h&A`V9d^xTmR9xHo4G3Xd3bAA!Gn>T3Fx>qi~e*QSdmci zPHL{uc(M%YT<4{lF-AMSWL{edeUeA&oA*i~{}EOs3t9^Xo3Y|aMSdkrmQK|+WBxCT zgB$obL;VGsqEB1L)K7&3ix02_j7>;KOHp1h_3Nx?2iHPT@v1U7y5BqOkPHMMCV;N^6k$LsJn=ny;VpaShb%peRjiIOhzD{&m|#{GU`+Tt+T)&(`h=Lb4|D*c#y>l=fseWe!ALQ-0W%l#NURU9_uLL zJo0XjirM3S#ogG}9u}?UKI#d{F~>7r$F;&p-KLL|(<))mS7^|V2CU7~#tyfDG#Qg~ zKfSfq84_B&e0iDs5qr9nHxrD=?<98^*0I|$d8w(WeG>amp=wjfKW@bZ=<_@ zK)myGvyUpr-w+#|VTO_Pp--a#1c5MP=Qt=BKn2|_H*CsAW3I;SwrQ&mF{&LZ__(Kk zvTc#Kzopof(SD>MpQ z4)tGr8_(-Qe+i$$%WJ=LXJoJE8PL(gKBemi5{CwTV#72D_oa(_Eko;_PeWo0HATC} z8FXYN(#>|^Oj_j2eI_lB;0Oo!INS4t?&1Zz&0M5=W&;Pa$+G)auTPaRiyOwhFrA}-!={)ZJF9p?>FU8p{QGu;VL zFF&w6bn}8|eA~&ZEOg4?)IuM%q=dAez1k16KBFJk5CyCT05kv_g1f+d+Fi6kU!)GI zzRVi11D2Z-oBcda32!J>o)%Z-Os-Til1{wx-u%bmuU*LxTGld_W=4rkv^m<>US)5R z_H*?)9kX@Z%BBs&Pj^tEa}zBFRe!X^$ihNc^!A;nK->V5`MTG$L|eJAyhdVi)LS8O zClnkobx^p0?awJEr@ULz251=DH{)0dif zj=4G=5Vq0gP9$XB(j&bMZr~UG-&OF`9(`@+o z@1u&sr$bM8|DGXS>zv62p=My_(ihywJ1P-R<^Ahp0^4tI;ay8qa=8jiaQR!N9m@yJ zM$cigj_1R#|1ri_doz|7JRB20ZI5eUhENVm3UvYEhvnor0lU(Ji3OBME+zY8B#LMM zZ8zRE*!QuE@#FDaH08`#THANSdW$g?auj93k7%o@iuc9IrAn9bddxHz~tc&c2JICCLZ&Z-4$;5u;P_={D?-$43t7UI{p!u74KmVMC)e zj-Fy4!Y!_aYR?-H?UItg~^js-=@ES>-W*IAo zOw#+hq-B>^2bj`#qVcY5^O$;cwPTnZ z-Lm5JzjXUwl3aW)7d@nYzpuihkg)i}Lr0}&Cg%RvVW^+24nX@r>2;YeqvU7k^gCML+&L^DVYCVMtj1--yCt^VIsS^Ymh3 zBX5Z|3)*oD`{a8=?@j6s(_u(ucpR~AQK#^FmO)veL)L{-Z+vuRXc%=pzWtkl%9XczJ_EG->CGkAs literal 0 HcmV?d00001 diff --git a/packages/upgrade/source/versions/v5/common/connected-accounts-dropdown.md b/packages/upgrade/source/versions/v5/common/connected-accounts-dropdown.md new file mode 100644 index 00000000000..0307c43693b --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/connected-accounts-dropdown.md @@ -0,0 +1,15 @@ +--- +title: 'Within ``, Connected Accounts Added via Dropdown' +matcher: '(?:` component (which is also rendered by ``), adding a connected account is now rendered as a dropdown instead of a modal. If you were relying on the modal for any sort of customizations, these customizations will need to be adjusted to the new form factor. + +New appearance prop keys were added to aid with customization, if desired: + +- `cl-menuList__connectedAccounts` for styling the list of connected account addition options +- `cl-menuItem__connectedAccounts` for styling individual items in the connected account options list +- `cl-menuList__web3Wallets` for styling the list of web3 wallet addition options +- `cl-menuItem__web3Wallets` for styling individual items in the web3 wallets options list diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 8dd79aad606..ba38197c0f3 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -23,6 +23,7 @@ const reactChangesList = [ 'organizationprofile-settings', 'userprofile-security', 'mfa-dropdown', + 'connected-accounts-dropdown', ]; export default { @@ -62,6 +63,7 @@ export default { 'organizationprofile-settings', 'userprofile-security', 'mfa-dropdown', + 'connected-accounts-dropdown', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -89,6 +91,7 @@ export default { 'organizationprofile-settings', 'userprofile-security', 'mfa-dropdown', + 'connected-accounts-dropdown', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -146,6 +149,7 @@ export default { 'organizationprofile-settings', 'userprofile-security', 'mfa-dropdown', + 'connected-accounts-dropdown', ]), shared: load('shared', [ 'magiclinkerror', From f44d88730d35e58b4cb0dc20508f0b7a4c25112f Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 17:08:50 -0500 Subject: [PATCH 044/159] feat(upgrade): Add userButtonPopoverActionButtonText change, multiple regex can be used per change --- packages/upgrade/source/scan.js | 17 +++++++++++++---- packages/upgrade/source/util/expandable-list.js | 1 + packages/upgrade/source/util/load-change.js | 4 +++- ...userbuttonpopoveractionbuttontext-removed.md | 8 ++++++++ packages/upgrade/source/versions/v5/index.js | 4 ++++ 5 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index 070913fb214..5c96c8511ab 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -79,16 +79,25 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { // then we run each of the matchers against the file contents for (const sdk in matchers) { // returns [{ ...matcher, instances: [{sdk, file, position}] }] - matchers[sdk].map(matcher => { + matchers[sdk].map(matcherConfig => { // run regex against file content, return array of matches - const matches = Array.from(content.matchAll(matcher.matcher)); + // matcher can be an array or string + let matches = []; + if (Array.isArray(matcherConfig.matcher)) { + matcherConfig.matcher.map(m => { + matches = matches.concat(Array.from(content.matchAll(m))); + }); + } else { + matches = Array.from(content.matchAll(matcherConfig.matcher)); + } if (matches.length < 1) return; // for each match, add to `instances` array of a key, create if not exists matches.map(match => { - if (!allResults[matcher.title]) allResults[matcher.title] = { instances: [], ...matcher }; + if (!allResults[matcherConfig.title]) + allResults[matcherConfig.title] = { instances: [], ...matcherConfig }; - allResults[matcher.title].instances.push({ + allResults[matcherConfig.title].instances.push({ sdk, file: path.relative(process.cwd(), file), position: indexToPosition(content, match.index, { oneBased: true }), diff --git a/packages/upgrade/source/util/expandable-list.js b/packages/upgrade/source/util/expandable-list.js index eb4a2782e5c..d1e289ac0f4 100644 --- a/packages/upgrade/source/util/expandable-list.js +++ b/packages/upgrade/source/util/expandable-list.js @@ -87,6 +87,7 @@ export default function ExpandableList({ items, numberVisible = 10 }) { {/* changed in {item.sdk} SDK */} {item.content} + Open in migration guide » diff --git a/packages/upgrade/source/util/load-change.js b/packages/upgrade/source/util/load-change.js index 9554435a1b5..6807a5b9483 100644 --- a/packages/upgrade/source/util/load-change.js +++ b/packages/upgrade/source/util/load-change.js @@ -20,7 +20,9 @@ export default function createLoader({ version, baseUrl }) { return { title: fm.title, - matcher: new RegExp(fm.matcher, `g${fm.matcherFlags ? fm.matcherFlags : ''}`), + matcher: Array.isArray(fm.matcher) + ? fm.matcher.map(m => new RegExp(m, `g${fm.matcherFlags ? fm.matcherFlags : ''}`)) + : new RegExp(fm.matcher, `g${fm.matcherFlags ? fm.matcherFlags : ''}`), replaceWithString: fm.replaceWithString, slug, sdk: sdk, diff --git a/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md b/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md new file mode 100644 index 00000000000..b10ee011b99 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md @@ -0,0 +1,8 @@ +--- +title: '`userButtonPopoverActionButtonText` descriptor removed' +matcher: + - "\\.cl-userButtonPopoverActionButtonText" + - "elements:\\s+{[\\s\\S]*?userButtonPopoverActionButtonText:[\\s\\S]*?}" +--- + +The `userButtonPopoverActionButtonText` customization descriptor has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. Any styling that needs to apply to the text can be applied to its direct parent `cl-userButtonPopoverActionButton`. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index ba38197c0f3..1486609725d 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -24,6 +24,7 @@ const reactChangesList = [ 'userprofile-security', 'mfa-dropdown', 'connected-accounts-dropdown', + 'userbuttonpopoveractionbuttontext-removed', ]; export default { @@ -64,6 +65,7 @@ export default { 'userprofile-security', 'mfa-dropdown', 'connected-accounts-dropdown', + 'userbuttonpopoveractionbuttontext-removed', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -92,6 +94,7 @@ export default { 'userprofile-security', 'mfa-dropdown', 'connected-accounts-dropdown', + 'userbuttonpopoveractionbuttontext-removed', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -150,6 +153,7 @@ export default { 'userprofile-security', 'mfa-dropdown', 'connected-accounts-dropdown', + 'userbuttonpopoveractionbuttontext-removed', ]), shared: load('shared', [ 'magiclinkerror', From 9026c08282513584b9c6daea3c6e2744fc0f013c Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 17:11:48 -0500 Subject: [PATCH 045/159] fix(upgrade): Add image to previous change item --- ...serbuttonpopoveractionbuttontext-removed.png | Bin 0 -> 11159 bytes ...userbuttonpopoveractionbuttontext-removed.md | 1 + 2 files changed, 1 insertion(+) create mode 100644 packages/upgrade/source/img/userbuttonpopoveractionbuttontext-removed.png diff --git a/packages/upgrade/source/img/userbuttonpopoveractionbuttontext-removed.png b/packages/upgrade/source/img/userbuttonpopoveractionbuttontext-removed.png new file mode 100644 index 0000000000000000000000000000000000000000..377b16b8613a6ba91128857084402ecf4fd57a15 GIT binary patch literal 11159 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 Date: Fri, 12 Jan 2024 17:14:21 -0500 Subject: [PATCH 046/159] fix(upgrade): Add some extra stuff I missed to the previous change --- .../v5/common/userbuttonpopoveractionbuttontext-removed.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md b/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md index 5e26538f9c6..6c6c0e934e5 100644 --- a/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md +++ b/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md @@ -3,7 +3,11 @@ title: '`userButtonPopoverActionButtonText` descriptor removed' image: true matcher: - "\\.cl-userButtonPopoverActionButtonText" + - "\\.cl-userButtonPopoverActionButtonText__signOut" + - "\\.cl-userButtonPopoverActionButtonText__manageAccount" - "elements:\\s+{[\\s\\S]*?userButtonPopoverActionButtonText:[\\s\\S]*?}" + - "elements:\\s+{[\\s\\S]*?userButtonPopoverActionButtonText__signOut:[\\s\\S]*?}" + - "elements:\\s+{[\\s\\S]*?userButtonPopoverActionButtonText__manageAccount:[\\s\\S]*?}" --- -The `userButtonPopoverActionButtonText` customization descriptor has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. Any styling that needs to apply to the text can be applied to its direct parent `cl-userButtonPopoverActionButton`. +The `userButtonPopoverActionButtonText` customization descriptor has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. The nested descriptors `userButtonPopoverActionButtonText__signOut` and `userButtonPopoverActionButtonText__manageAccount` have also been removed. Any styling that needs to apply to the text can be applied to its direct parent `cl-userButtonPopoverActionButton`. From 0ef63146930e440e4affe62b1cb0b4ec272e8fa2 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 17:28:49 -0500 Subject: [PATCH 047/159] feat(upgrade): Add userbuttonbox/userbuttontrigger change item --- .../common/userbuttontrigger-userbuttonbox-invert.md | 11 +++++++++++ packages/upgrade/source/versions/v5/index.js | 4 ++++ 2 files changed, 15 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md diff --git a/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md b/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md new file mode 100644 index 00000000000..ae3b131e519 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md @@ -0,0 +1,11 @@ +--- +title: '`userButtonBox` is now a child of `userButtonTrigger`' +warning: true +matcher: + - "\\.cl-userButtonTrigger" + - "\\.cl-userButtonBox" + - "elements:\\s+{[\\s\\S]*?userButtonTrigger:[\\s\\S]*?}" + - "elements:\\s+{[\\s\\S]*?userButtonBox:[\\s\\S]*?}" +--- + +We have swapped the parent-child relationship of the two elements `userButtonTrigger` and `userButtonBox`. Previously, `userButtonTrigger` was nested inside of `userButtonBox`, and now `userButtonBox` is nested inside of `userButtonTrigger`. This change resolves [some usability issues](https://github.com/clerk/javascript/issues/1625) in `. If you are applying style customization to either of these elements, your customizations may need to be adjusted. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 1486609725d..d752d792114 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -25,6 +25,7 @@ const reactChangesList = [ 'mfa-dropdown', 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', + 'userbuttontrigger-userbuttonbox-invert', ]; export default { @@ -66,6 +67,7 @@ export default { 'mfa-dropdown', 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', + 'userbuttontrigger-userbuttonbox-invert', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -95,6 +97,7 @@ export default { 'mfa-dropdown', 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', + 'userbuttontrigger-userbuttonbox-invert', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -154,6 +157,7 @@ export default { 'mfa-dropdown', 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', + 'userbuttontrigger-userbuttonbox-invert', ]), shared: load('shared', [ 'magiclinkerror', From b0a3d36e4272a3ad3d52ca9a78d97814438dc017 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 17:32:43 -0500 Subject: [PATCH 048/159] feat(upgrade): Add organizationSwitcherPopoverActionButtonText removal change item --- ...zationswitcherpopoveractionbuttontext-removed.md | 13 +++++++++++++ packages/upgrade/source/versions/v5/index.js | 4 ++++ 2 files changed, 17 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md diff --git a/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md b/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md new file mode 100644 index 00000000000..28c90dc10f5 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md @@ -0,0 +1,13 @@ +--- +title: '`organizationSwitcherPopoverActionButtonText` descriptor removed' +image: true +matcher: + - "\\.cl-organizationSwitcherPopoverActionButtonText" + - "\\.cl-organizationSwitcherPopoverActionButtonText__manageOrganization" + - "\\.cl-organizationSwitcherPopoverActionButtonText__createOrganization" + - "elements:\\s+{[\\s\\S]*?organizationSwitcherPopoverActionButtonText:[\\s\\S]*?}" + - "elements:\\s+{[\\s\\S]*?organizationSwitcherPopoverActionButtonText__manageOrganization:[\\s\\S]*?}" + - "elements:\\s+{[\\s\\S]*?organizationSwitcherPopoverActionButtonText__createOrganization:[\\s\\S]*?}" +--- + +The `organizationSwitcherPopoverActionButtonText` customization descriptor has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. The nested descriptors `organizationSwitcherPopoverActionButtonText__manageOrganization` and `organizationSwitcherPopoverActionButtonText__createOrganization` have also been removed. Any styling that needs to apply to the text can be applied to its direct parent `cl-organizationSwitcherPopoverActionButton`. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index d752d792114..bea18bada3a 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -26,6 +26,7 @@ const reactChangesList = [ 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', + 'organizationswitcherpopoveractionbuttontext-removed', ]; export default { @@ -68,6 +69,7 @@ export default { 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', + 'organizationswitcherpopoveractionbuttontext-removed', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -98,6 +100,7 @@ export default { 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', + 'organizationswitcherpopoveractionbuttontext-removed', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -158,6 +161,7 @@ export default { 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', + 'organizationswitcherpopoveractionbuttontext-removed', ]), shared: load('shared', [ 'magiclinkerror', From bbcda3bd305b4b282deb825e684767b13564fcbf Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 17:40:58 -0500 Subject: [PATCH 049/159] feat(upgrade): Add card changes change item --- .../source/versions/v5/common/card-changes.md | 13 +++++++++++++ packages/upgrade/source/versions/v5/index.js | 4 ++++ 2 files changed, 17 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/common/card-changes.md diff --git a/packages/upgrade/source/versions/v5/common/card-changes.md b/packages/upgrade/source/versions/v5/common/card-changes.md new file mode 100644 index 00000000000..2284e6b6664 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/card-changes.md @@ -0,0 +1,13 @@ +--- +title: 'Changes to the `card` customization descriptor' +warning: true +matcher: + - "\\.cl-card" + - "elements:\\s+{[\\s\\S]*?card:[\\s\\S]*?}" +--- + +The `card` descriptor in the previous major version was the main and only container element for components Outside the `card` element we introduced a new `cardBox` descriptor that allows more fine-grained style customization. + +As a note, if you are changing the background color of `card`, you will also need to also apply the same color on the `footer` descriptor as well. The `footer` now gray by default, and it’s located outside `card`, but inside `cardBox`. + +We also added a `footerItem` descriptor for more targeted styling of items inside the `footer`. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index bea18bada3a..4381c5d0c61 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -27,6 +27,7 @@ const reactChangesList = [ 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', 'organizationswitcherpopoveractionbuttontext-removed', + 'card-changes', ]; export default { @@ -70,6 +71,7 @@ export default { 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', 'organizationswitcherpopoveractionbuttontext-removed', + 'card-changes', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -101,6 +103,7 @@ export default { 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', 'organizationswitcherpopoveractionbuttontext-removed', + 'card-changes', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -162,6 +165,7 @@ export default { 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', 'organizationswitcherpopoveractionbuttontext-removed', + 'card-changes', ]), shared: load('shared', [ 'magiclinkerror', From e1e9f7aad57f9112d88d58e655bfe31ac5b5d3f2 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 21:03:07 -0500 Subject: [PATCH 050/159] feat(upgrade): Add alternative methods back link change item --- .../source/img/alternativemethods-backlink.png | Bin 0 -> 48838 bytes .../v5/common/alternativemethods-backlink.md | 17 +++++++++++++++++ packages/upgrade/source/versions/v5/index.js | 4 ++++ 3 files changed, 21 insertions(+) create mode 100644 packages/upgrade/source/img/alternativemethods-backlink.png create mode 100644 packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md diff --git a/packages/upgrade/source/img/alternativemethods-backlink.png b/packages/upgrade/source/img/alternativemethods-backlink.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea85bf42c2c98d81ae7cced969cd0ca0b64bb00 GIT binary patch literal 48838 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 YmqaIhLCqQLZiuI)rlVS` that lists out alternative two factor auth methods has changed location, and there have been some changes to the descriptors as a result of this: + +- `headerBackIcon` has been removed, as there is no longer an associated icon +- `headerBackRow` has been renamed to `backRow` as it's no longer in the header +- `headerBackLink` has been renamed to `backLink` as it's no longer in the header diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 4381c5d0c61..8110622fa19 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -28,6 +28,7 @@ const reactChangesList = [ 'userbuttontrigger-userbuttonbox-invert', 'organizationswitcherpopoveractionbuttontext-removed', 'card-changes', + 'alternativemethods-backlink', ]; export default { @@ -72,6 +73,7 @@ export default { 'userbuttontrigger-userbuttonbox-invert', 'organizationswitcherpopoveractionbuttontext-removed', 'card-changes', + 'alternativemethods-backlink', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -104,6 +106,7 @@ export default { 'userbuttontrigger-userbuttonbox-invert', 'organizationswitcherpopoveractionbuttontext-removed', 'card-changes', + 'alternativemethods-backlink', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -166,6 +169,7 @@ export default { 'userbuttontrigger-userbuttonbox-invert', 'organizationswitcherpopoveractionbuttontext-removed', 'card-changes', + 'alternativemethods-backlink', ]), shared: load('shared', [ 'magiclinkerror', From 6a7987c0e220701193af3728d05b14e99a33e996 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 21:24:54 -0500 Subject: [PATCH 051/159] feat(upgrade): Add button to organizationlistcreateorganizationactionbutton change item --- ...zationlistcreateorganizationactionbutton.png | Bin 0 -> 21827 bytes ...izationlistcreateorganizationactionbutton.md | 10 ++++++++++ packages/upgrade/source/versions/v5/index.js | 4 ++++ 3 files changed, 14 insertions(+) create mode 100644 packages/upgrade/source/img/button-to-organizationlistcreateorganizationactionbutton.png create mode 100644 packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md diff --git a/packages/upgrade/source/img/button-to-organizationlistcreateorganizationactionbutton.png b/packages/upgrade/source/img/button-to-organizationlistcreateorganizationactionbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..695c6002cfc344456b934722a9b52b906c0bdecd GIT binary patch literal 21827 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 SB;Qy`#Tcg}E)Fz1Ov0aI$&*9? literal 0 HcmV?d00001 diff --git a/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md b/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md new file mode 100644 index 00000000000..a623589355b --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md @@ -0,0 +1,10 @@ +--- +title: '`button` -> `organizationListCreateOrganizationActionButton` customization id' +image: true +replaceWithString: 'organizationListCreateOrganizationActionButton' +matcher: + - "\\.cl-(button)" + - "elements:\\s+{[\\s\\S]*?(button):[\\s\\S]*?}" +--- + +The `button` customization id was used only in one place, for a button to create a new organization in the `` component. This id has been removed and replaced by the more appropriately named `organizationListCreateOrganizationActionButton` customization id instead. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 8110622fa19..92391b4d19b 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -29,6 +29,7 @@ const reactChangesList = [ 'organizationswitcherpopoveractionbuttontext-removed', 'card-changes', 'alternativemethods-backlink', + 'button-to-organizationlistcreateorganizationactionbutton', ]; export default { @@ -74,6 +75,7 @@ export default { 'organizationswitcherpopoveractionbuttontext-removed', 'card-changes', 'alternativemethods-backlink', + 'button-to-organizationlistcreateorganizationactionbutton', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -107,6 +109,7 @@ export default { 'organizationswitcherpopoveractionbuttontext-removed', 'card-changes', 'alternativemethods-backlink', + 'button-to-organizationlistcreateorganizationactionbutton', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -170,6 +173,7 @@ export default { 'organizationswitcherpopoveractionbuttontext-removed', 'card-changes', 'alternativemethods-backlink', + 'button-to-organizationlistcreateorganizationactionbutton', ]), shared: load('shared', [ 'magiclinkerror', From e97fffd54ace2dde3ecad2ddbc342545b2e79589 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 12 Jan 2024 21:33:56 -0500 Subject: [PATCH 052/159] feat(upgrade): Add socialbuttonsblockbuttonarrow removal change item --- .../remove-socialbuttonsblockbuttonarrow.png | Bin 0 -> 22274 bytes .../remove-socialbuttonsblockbuttonarrow.md | 9 +++++++++ packages/upgrade/source/versions/v5/index.js | 4 ++++ 3 files changed, 13 insertions(+) create mode 100644 packages/upgrade/source/img/remove-socialbuttonsblockbuttonarrow.png create mode 100644 packages/upgrade/source/versions/v5/common/remove-socialbuttonsblockbuttonarrow.md diff --git a/packages/upgrade/source/img/remove-socialbuttonsblockbuttonarrow.png b/packages/upgrade/source/img/remove-socialbuttonsblockbuttonarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..0f43eed7496a1faa3deea795c6e7ca080f93611c GIT binary patch literal 22274 zcmeFXgS~!NQsn`bgRUIC|yc-NyE}0A|`kW@2@;lu3yn5(5ALQdJcNJpcd~fz96# z-o^eyaw`V`fP2zT^71;W^75=Y@7x@m-r55IDzRxs1jhRPGl3$IDA3!Ym9zEK%=_qee#j!xA9poNl zLvF9&S+_ajzOM9uajka>U(H`Jg-BV4iiu3;=jD7<<2eQ3eGa+T5^^Ux8)&1X9DV1t z{ASx+GsAC&Sp$ONN!hF05+~I8g*o8;>zF@&7xPjvWH=#4?-W;X0Wo@u0dGQ8;;iqO z+GMhJ#}|s}C-Ht0vq(bs2dvndkT>9dF6>;65ysJh-ShKj6Qz3d<4k^!bB!nh@MDzi ztbZ_jC|r!xhGB~%%=jl<<@N>7vD>HZu1}0w8-nR@MF%yUumD{F$IDxjq+1ui#*bg< z3@eN6V&!eVc}96RrwNN|#2K(6slF>Ky(lF*B*4+$AQMvS{}{p9htZXHl_8nDw z-R9ecnH=LF?cJ-v)2hyU9y+C+ZO?$guUn_n`EVrlLdhQ3^+fmWhS$9lufAS3uN(|u z6Sh`~&d+C*c}B}D%c>*eTN(}2h|%8)Ag4a>9q3(opzB)O$s)SCc~{*}IL6|LWc7jV zVK*+6b^Q_?^@CLcl*a=~9VSXl-wX#5EQjFZ0+>{+)Cp2vh>&}oJU{8+_0uLt0EGJR z0uZ0AqLeuM{UcCx1aa;8WUrx9h! z&cMZ(luno@r-Vx0Vw{EwE}2gkVs7(TY}$l1`XYGg`gIhVX5aG&y{D7A$99*(#pBLA z0lKqmd6Z1VF((vqZ+Nv?cKPv_6jY3R?r%k?w5kr@&ErAB-}tBD59(BIt7xFq<6b=& z54Rup(>$2w0b&RN!TVI`$PX55gL-THWyBbs{kCC5bn_P!hvWy{YJr*Lx5vjS29gF- z*3?dA!KKMkQzy&*HBpeDB>3f*ODXXEs~IY@2&V4YO8sfSy+@OPt!biC3g_M=)kD;d zKf9TQ{HTrn#hM&bhwKXJf{7E?aqgQO|J>HTE8_D%g$J+OKk!P|M4A(!jWYf z0OUBYsC7rayPv^Kh~ocpH~(3n)xDum(wt;r_wXelS#rXcFCN4YJhoyVk|8Pg6v`xa z2=n`lmm0cmMLG=-33sugohG>-a@YMq4z6Q|qC34gf$#Fp_FbTyESNxsgYf0cAB3c% z${OVA-OL_JbTMR=3@(CmA>CN&m2uf)s_ z>vLYCiu>~92hE!Z(=P=&cLx-@euKSmKgDXji2sehrRT+D8i{cp@#!+P2@Kl`b@g)#59|AV`{_r=UrC;)VrORmC0fhMay3EIOPa(DV)s} zebmf3Wx$~k{EvmYl_lrYby)@OHm6v$Y^m2zg zP)E=3sqQ;NVm&nj$|uykX}tS}66Ics+gW3d)e;Z*5V+f@7k&$Ow>2l_Ha*E$ykao^)|iPh~} z;uP$Q2ei^so-`ON>J-1?{mJq?%~Z}pt?YZ=cbU&YI^T*VepVa!{q%gr`)b#q;z#Q% zjuMlfLKECSsf*J}m|is(P8MkyHt0DPdyYGn82u0}UV6py`?FKRWXxFKALFl8W~(hq z$=s@c)P!|XiW=oSvp1ZEd!HpZXxWZJYcFc|YlUlF`M;*u(U|d?m1sCu7)Bem)qk&# z_xXDEY@c}FcGf~7Gb!!98IO@;)(B26gG9bpqE}W^z(P+`U6Ya5(r)7K<3FprX*(0! z7E@P++EZlX@KMVzOP_<60HT$`F+!PdD*F)$FO~?)C_o%g4mD*)I*(rR=e5EK&vUGy z!<7r}?S0dard8}}7q@D4^Q)4o@;&Mg->k0wf^k2iVxbD{f0IJR4d0&i;+D>6O@4kE@BP6$@l=}OXJW%v}@<-VUEM44VOX5Npy|NK4~lQ&}*Q#=y`qh(SxU7Ez3 zo*(tPOF8Db?{e!U7nsV#CA_>2w>CyAa`$r@N2o`pe(Ch$C1weK_ZZ@(h0wMRa%Y&8 zKbs<)iY(_Zw_KQC=yt7hg&}E>PRKN*D7|UI>tB?=#L2><+j<$33z%7?7oxi_~y15d^(o^G`>3v%kNVcD6OM}1f#qYqefckT zWI-~4nB420n`q2Zjg(1^G0&aK5JbpWNRr%edqg{FC|TH0*wgSgVVB_+;f{Fu_t+vL zB1;Jy`$cR#XD0S;bkM&|zLZ%%vG%ZL=wyzZi;VBe=J*}+JH~(l&Cbse`GHiIHIAw7 z$xcwM_ets&hfsIsR%TpgQB{Gh^)ROSh~bY8^XrSjxq z&Mp**72dXb$j1NJ#dnrg>p@YR@cR+13XOx!YN&G~5FFGp(E@4}4d%KviSqq5kdUWw zFl3MgGifzhHwnZ|w+crX_^6z1?4iYV#U(xOdZxVFJxVo3~Yip$Z(vHE0Me=@mqCS?{} zFITqVaba;m*`aX6$m=X83D3o$=$g!$`Vl3EBDiaot&C$w4zjVs(|5RFXfO*6snS0j zSZO#;*$@Q^nhN@MtXhTz7eChJr^uK$->P#zW)JvarQ5qA6h8&LF&yB9>1@0*1fAIv z`SwRzD&ICCr#imTt4pRg^3T=gK+U1ozlfKpn+@NT@|j+M4Z43`PMl19D_JVfs@(`^ zRKM7$ORf7@XR+Hk^}M{nxGeyaL2ANKZgg%mZt&1hpgf@ML&MCw2e4NgrC{Y_wNC`3AkSvk=vsG4c8N z$4`sWt7!8@hRTMj$uB<6xmp%8GL_oZ2NyTB7}5I?Os~cJ#Ec<*M>^})v&&=tg+cy- z!SaUkMz(6Uj{2|l)oYB7mpPJ@eVCt1n|f$mO;@j`u975?S0 zip3-wI?K~Bd?e4+wmw&EGZ4Au2S3)NrK5c)&}32S=IbJR-Mo7cEjcf- z18lT>)3WE$*y#Co^N_dINXvp0>VNj|YPM(h!<3{O=RDNg^Ln`4ti?>a!PBj+Ngup< zywHdyM5`T?ECGY9&Oh&v&B^XG%{L`U-vdwIJVK5x^v?GJ^VVc9#$brYr%o5bDUK7; zBht!{aDSjI3%cbha;s;v^`q?bo6-QMuBkCL7_bK0Yhw6`GuYy z(6UGbc#aQvIG?Zks~;WwRDKO&NRN9DFQ>Urlg%}rbHNk?0DHehe=euJfsrHd3` z^c7%58X(~?{S={e5v%^*B-3@h6>L8G9LPYDn0+xd>R>x!KqYfL+}GjsuVaOJK7u z_FmSkV3)V9o)Tbb_J1HGu=&5$Kz7!DK)jr#*^M=ISmoW`*|UlW2nqm2{(Bq+dr#YUPVQb#Zmz6<$F;U`^Y)TvXa9@ne}4a>(;n>fZ%nS9|1~Y_1c85B zfIS33)_m z-YG!Rymy14$-9B?&q;qNf?SU5SLAIjZg1->m+kCSXy^XSs%9s8@d8gl?mr%@M|j^= zLdYU(C@F9#$p7aFRguFrC;h)+qp)=WF_melgfSuiepEtANdL1O(@su=9gw2_Bjx{$ z_BTW1UiW{MDd^a7h)`^uhI;I*xc~9sl#BddWn6hqRva0H=@jwe;G5(8Ww+ofv&^UV zYSY%yOr7J!`aGT~D`LKi9jvJfG;&^VYX`?gZ@}|qe|M!sqf~ivAFN6&M^JSR@K)qx6rNF& zLy=9poz07<<=|8}fBp1V#87O_)t~$uuk(e2AX?^&KIJH~0K^?>$G80-xkBqTrtMNR zJF)F2(1k(Sv8&msRvIjOZX+CJject8 zsOzs3G-mI7KkXn361-jq1``Q8j@+}nIm+-X8;Z#`YP+0pQp-Q@=IQj`Ez1Z(GsJvv z!?K8J^?1{FHXU%FP;^zL`yk35|2+8iY6-O=+9v*T#v$9KGn9aNn(6oLh}h}4{vBZE zLgy#va{5IK(ziFmAQ<`R-PuL{>$w8%2)eq9EoIqE@qep|_)t+w!3PvF*O9Ra2qhv82ljn}t) zStJ8(Sb)kuT9Ty0`0FtoNrZpPwq|Rsx?38b87g$0eRI`I3S79bl)ro)d^%wijfNcr z3iTQ{(ucvL^tHsfa=a%^wvp_-WaT_8Sb44bxdp5;6fF7p>&B82p(uaPa}_+gH%N?X zK4_I}L3&rje+%Bx&;JzX5nbT^hs51n_q%4c$cDL6h6#?B3<^T!)1jzNBhGe0o2@SgD4oK6Dai_!d$L_#@kK5RTG zDYen{!gTM1rcsSX#^aQWVerm{?rDf;ie-|XPb~!;4_lAqh*!1DtokiIhIdAi*!opM zpZZk~;f=FfL&1kDVxyx+byFj!(E?AjD^B$dLzX<@(#y{){4_Og z=;2_cX}31aQT4~>iflkbybQV#9%+f$F*@9(Z9DIIO}eR0;n+MPLr^?bz1MhuknflW zDw_FwUft?he19cg`7XM(Pd)rdIC-u03K?&>vKOzl_&oQ_!_DL1sJ~lz);_C!i)jBC zs|_ffjV$B*jy1i@cF-=TS$z;bmv>wV&9!PqQ1#nc8DMHOc-!blbkN4mz1iE3WE-x6 zrgb9{y9p4#vx~iqj5ZNBhP;z#DbY*6jkTVM!PXa-$)J@f@s#ioyz`ie)lp>@rc9}R z`7>V2i-An7tmw*%KYu4fDtkGaY_omDeQJ&QMLZHQviJTGS>r(vx_OyL_M)Fof-LyF zt4rPTatyV`BkMO5)apfr@M>Dy91@1#>vjtz*tTUp&O{w$w6#>)+Ihb}2t0t;&XYic zj)z6bfI)}xT?H(d*YN_FYpkx)mwonvrXG}7V&0hBM`RG;uKzlMbIL{FY-U@nicJX> zw(gcUA9m=Vvg z@G%j?oc!rJow9UmwlSOW`lGoTG5_@fV82t80@%b!UY|L-t#5$wTRiS*mKBOy-Q+9G z5}4jH2!U8yg4FU+5j@>=H90jY7XQdFEBY|eEr4UB7uB=)rlhP>=4y|sCvM4YZd}M) zvq`2hZiE@KN5NBgiGjWK1m*-B^@sMy`Bb9S~I6$BI1ursa8^4OUY+h)C09I=4_{orY zT+h4i);4;An1NWHJh7zxJP49L58blq{UDi!CExEZg=8L6uJx_#&0#WX-z`{D%eDUa zys*t5Yr0u{<~@|#nm1i`mL-=iwDyWHiff@aIWi?b+8);4e!HP7yBu~468?VRSXXM) zdX#2+i2?ah*GbAYDcz0?l1Mf7^8IemM^Exh2Tivf=N=?jE?q66H)M>;8#g|+3*mbH zcpWZtZ!Gv6T)S`|mlDBY2&Xl7e{nvR(fYs>Q>-2ML~75POkLf5Ig<7}nGmx>G?S0< z9?Cc?Bsv$r^vM;n+3k9u%dP@;RxOX?aq=NKfRkEl8>hjek1aZaN9HirRofRwiy*;@ zpP2Blq4l(EnIak7ov9C=L3}IF@7pCbvA@%i%&PR>Jm9dWQP+K6sF#sS5xhu*wO5d7 zmxhI3Ox5STOy^5U7CtjvGUjnfj%bLrN?;a=;+a%yO*JXdc;Wp6m zc5SEnob6Ta!F#qW>T|zw2pGxh7kuWPX(}0JX3JSUXPMK|-l`le0XUjyD9DCpNOqHS zc#c4X_{}QpXKwc#W#g%S+HSnN(RC~x{}A}wc37Sd{9zBcDY5f8-~J42ViRVgo71h` z*6}W!<~siVR5fuTez$<1)e0CSM|g;<(54vVr&{m6{VgL396`@$N#qr>+j*nf&Gz%`QTd&$yIvkVfZ(SrQ_l6|d=(YSADb~qe^-9*^dno{wQxgE)i z^V>?3S2^gFy{XE5DEpXql51XHWeW68ECzZs$(H%axZNKvpVPAB-bE?| zD(A85QJXhG!AayLBaie%?@{T4lyKgj0Cb~*+aej{7v;AA1j1;@^tJ4;^|AK>)Fot)I*;B701B4H4_~i<0Ts(R72~tQY zhrIDbh|rBB7f)={ovA?fgvEEk+o*-MG~a(LB`@_Xmd0|_5r{iqzRtYDTyW61^RuM$ zu$Lu2&KAT6ZEM1xmj*9KumIUxymWl==H1`If=9Zl-(YstK}R3uV1HOJSj2tyJTX(Z$T90@Y_JFgR{KQ<@Ilk4X_iU`3+l7RnTES=Pz3X>ykFgdGGM`3`uZTPE z8zU6}cDE1g-&YKc@e`^X8ROI2>wN<6nj)~2DdjWX;0NO*ol^1sAWLAL{w>XDlGb%) z?5{*fRWo#q!ct|)Qot^&5qBDtN~kknMMfKSJlwSU2kr{7?yG81t-tAc>@2@CDW2c&Oe?T;l(hgP;Nk=5&UmwibicJRTV1I3V4t#DLrz_|!g z9D*aG0!z0)m?}JTeQM|sB={>RXZv&beYH7yU`@+2ilc72ix-?!-XdP)kn7WlX(TaUQDctD!S@}#()M~ zyHvzBX(mGf(Bt_rx;su`YZ^(d8l4Wxmf{@4#Bu=_;65PM{8)s=2PuRR=VU!tZROW{ zP{z5yh6N3pi!1@0=hzXt7Mc#q*Lcg|8+g?Do>{vzYBh<+u;>JQM6RCfDUfgx?gv8I z*EjV^!VlCXZl5i#eOV?;oYCqw@@G!)C+#0p^0%-VRtFyY?H2{bu=>TudT`UgsK@ z=zZ(oH&YGq&qnRSgOUO|q#2qHpSLxXvgqsg&q_2;mU*oLB_6C2+E<`(Mdu_pG$8nEjOjdN z`$-nR_K*n+JQx^BUxhKcWqsW9j0W{{r;g=pJkcb#U)1#>lt4!m znmjGNH`uL0OEpC}E{%2vAwcZ|D!~XI(T!Z^s~@6BNn8#-sNDyi`H~ir^jx^(2d*)s z?8x>rV!QN_y}+G0KV8TXTJTuG*rdR0s|OcU>&5Glo%|H}0CpMbnVTjo`L0K3iAUJ9 zeX;iBUQY|qTTtPcLL)(%Xh%a1?L|>Z@FNlB>C$&w7i#`NZU&*7Ky`^majgW z{D_&&>>l{*Fq3&03;5`(&MZO8&zr8JA8;S?_W+g-|1&aIv#vSjycq*74Z7nHc>s^w z#kT3nV%eSL_Bh;o9%m0*1naz@lR(I8cK(W#{nRAd$z100MeR`%Zz_NyZnta;%)LR1 zn#kQO^4G}jS(a!{zHcIJ6qIgx>Ju$0-;ORT1l(0IiR<@EJD-|EVxoW+VZR&wY~NIU zNhTh2Z%-^AI{jYRaJRjoVG3cPBVp0yE{Tq!UCKH5YXV=x(yg_FTHYg?@n`vQGc!aL zvhfe@I$SjcUfR=1<_K(x&p-IkiT+1c@qUsZxv|vsVjELk@(Ke_V!{ZDBTZ$sOhWVpxmKE zfV^mg*aP`g7#-QO%i23`z9J&6>2Z*e@4tmoQwKv79$g6OBJsg9mu#f)&at(WCWmJ| z+?f})^@&``r+=zWt_+^!gO=d z@}PR)rO5di;u!9y==ZI)ICv+7)_$ijBc#t(fRMvNM7h(lS3z0{I3#f}h{T7+@|N>g zhrAnts)w{uF?z6DGI8f; zh1Q=m@rX|zc!oMZ;0FHP?v% z2RvZwiGKbrvSEn2@SMo@`(=Yk=;=zTZH_z&x8*H{JUMtv@PZP}1*HNLRuz7N%S#C& zWP$CHM9p9Aq#S|m|D4i}kNVUpy%n342+geU?}G|k2(x8_gO(*ueHK{rq0Q~Po3ghT zncgiJj4@|B=Hm}O;fw}D(G>eCxg*>$2OLllNn9hfgHh(rq`(d`ST&fP#C_?PG_S0O zL{|I<0eLZ%+vU|MpJqbrhUImj?PGZr3Y1Bq?V}@$XF_q0zS?rFU2tbZm#zEmwDlbb zE4{xk!eY5IYxV=PZoF_#!B~naEs4_>df6TH`CAHW&k~cf#bl?e{RpzbYq04vVli}@ z6HLn-->_Fi8#P1i5RhZ2yjPRKfAF!}f37s)18I-}EwFuXlI$=WAbP8}L$>65^`f99 z&8zxi2i*(|PQx+^cE7XLZ016UFGwK*fsb=6eExzQR6WF0Y-S$Lj4lT)YR@#VxZ$8( zsn2VVt5X8$Ygh)^-CQUT32K#mRwBl^odcJrd*bKnb7QHBuHrM!=Z8!;gnT4f7NK#N za|L1TnD(cUrSD()-m06z2vO`H#r=`15VSLnqf4NfDz6(gNTiL;}L#lNdaQ*=MVfT@vaW|o{*gnrfJRbDc{%N=1q+s)} zv0opDPVs>EON{T9yunGD!!wk`bruoU3jw2Ws%#AX0t8)hy@R!|n@aa2drb4pre#x$ zTN!OA6wy9R5Y)uL%U>>!2M52u6v7#a&rLK$*bavGr&|v}-jDiJt$E%D-mC8}fP0Sm zSp17+%pSuq)vGU>qlST2n!%InJnd6a^;upCOT^-@ zM1n#8GXkaSYLCSuv6nc6MzD(mQwlKRg2=3XNqf;c zpVrOie!dj+5LT0>g97%lccO%t?(I?@+un&NO{-T4@hq2(s!L^A=@{#h#~%zWbIQSd zpmXys;OMoaL(?%o^lCp_m5~yQ3yLY)!qJ(;)$%*n&9>`T60sErn=BVC4hNs5>TAXJ z_GMTai6Z&VGpG?cQR}xJ$q@4Z!Rn7VG`h@!5qo5ZDDt{dQu9QVG*6&{k_&P1-dKSK7F)aN$uosL6Ad~Nx%$drL$?at|P;fwYkTZywz~FewD?} zrXW??n!;C-(V9>NC)ml$(7#@qaZu7<_nk@l0O~*#d(Q!S zj*zwH{_IVYxlRmAXg8VlbaIUGrx|$Z?_p;25)829J!P?)oOiw&l&$JM6Pp|4q!wK6 za{Rl_l6h#*DC@FHWSt+8o`+6Tkh@gP!rocWW*(hB$%|>$!XCpwgVmdg*yxZU-=%4L zS$dky=YU;$Q^Jn^l6<_w1+p21%vpw6b*jF~MW_*HF zBh2U*XoqRn3H3dExpV#4e>MvyXL5OyVtHa;uH%!WWq|=Y`BEYlz|?ikFYuuU(b6n) z8~DFK4%JxwyS4V%tqJ_=_kfPT;HEsfniMc&^i82(Pw(t73T$X~^xlpdFUVhdP8YHS zZRw9SwxN6XYt|)Qa!e`5TGP?Rw*DBmYr;5qxU6HO<4w%Bm}q5@%+H)7E#B`j;rP2Y zK0Wv0BF)wJoPEwft)mEAl-Wo30WE#{s)kP+aX zKGHeP0au0cBbDmwA&VsHS(hCdX-$uh%ucDKFx?;^vq=>}E9|ZkGx^(yr!okWk(qk^ zzkC!$Ch%S867PKCx;5VZ_JgUa@DciPfr<<&tOe`3>3QA*pw=CP(M=0QCOAmTH`fQG#sL9iXG8f9c@O?xgOhE#Ua6Lv zWJoKyJn}7~mPa-AQs!D9pNm!vY4Hu8q-?kio6{;W2Fd~Sic*&dGOa(H4klf$F4TKG z=Ky(HR3AH;CA`yXP;~j0bdzy1eEPoHMB23Ve6Jg8X8bZF%)UO@Z2XZek9Gg>KQBF{^q!(g+5vc51&cGk3%+r_k+N)#yXFnO-*aV%n3R#zSV94@>GySD_vJA0&!b0)}?xZ>+)~141CdE^tu|{>RSUpYQuOpKi5667Q zc;f+EEciq~CB5T#L=xEa?oiq}vEK9K@n6?sN*Wg4uFND&{V)7OPDCK4ihU*OnJ;qw zbz~1|SCAKB=*U{b-cJou2Mg7BtaDRtAIm^z<dYRfP7~4e3h_(iz6lC zas?id&|>|fD5pQ)Be(w)MbisAbnkP&D?OXVI~`Tm-}gS*DIFF!gt&O_Cxd2q)F5S_ z=6~afz1+Y$ zaPQ32$RvurJ%i7Lk_HIMNw@x%W*BD^$7C!ZphFlgZeXG1ijmL4mmC2fD zvmy!cM;B5S?k>4czfoUc9=kYb_Kyvw>&m_J30jn>_<57RS>srx;c$E!s>_d!59wgYmKWA1lsOKOJ z{!>;z`zEbXuow%7x!0WfrlO0x{Nyg%=Q9aHX$#4>xZZVB)@cPaIIT84ah0z}zltsE ztw4+oX7aqSAu8otEF%gD;+`83kM+Obdj+nW3Po+N2w>UO3>aG`Qk2{GerXW>^iQPR z#D1OnyENu<^AHXP;}@N!OU~tu4&Uev?bs1z6UH4T<&~v`Mi2wY&+L#{=YDZ$|Ngh&UvX3G4!}yxaWTcE^~Xz4h$$N8$gB%Uveofsh8hW7)(U1Y%9s_ z*D;Ke6qs`*r#)-pnQDAwbJkDbx1;T0C&B zK@oI6stZ@fduN=m&=RNo?5EE&J}llY_A;-Zte?+J@fCZ7_;AB(r>xh7vbDb9GM2Ch zLqC&qw%0&UVQRQHQS#t9OQ4gnnE_-!GJT{t49j=w2h_clgg;>S<7>x?!~P!>diVK%fNFI^G7FdR} z_{zJU*P?kjb1xoyMUy}6NI_aR#r|~Gk_V@5N@Dv7@+Z*`n4#vY!wJ>TZy{yE+6yb# zs34^uQLFI>78F6Jn^&Eu4f8BW%aM3>Ld!NQ4-KcKT!*5^6-Ha z{N?&TT51KL>t1{h$l1nmXX!8tZNt=}=h6vO|erMs-ICJb@A7QOqxV^Ib(lV}{u8g|vVK!7nu7;E z7`9KAMiX<_Lts1a!^sFKS5}>hVM&g96Ucd9%p}zP%AVzdNe;>-yPMLZ&osKLrCxSY-B*l^9zGuR5^r-~jU+oH*k) z&(N3hQ-@-E3TjDYd@Bl|A~21F=2!zJ&@)+u{{+Sz(GFV z4czMc+Eq4Rab{{!cZ>MZ)#9;@TG67bd8C#Y{(wVTMMQ7-+850@98v z<9wuowr(mw!2XQ6b~S2MV9p<7&^fs)i_nvR6qJ3X%a_4~vZM~?wV z6&dW^#E4LbiJZGWVRfIoc0;UyAuK z!xaeQSFh+<=Qx|siKVA=$`0%SmnV;{C&d3;fAN@WSg3l2lst}$ES`{rjN!!MGYaw9v z55Rft+=jsxdFt`9G9t7ox7oAK&%FaC;(hrNei*$-ByeL!^S+Vspv&9E$!xauw%Y zl4wMnABfpus_3Ue_;mC~mr{uMy}shMPlsU*S=qW2Dr?jK<7Q3bXOU%Tktp(vCqvAG zR0#7aL!$?EQ*TSQZ?9JHqoZ!~YFOt3`_KKJ!{QEZ^j$Wov7h(2Wb14%bG74C--a8^ zC-drknkT$DaJ1Te9$$2m`B;*xU49E4eIeCm?WP`Lq;Xxa)Fhd6F?W+ruMoh|DH*AS zdwrpuL%&#e^(0pyKehKHgs#Q(xOA@j6HohKVLA_TZYS>Rndx`@MA*g%iBFs)QVkDE zyG*%cD{gS8xnD;d$EKCOrx;SvHaTEj;W9a*d6F9MMmn|R)S7f-NnSdes!8M>7|fF>@ovj3CQzv7I=PkBW~EZ6#%)oVrwV2$L%gXN z54do@?Zmep4QnW*08_Ni_`&t{YXL^fjreD=x_rDBl3k3p(r`eeba4Q4I z`gXt$H`gU&*Y`A2dD?-^4o=gzP|4~dnjqzn(pZu z0WStsVF+PL5J&P1(tuc9JH z_kjh>u%I&zx^n$$`WY0ui&CzdPB`QNs_aGa7;w|yFf zwH!tzFk+OHEXvufRW!$^m=Ce=rr<4PpT;e>_m&I*xVblp`A6Re{HL8XRylFx(Nx_Ota7a6YEL8Nqu3)qh*L7Cs6qp}6>&aP zdVCCv=+69lPvO2+KV7qpAglgeWmZO9T)vr)?ws$f@Oho;8lF~&2D`vD;CmYA;3U!G z{h!~Gw^x_)Z+F)l%JQn28x@c&Zc*9ZK zV{-q$1~?og-?t$#S3Q*WBWPwi%j1cHyIl zrM9rgZrw*E(qh4v0QC4BkFc5wKv2($PvcqX3G2aj?N1+351^RQkwp2XEZrb=dqI*s zV3X{ZO>otTl&9$$_cvlhMnIE=z{N>-pY3GV%b>Q)-F2R}z~t+#4v2z$!(HUeA5${q zbuJmfHv=U%X3e)Q3HK0JSIS|hMH+eT?vlCgIOcb*O^oIrIa>PJ&hDN*qiO*0Iw=6q zg%!(JbK0i^s4Z_j6etiM^?jUWcq(T`AfqS@47-OV3-|nWWa{pS*DJsj&3Wq|(7v}e zjC+?27yPu%rr|p%o_etDrX;x8_`b7dn{Aodp1+&iC4o|5<2PN2*=#$#9UiH@U8Zzc zael|Rgheh@SUzf30^<+2Gr3MJWprf?sSj5~w!zFG!sB2(BKE>0&w^mL5(LD};&>@^Mv3rtgylKMEXtMF08 z;@CWA4O#vpD(-|uA+iJa4NF;;yt3x)zob3Fg(?S|4%VbM<5zrJ%s8H%WE0JP&KxLx z1(TGzGXi;A9mlm17TO@Hf-aa+c3qhAm8)-SmL*))Cv!^Mj;=2(+r))N9Ve*{kIj6z zNr0L)u6ARmx8k_)b|GI0rb;tu8e2d#dKEYRO;@AqPf=%se!kPq!Nw06PUul5&2#ed1bWK> z3bQ;Sv8}cTx3bQx&X#y6aIm1mi*yehoOzD3jJ9Uwpcb|(`U(`=3Z8r5wE~NLzv%TL zkJ-Aqy7H}KsvFGIKk@bj=kBoi^7Q7yws|jWh$n%R)@jpbd)KlV+H;ggAT^%$+GMnO z=oG95Ys1lJyTF)wiLcMIPOb8Yi}rz+<#sebkv_fIv>!jVedMwGJiMv22G2ctekr(0 zd+~t2|B5247w(d-9ptrFQ08Tt5lKKg#}Fh<1ND}$1Wf73mX+uV7*EqIY7T4n!Vu6q zGNunNDI)x7rQV<@-g`#6N$0_v_jLCwe%X&ZAAx32D`nLln+ya80nupVw}ey5+N~$Q zx0E-c&;@_++;PDUn%%ie$MMQ`OP({g#B{#F7xm7$!Sxy!DbyE+#WPbYH$i2bggEmB zH;`f!hNYMsG~@_YUZ4Q3eMoVy@n#ABM7$LJ{UunM^dB8GPE(N1-v?<@b{a#X4{{o0zs(& z*3($00^eGmXU|pCcc^rT>E~A;HM#2BhClmO?;YMMvOmO7cubZKRrG$IWLA-;z#amb zY{M)|AEj7s1mEKdP+`HjKCv}h=gpYJGW`u5I*cPE*}zKdkuzeF?KsQDqID~R>Q|t^ zd|)wr2hvJ^fiH{vp&AC8i|!FR-6@)yY`Hu*g5CN_9gMug_aH?rK~6nJ4^_}6Pg|}^ zOEK)T@&&J?!*;z5VHl#b%&x ztNX6YQKNQZ;QjNTUl1$#X2?r$;HQaqzl}hjibugq@-%$;vkvoJ(jNcoi`H5 zgDEw3igxwSZ97*G`=i2NVa$rElvVZ9Ol}gz61lv~(+OE}sYRNN$6=*m9J$e?2Rn5{fU>#~Mv^qubK^lYr~a zSDCKq8}uw`)V}k)x0uUpr)V?5Tb0J+Ghkm{Zd=-NVDq=#x?cOS!aW987LzlwF_}$$ zr@6^L8uR{Tg%mg~c$b$hnU`gmky0dioFSHerVvzB)FprBsaQ7*L5P@{pll6iYW-7| z{9{X}kK@rr9uLbxZzp0nqvQTAN_M>DRtvc1k@_;ZX{9@u0(NIa@QEDkvMl09ug(eK zLJd6iMn0MFe*FosEz|pV!RByUny4iMpW9NiJa-#4=G;J9Ht4GuR?A6R5=aOUT%D6B zOkWeG8hFZfbrA){3DDcAc?raH#eQXL0YyV;8F8eVY&zMbMsjxoaHJS_3X(xr>cvxI zCmv(u<;g!vrS{#_{)lx!zJV}4pmTxqFGV1xz3a-JDZEut%ZtYA1GmKiNPE}jP)agW z!y{wmrRhd>7AMs}LGVF3X|d$eDds%(Yj@dH%NAGA2LR|L;^j+l4xoJbO1KymXuuTh zwqO4b5x%32Q7F`>)j$uea)8!3vq2%KYho?9X_~dXbyY!Xu9bz7#hLPV+BI3@Xj2`3&0qR^+@Y zwL0m{1^W}`nBr>^HU_gGN58splmxzx8nH%?78o|apz%gr~lK=m4-EWE#V{v4YCD611JK5 zSP(=+_5d+f77>Xo23Z2u#svf-HBf>`sDkaSEP{e80R&kBLM#x7KxjZ^UuB6b!Eiy4 z)hL8mXtXD^_ql)X&-=qa-}gM{n{#H)oOkBT_dGM>l8XZtptBv?kg~qV`W|M}5Pzm6 zT-c6d7*D=_vJW;GbmFz;Ne~y&NPlOfdXEignNl@}}yN>-=sv1xGwS{nSH_!))Z7UU-V` z;iE@&Y;0^^_4R4eXf%4SSEy_edB0y;Xqzm5Fv!-Bu%ZP_75BZy+Z}m?&i&ojZXk5% zc#YPi`lJ-NfE^|3Xlp}2(IJedJQi$2^d2Sd=kxme?|nmcXH11vVX@G8Q!UM`bWbY9 z@SyoN=Wmi96O{H^_0Q~==Cj%C{Fr-3&CRz(98h8=Cn)}mB%!iD%Q#0xMdd?Iv+W^O zZDkPQ{DV~511~V&_;9^QAIxW)J#M2t(4i{G$~yY{`}ZmDJ+4>j;KkO2iW=}fK3Ub( z)jHdO^v9;3+{aKUF4Wc{A__=1=&AD_G8U>iy}-J{2FngOhP&^A&NB_V_Pj`? zCQ*cg_wys%Qy{izw1HSGK4M{^a@6s7%ICwH$sQcPt92UUsR}03Gcz+&KK}iO3F=&; zhCF|;%>DeL50xS`?D%|A55rD#OOM{zCGcc4j(NWO+_05oQ!*hOCKXKje7WNPJVE}p zfExQn2Z`{%s#YiLSCX3quMn2}OE}3dm*OcE?}orJ3US2TLU2yb`#WzsYw@cH&i#$p zwK*GV(5GQsft?yhm@6WCZ^Qnm<=1SL0b5p76dCEO)d;)Omq$Wr5lv$WCZc z)ko9xaEX*|^hL`V_BK**b-b$F_$01iWfDn9Or26;?$4X_iD{m+?%{#f;Y$4HSP$(e#mEOiq5*SQ&T7ZvjeM!7R46)g9L zvTeM(zWz;}5$(`L61n7ps31nijq&oE$`D|MnR?APOu=eH)a|u5}t8 za)NN<9pcn#$K$TmCR+D*Mb>6ti$<_yx@qM-cVezb4mSAMwZ9%BTnvt%>nz9(dTT)Ede615TO^$v4tjRmc^5|r_r*vjJs+4PcaWR+w8m5GKQ&JYs&nG9 zL}dFjOjTwV_rq(~B?QY`7En=&LMFK99EL6q9`SFzV8_(v2O6X0T^BOyBKMm8 zE0L$xi2j`jdxK_R#W zS>YFK>IKz>Rfdre{9S?63@JbD8COM{56?gJq=Xm}tua+Hde?hq%4@Np2A&^i5}46j zl~~$cLbOe4Zwx%H`8SiXO`?^Di)Chi6FsOhbcQHgAU%pReR#+t&kdz2^uDa{8v*zw zxuC;-OW-14ijYe(G9IOb=fMJFzconC$Yt2+BE*V5t{kNzJQ-~du7NZ924!b~>+p_> z4?iL85yZA<3dIyocOxXKN|R|qpvvnY9jxaZlp_kRV3GMyYXaobrs&Z%oY(c%!0iS zcgJkH+N%g8CwNt<{96cg3N}_7n!fYkSxHpcWAbdVvU3_V;c$wI7Ox8{1BXfjM)Zoa z_bm*UJ4ewVIW0}HFob3RmI?{U&$_GwLwN1#YjrtW;j72v@tUsqf;JG90Zp*E#l`yx zyUjb4T+v$A;fn}@Pvebe2Hw^0_;c}FSckH0qwBJx*G7(9>d6kEJ^NwyBckJ&p{_)> z-7pX&hq8rf301`p5Sq9Z*vd?I*(Xce)xP5&r&C?GF0nv4=JZ{Y9><`83cvd4G@lUZ z<-}Shvwe#Knk2{&kRaSywrN`gnOqp`->!P|4c;yHf;JW7m8W*|&7HB-&`d~<>m4o< z!)d^n{)ufAuZ5@!?U?DjRxl`b=(5R zYJ$TS%4@eWc%YuP5@a9*Snc7wXHCgxfc%u{H3M)CaO6{MaQzM7tCgW}+3oKRTQW=r;f$#x}8Dr)A1H=xHDKy#DwNZZh7QBM`Ync~O* zX{8H0)NVsyOx?U(-^$39nHQnWI#jMVkz@-97=VDX6xp*I3h&TGepYEFcBZw@73b!J zFJkTDlL0tdHox^h&gxQJH)9F4=tI$K%5lem;Gu4@ge= zs>PCI>mOy1oRtlMK9GWcg42rcSK_d*OIaTSpY%aY!1xi>2Lbp;#Txq5v`O&)Hr@ZU zHBn576yFt;7>)Fk--C`20b&X6L0^McHN>qF+u`JJzCiiqicyAc=Wl`*KM Date: Fri, 12 Jan 2024 21:43:59 -0500 Subject: [PATCH 053/159] feat(upgrade): Add identity preview avatar removal change item --- .../img/remove-identitypreview-avatar.png | Bin 0 -> 41840 bytes .../v5/common/remove-identitypreview-avatar.md | 11 +++++++++++ packages/upgrade/source/versions/v5/index.js | 4 ++++ 3 files changed, 15 insertions(+) create mode 100644 packages/upgrade/source/img/remove-identitypreview-avatar.png create mode 100644 packages/upgrade/source/versions/v5/common/remove-identitypreview-avatar.md diff --git a/packages/upgrade/source/img/remove-identitypreview-avatar.png b/packages/upgrade/source/img/remove-identitypreview-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..7f7c7d898cb52acafa5ed0bccbf6582dd9f9060a GIT binary patch literal 41840 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 z%0A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 Hx%>YD<0QsI literal 0 HcmV?d00001 diff --git a/packages/upgrade/source/versions/v5/common/remove-identitypreview-avatar.md b/packages/upgrade/source/versions/v5/common/remove-identitypreview-avatar.md new file mode 100644 index 00000000000..e47847b1cd4 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/remove-identitypreview-avatar.md @@ -0,0 +1,11 @@ +--- +title: 'Identity preview avatar customization ids removed' +image: true +matcher: + - "\\.cl-identityPreviewAvatarBox" + - "\\.cl-identityPreviewAvatarImage" + - "elements:\\s+{[\\s\\S]*?identityPreviewAvatarBox:[\\s\\S]*?}" + - "elements:\\s+{[\\s\\S]*?identityPreviewAvatarImage:[\\s\\S]*?}" +--- + +When signing in with Clerk's `` component, after entering a username or email the user is brought to a second pane where they can enter a second factor such as a password. On this pane, there is an area called "identity preview" that shows the username/email that they are entering a password/etc for. Previously, this area included the user's avatar, but this is no longer the case in updated designs. As such, the customization ids related to the user's avatar have been removed. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 46d648e090a..6815b218412 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -31,6 +31,7 @@ const reactChangesList = [ 'alternativemethods-backlink', 'button-to-organizationlistcreateorganizationactionbutton', 'remove-socialbuttonsblockbuttonarrow', + 'remove-identitypreview-avatar', ]; export default { @@ -78,6 +79,7 @@ export default { 'alternativemethods-backlink', 'button-to-organizationlistcreateorganizationactionbutton', 'remove-socialbuttonsblockbuttonarrow', + 'remove-identitypreview-avatar', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -113,6 +115,7 @@ export default { 'alternativemethods-backlink', 'button-to-organizationlistcreateorganizationactionbutton', 'remove-socialbuttonsblockbuttonarrow', + 'remove-identitypreview-avatar', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -178,6 +181,7 @@ export default { 'alternativemethods-backlink', 'button-to-organizationlistcreateorganizationactionbutton', 'remove-socialbuttonsblockbuttonarrow', + 'remove-identitypreview-avatar', ]), shared: load('shared', [ 'magiclinkerror', From 917c0f25c25cc1dab2ffa6bbd84d61ee030c0823 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 16 Jan 2024 09:48:49 -0500 Subject: [PATCH 054/159] chore(upgrade): Use 'customization id' unilaterally to describe appearance prop hooks --- .../versions/v5/common/alternativemethods-backlink.md | 4 ++-- .../upgrade/source/versions/v5/common/card-changes.md | 8 ++++---- ...organizationswitcherpopoveractionbuttontext-removed.md | 4 ++-- .../common/userbuttonpopoveractionbuttontext-removed.md | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md b/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md index 9aaf85f8b16..8d26d306324 100644 --- a/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md +++ b/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md @@ -1,5 +1,5 @@ --- -title: 'Back button descriptors change on alternative 2fa methods page' +title: 'Back button customization ids change on alternative 2fa methods page' image: true matcher: - "\\.cl-headerBackIcon" @@ -10,7 +10,7 @@ matcher: - "elements:\\s+{[\\s\\S]*?headerBackLink:[\\s\\S]*?}" --- -The "back" button on the panel within `` that lists out alternative two factor auth methods has changed location, and there have been some changes to the descriptors as a result of this: +The "back" button on the panel within `` that lists out alternative two factor auth methods has changed location, and there have been some changes to the ids as a result of this: - `headerBackIcon` has been removed, as there is no longer an associated icon - `headerBackRow` has been renamed to `backRow` as it's no longer in the header diff --git a/packages/upgrade/source/versions/v5/common/card-changes.md b/packages/upgrade/source/versions/v5/common/card-changes.md index 2284e6b6664..917e1f676fa 100644 --- a/packages/upgrade/source/versions/v5/common/card-changes.md +++ b/packages/upgrade/source/versions/v5/common/card-changes.md @@ -1,13 +1,13 @@ --- -title: 'Changes to the `card` customization descriptor' +title: 'Changes to the `card` customization id' warning: true matcher: - "\\.cl-card" - "elements:\\s+{[\\s\\S]*?card:[\\s\\S]*?}" --- -The `card` descriptor in the previous major version was the main and only container element for components Outside the `card` element we introduced a new `cardBox` descriptor that allows more fine-grained style customization. +The `card` customization id in the previous major version was the main and only container element for components Outside the `card` element we introduced a new `cardBox` id that allows more fine-grained style customization. -As a note, if you are changing the background color of `card`, you will also need to also apply the same color on the `footer` descriptor as well. The `footer` now gray by default, and it’s located outside `card`, but inside `cardBox`. +As a note, if you are changing the background color of `card`, you will also need to also apply the same color on the `footer` id as well. The `footer` now gray by default, and it’s located outside `card`, but inside `cardBox`. -We also added a `footerItem` descriptor for more targeted styling of items inside the `footer`. +We also added a `footerItem` id for more targeted styling of items inside the `footer`. diff --git a/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md b/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md index 28c90dc10f5..8c15a9e1772 100644 --- a/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md +++ b/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md @@ -1,5 +1,5 @@ --- -title: '`organizationSwitcherPopoverActionButtonText` descriptor removed' +title: '`organizationSwitcherPopoverActionButtonText` customization id removed' image: true matcher: - "\\.cl-organizationSwitcherPopoverActionButtonText" @@ -10,4 +10,4 @@ matcher: - "elements:\\s+{[\\s\\S]*?organizationSwitcherPopoverActionButtonText__createOrganization:[\\s\\S]*?}" --- -The `organizationSwitcherPopoverActionButtonText` customization descriptor has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. The nested descriptors `organizationSwitcherPopoverActionButtonText__manageOrganization` and `organizationSwitcherPopoverActionButtonText__createOrganization` have also been removed. Any styling that needs to apply to the text can be applied to its direct parent `cl-organizationSwitcherPopoverActionButton`. +The `organizationSwitcherPopoverActionButtonText` customization id has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. The nested ids `organizationSwitcherPopoverActionButtonText__manageOrganization` and `organizationSwitcherPopoverActionButtonText__createOrganization` have also been removed. Any styling that needs to apply to the text can be applied to its direct parent `cl-organizationSwitcherPopoverActionButton`. diff --git a/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md b/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md index 6c6c0e934e5..b7dd56f1a02 100644 --- a/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md +++ b/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md @@ -1,5 +1,5 @@ --- -title: '`userButtonPopoverActionButtonText` descriptor removed' +title: '`userButtonPopoverActionButtonText` customization id removed' image: true matcher: - "\\.cl-userButtonPopoverActionButtonText" @@ -10,4 +10,4 @@ matcher: - "elements:\\s+{[\\s\\S]*?userButtonPopoverActionButtonText__manageAccount:[\\s\\S]*?}" --- -The `userButtonPopoverActionButtonText` customization descriptor has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. The nested descriptors `userButtonPopoverActionButtonText__signOut` and `userButtonPopoverActionButtonText__manageAccount` have also been removed. Any styling that needs to apply to the text can be applied to its direct parent `cl-userButtonPopoverActionButton`. +The `userButtonPopoverActionButtonText` customization id has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. The nested ids `userButtonPopoverActionButtonText__signOut` and `userButtonPopoverActionButtonText__manageAccount` have also been removed. Any styling that needs to apply to the text can be applied to its direct parent `cl-userButtonPopoverActionButton`. From b8873bed2367bb28aa98de5f15ba19f08ceea0f6 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 16 Jan 2024 13:27:03 -0500 Subject: [PATCH 055/159] feat(upgrade): Add several import path move changes from backend --- .../v5/backend/constants-import-path-move.md | 12 ++++++++++++ .../createauthenticaterequest-import-path-move.md | 12 ++++++++++++ .../createisomorphicrequest-import-path-move.md | 12 ++++++++++++ .../v5/backend/decodeJwt-import-path-move.md | 12 ++++++++++++ .../versions/v5/backend/redirect-import-path-move.md | 12 ++++++++++++ .../versions/v5/backend/signjwt-import-path-move.md | 12 ++++++++++++ .../v5/backend/verifyjwt-import-path-move.md | 12 ++++++++++++ packages/upgrade/source/versions/v5/index.js | 7 +++++++ 8 files changed, 91 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/backend/constants-import-path-move.md create mode 100644 packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md create mode 100644 packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md create mode 100644 packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md create mode 100644 packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md create mode 100644 packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md create mode 100644 packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md diff --git a/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md b/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md new file mode 100644 index 00000000000..572ff5397a8 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md @@ -0,0 +1,12 @@ +--- +title: '`constants` import moved to `@clerk/backend/internal`' +matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +replaceWithString: 'backend/internal' +--- + +The `constants` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside the scope of semver. Example below of the fix that needs to be made: + +```diff +- import { constants } from "@clerk/backend" ++ import { constants } from "@clerk/backend/internal" +``` diff --git a/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md b/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md new file mode 100644 index 00000000000..7d599fb89e1 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md @@ -0,0 +1,12 @@ +--- +title: '`createAuthenticateRequest` import moved to `@clerk/backend/internal`' +matcher: "import\\s+{[\\s\\S]*?createAuthenticateRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +replaceWithString: 'backend/internal' +--- + +The `createAuthenticateRequest` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside the scope of semver. Example below of the fix that needs to be made: + +```diff +- import { createAuthenticateRequest } from "@clerk/backend" ++ import { createAuthenticateRequest } from "@clerk/backend/internal" +``` diff --git a/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md b/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md new file mode 100644 index 00000000000..f22947653fa --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md @@ -0,0 +1,12 @@ +--- +title: '`createIsomorphicRequest` import moved to `@clerk/backend/internal`' +matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +replaceWithString: 'backend/internal' +--- + +The `createIsomorphicRequest` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside the scope of semver. Example below of the fix that needs to be made: + +```diff +- import { createIsomorphicRequest } from "@clerk/backend" ++ import { createIsomorphicRequest } from "@clerk/backend/internal" +``` diff --git a/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md b/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md new file mode 100644 index 00000000000..aa887b78805 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md @@ -0,0 +1,12 @@ +--- +title: '`decodeJwt` import moved to `@clerk/backend/tokens`' +matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +replaceWithString: 'backend/tokens' +--- + +The `decodeJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made + +```diff +- import { decodeJwt } from "@clerk/backend" ++ import { decodeJwt } from "@clerk/backend/tokens" +``` diff --git a/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md b/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md new file mode 100644 index 00000000000..be8f799edc6 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md @@ -0,0 +1,12 @@ +--- +title: '`redirect` import moved to `@clerk/backend/internal`' +matcher: "import\\s+{[\\s\\S]*?redirect[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +replaceWithString: 'backend/internal' +--- + +The `redirect` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside the scope of semver. Example below of the fix that needs to be made: + +```diff +- import { redirect } from "@clerk/backend" ++ import { redirect } from "@clerk/backend/internal" +``` diff --git a/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md b/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md new file mode 100644 index 00000000000..30b4f8bec24 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md @@ -0,0 +1,12 @@ +--- +title: '`signJwt` import moved to `@clerk/backend/tokens`' +matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +replaceWithString: 'backend/tokens' +--- + +The `signJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made + +```diff +- import { signJwt } from "@clerk/backend" ++ import { signJwt } from "@clerk/backend/tokens" +``` diff --git a/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md b/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md new file mode 100644 index 00000000000..eb113a10293 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md @@ -0,0 +1,12 @@ +--- +title: '`verifyJwt` import moved to `@clerk/backend/tokens`' +matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +replaceWithString: 'backend/tokens' +--- + +The `verifyJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made + +```diff +- import { verifyJwt } from "@clerk/backend" ++ import { verifyJwt } from "@clerk/backend/tokens" +``` diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 6815b218412..e372096e397 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -197,6 +197,13 @@ export default { types: [], backend: [], // backend: load('backend', [ + // 'verifyjwt-import-path-move' + // 'decodejwt-import-path-move' + // 'signjwt-import-path-move' + // 'constants-import-path-move' + // 'redirect-import-path-move' + // 'createauthenticaterequest-import-path-move' + // 'createisomorphicrequest-import-path-move' // 'createclerkclient-frontendapi', // 'clerk-import', // 'externalaccount-picture', From ccb14efbb068be5ff12045be385fccf90419cca6 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 16 Jan 2024 13:37:33 -0500 Subject: [PATCH 056/159] feat(upgrade): Params change for authenticaterequest in backend --- .../v5/backend/authenticaterequest-params-change.md | 12 ++++++++++++ packages/upgrade/source/versions/v5/index.js | 1 + 2 files changed, 13 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/backend/authenticaterequest-params-change.md diff --git a/packages/upgrade/source/versions/v5/backend/authenticaterequest-params-change.md b/packages/upgrade/source/versions/v5/backend/authenticaterequest-params-change.md new file mode 100644 index 00000000000..94b5d53edd0 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/authenticaterequest-params-change.md @@ -0,0 +1,12 @@ +--- +title: '`request` separated from `options` as params to `authenticateRequest`' +warning: true +matcher: "authenticateRequest\\(" +--- + +There has been a change to the way the params of the `authenticateRequest` function are structured. The `request` param, formerly included in an `options` object, has been moved to stand on its own as the first param to the function, while the `options` object remains as the second param. Example below: + +```diff +- clerkClient.authenticateRequest({ ...opts, request }) ++ clerkClient.authenticateRequest(request, { ...opts }) +``` diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index e372096e397..2f60df0f687 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -205,6 +205,7 @@ export default { // 'createauthenticaterequest-import-path-move' // 'createisomorphicrequest-import-path-move' // 'createclerkclient-frontendapi', + // 'authenticaterequest-params-change', // 'clerk-import', // 'externalaccount-picture', // 'externalaccountjson-avatarurl', From 2fdef915a67edcc959d5ffe6a8247e842c690a87 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 16 Jan 2024 16:15:24 -0500 Subject: [PATCH 057/159] feat(upgrade): Add remix error boundary removal --- packages/upgrade/source/versions/v5/index.js | 1 + .../v5/remix/clerkerrorboundary-removed.md | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 2f60df0f687..c51f3f0fe8b 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -98,6 +98,7 @@ export default { 'withserverauth-return-type', ]), ), + remix: load('remix', ['clerkerrorboundary-removed']), expo: load('expo', [ 'apikey-to-publishable-key', 'ismagiclinkerror', diff --git a/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md b/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md new file mode 100644 index 00000000000..46c60859697 --- /dev/null +++ b/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md @@ -0,0 +1,22 @@ +--- +title: '`ClerkErrorBoundary` removed' +matcher: "import\\s+{[\\s\\S]*?ClerkErrorBoundary[\\s\\S]*?from\\s+['\"]@clerk\\/remix[\\s\\S]*?['\"]" +--- + +`ClerkErrorBoundary` is no longer needed for correct error handling in remix, so we have removed this function from the remix SDK, and it can be removed from your code as well. Example below: + +```diff + import { rootAuthLoader } from '@clerk/remix/ssr.server'; + import { + ClerkApp, +- ClerkErrorBoundary + } from '@clerk/remix'; + + export const loader = (args: DataFunctionArgs) => { + return rootAuthLoader(args); + }; + + export default ClerkApp(App); + +- export const ErrorBoundary = ClerkErrorBoundary(); +``` From 0439eeebdda9c97a5f81fb05ce3e402b2230957c Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 16 Jan 2024 16:25:55 -0500 Subject: [PATCH 058/159] feat(upgrade): Remix apiKey -> secretKey changes --- packages/upgrade/source/versions/v5/index.js | 7 ++++++- .../v5/remix/createclerkclient-apikey.md | 14 ++++++++++++++ .../source/versions/v5/remix/getauth-apikey.md | 16 ++++++++++++++++ .../versions/v5/remix/rootauthloader-apikey.md | 14 ++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 packages/upgrade/source/versions/v5/remix/createclerkclient-apikey.md create mode 100644 packages/upgrade/source/versions/v5/remix/getauth-apikey.md create mode 100644 packages/upgrade/source/versions/v5/remix/rootauthloader-apikey.md diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index c51f3f0fe8b..a1598ae1d98 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -98,7 +98,12 @@ export default { 'withserverauth-return-type', ]), ), - remix: load('remix', ['clerkerrorboundary-removed']), + remix: load('remix', [ + 'clerkerrorboundary-removed', + 'createclerkclient-apikey', + 'rootauthloader-apikey', + 'getauth-apikey', + ]), expo: load('expo', [ 'apikey-to-publishable-key', 'ismagiclinkerror', diff --git a/packages/upgrade/source/versions/v5/remix/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/remix/createclerkclient-apikey.md new file mode 100644 index 00000000000..59eadf567c9 --- /dev/null +++ b/packages/upgrade/source/versions/v5/remix/createclerkclient-apikey.md @@ -0,0 +1,14 @@ +--- +title: '`apiKey` -> `secretKey` as argument to createClerkClient' +matcher: "createClerkClient\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" +matcherFlags: 'm' +--- + +The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. + +```diff +import { createClerkClient } from '@clerk/remix/api.server'; + +- createClerkClient({ apiKey: '...' }); ++ createClerkClient({ secretKey: '...' }); +``` diff --git a/packages/upgrade/source/versions/v5/remix/getauth-apikey.md b/packages/upgrade/source/versions/v5/remix/getauth-apikey.md new file mode 100644 index 00000000000..a6f5130122f --- /dev/null +++ b/packages/upgrade/source/versions/v5/remix/getauth-apikey.md @@ -0,0 +1,16 @@ +--- +title: '`apiKey` -> `secretKey` as argument to getAuth' +matcher: "getAuth\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" +matcherFlags: 'm' +--- + +The `apiKey` argument passed to `getAuth` must be changed to `secretKey`. + +```diff +import { getAuth } from '@clerk/remix/ssr.server'; + +export const loader: LoaderFunction = async args => { +- return getAuth(args, { apiKey: '...' }); ++ return getAuth(args, { secretKey: '...' }); +}; +``` diff --git a/packages/upgrade/source/versions/v5/remix/rootauthloader-apikey.md b/packages/upgrade/source/versions/v5/remix/rootauthloader-apikey.md new file mode 100644 index 00000000000..9aa3075277f --- /dev/null +++ b/packages/upgrade/source/versions/v5/remix/rootauthloader-apikey.md @@ -0,0 +1,14 @@ +--- +title: '`apiKey` -> `secretKey` as argument to rootAuthLoader' +matcher: "rootAuthLoader\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" +matcherFlags: 'm' +--- + +The `apiKey` argument passed to `rootAuthLoader` must be changed to `secretKey`. + +```diff +import { rootAuthLoader } from '@clerk/remix/ssr.server'; + +- export const loader = args => rootAuthLoader(args, { apiKey: '...' }); ++ export const loader = args => rootAuthLoader(args, { secretKey: '...' }); +``` From 17a03b710fea5cdbaabb2f0b43cd86458b88994f Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 16 Jan 2024 16:32:12 -0500 Subject: [PATCH 059/159] feat(upgrade): Add frontendapi key changes, env variable changes for remix --- packages/upgrade/source/versions/v5/index.js | 4 ++++ .../v5/remix/rootauthloader-frontendapi.md | 14 ++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/remix/rootauthloader-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index a1598ae1d98..f06040b3ab7 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -103,6 +103,10 @@ export default { 'createclerkclient-apikey', 'rootauthloader-apikey', 'getauth-apikey', + 'clerkprovider-frontendapi', + 'rootauthloader-frontendapi', + 'frontend-api-to-publishable-key', + 'api-key-to-secret-key', ]), expo: load('expo', [ 'apikey-to-publishable-key', diff --git a/packages/upgrade/source/versions/v5/remix/rootauthloader-frontendapi.md b/packages/upgrade/source/versions/v5/remix/rootauthloader-frontendapi.md new file mode 100644 index 00000000000..bdba7ecd7f2 --- /dev/null +++ b/packages/upgrade/source/versions/v5/remix/rootauthloader-frontendapi.md @@ -0,0 +1,14 @@ +--- +title: '`frontendApi` -> `publishableKey` as argument to rootAuthLoader' +matcher: "rootAuthLoader\\({[\\s\\S]*?frontendApi:[\\s\\S]*?}\\)" +matcherFlags: 'm' +--- + +The `frontendApi` argument passed to `rootAuthLoader` must be changed to `publishableKey`. + +```diff +import { rootAuthLoader } from '@clerk/remix/ssr.server'; + +- export const loader = args => rootAuthLoader(args, { frontendApi: '...' }); ++ export const loader = args => rootAuthLoader(args, { publishableKey: '...' }); +``` From f3df3f506878e0d2c0a014613a244a6e4f0ca436 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 16 Jan 2024 16:41:26 -0500 Subject: [PATCH 060/159] feat(upgrade): Add magic link changes to remix --- packages/upgrade/source/versions/v5/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index f06040b3ab7..c84d020fa4d 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -107,6 +107,9 @@ export default { 'rootauthloader-frontendapi', 'frontend-api-to-publishable-key', 'api-key-to-secret-key', + 'ismagiclinkerror', + 'magiclinkerrorcode', + 'usemagiclink', ]), expo: load('expo', [ 'apikey-to-publishable-key', From db47c99350fd78c8c0f34435faf09af6a9c2c139 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 16 Jan 2024 16:43:29 -0500 Subject: [PATCH 061/159] feat(upgrade): Add setSession change to remix --- packages/upgrade/source/versions/v5/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index c84d020fa4d..82d63ac472d 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -110,6 +110,7 @@ export default { 'ismagiclinkerror', 'magiclinkerrorcode', 'usemagiclink', + 'setsession', ]), expo: load('expo', [ 'apikey-to-publishable-key', From a0a14ad6d0dd5c49e8e7ca682e2895d2a6762c8e Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 17 Jan 2024 16:39:14 -0500 Subject: [PATCH 062/159] feat(upgrade): Add top level import changes --- packages/upgrade/source/versions/v5/index.js | 17 +++++++++++++++++ .../versions/v5/next/auth-import-change.md | 12 ++++++++++++ .../v5/next/authmiddleware-import-change.md | 12 ++++++++++++ .../v5/next/buildclerkprops-import-change.md | 12 ++++++++++++ .../versions/v5/next/clerk-import-change.md | 11 +++++++++++ .../versions/v5/next/constants-import-change.md | 12 ++++++++++++ .../createauthenticaterequest-import-change.md | 12 ++++++++++++ .../createisomorphicrequest-import-change.md | 12 ++++++++++++ .../v5/next/currentuser-import-change.md | 12 ++++++++++++ .../versions/v5/next/decodejwt-import-change.md | 12 ++++++++++++ .../v5/next/emaillinkerrorcode-import-change.md | 12 ++++++++++++ .../isclerkapiresponserror-import-change.md | 12 ++++++++++++ .../v5/next/isemaillinkerror-import-change.md | 12 ++++++++++++ .../v5/next/isknownerror-import-change.md | 12 ++++++++++++ .../v5/next/ismetamaskerror-import-change.md | 12 ++++++++++++ .../multisessionappsupport-import-change.md | 12 ++++++++++++ .../versions/v5/next/redirect-import-change.md | 12 ++++++++++++ .../versions/v5/next/signjwt-import-change.md | 12 ++++++++++++ .../versions/v5/next/verifyjwt-import-change.md | 12 ++++++++++++ .../v5/next/verifytoken-import-change.md | 12 ++++++++++++ 20 files changed, 244 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/next/auth-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/clerk-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/constants-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/currentuser-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/decodejwt-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/isknownerror-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/redirect-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/signjwt-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/verifytoken-import-change.md diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 82d63ac472d..7dd3a43ca7b 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -80,6 +80,23 @@ export default { 'button-to-organizationlistcreateorganizationactionbutton', 'remove-socialbuttonsblockbuttonarrow', 'remove-identitypreview-avatar', + 'multisessionappsupport-import-change', + 'auth-import-change', + 'currentuser-import-change', + 'authmiddleware-import-change', + 'buildclerkprops-import-change', + 'verifytoken-import-change', + 'verifyjwt-import-change', + 'decodejwt-import-change', + 'signjwt-import-change', + 'constants-import-change', + 'createauthenticaterequest-import-change', + 'createisomorphicrequest-import-change', + 'clerk-import-change', + 'isclerkapiresponserror-import-change', + 'isemaillinkerror-import-change', + 'isknownerror-import-change', + 'ismetamaskerror-import-change', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes diff --git a/packages/upgrade/source/versions/v5/next/auth-import-change.md b/packages/upgrade/source/versions/v5/next/auth-import-change.md new file mode 100644 index 00000000000..63b56661e0d --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/auth-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`auth` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?auth[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `auth` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { auth } from "@clerk/nextjs" ++ import { auth } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md b/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md new file mode 100644 index 00000000000..bb33737cb1f --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`authMiddleware` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `authMiddleware` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Note as well that `authMiddleware` is deprecated as of this release, and we recommend [using `clerkMiddleware` instead](https://clerk.com/docs/references/nextjs/clerk-middleware). Example below of the fix that needs to be made: + +```diff +- import { authMiddleware } from "@clerk/nextjs" ++ import { authMiddleware } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md b/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md new file mode 100644 index 00000000000..2bd88384138 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`buildClerkProps` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?buildClerkProps[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `buildClerkProps` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { buildClerkProps } from "@clerk/nextjs" ++ import { buildClerkProps } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/clerk-import-change.md b/packages/upgrade/source/versions/v5/next/clerk-import-change.md new file mode 100644 index 00000000000..ba15ec38aab --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/clerk-import-change.md @@ -0,0 +1,11 @@ +--- +title: '`Clerk` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?Clerk[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +--- + +The `Clerk` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Note as well that the `Clerk` export has changed to `createClerkClient` as part of the v5 changes. Example below of the fix that needs to be made: + +```diff +- import { Clerk } from "@clerk/nextjs" ++ import { createClerkClient } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/constants-import-change.md b/packages/upgrade/source/versions/v5/next/constants-import-change.md new file mode 100644 index 00000000000..1196f9a9ce2 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/constants-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`constants` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `constants` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { constants } from "@clerk/nextjs" ++ import { constants } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md b/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md new file mode 100644 index 00000000000..fd8d8d67f81 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`createAuthenticateRequest` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?createAuthenticateRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `createAuthenticateRequest` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { createAuthenticateRequest } from "@clerk/nextjs" ++ import { createAuthenticateRequest } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md b/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md new file mode 100644 index 00000000000..8978d57cb2a --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`createIsomorphicRequest` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `createIsomorphicRequest` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { createIsomorphicRequest } from "@clerk/nextjs" ++ import { createIsomorphicRequest } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/currentuser-import-change.md b/packages/upgrade/source/versions/v5/next/currentuser-import-change.md new file mode 100644 index 00000000000..fad4f150c71 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/currentuser-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`currentUser` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?currentUser[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `currentUser` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { currentUser } from "@clerk/nextjs" ++ import { currentUser } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md b/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md new file mode 100644 index 00000000000..2d252afff32 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`decodeJwt` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `decodeJwt` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { decodeJwt } from "@clerk/nextjs" ++ import { decodeJwt } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md new file mode 100644 index 00000000000..95e1715ee46 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`EmailLinkErrorCode` import moved under `/errors`' +matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/errors' +--- + +The `EmailLinkErrorCode` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { EmailLinkErrorCode } from "@clerk/nextjs" ++ import { EmailLinkErrorCode } from "@clerk/nextjs/errors" +``` diff --git a/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md new file mode 100644 index 00000000000..a0a1d427659 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`isClerkAPIResponseError` import moved under `/errors`' +matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/errors' +--- + +The `isClerkAPIResponseError` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { isClerkAPIResponseError } from "@clerk/nextjs" ++ import { isClerkAPIResponseError } from "@clerk/nextjs/errors" +``` diff --git a/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md new file mode 100644 index 00000000000..e016b26100c --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`isEmailLinkError` import moved under `/errors`' +matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/errors' +--- + +The `isEmailLinkError` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { isEmailLinkError } from "@clerk/nextjs" ++ import { isEmailLinkError } from "@clerk/nextjs/errors" +``` diff --git a/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md b/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md new file mode 100644 index 00000000000..39519d89cb5 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`isKnownError` import moved under `/errors`' +matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/errors' +--- + +The `isKnownError` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { isKnownError } from "@clerk/nextjs" ++ import { isKnownError } from "@clerk/nextjs/errors" +``` diff --git a/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md new file mode 100644 index 00000000000..d38cd1c7700 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`isMetamaskError` import moved under `/errors`' +matcher: "import\\s+{[\\s\\S]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/errors' +--- + +The `isMetamaskError` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { isMetamaskError } from "@clerk/nextjs" ++ import { isMetamaskError } from "@clerk/nextjs/errors" +``` diff --git a/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md new file mode 100644 index 00000000000..9e978272073 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`MultiSessionAppSupport` import moved under `/internal`' +matcher: "import\\s+{[\\s\\S]*?MultiSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/internal' +--- + +The `MultiSessionAppSupport` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/internal`. You must update your import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside the scope of semver. Example below of the fix that needs to be made: + +```diff +- import { MultiSessionAppSupport } from "@clerk/nextjs" ++ import { MultiSessionAppSupport } from "@clerk/nextjs/internal" +``` diff --git a/packages/upgrade/source/versions/v5/next/redirect-import-change.md b/packages/upgrade/source/versions/v5/next/redirect-import-change.md new file mode 100644 index 00000000000..0bda8304461 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/redirect-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`redirect` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?redirect[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `redirect` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { redirect } from "@clerk/nextjs" ++ import { redirect } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/signjwt-import-change.md b/packages/upgrade/source/versions/v5/next/signjwt-import-change.md new file mode 100644 index 00000000000..9e514d590fb --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/signjwt-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`signJwt` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `signJwt` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { signJwt } from "@clerk/nextjs" ++ import { signJwt } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md b/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md new file mode 100644 index 00000000000..4ac97367ce4 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`verifyJwt` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `verifyJwt` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { verifyJwt } from "@clerk/nextjs" ++ import { verifyJwt } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md b/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md new file mode 100644 index 00000000000..17cc98d8e45 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`verifyToken` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?verifyToken[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `verifyToken` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { verifyToken } from "@clerk/nextjs" ++ import { verifyToken } from "@clerk/nextjs/server" +``` From 0592389072de47ce0f9d792038cb7b82b87dbeff Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 17 Jan 2024 17:19:36 -0500 Subject: [PATCH 063/159] feat(upgrade): Add withclerk, withsession, withuser removals --- .../v5/common/withclerk-hof-removed.md | 28 +++++++++++++++++++ .../versions/v5/common/withclerk-removed.md | 15 ++++++++++ .../v5/common/withsession-hof-removed.md | 28 +++++++++++++++++++ .../versions/v5/common/withsession-removed.md | 15 ++++++++++ .../v5/common/withuser-hof-removed.md | 28 +++++++++++++++++++ .../versions/v5/common/withuser-removed.md | 15 ++++++++++ packages/upgrade/source/versions/v5/index.js | 12 ++++++++ 7 files changed, 141 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md create mode 100644 packages/upgrade/source/versions/v5/common/withclerk-removed.md create mode 100644 packages/upgrade/source/versions/v5/common/withsession-hof-removed.md create mode 100644 packages/upgrade/source/versions/v5/common/withsession-removed.md create mode 100644 packages/upgrade/source/versions/v5/common/withuser-hof-removed.md create mode 100644 packages/upgrade/source/versions/v5/common/withuser-removed.md diff --git a/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md b/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md new file mode 100644 index 00000000000..24212a27790 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md @@ -0,0 +1,28 @@ +--- +title: '`withClerk` function removed' +matcher: "import\\s+{[\\s\\S]*?withClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +--- + +The `withClerk` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + +```js +function withClerk(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const clerk = useIsomorphicClerkContext(); + + if (!clerk.loaded) return null; + + return ( + + ); + }; + + HOC.displayName = `withClerk(${displayName})`; + return HOC; +} +``` diff --git a/packages/upgrade/source/versions/v5/common/withclerk-removed.md b/packages/upgrade/source/versions/v5/common/withclerk-removed.md new file mode 100644 index 00000000000..ae532011604 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/withclerk-removed.md @@ -0,0 +1,15 @@ +--- +title: '`WithClerk` component removed' +matcher: "import\\s+{[\\s\\S]*?WithClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +--- + +The `WithClerk` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + +```js +export const WithClerk = ({ children }) => { + const clerk = useClerk(); + if (typeof children !== 'function') throw new Error(); + + return {children(clerk)}; +}; +``` diff --git a/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md b/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md new file mode 100644 index 00000000000..465ce465e82 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md @@ -0,0 +1,28 @@ +--- +title: '`withSession` function removed' +matcher: "import\\s+{[\\s\\S]*?withSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +--- + +The `withSession` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + +```js +function withSession(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const session = useSessionContext(); + + if (!session) return null; + + return ( + + ); + }; + + HOC.displayName = `withSession(${displayName})`; + return HOC; +} +``` diff --git a/packages/upgrade/source/versions/v5/common/withsession-removed.md b/packages/upgrade/source/versions/v5/common/withsession-removed.md new file mode 100644 index 00000000000..e497e2cf264 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/withsession-removed.md @@ -0,0 +1,15 @@ +--- +title: '`WithSession` component removed' +matcher: "import\\s+{[\\s\\S]*?WithSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +--- + +The `WithSession` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + +```js +export const WithSession = ({ children }) => { + const session = useSession(); + if (typeof children !== 'function') throw new Error(); + + return {children(session)}; +}; +``` diff --git a/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md b/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md new file mode 100644 index 00000000000..8d34852151d --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md @@ -0,0 +1,28 @@ +--- +title: '`withUser` function removed' +matcher: "import\\s+{[\\s\\S]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +--- + +The `withUser` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + +```js +function withUser(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const clerk = useUserContext(); + + if (!user) return null; + + return ( + + ); + }; + + HOC.displayName = `withUser(${displayName})`; + return HOC; +} +``` diff --git a/packages/upgrade/source/versions/v5/common/withuser-removed.md b/packages/upgrade/source/versions/v5/common/withuser-removed.md new file mode 100644 index 00000000000..64cb3fc7ca2 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/withuser-removed.md @@ -0,0 +1,15 @@ +--- +title: '`WithUser` component removed' +matcher: "import\\s+{[\\s\\S]*?WithUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +--- + +The `WithUser` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + +```js +export const WithUser = ({ children }) => { + const user = useUser(); + if (typeof children !== 'function') throw new Error(); + + return {children(user)}; +}; +``` diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 7dd3a43ca7b..4a959bc4fa6 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -32,6 +32,12 @@ const reactChangesList = [ 'button-to-organizationlistcreateorganizationactionbutton', 'remove-socialbuttonsblockbuttonarrow', 'remove-identitypreview-avatar', + 'withsession-removed', + 'withclerk-removed', + 'withuser-removed', + 'withclerk-hof-removed', + 'withsession-hof-removed', + 'withuser-hof-removed', ]; export default { @@ -97,6 +103,12 @@ export default { 'isemaillinkerror-import-change', 'isknownerror-import-change', 'ismetamaskerror-import-change', + 'withsession-removed', + 'withclerk-removed', + 'withuser-removed', + 'withclerk-hof-removed', + 'withsession-hof-removed', + 'withuser-hof-removed', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes From 95c5436aa64347653c02868198d96efff103a212 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 17 Jan 2024 21:29:16 -0500 Subject: [PATCH 064/159] feat(upgrade): Add a couple new changes, fix regexes for env vars, add error import paths to react --- .../versions/v5/common/api-key-to-secret-key.md | 2 +- .../v5/common/clerkprovideroptionswrapper-dropped.md | 6 ++++++ .../v5/common/emaillinkerrorcode-import-change.md | 12 ++++++++++++ .../v5/common/frontend-api-to-publishable-key.md | 2 +- .../common/isclerkapiresponserror-import-change.md | 12 ++++++++++++ .../v5/common/isemaillinkerror-import-change.md | 12 ++++++++++++ .../versions/v5/common/isknownerror-import-change.md | 12 ++++++++++++ .../v5/common/ismetamaskerror-import-change.md | 0 .../common/multisessionappsupport-import-change.md | 11 +++++++++++ .../versions/v5/expo/apikey-to-publishable-key.md | 2 +- .../versions/v5/gatsby/apikey-to-publishable-key.md | 2 +- packages/upgrade/source/versions/v5/index.js | 3 +++ .../versions/v5/next/clerk-js-version-next-public.md | 2 +- .../versions/v5/next/next-public-clerk-js-url.md | 6 ++++++ 14 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 packages/upgrade/source/versions/v5/common/clerkprovideroptionswrapper-dropped.md create mode 100644 packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md create mode 100644 packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md create mode 100644 packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md create mode 100644 packages/upgrade/source/versions/v5/common/isknownerror-import-change.md create mode 100644 packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md create mode 100644 packages/upgrade/source/versions/v5/common/multisessionappsupport-import-change.md create mode 100644 packages/upgrade/source/versions/v5/next/next-public-clerk-js-url.md diff --git a/packages/upgrade/source/versions/v5/common/api-key-to-secret-key.md b/packages/upgrade/source/versions/v5/common/api-key-to-secret-key.md index 446a2e74a15..133ba344f2d 100644 --- a/packages/upgrade/source/versions/v5/common/api-key-to-secret-key.md +++ b/packages/upgrade/source/versions/v5/common/api-key-to-secret-key.md @@ -1,6 +1,6 @@ --- title: '`CLERK_API_KEY` replaced by `CLERK_SECRET_KEY`' -matcher: '[^_]CLERK_API_KEY' +matcher: 'CLERK_API_KEY' --- The `CLERK_API_KEY` environment variable was renamed to `CLERK_SECRET_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). diff --git a/packages/upgrade/source/versions/v5/common/clerkprovideroptionswrapper-dropped.md b/packages/upgrade/source/versions/v5/common/clerkprovideroptionswrapper-dropped.md new file mode 100644 index 00000000000..a0afa9675f7 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/clerkprovideroptionswrapper-dropped.md @@ -0,0 +1,6 @@ +--- +title: '`ClerkProviderOptionsWrapper` type removed' +matcher: 'ClerkProviderOptionsWrapper' +--- + +This type was extending `ClerkProviderProps` with but was not necessary. This type is typically used internally and is not required to be imported and used directly. If needed, import and use `ClerkProviderProps` instead. diff --git a/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md new file mode 100644 index 00000000000..6303912c95f --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`EmailLinkErrorCode` import moved under `/errors`' +matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +replaceWithString: 'clerk-react/errors' +--- + +The `EmailLinkErrorCode` import path has changed from `@clerk/clerk-react` to `@clerk/clerk-react/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { EmailLinkErrorCode } from "@clerk/clerk-react" ++ import { EmailLinkErrorCode } from "@clerk/clerk-react/errors" +``` diff --git a/packages/upgrade/source/versions/v5/common/frontend-api-to-publishable-key.md b/packages/upgrade/source/versions/v5/common/frontend-api-to-publishable-key.md index 8f479efd9e7..ff6a43f97a0 100644 --- a/packages/upgrade/source/versions/v5/common/frontend-api-to-publishable-key.md +++ b/packages/upgrade/source/versions/v5/common/frontend-api-to-publishable-key.md @@ -1,6 +1,6 @@ --- title: '`CLERK_FRONTEND_API` replaced by `CLERK_PUBLISHABLE_KEY`' -matcher: '[^_]CLERK_FRONTEND_API' +matcher: 'CLERK_FRONTEND_API' --- The `CLERK_FRONTEND_API` environment variable was renamed to `CLERK_PUBLISHABLE_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). **Note:** The values are different, so this is not just a key replacement. [More information](/docs/deployments/overview#api-keys-and-environment-variables). diff --git a/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md new file mode 100644 index 00000000000..e71cb81ee34 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`isClerkAPIResponseError` import moved under `/errors`' +matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +replaceWithString: 'clerk-react/errors' +--- + +The `isClerkAPIResponseError` import path has changed from `@clerk/clerk-react` to `@clerk/clerk-react/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { isClerkAPIResponseError } from "@clerk/clerk-react" ++ import { isClerkAPIResponseError } from "@clerk/clerk-react/errors" +``` diff --git a/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md new file mode 100644 index 00000000000..d2caf13e84a --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`isEmailLinkError` import moved under `/errors`' +matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +replaceWithString: 'clerk-react/errors' +--- + +The `isEmailLinkError` import path has changed from `@clerk/clerk-react` to `@clerk/clerk-react/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { isEmailLinkError } from "@clerk/clerk-react" ++ import { isEmailLinkError } from "@clerk/clerk-react/errors" +``` diff --git a/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md b/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md new file mode 100644 index 00000000000..5440c9938a9 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`isKnownError` import moved under `/errors`' +matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +replaceWithString: 'clerk-react/errors' +--- + +The `isKnownError` import path has changed from `@clerk/clerk-react` to `@clerk/clerk-react/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { isKnownError } from "@clerk/clerk-react" ++ import { isKnownError } from "@clerk/clerk-react/errors" +``` diff --git a/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/upgrade/source/versions/v5/common/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/v5/common/multisessionappsupport-import-change.md new file mode 100644 index 00000000000..1c086c7db8f --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/multisessionappsupport-import-change.md @@ -0,0 +1,11 @@ +--- +title: '`MultisessionAppSupport` import moved to `/internal`' +matcher: "import\\s+{[\\s\\S]*?MutliSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/clerk-react[\\s\\S]*?['\"]" +--- + +`MultiSessionAppSupport` is a component that handles the intermediate “undefined” state for multisession apps by unmounting and remounting the components during the session switch (` setActive`` call) in order to solve theoretical edge-cases that can arise while switching sessions. It is undocumented and intended only for internal use, so it has been moved to an `/internal` import path. Please note that internal imports are not intended for public use, and are outside the scope of semver. + +```diff +- import { MultiSessionAppSupport } from '@clerk/clerk-react' ++ import { MultiSessionAppSupport } from '@clerk/clerk-react/internal' +``` diff --git a/packages/upgrade/source/versions/v5/expo/apikey-to-publishable-key.md b/packages/upgrade/source/versions/v5/expo/apikey-to-publishable-key.md index 5b20f467128..58a45510c5f 100644 --- a/packages/upgrade/source/versions/v5/expo/apikey-to-publishable-key.md +++ b/packages/upgrade/source/versions/v5/expo/apikey-to-publishable-key.md @@ -1,6 +1,6 @@ --- title: '`CLERK_FRONTEND_API` replaced by `CLERK_PUBLISHABLE_KEY`' -matcher: '[^_]CLERK_FRONTEND_API' +matcher: 'CLERK_FRONTEND_API' --- If you are using a `CLERK_FRONTEND_API` environment variable, the name must be changed to `CLERK_PUBLISHABLE_KEY` instead. Note that the values are different as well, so this is not just a key replacement. You can find the publishable key in your Clerk dashboard. Make sure you do this in both your dev and production environments. diff --git a/packages/upgrade/source/versions/v5/gatsby/apikey-to-publishable-key.md b/packages/upgrade/source/versions/v5/gatsby/apikey-to-publishable-key.md index 4410c85803d..6f4474c47e8 100644 --- a/packages/upgrade/source/versions/v5/gatsby/apikey-to-publishable-key.md +++ b/packages/upgrade/source/versions/v5/gatsby/apikey-to-publishable-key.md @@ -1,6 +1,6 @@ --- title: '`GASTBY_CLERK_FRONTEND_API` replaced by `GATSBY_CLERK_PUBLISHABLE_KEY`' -matcher: '[^_]GATSBY_CLERK_FRONTEND_API' +matcher: 'GATSBY_CLERK_FRONTEND_API' --- If you are using a `GATSBY_CLERK_FRONTEND_API` environment variable, the name must be changed to `GATSBY_CLERK_PUBLISHABLE_KEY` instead. Note that the values are different as well, so this is not just a key replacement. You can find the publishable key in your Clerk dashboard. Make sure you do this in both your dev and production environments. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 4a959bc4fa6..31d1a8e721f 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -38,6 +38,8 @@ const reactChangesList = [ 'withclerk-hof-removed', 'withsession-hof-removed', 'withuser-hof-removed', + 'multisessionappsupport-import-change', + 'clerkprovideroptionswrapper-dropped', ]; export default { @@ -109,6 +111,7 @@ export default { 'withclerk-hof-removed', 'withsession-hof-removed', 'withuser-hof-removed', + 'next-public-clerk-js-url', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes diff --git a/packages/upgrade/source/versions/v5/next/clerk-js-version-next-public.md b/packages/upgrade/source/versions/v5/next/clerk-js-version-next-public.md index a10e7df4ca2..873c80c0445 100644 --- a/packages/upgrade/source/versions/v5/next/clerk-js-version-next-public.md +++ b/packages/upgrade/source/versions/v5/next/clerk-js-version-next-public.md @@ -1,6 +1,6 @@ --- title: '`CLERK_JS_VERSION` should be `NEXT_PUBLIC_CLERK_JS_VERSION`' -matcher: '[^_]CLERK_JS_VERSION' +matcher: '^[^_]*CLERK_JS_VERSION' --- If you are using `CLERK_JS_VERSION` as an environment variable, it should be changed to `NEXT_PUBLIC_CLERK_JS_VERSION` instead. diff --git a/packages/upgrade/source/versions/v5/next/next-public-clerk-js-url.md b/packages/upgrade/source/versions/v5/next/next-public-clerk-js-url.md new file mode 100644 index 00000000000..f95c2e03786 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/next-public-clerk-js-url.md @@ -0,0 +1,6 @@ +--- +title: '`NEXT_PUBLIC_CLERK_JS` should be `NEXT_PUBLIC_CLERK_JS_URL`' +matcher: 'NEXT_PUBLIC_CLERK_JS[^_]*$' +--- + +If you are using `NEXT_PUBLIC_CLERK_JS` as an environment variable, it should be changed to `NEXT_PUBLIC_CLERK_JS_URL` instead. We renamed this variable for consistency across public APIs. Make sure to also check your production host configuration when changing environment variable values. From a75d6b34ef99ec40032bd7715f79b03678622a17 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Jan 2024 12:21:25 -0500 Subject: [PATCH 065/159] feat(upgrade): Variety pack of new changes --- .../common/ismetamaskerror-import-change.md | 12 +++++++++ packages/upgrade/source/versions/v5/index.js | 9 +++++++ ...rganization-getdomains-arguments-change.md | 20 ++++++++++++++ ...zation-getinvitations-arguments-changed.md | 20 ++++++++++++++ ...getmembershiprequests-arguments-changed.md | 20 ++++++++++++++ ...zation-getmemberships-arguments-changed.md | 20 ++++++++++++++ ...organization-getroles-arguments-changed.md | 20 ++++++++++++++ ...anizationinvitations-arguments-chanaged.md | 20 ++++++++++++++ ...anizationmemberships-arguments-chanaged.md | 20 ++++++++++++++ ...anizationsuggestions-arguments-chanaged.md | 20 ++++++++++++++ .../v5/node/legacyauthobject-removed.md | 26 +++++++++++++++++++ .../versions/v5/shared/buildrequesturl.md | 14 +++++----- 12 files changed, 213 insertions(+), 8 deletions(-) create mode 100644 packages/upgrade/source/versions/v5/js/organization-getdomains-arguments-change.md create mode 100644 packages/upgrade/source/versions/v5/js/organization-getinvitations-arguments-changed.md create mode 100644 packages/upgrade/source/versions/v5/js/organization-getmembershiprequests-arguments-changed.md create mode 100644 packages/upgrade/source/versions/v5/js/organization-getmemberships-arguments-changed.md create mode 100644 packages/upgrade/source/versions/v5/js/organization-getroles-arguments-changed.md create mode 100644 packages/upgrade/source/versions/v5/js/user-getorganizationinvitations-arguments-chanaged.md create mode 100644 packages/upgrade/source/versions/v5/js/user-getorganizationmemberships-arguments-chanaged.md create mode 100644 packages/upgrade/source/versions/v5/js/user-getorganizationsuggestions-arguments-chanaged.md create mode 100644 packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md diff --git a/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md index e69de29bb2d..d38cd1c7700 100644 --- a/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md +++ b/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`isMetamaskError` import moved under `/errors`' +matcher: "import\\s+{[\\s\\S]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/errors' +--- + +The `isMetamaskError` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { isMetamaskError } from "@clerk/nextjs" ++ import { isMetamaskError } from "@clerk/nextjs/errors" +``` diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 31d1a8e721f..4c1e2185a09 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -191,6 +191,7 @@ export default { 'setclerkhttpoptions', 'setclerkserverapiurl', 'cjs-esm-instance', + 'legacyauthobject-removed', ]), react: load('react', reactChangesList), js: load('js', [ @@ -228,6 +229,14 @@ export default { 'button-to-organizationlistcreateorganizationactionbutton', 'remove-socialbuttonsblockbuttonarrow', 'remove-identitypreview-avatar', + 'organization-getroles-arguments-changed', + 'organization-getdomains-arguments-change', + 'organization-getmembershiprequests-arguments-changed', + 'organization-getmemberships-arguments-changed', + 'organization-getinvitations-arguments-changed', + 'user-getorganizationinvitations-arguments-chanaged', + 'user-getorganizationsuggestions-arguments-chanaged', + 'user-getorganizationmemberships-arguments-chanaged', ]), shared: load('shared', [ 'magiclinkerror', diff --git a/packages/upgrade/source/versions/v5/js/organization-getdomains-arguments-change.md b/packages/upgrade/source/versions/v5/js/organization-getdomains-arguments-change.md new file mode 100644 index 00000000000..0d9c819e910 --- /dev/null +++ b/packages/upgrade/source/versions/v5/js/organization-getdomains-arguments-change.md @@ -0,0 +1,20 @@ +--- +title: '`Organization.getDomains` arguments changed' +matcher: "\\.getDomains\\(" +--- + +There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + +```diff + import Clerk from "@clerk/clerk-js" + + const clerk = new Clerk() + await clerk.load() + + const { data: orgs } = await clerk.organization.getDomains({ +- limit: 10, ++ pageSize: 10, +- offset: 10, ++ initialPage: 2, + }) +``` diff --git a/packages/upgrade/source/versions/v5/js/organization-getinvitations-arguments-changed.md b/packages/upgrade/source/versions/v5/js/organization-getinvitations-arguments-changed.md new file mode 100644 index 00000000000..5e772137de6 --- /dev/null +++ b/packages/upgrade/source/versions/v5/js/organization-getinvitations-arguments-changed.md @@ -0,0 +1,20 @@ +--- +title: '`Organization.getInvitations` arguments changed' +matcher: "\\.getInvitations\\(" +--- + +There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + +```diff + import Clerk from "@clerk/clerk-js" + + const clerk = new Clerk() + await clerk.load() + + const { data: orgs } = await clerk.organization.getInvitations({ +- limit: 10, ++ pageSize: 10, +- offset: 10, ++ initialPage: 2, + }) +``` diff --git a/packages/upgrade/source/versions/v5/js/organization-getmembershiprequests-arguments-changed.md b/packages/upgrade/source/versions/v5/js/organization-getmembershiprequests-arguments-changed.md new file mode 100644 index 00000000000..89c6b75e46d --- /dev/null +++ b/packages/upgrade/source/versions/v5/js/organization-getmembershiprequests-arguments-changed.md @@ -0,0 +1,20 @@ +--- +title: '`Organization.getMembershipRequests` arguments changed' +matcher: "\\.getMembershipRequests\\(" +--- + +There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + +```diff + import Clerk from "@clerk/clerk-js" + + const clerk = new Clerk() + await clerk.load() + + const { data: orgs } = await clerk.organization.getMembershipRequests({ +- limit: 10, ++ pageSize: 10, +- offset: 10, ++ initialPage: 2, + }) +``` diff --git a/packages/upgrade/source/versions/v5/js/organization-getmemberships-arguments-changed.md b/packages/upgrade/source/versions/v5/js/organization-getmemberships-arguments-changed.md new file mode 100644 index 00000000000..3a04cea7c13 --- /dev/null +++ b/packages/upgrade/source/versions/v5/js/organization-getmemberships-arguments-changed.md @@ -0,0 +1,20 @@ +--- +title: '`Organization.getMemberships` arguments changed' +matcher: "\\.getMemberships\\(" +--- + +There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + +```diff + import Clerk from "@clerk/clerk-js" + + const clerk = new Clerk() + await clerk.load() + + const { data: orgs } = await clerk.organization.getMemberships({ +- limit: 10, ++ pageSize: 10, +- offset: 10, ++ initialPage: 2, + }) +``` diff --git a/packages/upgrade/source/versions/v5/js/organization-getroles-arguments-changed.md b/packages/upgrade/source/versions/v5/js/organization-getroles-arguments-changed.md new file mode 100644 index 00000000000..026008f3350 --- /dev/null +++ b/packages/upgrade/source/versions/v5/js/organization-getroles-arguments-changed.md @@ -0,0 +1,20 @@ +--- +title: '`Organization.getRoles` arguments changed' +matcher: "\\.getRoles\\(" +--- + +There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + +```diff + import Clerk from "@clerk/clerk-js" + + const clerk = new Clerk() + await clerk.load() + + const { data: orgs } = await clerk.organization.getRoles({ +- limit: 10, ++ pageSize: 10, +- offset: 10, ++ initialPage: 2, + }) +``` diff --git a/packages/upgrade/source/versions/v5/js/user-getorganizationinvitations-arguments-chanaged.md b/packages/upgrade/source/versions/v5/js/user-getorganizationinvitations-arguments-chanaged.md new file mode 100644 index 00000000000..60073ebdebb --- /dev/null +++ b/packages/upgrade/source/versions/v5/js/user-getorganizationinvitations-arguments-chanaged.md @@ -0,0 +1,20 @@ +--- +title: '`User.getOrganizationInvitations` arguments changed' +matcher: "\\.getOrganizationInvitations\\(" +--- + +There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + +```diff + import Clerk from "@clerk/clerk-js" + + const clerk = new Clerk() + await clerk.load() + + const { data: orgs } = await clerk.user.getOrganizationInvitations({ +- limit: 10, ++ pageSize: 10, +- offset: 10, ++ initialPage: 2, + }) +``` diff --git a/packages/upgrade/source/versions/v5/js/user-getorganizationmemberships-arguments-chanaged.md b/packages/upgrade/source/versions/v5/js/user-getorganizationmemberships-arguments-chanaged.md new file mode 100644 index 00000000000..cf89d2d2b9f --- /dev/null +++ b/packages/upgrade/source/versions/v5/js/user-getorganizationmemberships-arguments-chanaged.md @@ -0,0 +1,20 @@ +--- +title: '`User.getOrganizationMemberships` arguments changed' +matcher: "\\.getOrganizationMemberships\\(" +--- + +There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + +```diff + import Clerk from "@clerk/clerk-js" + + const clerk = new Clerk() + await clerk.load() + + const { data: orgs } = await clerk.user.getOrganizationMemberships({ +- limit: 10, ++ pageSize: 10, +- offset: 10, ++ initialPage: 2, + }) +``` diff --git a/packages/upgrade/source/versions/v5/js/user-getorganizationsuggestions-arguments-chanaged.md b/packages/upgrade/source/versions/v5/js/user-getorganizationsuggestions-arguments-chanaged.md new file mode 100644 index 00000000000..39f9bb5ed18 --- /dev/null +++ b/packages/upgrade/source/versions/v5/js/user-getorganizationsuggestions-arguments-chanaged.md @@ -0,0 +1,20 @@ +--- +title: '`User.getOrganizationSuggestions` arguments changed' +matcher: "\\.getOrganizationSuggestions\\(" +--- + +There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + +```diff + import Clerk from "@clerk/clerk-js" + + const clerk = new Clerk() + await clerk.load() + + const { data: orgs } = await clerk.user.getOrganizationSuggestions({ +- limit: 10, ++ pageSize: 10, +- offset: 10, ++ initialPage: 2, + }) +``` diff --git a/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md b/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md new file mode 100644 index 00000000000..40c87bf060f --- /dev/null +++ b/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md @@ -0,0 +1,26 @@ +--- +title: '`LegacyAuthObject` type -> `AuthObject`' +matcher: '(?:LegacyAuthObject|LooseAuthProp|StrictAuthProp)' +--- + +We changed the values that our middleware adds to the `request` object after running. Previously it returned a `LegacyAuthObject` type, and now it returns an `AuthObject` type, the difference between the two types is as such: + +```diff +- type LegacyAuthObject = { ++ type AuthObject = { + sessionId: string | null; + actor: ActClaim | undefined | null; + userId: string | null; + getToken: ServerGetToken | null; + debug: AuthObjectDebug | null; +- claims: JwtPayload | null; +- sessionClaims: JwtPayload | null; ++ orgId: string | undefined | null; ++ orgRole: OrganizationCustomRoleKey | undefined | null; ++ orgSlug: string | undefined | null; ++ orgPermissions: OrganizationCustomPermissionKey[] | undefined | null; ++ has: CheckAuthorizationWithCustomPermissions | null; + } +``` + +If you were using the `claims` key on the request after running middleware, you will need to instead use `sessionClaims`. Additionally, if you were using the `LooseAuthProp` or `StrictAuthProp` exported types anywhere, note that these have been adjusted to fit the shape of the new middleware response typing. diff --git a/packages/upgrade/source/versions/v5/shared/buildrequesturl.md b/packages/upgrade/source/versions/v5/shared/buildrequesturl.md index 5dd826c4e73..72e26dd0e3c 100644 --- a/packages/upgrade/source/versions/v5/shared/buildrequesturl.md +++ b/packages/upgrade/source/versions/v5/shared/buildrequesturl.md @@ -1,14 +1,12 @@ --- -title: '`getRequestUrl` -> `buildRequestUrl` from `@clerk/backend`' +title: '`getRequestUrl` -> `buildRequestUrl` from `@clerk/backend/internal`' matcher: "getRequestUrl\\(" --- -```js -// before -import { getRequestUrl } from '@clerk/shared/proxy'; -const url = getRequestUrl(req, '/your/path'); +```diff +- import { getRequestUrl } from '@clerk/shared/proxy'; ++ import { buildRequestUrl } from '@clerk/backend/internal'; -// after -import { buildRequestUrl } from '@clerk/backend'; -const url = buildRequestUrl(/* ??? */); +- const url = getRequestUrl(req, '/your/path'); ++ const url = buildRequestUrl(/* ??? */); ``` From d012e3a3b132ff7e93240f65fb76e605e51f8737 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Jan 2024 13:08:21 -0500 Subject: [PATCH 066/159] feat(upgrade): Add afterSign[Up|In|Out]Url behavior change item --- .../v5/common/aftersigninurl-behavior-change.md | 7 +++++++ .../v5/common/aftersignouturl-behavior-change.md | 7 +++++++ .../v5/common/aftersignupurl-behavior-change.md | 7 +++++++ packages/upgrade/source/versions/v5/index.js | 15 +++++++++++++++ 4 files changed, 36 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change.md create mode 100644 packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md create mode 100644 packages/upgrade/source/versions/v5/common/aftersignupurl-behavior-change.md diff --git a/packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change.md b/packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change.md new file mode 100644 index 00000000000..4f74dd99afd --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change.md @@ -0,0 +1,7 @@ +--- +title: '`afterSignInUrl` prop behavior change' +matcher: 'afterSignInUrl=' +warning: true +--- + +The default value of `afterSignInUrl` has been changed to `/`. The URLs defined in your `Dashboard > Account Portal > Redirects` section will no longer affect these values. Read the [Customizing your Account Portal redirects](https://clerk.com/docs/account-portal/custom-redirects) guide to learn how to override these defaults. diff --git a/packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md b/packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md new file mode 100644 index 00000000000..8c79fa4ead2 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md @@ -0,0 +1,7 @@ +--- +title: '`afterSignOutUrl` prop behavior change' +matcher: 'afterSignOutUrl=' +warning: true +--- + +The default value of `afterSignOutUrl` has been changed to `/`. The URLs defined in your `Dashboard > Account Portal > Redirects` section will no longer affect these values. Read the [Customizing your Account Portal redirects](https://clerk.com/docs/account-portal/custom-redirects) guide to learn how to override these defaults. diff --git a/packages/upgrade/source/versions/v5/common/aftersignupurl-behavior-change.md b/packages/upgrade/source/versions/v5/common/aftersignupurl-behavior-change.md new file mode 100644 index 00000000000..ab5bb9c7968 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/aftersignupurl-behavior-change.md @@ -0,0 +1,7 @@ +--- +title: '`afterSignUpUrl` prop behavior change' +matcher: 'afterSignUpUrl=' +warning: true +--- + +The default value of `afterSignUpUrl` has been changed to `/`. The URLs defined in your `Dashboard > Account Portal > Redirects` section will no longer affect these values. Read the [Customizing your Account Portal redirects](https://clerk.com/docs/account-portal/custom-redirects) guide to learn how to override these defaults. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 4c1e2185a09..9044ba790de 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -40,6 +40,9 @@ const reactChangesList = [ 'withuser-hof-removed', 'multisessionappsupport-import-change', 'clerkprovideroptionswrapper-dropped', + 'aftersignouturl-behavior-change', + 'aftersigninurl-behavior-change', + 'aftersignupurl-behavior-change', ]; export default { @@ -112,6 +115,9 @@ export default { 'withsession-hof-removed', 'withuser-hof-removed', 'next-public-clerk-js-url', + 'aftersignouturl-behavior-change', + 'aftersigninurl-behavior-change', + 'aftersignupurl-behavior-change', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -143,6 +149,9 @@ export default { 'magiclinkerrorcode', 'usemagiclink', 'setsession', + 'aftersignouturl-behavior-change', + 'aftersigninurl-behavior-change', + 'aftersignupurl-behavior-change', ]), expo: load('expo', [ 'apikey-to-publishable-key', @@ -162,6 +171,9 @@ export default { 'button-to-organizationlistcreateorganizationactionbutton', 'remove-socialbuttonsblockbuttonarrow', 'remove-identitypreview-avatar', + 'aftersignouturl-behavior-change', + 'aftersigninurl-behavior-change', + 'aftersignupurl-behavior-change', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -237,6 +249,9 @@ export default { 'user-getorganizationinvitations-arguments-chanaged', 'user-getorganizationsuggestions-arguments-chanaged', 'user-getorganizationmemberships-arguments-chanaged', + 'aftersignouturl-behavior-change', + 'aftersigninurl-behavior-change', + 'aftersignupurl-behavior-change', ]), shared: load('shared', [ 'magiclinkerror', From 00deab54f24d50a5699d07c62950b5b0053af8fa Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Jan 2024 14:14:08 -0500 Subject: [PATCH 067/159] feat(upgrade): Localization key changes --- .../v5/common/changed-localization-keys.md | 178 ++++++++++++++++++ .../v5/common/new-localization-keys.md | 132 +++++++++++++ .../v5/common/removed-localization-keys.md | 165 ++++++++++++++++ packages/upgrade/source/versions/v5/index.js | 18 +- .../versions/v5/js/clerk-isready-removed.md | 6 + 5 files changed, 498 insertions(+), 1 deletion(-) create mode 100644 packages/upgrade/source/versions/v5/common/changed-localization-keys.md create mode 100644 packages/upgrade/source/versions/v5/common/new-localization-keys.md create mode 100644 packages/upgrade/source/versions/v5/common/removed-localization-keys.md create mode 100644 packages/upgrade/source/versions/v5/js/clerk-isready-removed.md diff --git a/packages/upgrade/source/versions/v5/common/changed-localization-keys.md b/packages/upgrade/source/versions/v5/common/changed-localization-keys.md new file mode 100644 index 00000000000..9db6362aadc --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/changed-localization-keys.md @@ -0,0 +1,178 @@ +--- +title: 'Localization keys changed' +matcher: + - 'formFieldLabel__organizationName:' + - 'formFieldLabel__organizationSlug:' + - 'formFieldInputPlaceholder__emailAddresses:' + - 'formFieldInputPlaceholder__organizationSlug:' + - "signUp:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?subtitle:" + - "signUp:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?actionText:" + - "signUp:\\s+{[\\s\\S]*?emailCode:\\s+{[\\s\\S]*?subtitle:" + - "signUp:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?subtitle:" + - "signUp:\\s+{[\\s\\S]*?continue:\\s+{[\\s\\S]*?subtitle:" + - "signUp:\\s+{[\\s\\S]*?continue:\\s+{[\\s\\S]*?actionText:" + - "signIn:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?title:" + - "signIn:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?subtitle:" + - "signIn:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?actionText:" + - "signIn:\\s+{[\\s\\S]*?password:\\s+{[\\s\\S]*?subtitle:" + - "signIn:\\s+{[\\s\\S]*?forgotPasswordAlternativeMethods:\\s+{[\\s\\S]*?label__alternativeMethods:" + - "signIn:\\s+{[\\s\\S]*?resetPassword:\\s+{[\\s\\S]*?title:" + - "signIn:\\s+{[\\s\\S]*?phoneCodeMfa:\\s+{[\\s\\S]*?subtitle:" + - "signIn:\\s+{[\\s\\S]*?totpMfa:\\s+{[\\s\\S]*?subtitle:" + - "signIn:\\s+{[\\s\\S]*?backupCodeMfa:\\s+{[\\s\\S]*?subtitle:" + - "userProfile:\\s+{[\\s\\S]*?formButtonPrimary__continue:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__account" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?profileSection:\\s+{[\\s\\S]*?primaryButton:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsAction__unverified:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?destructiveAction:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?destructiveActionLabel:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?backupCodes:\\s+{[\\s\\S]*?actionLabel__regenerate:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?title:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?deleteAccountButton:" + - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?imageFormSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?imageFormDestructiveActionSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?phoneNumberPage:\\s+{[\\s\\S]*?title:" + - "userProfile:\\s+{[\\s\\S]*?phoneNumberPage:\\s+{[\\s\\S]*?infoText:" + - "userProfile:\\s+{[\\s\\S]*?connectedAccountPage:\\s+{[\\s\\S]*?socialButtonsBlockButton:" + - "userProfile:\\s+{[\\s\\S]*?mfaPhoneCodePage:\\s+{[\\s\\S]*?subtitle__availablePhoneNumbers:" + - "userProfile:\\s+{[\\s\\S]*?mfaPhoneCodePage:\\s+{[\\s\\S]*?subtitle__unavailablePhoneNumbers:" + - "userProfile:\\s+{[\\s\\S]*?deletePage:\\s+{[\\s\\S]*?actionDescription:" + - "organizationSwitcher:\\s+{[\\s\\S]*?action__createOrganization:" + - "organizationSwitcher:\\s+{[\\s\\S]*?action__manageOrganization:" + - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?title:" + - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?title:" + - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?leaveOrganization:\\s+{[\\s\\S]*?actionDescription:" + - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?deleteOrganization:\\s+{[\\s\\S]*?actionDescription:" + - "organizationProfile:\\s+{[\\s\\S]*?invitePage:\\s+{[\\s\\S]*?title:" + - "organizationProfile:\\s+{[\\s\\S]*?invitePage:\\s+{[\\s\\S]*?subtitle:" + - "createOrganization:\\s+{[\\s\\S]*?title:" + - "organizationList:\\s+{[\\s\\S]*?title:" + - "organizationList:\\s+{[\\s\\S]*?titleWithoutPersonal:" +--- + +The values of some keys have been changed on the default [en-US localization object](https://github.com/clerk/javascript/blob/main/packages/localizations/src/en-US.ts). The list below shows you the new defaults (as of writing this guide) which you can either use or overwrite. If you have overridden these values, make sure to double check so you can be sure that your modifications are appropriate. + +```js +const changedValues = { + formFieldLabel__organizationName: 'Name', + formFieldLabel__organizationSlug: 'Slug', + formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', + formFieldInputPlaceholder__organizationSlug: 'my-org', + signUp: { + start: { + subtitle: 'Welcome! Please fill in the details to get started.', + actionText: 'Already have an account?', + }, + emailCode: { + subtitle: 'Enter the verification code sent to your email', + }, + phoneCode: { + subtitle: 'Enter the verification code sent to your phone', + }, + continue: { + subtitle: 'Please fill in the remaining details to continue.', + actionText: 'Already have an account?', + }, + }, + signIn: { + start: { + title: 'Sign in to {{applicationName}}', + subtitle: 'Welcome back! Please sign in to continue', + actionText: 'Don’t have an account?', + }, + password: { + subtitle: 'Enter the password associated with your account', + }, + forgotPasswordAlternativeMethods: { + label__alternativeMethods: 'Or, sign in with another method', + }, + resetPassword: { + title: 'Set new password', + }, + phoneCodeMfa: { + subtitle: 'To continue, please enter the verification code sent to your phone', + }, + totpMfa: { + subtitle: 'To continue, please enter the verification code generated by your authenticator app', + }, + backupCodeMfa: { + subtitle: 'Your backup code is the one you got when setting up two-step authentication.', + }, + }, + userProfile: { + formButtonPrimary__continue: 'Save', + start: { + headerTitle__account: 'Profile details', + profileSection: { + primaryButton: 'Edit profile', + }, + emailAddressesSection: { + detailsAction__unverified: 'Verify', + destructiveAction: 'Remove email', + }, + mfaSection: { + phoneCode: { + destructiveActionLabel: 'Remove', + }, + backupCodes: { + actionLabel__regenerate: 'Regenerate', + }, + }, + dangerSection: { + title: 'Account termination', + deleteAccountButton: 'Delete account', + }, + }, + profilePage: { + imageFormSubtitle: 'Upload', + imageFormDestructiveActionSubtitle: 'Remove', + }, + phoneNumberPage: { + title: 'Add a phone number', + infoText: + 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', + }, + connectedAccountPage: { + socialButtonsBlockButton: '{{provider|titleize}}', + }, + mfaPhoneCodePage: { + subtitle__availablePhoneNumbers: + 'Select an existing phone number to register for SMS code two-step verification or add a new one.', + subtitle__unavailablePhoneNumbers: + 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', + }, + deletePage: { + actionDescription: 'Type "Delete account" below to continue.', + }, + }, + organizationSwitcher: { + action__createOrganization: 'Create organization', + action__manageOrganization: 'Manage', + }, + organizationProfile: { + profilePage: { + title: 'Update Profile', + dangerSection: { + title: 'Danger', + leaveOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + deleteOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + }, + }, + invitePage: { + title: 'Invite new members', + subtitle: 'Enter or paste one or more email addresses, separated by spaces or commas.', + }, + }, + createOrganization: { + title: 'Create organization', + }, + organizationList: { + title: 'Choose an account', + titleWithoutPersonal: 'Choose an organization', + }, +}; +``` diff --git a/packages/upgrade/source/versions/v5/common/new-localization-keys.md b/packages/upgrade/source/versions/v5/common/new-localization-keys.md new file mode 100644 index 00000000000..eeef0b571d5 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/new-localization-keys.md @@ -0,0 +1,132 @@ +--- +title: 'New localization keys added' +matcher: "" +warning: true +--- + +As part of the redesign of Clerk's components, a number of new localization keys have been added and can be seen along with their default english values in the code block below. If you do not supply translated values for these keys in your custom localization, they will fall back to the default english values specified below. + +```js +const newValues = { + formFieldLabel__organizationName: 'Name', + formFieldLabel__organizationSlug: 'Slug', + formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', + formFieldInputPlaceholder__organizationSlug: 'my-org', + signUp: { + start: { + subtitle: 'Welcome! Please fill in the details to get started.', + actionText: 'Already have an account?', + }, + emailCode: { + subtitle: 'Enter the verification code sent to your email', + }, + phoneCode: { + subtitle: 'Enter the verification code sent to your phone', + }, + continue: { + subtitle: 'Please fill in the remaining details to continue.', + actionText: 'Already have an account?', + }, + }, + signIn: { + start: { + title: 'Sign in to {{applicationName}}', + subtitle: 'Welcome back! Please sign in to continue', + actionText: 'Don’t have an account?', + }, + password: { + subtitle: 'Enter the password associated with your account', + }, + forgotPasswordAlternativeMethods: { + label__alternativeMethods: 'Or, sign in with another method', + }, + resetPassword: { + title: 'Set new password', + }, + phoneCodeMfa: { + subtitle: 'To continue, please enter the verification code sent to your phone', + }, + totpMfa: { + subtitle: 'To continue, please enter the verification code generated by your authenticator app', + }, + backupCodeMfa: { + subtitle: 'Your backup code is the one you got when setting up two-step authentication.', + }, + }, + userProfile: { + formButtonPrimary__continue: 'Save', + start: { + headerTitle__account: 'Profile details', + profileSection: { + primaryButton: 'Edit profile', + }, + emailAddressesSection: { + detailsAction__unverified: 'Verify', + destructiveAction: 'Remove email', + }, + mfaSection: { + phoneCode: { + destructiveActionLabel: 'Remove', + }, + backupCodes: { + actionLabel__regenerate: 'Regenerate', + }, + }, + dangerSection: { + title: 'Account termination', + deleteAccountButton: 'Delete account', + }, + }, + profilePage: { + imageFormSubtitle: 'Upload', + imageFormDestructiveActionSubtitle: 'Remove', + }, + phoneNumberPage: { + title: 'Add a phone number', + infoText: + 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', + }, + connectedAccountPage: { + socialButtonsBlockButton: '{{provider|titleize}}', + }, + mfaPhoneCodePage: { + subtitle__availablePhoneNumbers: + 'Select an existing phone number to register for SMS code two-step verification or add a new one.', + subtitle__unavailablePhoneNumbers: + 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', + }, + deletePage: { + actionDescription: 'Type "Delete account" below to continue.', + }, + }, + organizationSwitcher: { + action__createOrganization: 'Create organization', + action__manageOrganization: 'Manage', + }, + organizationProfile: { + profilePage: { + title: 'Update Profile', + dangerSection: { + title: 'Danger', + leaveOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + deleteOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + }, + }, + invitePage: { + title: 'Invite new members', + subtitle: 'Enter or paste one or more email addresses, separated by spaces or commas.', + }, + }, + createOrganization: { + title: 'Create organization', + }, + organizationList: { + title: 'Choose an account', + titleWithoutPersonal: 'Choose an organization', + }, +}; +``` diff --git a/packages/upgrade/source/versions/v5/common/removed-localization-keys.md b/packages/upgrade/source/versions/v5/common/removed-localization-keys.md new file mode 100644 index 00000000000..07154c4aed3 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/removed-localization-keys.md @@ -0,0 +1,165 @@ +--- +title: 'Removed localization keys' +matcher: + - "signIn:\\s+{[\\s\\S]*?forgotPassword:\\s+{[\\s\\S]*?title_email:" + - "signIn:\\s+{[\\s\\S]*?forgotPassword:\\s+{[\\s\\S]*?title_phone:" + - "signIn:\\s+{[\\s\\S]*?forgotPassword:\\s+{[\\s\\S]*?formSubtitle_email:" + - "signIn:\\s+{[\\s\\S]*?forgotPassword:\\s+{[\\s\\S]*?formSubtitle_phone:" + - "signIn:\\s+{[\\s\\S]*?emailCode:\\s+{[\\s\\S]*?formSubtitle:" + - "signIn:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?formSubtitle:" + - "signIn:\\s+{[\\s\\S]*?phoneCodeMfa:\\s+{[\\s\\S]*?formSubtitle:" + - "signIn:\\s+{[\\s\\S]*?totpMfa:\\s+{[\\s\\S]*?formSubtitle:" + - "signIn:\\s+{[\\s\\S]*?backupCodeMfa:\\s+{[\\s\\S]*?formTitle:" + - "signIn:\\s+{[\\s\\S]*?backupCodeMfa:\\s+{[\\s\\S]*?formSubTitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsTitle__primary:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsSubtitle__primary:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsTitle__nonPrimary:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsSubtitle__nonPrimary:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsTitle__unverified:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsSubtitle__unverified:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?destructiveActionTitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?destructiveActionSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?phoneNumbersSection:\\s+{[\\s\\S]*?detailsTitle__primary:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?phoneNumbersSection:\\s+{[\\s\\S]*?detailsSubtitle__primary:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?phoneNumbersSection:\\s+{[\\s\\S]*?detailsTitle__nonPrimary:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?phoneNumbersSection:\\s+{[\\s\\S]*?detailsSubtitle__nonPrimary:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?phoneNumbersSection:\\s+{[\\s\\S]*?detailsTitle__unverified:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?phoneNumbersSection:\\s+{[\\s\\S]*?detailsSubtitle__unverified:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?phoneNumbersSection:\\s+{[\\s\\S]*?destructiveActionTitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?phoneNumbersSection:\\s+{[\\s\\S]*?destructiveActionSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?title__conectionFailed:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?title__connectionFailed:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?title__reauthorize:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?subtitle__reauthorize:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?actionLabel__conectionFailed:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?destructiveActionSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?destructiveActionAccordionSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.destructiveActionTitle" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.destructiveActionSubtitle" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.title__default" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.title__setDefault" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.subtitle__default" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.subtitle__setDefault" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:.title" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:.subtitle" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:.destructiveActionSubtitle" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:.destructiveActionLabel" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?activeDevicesSection:\\s+{[\\s\\S]*?primaryButton:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?activeDevicesSection:\\s+{[\\s\\S]*?detailsTitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?activeDevicesSection:\\s+{[\\s\\S]*?detailsSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?activeDevicesSection:\\s+{[\\s\\S]*?destructiveActionTitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?activeDevicesSection:\\s+{[\\s\\S]*?destructiveActionSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?web3WalletsSection:\\s+{[\\s\\S]*?destructiveActionTitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?web3WalletsSection:\\s+{[\\s\\S]*?destructiveActionSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?deleteAccountTitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?deleteAccountDescription:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__account:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__security:" + - "organizationProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__settings:" + - "organizationProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__members:" + - "organizationProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__settings:" + - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?domainSection:\\s+{[\\s\\S]*?unverifiedDomain_menuAction__verify:" + - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?domainSection:\\s+{[\\s\\S]*?unverifiedDomain_menuAction__remove:" + - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?subtitle" + - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__active" + - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__invited" + - "createOrganization:\\s+{[\\s\\S]*?subtitle" + - 'formFieldLabel__emailAddress_phoneNumber:' + - 'formFieldLabel__phoneNumber_username:' + - 'formFieldLabel__emailAddress_phoneNumber_username:' + - 'formFieldInputPlaceholder__emailAddress_phoneNumber:' + - 'formFieldInputPlaceholder__phoneNumber_username:' + - 'formFieldInputPlaceholder__emailAddress_phoneNumber_username:' + - "userProfile:\\s+{[\\s\\S]*?phoneNumberPage:\\s+{[\\s\\S]*?infoText__secondary:" + - "userProfile:\\s+{[\\s\\S]*?mfaPhoneCodePage:\\s+{[\\s\\S]*?successMessage:" + - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?fileDropAreaTitle:" + - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?fileDropAreaAction:" +--- + +As part of the redesign of Clerk's components, a number of localization keys have been removed as they were no longer present in the new designs. You should remove any of these keys that are present in your localization object as they are no longer needed. + +```js +const deletedKeys = [ + 'signIn.forgotPassword.title_email', + 'signIn.forgotPassword.title_phone', + 'signIn.forgotPassword.formSubtitle_email', + 'signIn.forgotPassword.formSubtitle_phone', + 'signIn.emailCode.formSubtitle', + 'signIn.phoneCode.formSubtitle', + 'signIn.phoneCodeMfa.formSubtitle', + 'signIn.totpMfa.formSubtitle', + 'signIn.backupCodeMfa.formTitle', + 'signIn.backupCodeMfa.formSubtitle', + 'userProfile.start.emailAddressesSection.detailsTitle__primary', + 'userProfile.start.emailAddressesSection.detailsSubtitle__primary', + 'userProfile.start.emailAddressesSection.detailsTitle__nonPrimary', + 'userProfile.start.emailAddressesSection.detailsSubtitle__nonPrimary', + 'userProfile.start.emailAddressesSection.detailsTitle__unverified', + 'userProfile.start.emailAddressesSection.detailsSubtitle__unverified', + 'userProfile.start.emailAddressesSection.destructiveActionTitle', + 'userProfile.start.emailAddressesSection.destructiveActionSubtitle', + 'userProfile.start.phoneNumbersSection.detailsTitle__primary', + 'userProfile.start.phoneNumbersSection.detailsSubtitle__primary', + 'userProfile.start.phoneNumbersSection.detailsTitle__nonPrimary', + 'userProfile.start.phoneNumbersSection.detailsSubtitle__nonPrimary', + 'userProfile.start.phoneNumbersSection.detailsTitle__unverified', + 'userProfile.start.phoneNumbersSection.detailsSubtitle__unverified', + 'userProfile.start.phoneNumbersSection.destructiveActionTitle', + 'userProfile.start.phoneNumbersSection.destructiveActionSubtitle', + 'userProfile.start.connectedAccountsSection.title__conectionFailed', + 'userProfile.start.connectedAccountsSection.title__connectionFailed', + 'userProfile.start.connectedAccountsSection.title__reauthorize', + 'userProfile.start.connectedAccountsSection.subtitle__reauthorize', + 'userProfile.start.connectedAccountsSection.actionLabel__conectionFailed', + 'userProfile.start.connectedAccountsSection.destructiveActionSubtitle', + 'userProfile.start.connectedAccountsSection.destructiveActionAccordionSubtitle', + 'userProfile.start.mfaSection.phoneCode.destructiveActionTitle', + 'userProfile.start.mfaSection.phoneCode.destructiveActionSubtitle', + 'userProfile.start.mfaSection.phoneCode.title__default', + 'userProfile.start.mfaSection.phoneCode.title__setDefault', + 'userProfile.start.mfaSection.phoneCode.subtitle__default', + 'userProfile.start.mfaSection.phoneCode.subtitle__setDefault', + 'userProfile.start.mfaSection.totp.title', + 'userProfile.start.mfaSection.totp.subtitle', + 'userProfile.start.mfaSection.totp.destructiveActionSubtitle', + 'userProfile.start.mfaSection.totp.destructiveActionLabel', + 'userProfile.start.activeDevicesSection.primaryButton', + 'userProfile.start.activeDevicesSection.detailsTitle', + 'userProfile.start.activeDevicesSection.detailsSubtitle', + 'userProfile.start.activeDevicesSection.destructiveActionTitle', + 'userProfile.start.activeDevicesSection.destructiveActionSubtitle', + 'userProfile.start.web3WalletsSection.destructiveActionTitle', + 'userProfile.start.web3WalletsSection.destructiveActionSubtitle', + 'userProfile.start.dangerSection.deleteAccountTitle', + 'userProfile.start.dangerSection.deleteAccountDescription', + 'userProfile.start.headerSubtitle__account', + 'userProfile.start.headerSubtitle__security', + 'organizationProfile.start.headerTitle__settings', + 'organizationProfile.start.headerSubtitle__members', + 'organizationProfile.start.headerSubtitle__settings', + 'organizationProfile.profilePage.domainSection.unverifiedDomain_menuAction__verify', + 'organizationProfile.profilePage.domainSection.unverifiedDomain_menuAction__remove', + 'organizationProfile.profilePage.subtitle', + 'organizationProfile.membersPage.start.headerTitle__active', + 'organizationProfile.membersPage.start.headerTitle__invited', + 'createOrganization.subtitle', + 'formFieldLabel__emailAddress_phoneNumber', + 'formFieldLabel__phoneNumber_username', + 'formFieldLabel__emailAddress_phoneNumber_username', + 'formFieldInputPlaceholder__emailAddress_phoneNumber', + 'formFieldInputPlaceholder__phoneNumber_username', + 'formFieldInputPlaceholder__emailAddress_phoneNumber_username', + 'userProfile.phoneNumberPage.infoText__secondary', + 'userProfile.mfaPhoneCodePage.successMessage', + 'userProfile.profilePage.fileDropAreaTitle', + 'userProfile.profilePage.fileDropAreaAction', +]; +``` + +If you'd like to automate this, you can use the [lodash omit function](https://lodash.com/docs/#omit) as such: + +```js +import { omit } from 'lodash-es'; + +const localization = omit(yourOldOject, deletedKeys); +``` diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 9044ba790de..65a8656ddc9 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -43,6 +43,9 @@ const reactChangesList = [ 'aftersignouturl-behavior-change', 'aftersigninurl-behavior-change', 'aftersignupurl-behavior-change', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', ]; export default { @@ -118,6 +121,9 @@ export default { 'aftersignouturl-behavior-change', 'aftersigninurl-behavior-change', 'aftersignupurl-behavior-change', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -152,6 +158,9 @@ export default { 'aftersignouturl-behavior-change', 'aftersigninurl-behavior-change', 'aftersignupurl-behavior-change', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', ]), expo: load('expo', [ 'apikey-to-publishable-key', @@ -174,6 +183,9 @@ export default { 'aftersignouturl-behavior-change', 'aftersigninurl-behavior-change', 'aftersignupurl-behavior-change', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -252,6 +264,10 @@ export default { 'aftersignouturl-behavior-change', 'aftersigninurl-behavior-change', 'aftersignupurl-behavior-change', + 'clerk-isready-removed', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', ]), shared: load('shared', [ 'magiclinkerror', @@ -263,7 +279,7 @@ export default { 'useorganizationlist-organizationlist', // shared outside this pkg? ]), chromeExtension: load('chromeExtension', ['clerkprovider-tokencache']), - localizations: [], + localizations: load('localization', ['new-localization-keys']), types: [], backend: [], // backend: load('backend', [ diff --git a/packages/upgrade/source/versions/v5/js/clerk-isready-removed.md b/packages/upgrade/source/versions/v5/js/clerk-isready-removed.md new file mode 100644 index 00000000000..d4be8be4666 --- /dev/null +++ b/packages/upgrade/source/versions/v5/js/clerk-isready-removed.md @@ -0,0 +1,6 @@ +--- +title: '`Clerk.isReady()` removed' +matcher: "Clerk\\.isReady\\(" +--- + +We have removed the `Clerk.isReady()` function - instead, please use the `Clerk.loaded` property to check whether Clerk has completed loading. From 232530f3ea9be162d589d8b6016e3146c3cb2778 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Jan 2024 14:18:46 -0500 Subject: [PATCH 068/159] fix(upgrade): Add missed keys to localization obj --- packages/upgrade/source/versions/v5/index.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 65a8656ddc9..44d73220f2e 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -279,7 +279,11 @@ export default { 'useorganizationlist-organizationlist', // shared outside this pkg? ]), chromeExtension: load('chromeExtension', ['clerkprovider-tokencache']), - localizations: load('localization', ['new-localization-keys']), + localizations: load('localization', [ + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', + ]), types: [], backend: [], // backend: load('backend', [ From 8a0719535308343813490083a9d2dc13e2c637f4 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Jan 2024 15:29:47 -0500 Subject: [PATCH 069/159] feat(upgrade): Clean up backend change items --- .../v5/backend/api-url-value-changed.md | 7 +++ .../versions/v5/backend/clockskewinseconds.md | 12 ++++- .../v5/backend/constants-import-path-move.md | 1 + ...ateauthenticaterequest-import-path-move.md | 1 + .../v5/backend/createclerkclient-apikey.md | 17 +++---- .../backend/createclerkclient-frontendapi.md | 17 +++---- ...reateisomorphicrequest-import-path-move.md | 1 + .../v5/backend/decodeJwt-import-path-move.md | 1 + .../v5/backend/externalaccount-picture.md | 6 +++ .../backend/externalaccountjson-avatarurl.md | 6 +++ .../getpendingorganizationinvitationlist.md | 10 ++--- .../v5/backend/organization-logourl.md | 6 +++ .../v5/backend/organizationjson-logourl.md | 6 +++ ...embershippublicuserdata-profileimageurl.md | 6 +++ ...rshippublicuserdatajson-profileimageurl.md | 6 +++ .../source/versions/v5/backend/pkgversion.md | 15 +++++++ .../v5/backend/redirect-import-path-move.md | 1 + .../v5/backend/signjwt-import-path-move.md | 1 + .../v5/backend/user-profileimageurl.md | 6 +++ .../v5/backend/userjson-profileimageurl.md | 6 +++ .../v5/backend/verifyjwt-import-path-move.md | 1 + packages/upgrade/source/versions/v5/index.js | 45 ++++++++++--------- 22 files changed, 129 insertions(+), 49 deletions(-) create mode 100644 packages/upgrade/source/versions/v5/backend/api-url-value-changed.md diff --git a/packages/upgrade/source/versions/v5/backend/api-url-value-changed.md b/packages/upgrade/source/versions/v5/backend/api-url-value-changed.md new file mode 100644 index 00000000000..18746f431f0 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/api-url-value-changed.md @@ -0,0 +1,7 @@ +--- +title: '`API_URL` value has changed' +matcher: "API_URL[\\s\\S]*?from\\s+['\"]@clerk\\/backend\\/constants['\"]" +matcherFlags: 'm' +--- + +The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md b/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md index 16b72a493e0..8eecea6ab33 100644 --- a/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md +++ b/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md @@ -1,7 +1,15 @@ --- title: '`clockSkewInSeconds` -> `clockSkewInMs`' -matcher: 'clockSkewInSeconds' +matcher: + - "verifyJwt\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?)" + - "verifyToken\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?)" + - "authenticateRequest\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?)" +matcherFlags: 'm' replaceWithString: 'clockSkewInMs' --- -The value stayed the same, only the name changed. +The `clockSkewInSeconds` option has been renamed to `clockSkewInMs` in order to accurately reflect that its value is expected to be in milliseconds rather than seconds. The value does not need to change here, only the name. This change affects the following imports: + +- `verifyJwt` +- `verifyToken` +- `Clerk.authenticateRequest` diff --git a/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md b/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md index 572ff5397a8..03732f92235 100644 --- a/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md @@ -1,6 +1,7 @@ --- title: '`constants` import moved to `@clerk/backend/internal`' matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' replaceWithString: 'backend/internal' --- diff --git a/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md b/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md index 7d599fb89e1..6880e45a2bb 100644 --- a/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md @@ -1,6 +1,7 @@ --- title: '`createAuthenticateRequest` import moved to `@clerk/backend/internal`' matcher: "import\\s+{[\\s\\S]*?createAuthenticateRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' replaceWithString: 'backend/internal' --- diff --git a/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md index fd6f0051fbd..9a70dfdeca6 100644 --- a/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md @@ -6,16 +6,13 @@ matcherFlags: 'm' The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. Also note that the import value has changed for creating a new Clerk client, which will be addressed by a separate line item if relevant to your codebase. -```js -// before -import { Clerk } from '@clerk/backend'; +```diff +- import { Clerk } from '@clerk/backend'; ++ import { createClerkClient } from '@clerk/backend'; -const clerkClient = Clerk({ apiKey: '...' }); -clerkClient.authenticateRequest({ apiKey: '...' }); +- const clerkClient = Clerk({ apiKey: '...' }); ++ const clerkClient = createClerkClient({ secretKey: '...' }); -// after -import { createClerkClient } from '@clerk/backend'; - -const clerkClient = createClerkClient({ secretKey: '...' }); -clerkClient.authenticateRequest({ secretKey: '...' }); +- clerkClient.authenticateRequest({ apiKey: '...' }); ++ clerkClient.authenticateRequest({ secretKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md index 9e700a75b1a..b05e04c2ee3 100644 --- a/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md @@ -6,16 +6,13 @@ matcherFlags: 'm' The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. Also note that the import value has changed for creating a new Clerk client, which will be addressed by a separate line item if relevant to your codebase. -```js -// before -import { Clerk } from '@clerk/backend'; +```diff +- import { Clerk } from '@clerk/backend'; ++ import { createClerkClient } from '@clerk/backend'; -const clerkClient = Clerk({ frontendApi: '...' }); -clerkClient.authenticateRequest({ frontendApi: '...' }); +- const clerkClient = Clerk({ frontendApi: '...' }); ++ const clerkClient = createClerkClient({ publishableKey: '...' }); -// after -import { createClerkClient } from '@clerk/backend'; - -const clerkClient = createClerkClient({ publishableKey: '...' }); -clerkClient.authenticateRequest({ publishableKey: '...' }); +- clerkClient.authenticateRequest({ frontendApi: '...' }); ++ clerkClient.authenticateRequest({ publishableKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md b/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md index f22947653fa..b9cdc79c534 100644 --- a/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md @@ -1,6 +1,7 @@ --- title: '`createIsomorphicRequest` import moved to `@clerk/backend/internal`' matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' replaceWithString: 'backend/internal' --- diff --git a/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md b/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md index aa887b78805..3c752a60939 100644 --- a/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md @@ -1,6 +1,7 @@ --- title: '`decodeJwt` import moved to `@clerk/backend/tokens`' matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' replaceWithString: 'backend/tokens' --- diff --git a/packages/upgrade/source/versions/v5/backend/externalaccount-picture.md b/packages/upgrade/source/versions/v5/backend/externalaccount-picture.md index e69de29bb2d..7cfe151fdea 100644 --- a/packages/upgrade/source/versions/v5/backend/externalaccount-picture.md +++ b/packages/upgrade/source/versions/v5/backend/externalaccount-picture.md @@ -0,0 +1,6 @@ +--- +title: '`ExternalAccount.picture` -> `.imageUrl`' +matcher: "\\.picture" +--- + +The `picture` property of any [`ExternalAcccount` object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/externalaccountjson-avatarurl.md b/packages/upgrade/source/versions/v5/backend/externalaccountjson-avatarurl.md index e69de29bb2d..7ad3322bf94 100644 --- a/packages/upgrade/source/versions/v5/backend/externalaccountjson-avatarurl.md +++ b/packages/upgrade/source/versions/v5/backend/externalaccountjson-avatarurl.md @@ -0,0 +1,6 @@ +--- +title: '`ExternalAccountJSON.avatar_url` -> `.imageUrl`' +matcher: "\\.avatar_url" +--- + +The `avatarUrl` property of any `ExternalAcccountJSON` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/getpendingorganizationinvitationlist.md b/packages/upgrade/source/versions/v5/backend/getpendingorganizationinvitationlist.md index 822311eecb3..33db69fd7b7 100644 --- a/packages/upgrade/source/versions/v5/backend/getpendingorganizationinvitationlist.md +++ b/packages/upgrade/source/versions/v5/backend/getpendingorganizationinvitationlist.md @@ -1,12 +1,12 @@ --- -title: '`getPendingOrganizationInvitationList` -> `getOrganizationInvitationList`' -matcher: 'getPendingOrganizationInvitationList' +title: '`Organizations.getPendingOrganizationInvitationList` -> `getOrganizationInvitationList`' +matcher: "\\.(getPendingOrganizationInvitationList)\\(" replaceWithString: 'getOrganizationInvitationList' --- -Use `getOrganizationInvitationList` with a `status` option instead. +The `Organizations.getPendingOrganizationInvitationList` method has been removed. To match the same functionality, use `Organizations.getOrganizationInvitationList` and pass in `status` option as "pending" instead. ```diff -- getPendingOrganizationInvitationList({ organizationId: "" }) -+ getOrganizationInvitationList({ organizationId: "", status: "pending" }) +- clerkClient.organizations.getPendingOrganizationInvitationList() ++ clerkClient.organizations.getOrganizationInvitationList({ status: "pending" }) ``` diff --git a/packages/upgrade/source/versions/v5/backend/organization-logourl.md b/packages/upgrade/source/versions/v5/backend/organization-logourl.md index e69de29bb2d..e2e5ed34b0c 100644 --- a/packages/upgrade/source/versions/v5/backend/organization-logourl.md +++ b/packages/upgrade/source/versions/v5/backend/organization-logourl.md @@ -0,0 +1,6 @@ +--- +title: '`Organization.logoUrl` -> `.imageUrl`' +matcher: "\\.logoUrl" +--- + +The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/organizationjson-logourl.md b/packages/upgrade/source/versions/v5/backend/organizationjson-logourl.md index e69de29bb2d..3015ee230fb 100644 --- a/packages/upgrade/source/versions/v5/backend/organizationjson-logourl.md +++ b/packages/upgrade/source/versions/v5/backend/organizationjson-logourl.md @@ -0,0 +1,6 @@ +--- +title: '`OrganizationJSON.logo_url` -> `.imageUrl`' +matcher: "\\.logo_url" +--- + +The `logo_url` property of any `OrganizationJSON` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdata-profileimageurl.md b/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdata-profileimageurl.md index e69de29bb2d..525d1881a22 100644 --- a/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdata-profileimageurl.md +++ b/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdata-profileimageurl.md @@ -0,0 +1,6 @@ +--- +title: '`OrganizationMembershipPublicUserData.profileImageUrl` -> `.imageUrl`' +matcher: "\\.profileImageUrl" +--- + +The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdatajson-profileimageurl.md b/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdatajson-profileimageurl.md index e69de29bb2d..edf45230d25 100644 --- a/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdatajson-profileimageurl.md +++ b/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdatajson-profileimageurl.md @@ -0,0 +1,6 @@ +--- +title: '`OrganizationMembershipPublicUserDataJSON.profile_image_url` -> `.imageUrl`' +matcher: "\\.profile_image_url" +--- + +The `profile_image_url` property of any `OrganizationMembershipPublicUserDataJSON` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/pkgversion.md b/packages/upgrade/source/versions/v5/backend/pkgversion.md index e69de29bb2d..1f436742389 100644 --- a/packages/upgrade/source/versions/v5/backend/pkgversion.md +++ b/packages/upgrade/source/versions/v5/backend/pkgversion.md @@ -0,0 +1,15 @@ +--- +title: '`pkgVersion` -> `clerkJSVersion`' +matcher: + - "loadInterstitialFromLocal\\([\\s\\S]*?pkgVersion:" + - "loadInterstitialFromBAPI\\([\\s\\S]*?pkgVersion:" + - "buildPublicInterstitialUrl\\([\\s\\S]*?pkgVersion:" +matcherFlags: 'm' +--- + +The `pkgVersion` parameter was removed from the `loadInterstitialFromLocal`, `loadInterstitialFromBAPI`, and `buildPublicInterstitialUrl` functions. Use `clerkJSVersion` instead. Example: + +```diff +- loadInterstitialFromLocal({ pkgVersion: "..." }) ++ loadInterstitialFromLocal({ clerkJSVersion: "..." }) +``` diff --git a/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md b/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md index be8f799edc6..275c9a63e3a 100644 --- a/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md @@ -1,6 +1,7 @@ --- title: '`redirect` import moved to `@clerk/backend/internal`' matcher: "import\\s+{[\\s\\S]*?redirect[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' replaceWithString: 'backend/internal' --- diff --git a/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md b/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md index 30b4f8bec24..d6599891107 100644 --- a/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md @@ -1,6 +1,7 @@ --- title: '`signJwt` import moved to `@clerk/backend/tokens`' matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' replaceWithString: 'backend/tokens' --- diff --git a/packages/upgrade/source/versions/v5/backend/user-profileimageurl.md b/packages/upgrade/source/versions/v5/backend/user-profileimageurl.md index e69de29bb2d..af842c6032b 100644 --- a/packages/upgrade/source/versions/v5/backend/user-profileimageurl.md +++ b/packages/upgrade/source/versions/v5/backend/user-profileimageurl.md @@ -0,0 +1,6 @@ +--- +title: '`User.profileImageUrl` -> `.imageUrl`' +matcher: "\\.profileImageUrl" +--- + +The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/userjson-profileimageurl.md b/packages/upgrade/source/versions/v5/backend/userjson-profileimageurl.md index e69de29bb2d..818a1b3dfcc 100644 --- a/packages/upgrade/source/versions/v5/backend/userjson-profileimageurl.md +++ b/packages/upgrade/source/versions/v5/backend/userjson-profileimageurl.md @@ -0,0 +1,6 @@ +--- +title: '`UserJSON.profile_image_url` -> `.imageUrl`' +matcher: "\\.profile_image_url" +--- + +The `profile_image_url` property of any `UserJSON` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md b/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md index eb113a10293..6cbeeb65579 100644 --- a/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md @@ -1,6 +1,7 @@ --- title: '`verifyJwt` import moved to `@clerk/backend/tokens`' matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' replaceWithString: 'backend/tokens' --- diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 44d73220f2e..ae278e3dfda 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -285,28 +285,29 @@ export default { 'changed-localization-keys', ]), types: [], - backend: [], - // backend: load('backend', [ - // 'verifyjwt-import-path-move' - // 'decodejwt-import-path-move' - // 'signjwt-import-path-move' - // 'constants-import-path-move' - // 'redirect-import-path-move' - // 'createauthenticaterequest-import-path-move' - // 'createisomorphicrequest-import-path-move' - // 'createclerkclient-frontendapi', - // 'authenticaterequest-params-change', - // 'clerk-import', - // 'externalaccount-picture', - // 'externalaccountjson-avatarurl', - // 'organization-logourl', - // 'organizationjson-logourl', - // 'user-profileimageurl', - // 'userjson-profileimageurl', - // 'organizationmembershippublicuserdata-profileimageurl', - // 'organizationmembershippublicuserdatajson-profileimageurl', - // 'clockskewinseconds', - // ]), + backend: load('backend', [ + 'api-url-value-changed', + 'verifyjwt-import-path-move', + 'decodejwt-import-path-move', + 'signjwt-import-path-move', + 'constants-import-path-move', + 'redirect-import-path-move', + 'createauthenticaterequest-import-path-move', + 'createisomorphicrequest-import-path-move', + 'createclerkclient-frontendapi', + 'authenticaterequest-params-change', + 'clerk-import', + 'externalaccount-picture', + 'externalaccountjson-avatarurl', + 'organization-logourl', + 'organizationjson-logourl', + 'user-profileimageurl', + 'userjson-profileimageurl', + 'organizationmembershippublicuserdata-profileimageurl', + 'organizationmembershippublicuserdatajson-profileimageurl', + 'clockskewinseconds', + 'pkgversion', + ]), }; function dedupeMerge(arr1, arr2) { From d6700c1f63a7e84989b401a2afcb14f15b35b423 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Jan 2024 16:21:20 -0500 Subject: [PATCH 070/159] feat(upgrade): Finish the last batch of backend change items --- .../v5/backend/buildrequesturl-removed.md | 13 ++++++++++++ .../backend/client-unstableoptions-removed.md | 15 +++++++++++++ .../v5/backend/createemail-removed.md | 7 +++++++ .../createisomorphicrequest-removed.md | 13 ++++++++++++ .../v5/backend/httpoptions-removed.md | 15 +++++++++++++ .../versions/v5/backend/membershiprole.md | 21 +++++++++++++++++++ .../v5/backend/signjwterror-import-move.md | 13 ++++++++++++ .../tokenverificationerror-import-move.md | 13 ++++++++++++ ...okenverificationerroraction-import-move.md | 13 ++++++++++++ .../tokenverificationerrorcode-import-move.md | 13 ++++++++++++ ...okenverificationerrorreason-import-move.md | 13 ++++++++++++ packages/upgrade/source/versions/v5/index.js | 9 ++++++++ 12 files changed, 158 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/backend/buildrequesturl-removed.md create mode 100644 packages/upgrade/source/versions/v5/backend/client-unstableoptions-removed.md create mode 100644 packages/upgrade/source/versions/v5/backend/createemail-removed.md create mode 100644 packages/upgrade/source/versions/v5/backend/createisomorphicrequest-removed.md create mode 100644 packages/upgrade/source/versions/v5/backend/httpoptions-removed.md create mode 100644 packages/upgrade/source/versions/v5/backend/membershiprole.md create mode 100644 packages/upgrade/source/versions/v5/backend/signjwterror-import-move.md create mode 100644 packages/upgrade/source/versions/v5/backend/tokenverificationerror-import-move.md create mode 100644 packages/upgrade/source/versions/v5/backend/tokenverificationerroraction-import-move.md create mode 100644 packages/upgrade/source/versions/v5/backend/tokenverificationerrorcode-import-move.md create mode 100644 packages/upgrade/source/versions/v5/backend/tokenverificationerrorreason-import-move.md diff --git a/packages/upgrade/source/versions/v5/backend/buildrequesturl-removed.md b/packages/upgrade/source/versions/v5/backend/buildrequesturl-removed.md new file mode 100644 index 00000000000..81e6de2f66b --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/buildrequesturl-removed.md @@ -0,0 +1,13 @@ +--- +title: '`buildRequestUrl` import moved to `/internal`' +matcher: "import\\s+{[\\s\\S]*?buildRequestUrl[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/(backend)['\"]" +replaceWithString: 'backend/internal' +matcherFlags: 'm' +--- + +The `buildRequestUrl` import was intended for those building custom Clerk integrations for frameworks and has been moved to `@clerk/backend/internal` to reflect this. Please use caution when using internal imports as they are outside the bounds of semver. + +```diff +- import { buildRequestUrl } from "@clerk/backend" ++ import { buildRequestUrl } from "@clerk/backend/internal" +``` diff --git a/packages/upgrade/source/versions/v5/backend/client-unstableoptions-removed.md b/packages/upgrade/source/versions/v5/backend/client-unstableoptions-removed.md new file mode 100644 index 00000000000..24653ab7981 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/client-unstableoptions-removed.md @@ -0,0 +1,15 @@ +--- +title: '`clerkClient.__unstable_options` removed' +matcher: "\\.__unstable_options" +--- + +The `clerkClient.__unstable_options` property was removed. Previously, you could use it to update the internal options. Instead, create a new ` clerkClient` instance using `createClerkClient` and pass the options in this way. For example: + +```diff + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "old" }) + +- clerkClient.__unstable_options.secretKey = "new" ++ const newClerkClient = createClerkClient({ secretKey: "new" }) +``` diff --git a/packages/upgrade/source/versions/v5/backend/createemail-removed.md b/packages/upgrade/source/versions/v5/backend/createemail-removed.md new file mode 100644 index 00000000000..0dbdc27686e --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/createemail-removed.md @@ -0,0 +1,7 @@ +--- +title: '`createEmail` import removed' +matcher: "import\\s+{[\\s\\S]*?createEmail[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/backend['\"]" +matcherFlags: 'm' +--- + +The `createEmail` import has been removed. There is no replacement at this time because we need to rethink how `createEmail` behaves and align it with the newer `sendSms` method. If this is an issue for your implementation, please contact [Clerk support](https://clerk.com/contact). diff --git a/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-removed.md b/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-removed.md new file mode 100644 index 00000000000..df591f0ad4e --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-removed.md @@ -0,0 +1,13 @@ +--- +title: '`createIsomorphicRequest` import moved to `/internal`' +matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/(backend)['\"]" +replaceWithString: 'backend/internal' +matcherFlags: 'm' +--- + +The `createIsomorphicRequest` import was intended for those building custom Clerk integrations for frameworks and has been moved to `@clerk/backend/internal` to reflect this. Please use caution when using internal imports as they are outside the bounds of semver. + +```diff +- import { createIsomorphicRequest } from "@clerk/backend" ++ import { createIsomorphicRequest } from "@clerk/backend/internal" +``` diff --git a/packages/upgrade/source/versions/v5/backend/httpoptions-removed.md b/packages/upgrade/source/versions/v5/backend/httpoptions-removed.md new file mode 100644 index 00000000000..d2713546a03 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/httpoptions-removed.md @@ -0,0 +1,15 @@ +--- +title: '`httpOptions` parameter removed' +matcher: "\\([\\s\\S]*?httpOptions:\\s\\S]*?\\)" +matcherFlags: 'm' +--- + +The `httpOptions` parameter was removed from the internal `buildRequest` function but it is used by most public facing APIs. Hence you were able to pass `httpOptions` to some functions which is not possible anymore. If you're currently relying on this functionality and wish to update, please reach out to Clerk's support. + +The internal change looks like this: + +```diff +- const r = buildRequest({ httpsOptions: { headers: {} }}) ++ const request = buildRequest() ++ request({ headerParams: {} }) +``` diff --git a/packages/upgrade/source/versions/v5/backend/membershiprole.md b/packages/upgrade/source/versions/v5/backend/membershiprole.md new file mode 100644 index 00000000000..9fdb2cf408c --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/membershiprole.md @@ -0,0 +1,21 @@ +--- +title: '`MembershipRole` type replaced by `OrganizationCustomRoleKey` type' +matcher: "(?:\\.orgRole|\\.org_role)" +--- + +The `MembershipRole` type was replaced with `OrganizationCustomRoleKey` (related to [roles and permissions](https://clerk.com/docs/organizations/roles-permissions)). An example of where this type might be found: + +```js +import { useAuth } from '@clerk/clerk-react'; + +const { orgRole } = useAuth(); +``` + +To support the existing roles `admin`, `basic_member`, and `guest_member` apply interface merging using the following snippet: + +```js +interface ClerkAuthorization { + permission: '' + role: 'admin' | 'basic_member' | 'guest_member' +} +``` diff --git a/packages/upgrade/source/versions/v5/backend/signjwterror-import-move.md b/packages/upgrade/source/versions/v5/backend/signjwterror-import-move.md new file mode 100644 index 00000000000..5798afc16ce --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/signjwterror-import-move.md @@ -0,0 +1,13 @@ +--- +title: '`SignJWTError` import moved to `@clerk/backend/errors`' +matcher: "import\\s+{[\\s\\S]*?SignJWTError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' +replaceWithString: 'backend/errors' +--- + +The `SignJWTError` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { SignJWTError } from "@clerk/backend" ++ import { SignJWTError } from "@clerk/backend/errors" +``` diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerror-import-move.md b/packages/upgrade/source/versions/v5/backend/tokenverificationerror-import-move.md new file mode 100644 index 00000000000..30127e06e39 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/tokenverificationerror-import-move.md @@ -0,0 +1,13 @@ +--- +title: '`TokenVerificationError` import moved to `@clerk/backend/errors`' +matcher: "import\\s+{[\\s\\S]*?TokenVerificationError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' +replaceWithString: 'backend/errors' +--- + +The `TokenVerificationError` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { TokenVerificationError } from "@clerk/backend" ++ import { TokenVerificationError } from "@clerk/backend/errors" +``` diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerroraction-import-move.md b/packages/upgrade/source/versions/v5/backend/tokenverificationerroraction-import-move.md new file mode 100644 index 00000000000..747d6489d00 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/tokenverificationerroraction-import-move.md @@ -0,0 +1,13 @@ +--- +title: '`TokenVerificationErrorAction` import moved to `@clerk/backend/errors`' +matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorAction[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' +replaceWithString: 'backend/errors' +--- + +The `TokenVerificationErrorAction` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { TokenVerificationErrorAction } from "@clerk/backend" ++ import { TokenVerificationErrorAction } from "@clerk/backend/errors" +``` diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerrorcode-import-move.md b/packages/upgrade/source/versions/v5/backend/tokenverificationerrorcode-import-move.md new file mode 100644 index 00000000000..a0e096c4b61 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/tokenverificationerrorcode-import-move.md @@ -0,0 +1,13 @@ +--- +title: '`TokenVerificationErrorCode` import moved to `@clerk/backend/errors`' +matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorCode[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' +replaceWithString: 'backend/errors' +--- + +The `TokenVerificationErrorCode` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { TokenVerificationErrorCode } from "@clerk/backend" ++ import { TokenVerificationErrorCode } from "@clerk/backend/errors" +``` diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerrorreason-import-move.md b/packages/upgrade/source/versions/v5/backend/tokenverificationerrorreason-import-move.md new file mode 100644 index 00000000000..23e46f5baa8 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/tokenverificationerrorreason-import-move.md @@ -0,0 +1,13 @@ +--- +title: '`TokenVerificationErrorReason` import moved to `@clerk/backend/errors`' +matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorReason[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcherFlags: 'm' +replaceWithString: 'backend/errors' +--- + +The `TokenVerificationErrorReason` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { TokenVerificationErrorReason } from "@clerk/backend" ++ import { TokenVerificationErrorReason } from "@clerk/backend/errors" +``` diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index ae278e3dfda..07e51f9162a 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -307,6 +307,15 @@ export default { 'organizationmembershippublicuserdatajson-profileimageurl', 'clockskewinseconds', 'pkgversion', + 'client-unstableoptions-removed', + 'httpoptions-removed', + 'createisomorphicrequest-removed', + 'createemail-removed', + 'signjwterror-import-move', + 'tokenverificationerror-import-move', + 'tokenverificationerroraction-import-move', + 'tokenverificationerrorreason-import-move', + 'membershiprole', ]), }; From 74c26718e944c6f9cd119d8933c4e6a2211b4f9a Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Jan 2024 16:25:23 -0500 Subject: [PATCH 071/159] feat(upgrade): Fix the middleware thing --- .../v5/next/auth-middleware-deprecated.md | 47 +++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md b/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md index 719a3d1e8fb..47c461eabf4 100644 --- a/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md +++ b/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md @@ -1,10 +1,49 @@ --- title: '`authMiddleware` deprecated' -matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/nextjs.*?['\"]" +matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' +warning: true --- -`authMiddleware` is now deprecated, and we recommend instead using `clerkMiddleware`. Here’s how code could look before and after migration: +The [`authMiddleware`](https://clerk.com/docs/references/nextjs/auth-middleware) API from `@clerk/nextjs` has been marked as deprecated. We highly recommend using [`clerkMiddleware`](https://clerk.com/docs/references/nextjs/clerk-middleware) going forward. `clerkMiddleware` protects no routes by default and you need to add your individual routes you want to opt into protection. Here's an example of having all routes public except for everything under `/dashboard`. -```js -// TODO +For more documentation on the new `clerkMiddleware` function, check out [our official docs](https://clerk.com/docs/references/nextjs/clerk-middleware)! + +**Before:** + +```ts +// middleware.ts + +import { authMiddleware } from '@clerk/nextjs'; + +export default authMiddleware({ + publicRoutes: req => !req.url.includes('/dashboard'), +}); + +export const config = { + matcher: ['/((?!.+\\.[\\w]+$|_next)._)', '/', '/(api|trpc)(._)'], +}; +``` + +**After:** + +```ts +// middleware.ts + +import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'; +import { NextResponse } from 'next/server'; + +const isProtectedRoute = createRouteMatcher(['/dashboard(.*)']); + +export default clerkMiddleware((auth, request) => { + if (isProtectedRoute(request)) { + auth().protect(); + } + + return NextResponse.next(); +}); + +export const config = { + matcher: ['/((?!.+\\.[\\w]+$|_next)._)', '/', '/(api|trpc)(._)'], +}; ``` From 0b4c0b54f14c2eaf29e1980b3b4e8ba0650b10c0 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Jan 2024 16:49:53 -0500 Subject: [PATCH 072/159] feat(upgrade): Add router navigate and backend return signature changes --- .../v5/backend/return-signature-change.md | 14 ++++++++++++++ packages/upgrade/source/versions/v5/index.js | 2 ++ .../versions/v5/react/router-navigate.md | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/backend/return-signature-change.md create mode 100644 packages/upgrade/source/versions/v5/react/router-navigate.md diff --git a/packages/upgrade/source/versions/v5/backend/return-signature-change.md b/packages/upgrade/source/versions/v5/backend/return-signature-change.md new file mode 100644 index 00000000000..6715af753d1 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/return-signature-change.md @@ -0,0 +1,14 @@ +--- +title: 'Return signature changed for all clerk backend requests' +matcher: "import\\s+{[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/backend['\"]" +warning: true +--- + +The response payload of every backend API request was changed as part of the v5 release. Rather than directly returning ` data``, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.organizations.getOrganizationList() ++ const { data, totalCount } = await clerkClient.organizations.getOrganizationList() +``` diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 07e51f9162a..4739daab7c0 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -46,6 +46,7 @@ const reactChangesList = [ 'new-localization-keys', 'removed-localization-keys', 'changed-localization-keys', + 'router-navigate', ]; export default { @@ -316,6 +317,7 @@ export default { 'tokenverificationerroraction-import-move', 'tokenverificationerrorreason-import-move', 'membershiprole', + 'return-signature-change', ]), }; diff --git a/packages/upgrade/source/versions/v5/react/router-navigate.md b/packages/upgrade/source/versions/v5/react/router-navigate.md new file mode 100644 index 00000000000..9bd8b4313fc --- /dev/null +++ b/packages/upgrade/source/versions/v5/react/router-navigate.md @@ -0,0 +1,18 @@ +--- +title: '`navigate` prop to `ClerkProvider` replaced by `routerPush` and `routerReplace`' +matcher: "" +matcherFlags: 'm' +--- + +The `navigate` prop on ClerkProvider allowed developers to override the default navigation behavior with a custom function. However, navigate was only able to push, not replace routes. We have now added the capability for the router to push or replace, and as such, upgraded the provider prop so that it can handle either depending on the circumstance. + +Two new props have been added to `ClerkProvider` that replace the single `navigate` prop, and can be used to override the default navigation behavior for either a push or replace navigation. For more information on what push and replace mean in relation to the browser history api, [check out these wonderful MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/History_API/Working_with_the_History_API). + +If you’d like to keep the same behavior as you had with the single `navigate` prop, pass the exact same function to both `routerPush` and `routerReplace` and the behavior will be identical. For example: + +```diff +- x } /> ++ x } routerReplace={ x => x } /> +``` + +However, you now have the option to differentiate behavior based on whether the navigation will be a push or replace. From a098d9ce433d0baf99db6614a559547a2b00e895 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 19 Jan 2024 13:58:54 -0500 Subject: [PATCH 073/159] feat(upgrade): Add signoutcallback to redirecturl change --- .../common/signoutcallback-to-redirecturl.md | 22 +++++++++++++++++++ packages/upgrade/source/versions/v5/index.js | 5 +++++ 2 files changed, 27 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/common/signoutcallback-to-redirecturl.md diff --git a/packages/upgrade/source/versions/v5/common/signoutcallback-to-redirecturl.md b/packages/upgrade/source/versions/v5/common/signoutcallback-to-redirecturl.md new file mode 100644 index 00000000000..f191fe95b29 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/signoutcallback-to-redirecturl.md @@ -0,0 +1,22 @@ +--- +title: 'Replace `signOutCallback` prop on `SignOutButton` with `redirectUrl`' +matcher: "" +matcherFlags: 'm' +--- + +The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: + +```diff + import { SignOutButton } from "@clerk/clerk-react"; + + export const Signout = () => { + return ( + { window.location.href = "/your-path" }} ++ redirectUrl="/your-path" + > + + + ) + } +``` diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 4739daab7c0..72d9ea661c2 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -47,6 +47,7 @@ const reactChangesList = [ 'removed-localization-keys', 'changed-localization-keys', 'router-navigate', + 'signoutcallback-to-redirecturl', ]; export default { @@ -125,6 +126,7 @@ export default { 'new-localization-keys', 'removed-localization-keys', 'changed-localization-keys', + 'signoutcallback-to-redirecturl', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -162,6 +164,7 @@ export default { 'new-localization-keys', 'removed-localization-keys', 'changed-localization-keys', + 'signoutcallback-to-redirecturl', ]), expo: load('expo', [ 'apikey-to-publishable-key', @@ -187,6 +190,7 @@ export default { 'new-localization-keys', 'removed-localization-keys', 'changed-localization-keys', + 'signoutcallback-to-redirecturl', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -269,6 +273,7 @@ export default { 'new-localization-keys', 'removed-localization-keys', 'changed-localization-keys', + 'signoutcallback-to-redirecturl', ]), shared: load('shared', [ 'magiclinkerror', From d753818a9e18fe29582035672fe100f63f89510c Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 19 Jan 2024 14:05:35 -0500 Subject: [PATCH 074/159] feat(upgrade): Modify return signature change in backend to scope to the 3 methods it impacts --- ...torganizationinvitationlist-return-signature.md | 14 ++++++++++++++ .../getorganizationlist-return-signature.md | 14 ++++++++++++++ ...torganizationmembershiplist-return-signature.md | 14 ++++++++++++++ .../versions/v5/backend/return-signature-change.md | 14 -------------- packages/upgrade/source/versions/v5/index.js | 4 +++- 5 files changed, 45 insertions(+), 15 deletions(-) create mode 100644 packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-signature.md create mode 100644 packages/upgrade/source/versions/v5/backend/getorganizationlist-return-signature.md create mode 100644 packages/upgrade/source/versions/v5/backend/getorganizationmembershiplist-return-signature.md delete mode 100644 packages/upgrade/source/versions/v5/backend/return-signature-change.md diff --git a/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-signature.md b/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-signature.md new file mode 100644 index 00000000000..8325fa3b601 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-signature.md @@ -0,0 +1,14 @@ +--- +title: '`Users.getOrganizationInvitationList` return signature changed' +matcher: "\\.users\\.getOrganizationInvitationList\\(" +warning: true +--- + +The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.users.getOrganizationInvitationList() ++ const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList() +``` diff --git a/packages/upgrade/source/versions/v5/backend/getorganizationlist-return-signature.md b/packages/upgrade/source/versions/v5/backend/getorganizationlist-return-signature.md new file mode 100644 index 00000000000..0bdcdf5513f --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/getorganizationlist-return-signature.md @@ -0,0 +1,14 @@ +--- +title: '`Users.getOrganizationList` return signature changed' +matcher: "\\.users\\.getOrganizationList\\(" +warning: true +--- + +The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.users.getOrganizationList() ++ const { data, totalCount } = await clerkClient.users.getOrganizationList() +``` diff --git a/packages/upgrade/source/versions/v5/backend/getorganizationmembershiplist-return-signature.md b/packages/upgrade/source/versions/v5/backend/getorganizationmembershiplist-return-signature.md new file mode 100644 index 00000000000..3a915547214 --- /dev/null +++ b/packages/upgrade/source/versions/v5/backend/getorganizationmembershiplist-return-signature.md @@ -0,0 +1,14 @@ +--- +title: '`Users.getOrganizationMembershipList` return signature changed' +matcher: "\\.users\\.getOrganizationMembershipList\\(" +warning: true +--- + +The response payload of `Users.getOrganizationMembershipList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.users.getOrganizationMembershipList() ++ const { data, totalCount } = await clerkClient.users.getOrganizationMembershipList() +``` diff --git a/packages/upgrade/source/versions/v5/backend/return-signature-change.md b/packages/upgrade/source/versions/v5/backend/return-signature-change.md deleted file mode 100644 index 6715af753d1..00000000000 --- a/packages/upgrade/source/versions/v5/backend/return-signature-change.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: 'Return signature changed for all clerk backend requests' -matcher: "import\\s+{[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/backend['\"]" -warning: true ---- - -The response payload of every backend API request was changed as part of the v5 release. Rather than directly returning ` data``, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - -Here's an example of how the response shape would change with this modification: - -```diff -- const data = await clerkClient.organizations.getOrganizationList() -+ const { data, totalCount } = await clerkClient.organizations.getOrganizationList() -``` diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 72d9ea661c2..9e27bb757de 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -322,7 +322,9 @@ export default { 'tokenverificationerroraction-import-move', 'tokenverificationerrorreason-import-move', 'membershiprole', - 'return-signature-change', + 'getorganizationmembershiplist-return-signature', + 'getorganizationlist-return-signature', + 'getorganizationinvitationlist-return-signature', ]), }; From 97f9e5d38d281f718cd47516c5eb240448811978 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 19 Jan 2024 14:09:31 -0500 Subject: [PATCH 075/159] feat(upgrade): Remove buildrequesturl and getrequesturl entirely --- .../versions/v5/backend/buildrequesturl-removed.md | 12 +++--------- packages/upgrade/source/versions/v5/index.js | 2 +- .../source/versions/v5/shared/buildrequesturl.md | 12 ------------ .../source/versions/v5/shared/getrequesturl.md | 6 ++++++ 4 files changed, 10 insertions(+), 22 deletions(-) delete mode 100644 packages/upgrade/source/versions/v5/shared/buildrequesturl.md create mode 100644 packages/upgrade/source/versions/v5/shared/getrequesturl.md diff --git a/packages/upgrade/source/versions/v5/backend/buildrequesturl-removed.md b/packages/upgrade/source/versions/v5/backend/buildrequesturl-removed.md index 81e6de2f66b..3eb12f126d6 100644 --- a/packages/upgrade/source/versions/v5/backend/buildrequesturl-removed.md +++ b/packages/upgrade/source/versions/v5/backend/buildrequesturl-removed.md @@ -1,13 +1,7 @@ --- -title: '`buildRequestUrl` import moved to `/internal`' -matcher: "import\\s+{[\\s\\S]*?buildRequestUrl[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/(backend)['\"]" -replaceWithString: 'backend/internal' +title: '`buildRequestUrl` import removed' +matcher: "import\\s+{[\\s\\S]*?buildRequestUrl[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/backend['\"]" matcherFlags: 'm' --- -The `buildRequestUrl` import was intended for those building custom Clerk integrations for frameworks and has been moved to `@clerk/backend/internal` to reflect this. Please use caution when using internal imports as they are outside the bounds of semver. - -```diff -- import { buildRequestUrl } from "@clerk/backend" -+ import { buildRequestUrl } from "@clerk/backend/internal" -``` +The `buildRequestUrl` import was intended for those building custom Clerk integrations for frameworks and has been removed in favor of other methods internally. If you were relying on this function and this is an issue, please [reach out to Clerk support](https://clerk.com/support). diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 9e27bb757de..69c178e0f8c 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -280,7 +280,7 @@ export default { 'ismagiclinkerror', 'magiclinkerrorcode', 'usemagiclink', - 'buildrequesturl', + 'getrequesturl', 'organizationcontext', 'useorganizationlist-organizationlist', // shared outside this pkg? ]), diff --git a/packages/upgrade/source/versions/v5/shared/buildrequesturl.md b/packages/upgrade/source/versions/v5/shared/buildrequesturl.md deleted file mode 100644 index 72e26dd0e3c..00000000000 --- a/packages/upgrade/source/versions/v5/shared/buildrequesturl.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: '`getRequestUrl` -> `buildRequestUrl` from `@clerk/backend/internal`' -matcher: "getRequestUrl\\(" ---- - -```diff -- import { getRequestUrl } from '@clerk/shared/proxy'; -+ import { buildRequestUrl } from '@clerk/backend/internal'; - -- const url = getRequestUrl(req, '/your/path'); -+ const url = buildRequestUrl(/* ??? */); -``` diff --git a/packages/upgrade/source/versions/v5/shared/getrequesturl.md b/packages/upgrade/source/versions/v5/shared/getrequesturl.md new file mode 100644 index 00000000000..c9e75e23694 --- /dev/null +++ b/packages/upgrade/source/versions/v5/shared/getrequesturl.md @@ -0,0 +1,6 @@ +--- +title: '`getRequestUrl` removed' +matcher: "\\.getRequestUrl\\(" +--- + +The `getRequestUrl` import was intended for those building custom Clerk integrations for frameworks and has been removed in favor of other methods internally. If you were relying on this function and this is an issue, please [reach out to Clerk support](https://clerk.com/support). From b5d3e70d41a86c35448673d5c153a01a58048784 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 19 Jan 2024 15:51:37 -0500 Subject: [PATCH 076/159] fix(upgrade): Add yolo flag to run all SDKs, fix a couple very odd bugs, fix a bunch of fm values --- packages/upgrade/source/app.js | 8 +++++- packages/upgrade/source/cli.js | 2 ++ packages/upgrade/source/scan.js | 8 ++++++ .../versions/v5/backend/clockskewinseconds.md | 6 ++--- ...md => aftersigninurl-behavior-change-2.md} | 0 .../v5/common/afterswitchorganizationurl.md | 3 ++- .../v5/common/alternativemethods-backlink.md | 1 + ...ationlistcreateorganizationactionbutton.md | 1 + .../source/versions/v5/common/card-changes.md | 1 + .../v5/common/changed-localization-keys.md | 1 + ...dapi.md => clerkprovider-frontendapi-2.md} | 0 .../emaillinkerrorcode-import-change.md | 1 + .../isclerkapiresponserror-import-change.md | 1 + .../common/isemaillinkerror-import-change.md | 1 + .../v5/common/isknownerror-import-change.md | 1 + .../common/ismetamaskerror-import-change.md | 1 + .../source/versions/v5/common/mfa-dropdown.md | 1 + .../multisessionappsupport-import-change.md | 1 + .../v5/common/new-localization-keys.md | 1 + ...switcherpopoveractionbuttontext-removed.md | 1 + .../common/remove-identitypreview-avatar.md | 1 + .../remove-socialbuttonsblockbuttonarrow.md | 1 + .../v5/common/removed-localization-keys.md | 1 + .../common/useorganization-invitationlist.md | 2 +- .../common/useorganization-membershiplist.md | 3 ++- ...erbuttonpopoveractionbuttontext-removed.md | 1 + .../userbuttontrigger-userbuttonbox-invert.md | 1 + .../versions/v5/common/userprofile-prop.md | 3 ++- .../v5/common/withclerk-hof-removed.md | 1 + .../versions/v5/common/withclerk-removed.md | 1 + .../v5/common/withsession-hof-removed.md | 1 + .../versions/v5/common/withsession-removed.md | 1 + .../v5/common/withuser-hof-removed.md | 1 + ...huser-removed.md => withuser-removed-2.md} | 5 +++- packages/upgrade/source/versions/v5/index.js | 25 ++++++++++--------- .../versions/v5/next/api-url-value-change.md | 1 + .../versions/v5/next/auth-import-change.md | 1 + .../v5/next/authmiddleware-import-change.md | 1 + .../v5/next/buildclerkprops-import-change.md | 1 + .../versions/v5/next/clerk-import-change.md | 1 + .../v5/next/constants-import-change.md | 1 + ...createauthenticaterequest-import-change.md | 1 + .../createisomorphicrequest-import-change.md | 1 + .../v5/next/currentuser-import-change.md | 1 + .../v5/next/decodejwt-import-change.md | 1 + .../next/emaillinkerrorcode-import-change.md | 1 + .../versions/v5/next/import-sign-up-url.md | 1 + .../isclerkapiresponserror-import-change.md | 1 + .../v5/next/isemaillinkerror-import-change.md | 1 + .../v5/next/isknownerror-import-change.md | 1 + .../v5/next/ismetamaskerror-import-change.md | 1 + .../multisessionappsupport-import-change.md | 1 + .../v5/next/redirect-import-change.md | 1 + .../versions/v5/next/signjwt-import-change.md | 1 + .../v5/next/verifyjwt-import-change.md | 1 + .../v5/next/verifytoken-import-change.md | 1 + 56 files changed, 88 insertions(+), 21 deletions(-) rename packages/upgrade/source/versions/v5/common/{aftersigninurl-behavior-change.md => aftersigninurl-behavior-change-2.md} (100%) rename packages/upgrade/source/versions/v5/common/{clerkprovider-frontendapi.md => clerkprovider-frontendapi-2.md} (100%) rename packages/upgrade/source/versions/v5/common/{withuser-removed.md => withuser-removed-2.md} (69%) diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index 0b11f094285..45a2e755f89 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -9,7 +9,8 @@ import getClerkMajorVersion from './util/get-clerk-version.js'; import Gradient from 'ink-gradient'; import BigText from 'ink-big-text'; -export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ignore = [] }) { +export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ignore = [], _yolo = false }) { + const [yolo, setYolo] = useState(_yolo); const [sdks, setSdks] = useState(_sdk ? [_sdk] : []); const [sdkGuesses, setSdkGuesses] = useState([]); const [sdkGuessConfirmed, setSdkGuessConfirmed] = useState(false); @@ -23,6 +24,11 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign const [configVerified, setConfigVerified] = useState(false); let fromVersionGuess = false; + if (yolo) { + setSdks(SDKS.map(s => s.value)); + setYolo(false); + } + // We try to guess which SDK they are using if (isEmpty(sdks) && isEmpty(sdkGuesses) && !sdkGuessAttempted) { if (!dir) return setDir(process.cwd()); diff --git a/packages/upgrade/source/cli.js b/packages/upgrade/source/cli.js index e0d1707765f..9afa2d8ef45 100644 --- a/packages/upgrade/source/cli.js +++ b/packages/upgrade/source/cli.js @@ -29,6 +29,7 @@ const cli = meow( sdk: { type: 'string', choices: sdks.map(i => i.value) }, dir: { type: 'string' }, ignore: { type: 'string', isMultiple: true }, + yolo: { type: 'boolean' }, }, }, ); @@ -39,5 +40,6 @@ render( _toVersion={cli.flags.to} _sdk={cli.flags.sdk} _dir={cli.flags.dir} + _yolo={cli.flags.yolo} />, ); diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index 5c96c8511ab..ec09df03bf3 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -97,6 +97,14 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { if (!allResults[matcherConfig.title]) allResults[matcherConfig.title] = { instances: [], ...matcherConfig }; + try { + indexToPosition(content, match.index, { oneBased: true }); + } catch (err) { + console.log(matcherConfig); + console.log(file); + console.log(content.length, match.index); + } + allResults[matcherConfig.title].instances.push({ sdk, file: path.relative(process.cwd(), file), diff --git a/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md b/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md index 8eecea6ab33..c4de869a87e 100644 --- a/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md +++ b/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md @@ -1,9 +1,9 @@ --- title: '`clockSkewInSeconds` -> `clockSkewInMs`' matcher: - - "verifyJwt\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?)" - - "verifyToken\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?)" - - "authenticateRequest\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?)" + - "verifyJwt\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?\\)" + - "verifyToken\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?\\)" + - "authenticateRequest\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?\\)" matcherFlags: 'm' replaceWithString: 'clockSkewInMs' --- diff --git a/packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change.md b/packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change-2.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change.md rename to packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change-2.md diff --git a/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md b/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md index ab2e1a27fe1..02560dfcebe 100644 --- a/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md +++ b/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md @@ -1,6 +1,7 @@ --- title: '`afterSwitchOrganizationUrl` -> `afterSelectOrganizationUrl` in `OrganizationSwitcher`' -matcher: '' +matcher: "" +matcherFlags: 'm' replaceWithString: 'afterSelectOrganizationUrl' --- diff --git a/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md b/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md index 8d26d306324..bb8ce2add76 100644 --- a/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md +++ b/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md @@ -1,6 +1,7 @@ --- title: 'Back button customization ids change on alternative 2fa methods page' image: true +matcherFlags: 'm' matcher: - "\\.cl-headerBackIcon" - "\\.cl-headerBackRow" diff --git a/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md b/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md index a623589355b..1fb3381f0c7 100644 --- a/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md +++ b/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md @@ -2,6 +2,7 @@ title: '`button` -> `organizationListCreateOrganizationActionButton` customization id' image: true replaceWithString: 'organizationListCreateOrganizationActionButton' +matcherFlags: 'm' matcher: - "\\.cl-(button)" - "elements:\\s+{[\\s\\S]*?(button):[\\s\\S]*?}" diff --git a/packages/upgrade/source/versions/v5/common/card-changes.md b/packages/upgrade/source/versions/v5/common/card-changes.md index 917e1f676fa..b4539c2be51 100644 --- a/packages/upgrade/source/versions/v5/common/card-changes.md +++ b/packages/upgrade/source/versions/v5/common/card-changes.md @@ -1,6 +1,7 @@ --- title: 'Changes to the `card` customization id' warning: true +matcherFlags: 'm' matcher: - "\\.cl-card" - "elements:\\s+{[\\s\\S]*?card:[\\s\\S]*?}" diff --git a/packages/upgrade/source/versions/v5/common/changed-localization-keys.md b/packages/upgrade/source/versions/v5/common/changed-localization-keys.md index 9db6362aadc..278f16577db 100644 --- a/packages/upgrade/source/versions/v5/common/changed-localization-keys.md +++ b/packages/upgrade/source/versions/v5/common/changed-localization-keys.md @@ -1,5 +1,6 @@ --- title: 'Localization keys changed' +matcherFlags: 'm' matcher: - 'formFieldLabel__organizationName:' - 'formFieldLabel__organizationSlug:' diff --git a/packages/upgrade/source/versions/v5/common/clerkprovider-frontendapi.md b/packages/upgrade/source/versions/v5/common/clerkprovider-frontendapi-2.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/clerkprovider-frontendapi.md rename to packages/upgrade/source/versions/v5/common/clerkprovider-frontendapi-2.md diff --git a/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md index 6303912c95f..acf569d57a8 100644 --- a/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md +++ b/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md @@ -1,6 +1,7 @@ --- title: '`EmailLinkErrorCode` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'clerk-react/errors' --- diff --git a/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md index e71cb81ee34..9e18ca0f9a0 100644 --- a/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md +++ b/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md @@ -1,6 +1,7 @@ --- title: '`isClerkAPIResponseError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'clerk-react/errors' --- diff --git a/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md index d2caf13e84a..0089b4bfac6 100644 --- a/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md +++ b/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md @@ -1,6 +1,7 @@ --- title: '`isEmailLinkError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'clerk-react/errors' --- diff --git a/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md b/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md index 5440c9938a9..64be448f30f 100644 --- a/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md +++ b/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md @@ -1,6 +1,7 @@ --- title: '`isKnownError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'clerk-react/errors' --- diff --git a/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md index d38cd1c7700..440a15e1677 100644 --- a/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md +++ b/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md @@ -1,6 +1,7 @@ --- title: '`isMetamaskError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/errors' --- diff --git a/packages/upgrade/source/versions/v5/common/mfa-dropdown.md b/packages/upgrade/source/versions/v5/common/mfa-dropdown.md index e77e022de15..53931f31533 100644 --- a/packages/upgrade/source/versions/v5/common/mfa-dropdown.md +++ b/packages/upgrade/source/versions/v5/common/mfa-dropdown.md @@ -1,6 +1,7 @@ --- title: 'Within ``, Multi-Factor Auth is Added via Dropdown' matcher: '(?:" +matcherFlags: 'm' warning: true --- diff --git a/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md b/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md index 8c15a9e1772..a7bc00cfc7c 100644 --- a/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md +++ b/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md @@ -1,6 +1,7 @@ --- title: '`organizationSwitcherPopoverActionButtonText` customization id removed' image: true +matcherFlags: 'm' matcher: - "\\.cl-organizationSwitcherPopoverActionButtonText" - "\\.cl-organizationSwitcherPopoverActionButtonText__manageOrganization" diff --git a/packages/upgrade/source/versions/v5/common/remove-identitypreview-avatar.md b/packages/upgrade/source/versions/v5/common/remove-identitypreview-avatar.md index e47847b1cd4..366053bcf52 100644 --- a/packages/upgrade/source/versions/v5/common/remove-identitypreview-avatar.md +++ b/packages/upgrade/source/versions/v5/common/remove-identitypreview-avatar.md @@ -1,6 +1,7 @@ --- title: 'Identity preview avatar customization ids removed' image: true +matcherFlags: 'm' matcher: - "\\.cl-identityPreviewAvatarBox" - "\\.cl-identityPreviewAvatarImage" diff --git a/packages/upgrade/source/versions/v5/common/remove-socialbuttonsblockbuttonarrow.md b/packages/upgrade/source/versions/v5/common/remove-socialbuttonsblockbuttonarrow.md index 62b80f2166c..07d7539dab5 100644 --- a/packages/upgrade/source/versions/v5/common/remove-socialbuttonsblockbuttonarrow.md +++ b/packages/upgrade/source/versions/v5/common/remove-socialbuttonsblockbuttonarrow.md @@ -1,6 +1,7 @@ --- title: '`socialButtonsBlockButtonArrow` customization id removed' image: true +matcherFlags: 'm' matcher: - "\\.cl-socialButtonsBlockButtonArrow" - "elements:\\s+{[\\s\\S]*?socialButtonsBlockButtonArrow:[\\s\\S]*?}" diff --git a/packages/upgrade/source/versions/v5/common/removed-localization-keys.md b/packages/upgrade/source/versions/v5/common/removed-localization-keys.md index 07154c4aed3..1d63060a79b 100644 --- a/packages/upgrade/source/versions/v5/common/removed-localization-keys.md +++ b/packages/upgrade/source/versions/v5/common/removed-localization-keys.md @@ -1,5 +1,6 @@ --- title: 'Removed localization keys' +matcherFlags: 'm' matcher: - "signIn:\\s+{[\\s\\S]*?forgotPassword:\\s+{[\\s\\S]*?title_email:" - "signIn:\\s+{[\\s\\S]*?forgotPassword:\\s+{[\\s\\S]*?title_phone:" diff --git a/packages/upgrade/source/versions/v5/common/useorganization-invitationlist.md b/packages/upgrade/source/versions/v5/common/useorganization-invitationlist.md index c60ba2e74cd..6623420a7c8 100644 --- a/packages/upgrade/source/versions/v5/common/useorganization-invitationlist.md +++ b/packages/upgrade/source/versions/v5/common/useorganization-invitationlist.md @@ -1,6 +1,6 @@ --- title: '`invitationList` -> `invitations` as param to `useOrganizations`' -matcher: "useOrganizations\\(\\s*{\\.*?invitationList:" +matcher: "useOrganizations\\(\\s*{[\\s\\S]*?invitationList:" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/useorganization-membershiplist.md b/packages/upgrade/source/versions/v5/common/useorganization-membershiplist.md index bf216afe9f0..1c127f96264 100644 --- a/packages/upgrade/source/versions/v5/common/useorganization-membershiplist.md +++ b/packages/upgrade/source/versions/v5/common/useorganization-membershiplist.md @@ -1,6 +1,7 @@ --- title: '`membershipList` -> `members` as param to `useOrganization`' -matcher: "useOrganizations\\(\\s*{\\.*?membershipList:" +matcher: "useOrganizations\\(\\s*{[\\s\\S]*?membershipList:" +matcherFlags: 'm' --- The `membershipList` param from the `useOrganization` hook has been removed. Instead, [use the `memberships` param](https://clerk.com/docs/references/react/use-organization#parameters). Examples of each can be seen here: diff --git a/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md b/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md index b7dd56f1a02..79c9abd798b 100644 --- a/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md +++ b/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md @@ -8,6 +8,7 @@ matcher: - "elements:\\s+{[\\s\\S]*?userButtonPopoverActionButtonText:[\\s\\S]*?}" - "elements:\\s+{[\\s\\S]*?userButtonPopoverActionButtonText__signOut:[\\s\\S]*?}" - "elements:\\s+{[\\s\\S]*?userButtonPopoverActionButtonText__manageAccount:[\\s\\S]*?}" +matcherFlags: 'm' --- The `userButtonPopoverActionButtonText` customization id has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. The nested ids `userButtonPopoverActionButtonText__signOut` and `userButtonPopoverActionButtonText__manageAccount` have also been removed. Any styling that needs to apply to the text can be applied to its direct parent `cl-userButtonPopoverActionButton`. diff --git a/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md b/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md index ae3b131e519..f36fe08024e 100644 --- a/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md +++ b/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md @@ -6,6 +6,7 @@ matcher: - "\\.cl-userButtonBox" - "elements:\\s+{[\\s\\S]*?userButtonTrigger:[\\s\\S]*?}" - "elements:\\s+{[\\s\\S]*?userButtonBox:[\\s\\S]*?}" +matcherFlags: 'm' --- We have swapped the parent-child relationship of the two elements `userButtonTrigger` and `userButtonBox`. Previously, `userButtonTrigger` was nested inside of `userButtonBox`, and now `userButtonBox` is nested inside of `userButtonTrigger`. This change resolves [some usability issues](https://github.com/clerk/javascript/issues/1625) in `. If you are applying style customization to either of these elements, your customizations may need to be adjusted. diff --git a/packages/upgrade/source/versions/v5/common/userprofile-prop.md b/packages/upgrade/source/versions/v5/common/userprofile-prop.md index 6097deda8d4..08985f014f4 100644 --- a/packages/upgrade/source/versions/v5/common/userprofile-prop.md +++ b/packages/upgrade/source/versions/v5/common/userprofile-prop.md @@ -1,6 +1,7 @@ --- title: '`userProfile` -> `userProfileProps` for `UserButton`' -matcher: '' +matcher: "" +matcherFlags: 'm' replaceWithString: 'userProfileProps' --- diff --git a/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md b/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md index 24212a27790..6e4dd3e193e 100644 --- a/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md +++ b/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md @@ -1,6 +1,7 @@ --- title: '`withClerk` function removed' matcher: "import\\s+{[\\s\\S]*?withClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcherFlags: 'm' --- The `withClerk` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: diff --git a/packages/upgrade/source/versions/v5/common/withclerk-removed.md b/packages/upgrade/source/versions/v5/common/withclerk-removed.md index ae532011604..b5b24ff1792 100644 --- a/packages/upgrade/source/versions/v5/common/withclerk-removed.md +++ b/packages/upgrade/source/versions/v5/common/withclerk-removed.md @@ -1,6 +1,7 @@ --- title: '`WithClerk` component removed' matcher: "import\\s+{[\\s\\S]*?WithClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcherFlags: 'm' --- The `WithClerk` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: diff --git a/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md b/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md index 465ce465e82..9ab61237089 100644 --- a/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md +++ b/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md @@ -1,6 +1,7 @@ --- title: '`withSession` function removed' matcher: "import\\s+{[\\s\\S]*?withSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcherFlags: 'm' --- The `withSession` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: diff --git a/packages/upgrade/source/versions/v5/common/withsession-removed.md b/packages/upgrade/source/versions/v5/common/withsession-removed.md index e497e2cf264..c5b3aaafa4d 100644 --- a/packages/upgrade/source/versions/v5/common/withsession-removed.md +++ b/packages/upgrade/source/versions/v5/common/withsession-removed.md @@ -1,6 +1,7 @@ --- title: '`WithSession` component removed' matcher: "import\\s+{[\\s\\S]*?WithSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcherFlags: 'm' --- The `WithSession` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: diff --git a/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md b/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md index 8d34852151d..d3ad1a9d33b 100644 --- a/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md +++ b/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md @@ -1,6 +1,7 @@ --- title: '`withUser` function removed' matcher: "import\\s+{[\\s\\S]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcherFlags: 'm' --- The `withUser` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: diff --git a/packages/upgrade/source/versions/v5/common/withuser-removed.md b/packages/upgrade/source/versions/v5/common/withuser-removed-2.md similarity index 69% rename from packages/upgrade/source/versions/v5/common/withuser-removed.md rename to packages/upgrade/source/versions/v5/common/withuser-removed-2.md index 64cb3fc7ca2..1afa19709b8 100644 --- a/packages/upgrade/source/versions/v5/common/withuser-removed.md +++ b/packages/upgrade/source/versions/v5/common/withuser-removed-2.md @@ -1,8 +1,11 @@ --- title: '`WithUser` component removed' -matcher: "import\\s+{[\\s\\S]*?WithUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcherFlags: 'm' --- + + The `WithUser` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: ```js diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 69c178e0f8c..1076e348bd5 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -11,7 +11,7 @@ const reactChangesList = [ 'ismagiclinkerror', 'magiclinkerror', 'handlemagiclinkverification', - 'clerkprovider-frontendapi', + 'clerkprovider-frontendapi-2', 'setsession', 'navigate-to-routerpush-routerreplace', 'afterswitchorganizationurl', @@ -34,19 +34,18 @@ const reactChangesList = [ 'remove-identitypreview-avatar', 'withsession-removed', 'withclerk-removed', - 'withuser-removed', + 'withuser-removed-2', 'withclerk-hof-removed', 'withsession-hof-removed', 'withuser-hof-removed', 'multisessionappsupport-import-change', 'clerkprovideroptionswrapper-dropped', 'aftersignouturl-behavior-change', - 'aftersigninurl-behavior-change', + 'aftersigninurl-behavior-change-2', 'aftersignupurl-behavior-change', 'new-localization-keys', 'removed-localization-keys', 'changed-localization-keys', - 'router-navigate', 'signoutcallback-to-redirecturl', ]; @@ -62,7 +61,7 @@ export default { 'createclerkclient-apikey', 'createclerkclient-frontendapi', 'getauth-apikey', - 'clerkprovider-frontendapi', + 'clerkprovider-frontendapi-2', 'import-nextjs-app-beta', 'import-nextjs-ssr', 'import-nextjs-edge-middleware', @@ -115,13 +114,13 @@ export default { 'ismetamaskerror-import-change', 'withsession-removed', 'withclerk-removed', - 'withuser-removed', + 'withuser-removed-2', 'withclerk-hof-removed', 'withsession-hof-removed', 'withuser-hof-removed', 'next-public-clerk-js-url', 'aftersignouturl-behavior-change', - 'aftersigninurl-behavior-change', + 'aftersigninurl-behavior-change-2', 'aftersignupurl-behavior-change', 'new-localization-keys', 'removed-localization-keys', @@ -150,7 +149,7 @@ export default { 'createclerkclient-apikey', 'rootauthloader-apikey', 'getauth-apikey', - 'clerkprovider-frontendapi', + 'clerkprovider-frontendapi-2', 'rootauthloader-frontendapi', 'frontend-api-to-publishable-key', 'api-key-to-secret-key', @@ -159,7 +158,7 @@ export default { 'usemagiclink', 'setsession', 'aftersignouturl-behavior-change', - 'aftersigninurl-behavior-change', + 'aftersigninurl-behavior-change-2', 'aftersignupurl-behavior-change', 'new-localization-keys', 'removed-localization-keys', @@ -185,7 +184,7 @@ export default { 'remove-socialbuttonsblockbuttonarrow', 'remove-identitypreview-avatar', 'aftersignouturl-behavior-change', - 'aftersigninurl-behavior-change', + 'aftersigninurl-behavior-change-2', 'aftersignupurl-behavior-change', 'new-localization-keys', 'removed-localization-keys', @@ -267,7 +266,7 @@ export default { 'user-getorganizationsuggestions-arguments-chanaged', 'user-getorganizationmemberships-arguments-chanaged', 'aftersignouturl-behavior-change', - 'aftersigninurl-behavior-change', + 'aftersigninurl-behavior-change-2', 'aftersignupurl-behavior-change', 'clerk-isready-removed', 'new-localization-keys', @@ -290,7 +289,6 @@ export default { 'removed-localization-keys', 'changed-localization-keys', ]), - types: [], backend: load('backend', [ 'api-url-value-changed', 'verifyjwt-import-path-move', @@ -326,6 +324,9 @@ export default { 'getorganizationlist-return-signature', 'getorganizationinvitationlist-return-signature', ]), + types: [], + redwood: [], + express: [], }; function dedupeMerge(arr1, arr2) { diff --git a/packages/upgrade/source/versions/v5/next/api-url-value-change.md b/packages/upgrade/source/versions/v5/next/api-url-value-change.md index f9444ae18c2..ddac88159b3 100644 --- a/packages/upgrade/source/versions/v5/next/api-url-value-change.md +++ b/packages/upgrade/source/versions/v5/next/api-url-value-change.md @@ -1,6 +1,7 @@ --- title: '`API_URL` value has changed' matcher: "API_URL[\\s\\S]+?from\\s+['\"]@clerk\\/nextjs\\/server['\"]" +matcherFlags: 'm' --- The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/next/auth-import-change.md b/packages/upgrade/source/versions/v5/next/auth-import-change.md index 63b56661e0d..8f771d6175a 100644 --- a/packages/upgrade/source/versions/v5/next/auth-import-change.md +++ b/packages/upgrade/source/versions/v5/next/auth-import-change.md @@ -1,6 +1,7 @@ --- title: '`auth` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?auth[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md b/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md index bb33737cb1f..b2dce218e73 100644 --- a/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md +++ b/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md @@ -1,6 +1,7 @@ --- title: '`authMiddleware` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md b/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md index 2bd88384138..7620bf1a479 100644 --- a/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md +++ b/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md @@ -1,6 +1,7 @@ --- title: '`buildClerkProps` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?buildClerkProps[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/clerk-import-change.md b/packages/upgrade/source/versions/v5/next/clerk-import-change.md index ba15ec38aab..d9844114612 100644 --- a/packages/upgrade/source/versions/v5/next/clerk-import-change.md +++ b/packages/upgrade/source/versions/v5/next/clerk-import-change.md @@ -1,6 +1,7 @@ --- title: '`Clerk` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?Clerk[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- The `Clerk` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Note as well that the `Clerk` export has changed to `createClerkClient` as part of the v5 changes. Example below of the fix that needs to be made: diff --git a/packages/upgrade/source/versions/v5/next/constants-import-change.md b/packages/upgrade/source/versions/v5/next/constants-import-change.md index 1196f9a9ce2..9d6165a8a43 100644 --- a/packages/upgrade/source/versions/v5/next/constants-import-change.md +++ b/packages/upgrade/source/versions/v5/next/constants-import-change.md @@ -1,6 +1,7 @@ --- title: '`constants` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md b/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md index fd8d8d67f81..3e940591445 100644 --- a/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md +++ b/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md @@ -1,6 +1,7 @@ --- title: '`createAuthenticateRequest` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?createAuthenticateRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md b/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md index 8978d57cb2a..01c610b4cb7 100644 --- a/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md +++ b/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md @@ -1,6 +1,7 @@ --- title: '`createIsomorphicRequest` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/currentuser-import-change.md b/packages/upgrade/source/versions/v5/next/currentuser-import-change.md index fad4f150c71..9f2977b1094 100644 --- a/packages/upgrade/source/versions/v5/next/currentuser-import-change.md +++ b/packages/upgrade/source/versions/v5/next/currentuser-import-change.md @@ -1,6 +1,7 @@ --- title: '`currentUser` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?currentUser[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md b/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md index 2d252afff32..154e4d808a2 100644 --- a/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md +++ b/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md @@ -1,6 +1,7 @@ --- title: '`decodeJwt` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md index 95e1715ee46..5b2f19a0d87 100644 --- a/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md +++ b/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md @@ -1,6 +1,7 @@ --- title: '`EmailLinkErrorCode` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/errors' --- diff --git a/packages/upgrade/source/versions/v5/next/import-sign-up-url.md b/packages/upgrade/source/versions/v5/next/import-sign-up-url.md index cf92e5ff240..9bb41f6a156 100644 --- a/packages/upgrade/source/versions/v5/next/import-sign-up-url.md +++ b/packages/upgrade/source/versions/v5/next/import-sign-up-url.md @@ -1,6 +1,7 @@ --- title: '`SIGN_UP_URL` constant removed' matcher: "import\\s+{[\\s\\S]*?SIGN_UP_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcherFlags: 'm' --- This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_SIGN_UP_URL` environment variable and using this instead. diff --git a/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md index a0a1d427659..595088d24a3 100644 --- a/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md +++ b/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md @@ -1,6 +1,7 @@ --- title: '`isClerkAPIResponseError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/errors' --- diff --git a/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md index e016b26100c..af452fdca44 100644 --- a/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md +++ b/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md @@ -1,6 +1,7 @@ --- title: '`isEmailLinkError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/errors' --- diff --git a/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md b/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md index 39519d89cb5..41f68ecf02b 100644 --- a/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md +++ b/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md @@ -1,6 +1,7 @@ --- title: '`isKnownError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/errors' --- diff --git a/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md index d38cd1c7700..440a15e1677 100644 --- a/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md +++ b/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md @@ -1,6 +1,7 @@ --- title: '`isMetamaskError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/errors' --- diff --git a/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md index 9e978272073..b3d0668e4d0 100644 --- a/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md +++ b/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md @@ -1,6 +1,7 @@ --- title: '`MultiSessionAppSupport` import moved under `/internal`' matcher: "import\\s+{[\\s\\S]*?MultiSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/internal' --- diff --git a/packages/upgrade/source/versions/v5/next/redirect-import-change.md b/packages/upgrade/source/versions/v5/next/redirect-import-change.md index 0bda8304461..914d391d828 100644 --- a/packages/upgrade/source/versions/v5/next/redirect-import-change.md +++ b/packages/upgrade/source/versions/v5/next/redirect-import-change.md @@ -1,6 +1,7 @@ --- title: '`redirect` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?redirect[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/signjwt-import-change.md b/packages/upgrade/source/versions/v5/next/signjwt-import-change.md index 9e514d590fb..3e569231a70 100644 --- a/packages/upgrade/source/versions/v5/next/signjwt-import-change.md +++ b/packages/upgrade/source/versions/v5/next/signjwt-import-change.md @@ -1,6 +1,7 @@ --- title: '`signJwt` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md b/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md index 4ac97367ce4..ff3bc67a756 100644 --- a/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md +++ b/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md @@ -1,6 +1,7 @@ --- title: '`verifyJwt` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md b/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md index 17cc98d8e45..907c0c0b6bb 100644 --- a/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md +++ b/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md @@ -1,6 +1,7 @@ --- title: '`verifyToken` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?verifyToken[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcherFlags: 'm' replaceWithString: 'nextjs/server' --- From c481fb79cdb97d2cb86d3628f1c8d02b0139fd25 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 19 Jan 2024 16:37:34 -0500 Subject: [PATCH 077/159] fix(upgrade): A couple more fixes as a result of scanning against many sample apps --- packages/upgrade/source/scan.js | 9 +-------- .../v5/common/aftersignouturl-behavior-change.md | 2 +- .../source/versions/v5/next/clerk-import-change.md | 2 +- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index ec09df03bf3..ccd27ae7da0 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -97,14 +97,7 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { if (!allResults[matcherConfig.title]) allResults[matcherConfig.title] = { instances: [], ...matcherConfig }; - try { - indexToPosition(content, match.index, { oneBased: true }); - } catch (err) { - console.log(matcherConfig); - console.log(file); - console.log(content.length, match.index); - } - + // TODO: there's a small bug where we can see multiple instances of the same position allResults[matcherConfig.title].instances.push({ sdk, file: path.relative(process.cwd(), file), diff --git a/packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md b/packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md index 8c79fa4ead2..1f37d73d635 100644 --- a/packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md +++ b/packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md @@ -4,4 +4,4 @@ matcher: 'afterSignOutUrl=' warning: true --- -The default value of `afterSignOutUrl` has been changed to `/`. The URLs defined in your `Dashboard > Account Portal > Redirects` section will no longer affect these values. Read the [Customizing your Account Portal redirects](https://clerk.com/docs/account-portal/custom-redirects) guide to learn how to override these defaults. +The default value of `afterSignOutUrl` has been changed to `/`. The URLs defined in your `Dashboard > Account Portal > Redirects` section will no longer affect these values. Read the [Customizing your Account Portal redirects](https://clerk.com/docs/account-portal/custom-redirects) guide to learn how to override these defaults. If you are setting the value to `/`, you can remove the prop entirely. diff --git a/packages/upgrade/source/versions/v5/next/clerk-import-change.md b/packages/upgrade/source/versions/v5/next/clerk-import-change.md index d9844114612..cc1db4b0281 100644 --- a/packages/upgrade/source/versions/v5/next/clerk-import-change.md +++ b/packages/upgrade/source/versions/v5/next/clerk-import-change.md @@ -1,6 +1,6 @@ --- title: '`Clerk` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?Clerk[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" matcherFlags: 'm' --- From 11459cb25ab153a83f09e4ac7f6c4b362ab79fe4 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 19 Jan 2024 16:56:11 -0500 Subject: [PATCH 078/159] feat(upgrade): Implement warnings UI and flag to not render them --- packages/upgrade/source/app.js | 12 ++++++++-- packages/upgrade/source/cli.js | 13 ++++++----- packages/upgrade/source/scan.js | 4 +++- .../upgrade/source/util/expandable-list.js | 22 +++++++++++++++---- packages/upgrade/source/util/load-change.js | 1 + .../v5/common/organizationprofile-settings.md | 2 +- 6 files changed, 41 insertions(+), 13 deletions(-) diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index 45a2e755f89..bbfa2e44b4e 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -9,7 +9,15 @@ import getClerkMajorVersion from './util/get-clerk-version.js'; import Gradient from 'ink-gradient'; import BigText from 'ink-big-text'; -export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ignore = [], _yolo = false }) { +export default function App({ + _fromVersion, + _toVersion, + _sdk, + _dir = false, + _ignore = [], + _yolo = false, + noWarnings = false, +}) { const [yolo, setYolo] = useState(_yolo); const [sdks, setSdks] = useState(_sdk ? [_sdk] : []); const [sdkGuesses, setSdkGuesses] = useState([]); @@ -236,7 +244,7 @@ export default function App({ _fromVersion, _toVersion, _sdk, _dir = false, _ign {configVerified && ( <> - + )} diff --git a/packages/upgrade/source/cli.js b/packages/upgrade/source/cli.js index 9afa2d8ef45..c87be515960 100644 --- a/packages/upgrade/source/cli.js +++ b/packages/upgrade/source/cli.js @@ -11,11 +11,12 @@ const cli = meow( $ clerk-upgrade Options - --from Major version number you're upgrading from - --to Major version number you're upgrading to - --sdk Name of the SDK you're upgrading - --dir Directory you'd like to scan for files - --ignore Any files or directories you'd like to ignore + --from Major version number you're upgrading from + --to Major version number you're upgrading to + --sdk Name of the SDK you're upgrading + --dir Directory you'd like to scan for files + --ignore Any files or directories you'd like to ignore + --noWarnings Do not print warnings, only items that must be fixed Examples $ clerk-upgrade --from=4 --to=5 --sdk=nextjs --dir=src/** @@ -30,6 +31,7 @@ const cli = meow( dir: { type: 'string' }, ignore: { type: 'string', isMultiple: true }, yolo: { type: 'boolean' }, + noWarnings: { type: 'boolean' }, }, }, ); @@ -41,5 +43,6 @@ render( _sdk={cli.flags.sdk} _dir={cli.flags.dir} _yolo={cli.flags.yolo} + noWarnings={cli.flags.noWarnings} />, ); diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index ccd27ae7da0..cd880da97bd 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -7,7 +7,7 @@ import { ProgressBar } from '@inkjs/ui'; import indexToPosition from 'index-to-position'; import ExpandableList from './util/expandable-list.js'; -export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { +export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarnings }) { // NOTE: if the difference between fromVersion and toVersion is greater than 1 // we need to do a little extra work here and import two matchers, // sequence them after each other, and clearly mark which version migration @@ -94,6 +94,8 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore }) { // for each match, add to `instances` array of a key, create if not exists matches.map(match => { + if (noWarnings && matcherConfig.warning) return; + if (!allResults[matcherConfig.title]) allResults[matcherConfig.title] = { instances: [], ...matcherConfig }; diff --git a/packages/upgrade/source/util/expandable-list.js b/packages/upgrade/source/util/expandable-list.js index d1e289ac0f4..5480b523221 100644 --- a/packages/upgrade/source/util/expandable-list.js +++ b/packages/upgrade/source/util/expandable-list.js @@ -81,17 +81,31 @@ export default function ExpandableList({ items, numberVisible = 10 }) { {' '}- {loc} ))} + + + )} + + {item.warning && ( + <> + + ⚠️ This is a WARNING and will still match even if you corrected the issue or if no correction is + necessary. To dismiss warnings, pass the `--noWarnings` flag to the CLI when running. + + )} + + {/* This didn't feel like useful information, but keeping it for future reference */} {/* changed in {item.sdk} SDK */} {item.content} - - - + {/* We are not generating the upgrade guide from the slugs this round, so this is commented out */} + {/* */} + {/* */} + {/* Open in migration guide » - + */} )} , diff --git a/packages/upgrade/source/util/load-change.js b/packages/upgrade/source/util/load-change.js index 6807a5b9483..97b77f0ade0 100644 --- a/packages/upgrade/source/util/load-change.js +++ b/packages/upgrade/source/util/load-change.js @@ -27,6 +27,7 @@ export default function createLoader({ version, baseUrl }) { slug, sdk: sdk, content: parsed.content, + warning: fm.warning, link: `${baseUrl}#${slug}`, }; }); diff --git a/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md b/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md index 20305e10bea..0a96da275e8 100644 --- a/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md +++ b/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md @@ -1,7 +1,7 @@ --- title: '`Settings` -> `General` tab in `OrganizationProfile`' matcher: ' Date: Fri, 19 Jan 2024 16:57:20 -0500 Subject: [PATCH 079/159] chore(upgrade): Boost version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index f4671dab82c..1afe7b6fd12 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.0.3", + "version": "0.1.0", "license": "MIT", "type": "module", "bin": "dist/cli.js", From 11e0c875fb4153ca1b59d7938fc4dc9808bb5f66 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 23 Jan 2024 14:21:08 +0000 Subject: [PATCH 080/159] fix(upgrade): Missing file bugfix (ty lennart), min next ver, auth matcher fix --- packages/upgrade/source/cli.js | 3 +-- packages/upgrade/source/versions/v5/index.js | 2 +- .../source/versions/v5/next/auth-import-change.md | 2 +- .../source/versions/v5/next/min-nextjs-version.md | 9 +++++++++ 4 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 packages/upgrade/source/versions/v5/next/min-nextjs-version.md diff --git a/packages/upgrade/source/cli.js b/packages/upgrade/source/cli.js index c87be515960..b3f8cc9063b 100644 --- a/packages/upgrade/source/cli.js +++ b/packages/upgrade/source/cli.js @@ -19,8 +19,7 @@ const cli = meow( --noWarnings Do not print warnings, only items that must be fixed Examples - $ clerk-upgrade --from=4 --to=5 --sdk=nextjs --dir=src/** - Hello, Jane + $ clerk-upgrade --sdk=nextjs --dir=src/** `, { importMeta: import.meta, diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 1076e348bd5..7ec4f4fefe9 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -126,6 +126,7 @@ export default { 'removed-localization-keys', 'changed-localization-keys', 'signoutcallback-to-redirecturl', + 'min-nextjs-version', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -200,7 +201,6 @@ export default { 'clerkplugin-frontendapi', ]), node: load('node', [ - 'package-rename', 'api-key-to-secret-key', 'api-url-value-change', 'frontend-api-to-publishable-key', diff --git a/packages/upgrade/source/versions/v5/next/auth-import-change.md b/packages/upgrade/source/versions/v5/next/auth-import-change.md index 8f771d6175a..1fd07d180ec 100644 --- a/packages/upgrade/source/versions/v5/next/auth-import-change.md +++ b/packages/upgrade/source/versions/v5/next/auth-import-change.md @@ -1,6 +1,6 @@ --- title: '`auth` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?auth[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?[,\\s]auth[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/min-nextjs-version.md b/packages/upgrade/source/versions/v5/next/min-nextjs-version.md new file mode 100644 index 00000000000..05e7680f40d --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/min-nextjs-version.md @@ -0,0 +1,9 @@ +--- +title: 'Upgrade nextjs to v13 or higher' +matcher: "dependencies\":\\s*{[\\s\\S]*?\"next\":\\s*\"(?:^|~|>|=|\\s)*(?:10|11|12)\\..*?" +--- + +If you're using `@clerk/nextjs`, you will need to update your Next.js project to `13.0.4` or later. Check out Next's upgrade guides for help: + +- [Upgrading from 12 to 13](https://nextjs.org/docs/pages/building-your-application/upgrading/version-13) +- [Upgrading from 13 to 14](https://nextjs.org/docs/app/building-your-application/upgrading/version-14) From b3283009bfec4f926ae448e0e0709b69f22e5b4f Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 23 Jan 2024 14:22:20 +0000 Subject: [PATCH 081/159] fix(upgrade): Add commented out debug line hint --- packages/upgrade/source/cli.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/upgrade/source/cli.js b/packages/upgrade/source/cli.js index b3f8cc9063b..a1525d7ea4b 100644 --- a/packages/upgrade/source/cli.js +++ b/packages/upgrade/source/cli.js @@ -44,4 +44,5 @@ render( _yolo={cli.flags.yolo} noWarnings={cli.flags.noWarnings} />, + // { debug: true }, if having issues with errors being swallowed, uncomment this ); From a0aeac89d0bdb5227ceb0c5aec9e2498ee622508 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 23 Jan 2024 14:22:48 +0000 Subject: [PATCH 082/159] chore(upgrade): Patch version increment --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 1afe7b6fd12..e235098e94c 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "type": "module", "bin": "dist/cli.js", From 7056b16fc088713b838e3f4e0578254e5a381873 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 24 Jan 2024 10:43:44 +0000 Subject: [PATCH 083/159] feat(upgrade): Add minimum react version matcher --- .../upgrade/source/versions/v5/common/min-react-version.md | 6 ++++++ packages/upgrade/source/versions/v5/index.js | 1 + 2 files changed, 7 insertions(+) create mode 100644 packages/upgrade/source/versions/v5/common/min-react-version.md diff --git a/packages/upgrade/source/versions/v5/common/min-react-version.md b/packages/upgrade/source/versions/v5/common/min-react-version.md new file mode 100644 index 00000000000..33ac1f808c2 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/min-react-version.md @@ -0,0 +1,6 @@ +--- +title: 'Upgrade react to v18 or higher' +matcher: "dependencies\":\\s*{[\\s\\S]*?\"react\":\\s*\"(?:^|~|>|=|\\s)*(?:12|13|14|15|16|17)\\..*?" +--- + +If you're using `react`, you will need to update your Next.js project to `v18` or later to ensure that the latest version of Clerk's SDKs work properly. diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 7ec4f4fefe9..a10e140c813 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -47,6 +47,7 @@ const reactChangesList = [ 'removed-localization-keys', 'changed-localization-keys', 'signoutcallback-to-redirecturl', + 'min-react-version', ]; export default { From e0060568d2433793c7d85da3be9408cdee632c29 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 24 Jan 2024 12:48:57 +0000 Subject: [PATCH 084/159] feat(upgrade): Add redirectToSignUp/In import changes, minor cleanup --- packages/upgrade/source/versions/v5/index.js | 3 +++ .../versions/v5/next/redirecttosignin-import-path.md | 12 ++++++++++++ .../versions/v5/next/redirecttosignup-import-path.md | 12 ++++++++++++ .../source/versions/v5/node/api-url-value-change.md | 2 +- .../source/versions/v5/node/cjs-esm-instance.md | 4 ++-- 5 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 packages/upgrade/source/versions/v5/next/redirecttosignin-import-path.md create mode 100644 packages/upgrade/source/versions/v5/next/redirecttosignup-import-path.md diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index a10e140c813..864f8c2e660 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -128,6 +128,8 @@ export default { 'changed-localization-keys', 'signoutcallback-to-redirecturl', 'min-nextjs-version', + 'redirecttosignin-import-path', + 'redirecttosignup-import-path', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -324,6 +326,7 @@ export default { 'getorganizationmembershiplist-return-signature', 'getorganizationlist-return-signature', 'getorganizationinvitationlist-return-signature', + 'buildrequesturl-removed', ]), types: [], redwood: [], diff --git a/packages/upgrade/source/versions/v5/next/redirecttosignin-import-path.md b/packages/upgrade/source/versions/v5/next/redirecttosignin-import-path.md new file mode 100644 index 00000000000..f85516998f8 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/redirecttosignin-import-path.md @@ -0,0 +1,12 @@ +--- +title: '`redirectToSignIn` import moved under `/server/' +matcher: "import\\s+{[\\s\\S]*?[,\\s]redirectToSignIn[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `redirectToSignIn` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { redirectToSignIn } from "@clerk/nextjs" ++ import { redirectToSignIn } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/next/redirecttosignup-import-path.md b/packages/upgrade/source/versions/v5/next/redirecttosignup-import-path.md new file mode 100644 index 00000000000..1b47290c8e5 --- /dev/null +++ b/packages/upgrade/source/versions/v5/next/redirecttosignup-import-path.md @@ -0,0 +1,12 @@ +--- +title: '`redirectToSignUp` import path changed' +matcher: "import\\s+{[\\s\\S]*?[,\\s]redirectToSignUp[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +replaceWithString: 'nextjs/server' +--- + +The `redirectToSignUp` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { redirectToSignUp } from "@clerk/nextjs" ++ import { redirectToSignUp } from "@clerk/nextjs/server" +``` diff --git a/packages/upgrade/source/versions/v5/node/api-url-value-change.md b/packages/upgrade/source/versions/v5/node/api-url-value-change.md index 14d801da56e..6f200508938 100644 --- a/packages/upgrade/source/versions/v5/node/api-url-value-change.md +++ b/packages/upgrade/source/versions/v5/node/api-url-value-change.md @@ -3,4 +3,4 @@ title: '`API_URL` value has changed' matcher: "API_URL.*?from\\s['\"]@clerk\\/clerk-sdk-node['\"]" --- -- The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. +The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md b/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md index baf839cd536..1c0026d0271 100644 --- a/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md +++ b/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md @@ -1,7 +1,7 @@ --- title: '`cjs/instance` and `esm/instance` imports no longer needed' -matcher: "@clerk\\/clerk-sdk-node\\/(?:cjs|esm)\\/instance" -replaceWithString: '@clerk/clerk-sdk-node' +matcher: "@clerk\\/clerk-sdk-node(\\/(?:cjs|esm)\\/instance)" +replaceWithString: '' --- If you are using either of these import paths, they are no longer necessary and you can import directly from the top level `@clerk/express` path. From f9b7a0d4a36dc5c0932d94112343c190f56bf40b Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 25 Jan 2024 10:54:21 +0000 Subject: [PATCH 085/159] feat(upgrade): Total count return type change, default clerk import change --- ...anizationinvitationlist-return-type-change.md | 14 ++++++++++++++ .../getorganizationlist-return-type-change.md | 14 ++++++++++++++ ...anizationmembershiplist-return-type-change.md | 14 ++++++++++++++ .../versions/v5/fastify/clerk-import-change.md | 12 ++++++++++++ .../versions/v5/gatsby/clerk-import-change.md | 12 ++++++++++++ packages/upgrade/source/versions/v5/index.js | 16 ++++++++++++++++ .../versions/v5/next/redirect-import-change.md | 2 +- .../versions/v5/node/clerk-import-change.md | 12 ++++++++++++ .../versions/v5/remix/clerk-import-change.md | 12 ++++++++++++ 9 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md create mode 100644 packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md create mode 100644 packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md create mode 100644 packages/upgrade/source/versions/v5/fastify/clerk-import-change.md create mode 100644 packages/upgrade/source/versions/v5/gatsby/clerk-import-change.md create mode 100644 packages/upgrade/source/versions/v5/node/clerk-import-change.md create mode 100644 packages/upgrade/source/versions/v5/remix/clerk-import-change.md diff --git a/packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md b/packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md new file mode 100644 index 00000000000..5dbde6095ca --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md @@ -0,0 +1,14 @@ +--- +title: '`Organization.getOrganizationInvitationList()` return type changed' +matcher: "\\.getOrganizationInvitationList\\(" +--- + +The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + +```diff + const { organization } = useOrganization() + const inviteList = organization.getOrganizationInvitationList() + +- inviteList.forEach(() => {}) ++ inviteList.data.forEach(() => {}) +``` diff --git a/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md b/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md new file mode 100644 index 00000000000..5b7bb911e2c --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md @@ -0,0 +1,14 @@ +--- +title: '`Organization.getOrganizationList()` return type changed' +matcher: "\\.getOrganizationList\\(" +--- + +The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + +```diff + const { organization } = useOrganization() + const orgList = organization.getOrganizationList() + +- orgList.forEach(() => {}) ++ orgList.data.forEach(() => {}) +``` diff --git a/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md b/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md new file mode 100644 index 00000000000..03b0037bd08 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md @@ -0,0 +1,14 @@ +--- +title: '`User.getOrganizationMembershipList()` return type changed' +matcher: "\\.getOrganizationMembershipList\\(" +--- + +The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + +```diff + const { user } = useUser() + const membershipList = user.getOrganizationMembershipList() + +- membershipList.forEach(() => {}) ++ membershipList.data.forEach(() => {}) +``` diff --git a/packages/upgrade/source/versions/v5/fastify/clerk-import-change.md b/packages/upgrade/source/versions/v5/fastify/clerk-import-change.md new file mode 100644 index 00000000000..30d3cbf3611 --- /dev/null +++ b/packages/upgrade/source/versions/v5/fastify/clerk-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`Clerk` -> `{ createClerkClient }`' +matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/fastify[\\s\\S]*?['\"]" +matcherFlags: 'm' +--- + +The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import Clerk from "@clerk/fastify" ++ import { createClerkClient } from "@clerk/fastify" +``` diff --git a/packages/upgrade/source/versions/v5/gatsby/clerk-import-change.md b/packages/upgrade/source/versions/v5/gatsby/clerk-import-change.md new file mode 100644 index 00000000000..c2b69fe135d --- /dev/null +++ b/packages/upgrade/source/versions/v5/gatsby/clerk-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`Clerk` -> `{ createClerkClient }`' +matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]gatsby-plugin-clerk[\\s\\S]*?['\"]" +matcherFlags: 'm' +--- + +The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import Clerk from "gatsby-plugin-clerk" ++ import { createClerkClient } from "gatsby-plugin-clerk" +``` diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 864f8c2e660..b9797e2aa16 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -48,6 +48,9 @@ const reactChangesList = [ 'changed-localization-keys', 'signoutcallback-to-redirecturl', 'min-react-version', + 'getorganizationlist-return-type-change', + 'getorganizationinvitationlist-return-type-change', + 'getorganizationmembershiplist-return-type-change', ]; export default { @@ -130,6 +133,9 @@ export default { 'min-nextjs-version', 'redirecttosignin-import-path', 'redirecttosignup-import-path', + 'getorganizationlist-return-type-change', + 'getorganizationinvitationlist-return-type-change', + 'getorganizationmembershiplist-return-type-change', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -146,6 +152,7 @@ export default { 'setsession', 'api-url-value-change', 'withserverauth-return-type', + 'clerk-import-change', ]), ), remix: load('remix', [ @@ -168,6 +175,10 @@ export default { 'removed-localization-keys', 'changed-localization-keys', 'signoutcallback-to-redirecturl', + 'clerk-import-change', + 'getorganizationlist-return-type-change', + 'getorganizationinvitationlist-return-type-change', + 'getorganizationmembershiplist-return-type-change', ]), expo: load('expo', [ 'apikey-to-publishable-key', @@ -194,6 +205,9 @@ export default { 'removed-localization-keys', 'changed-localization-keys', 'signoutcallback-to-redirecturl', + 'getorganizationlist-return-type-change', + 'getorganizationinvitationlist-return-type-change', + 'getorganizationmembershiplist-return-type-change', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -202,6 +216,7 @@ export default { 'createclerkclient-apikey', 'createclerkclient-frontendapi', 'clerkplugin-frontendapi', + 'clerk-import-change', ]), node: load('node', [ 'api-key-to-secret-key', @@ -223,6 +238,7 @@ export default { 'setclerkserverapiurl', 'cjs-esm-instance', 'legacyauthobject-removed', + 'clerk-import-change', ]), react: load('react', reactChangesList), js: load('js', [ diff --git a/packages/upgrade/source/versions/v5/next/redirect-import-change.md b/packages/upgrade/source/versions/v5/next/redirect-import-change.md index 914d391d828..e050620deb4 100644 --- a/packages/upgrade/source/versions/v5/next/redirect-import-change.md +++ b/packages/upgrade/source/versions/v5/next/redirect-import-change.md @@ -1,6 +1,6 @@ --- title: '`redirect` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?redirect[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?[,\\s]redirect[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/node/clerk-import-change.md b/packages/upgrade/source/versions/v5/node/clerk-import-change.md new file mode 100644 index 00000000000..69581539806 --- /dev/null +++ b/packages/upgrade/source/versions/v5/node/clerk-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`Clerk` -> `{ createClerkClient }`' +matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/clerk-sdk-node[\\s\\S]*?['\"]" +matcherFlags: 'm' +--- + +The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import Clerk from "@clerk/clerk-sdk-node" ++ import { createClerkClient } from "@clerk/clerk-sdk-node" +``` diff --git a/packages/upgrade/source/versions/v5/remix/clerk-import-change.md b/packages/upgrade/source/versions/v5/remix/clerk-import-change.md new file mode 100644 index 00000000000..275f89e74ef --- /dev/null +++ b/packages/upgrade/source/versions/v5/remix/clerk-import-change.md @@ -0,0 +1,12 @@ +--- +title: '`Clerk` -> `{ createClerkClient }`' +matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/remix[\\s\\S]*?['\"]" +matcherFlags: 'm' +--- + +The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import Clerk from "@clerk/remix" ++ import { createClerkClient } from "@clerk/remix" +``` From 84a31d1a5f246b77a907d23ba7a6dc55e2c27d52 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Mon, 29 Jan 2024 17:02:43 -0500 Subject: [PATCH 086/159] feat(upgrade): Broaden impact of return signature changes across more SDKs, remove doubled routernav --- .../navigate-to-routerpush-routerreplace.md | 14 ++++++----- ...rganization-getdomains-arguments-change.md | 7 +----- ...zation-getinvitations-arguments-changed.md | 7 +----- ...getmembershiprequests-arguments-changed.md | 7 +----- ...zation-getmemberships-arguments-changed.md | 7 +----- ...organization-getroles-arguments-changed.md | 7 +----- ...anizationinvitations-arguments-chanaged.md | 7 +----- ...anizationmemberships-arguments-chanaged.md | 7 +----- ...anizationsuggestions-arguments-chanaged.md | 7 +----- packages/upgrade/source/versions/v5/index.js | 24 +++++++++++++++++++ .../v5/js/organization-create-string.md | 9 +++---- .../js/organization-getpendinginvitations.md | 9 +++---- .../v5/js/router-navigate-push-replace.md | 18 ++++++++++++++ .../versions/v5/react/router-navigate.md | 18 -------------- 14 files changed, 64 insertions(+), 84 deletions(-) rename packages/upgrade/source/versions/v5/{js => common}/organization-getdomains-arguments-change.md (76%) rename packages/upgrade/source/versions/v5/{js => common}/organization-getinvitations-arguments-changed.md (76%) rename packages/upgrade/source/versions/v5/{js => common}/organization-getmembershiprequests-arguments-changed.md (75%) rename packages/upgrade/source/versions/v5/{js => common}/organization-getmemberships-arguments-changed.md (76%) rename packages/upgrade/source/versions/v5/{js => common}/organization-getroles-arguments-changed.md (76%) rename packages/upgrade/source/versions/v5/{js => common}/user-getorganizationinvitations-arguments-chanaged.md (76%) rename packages/upgrade/source/versions/v5/{js => common}/user-getorganizationmemberships-arguments-chanaged.md (76%) rename packages/upgrade/source/versions/v5/{js => common}/user-getorganizationsuggestions-arguments-chanaged.md (76%) create mode 100644 packages/upgrade/source/versions/v5/js/router-navigate-push-replace.md delete mode 100644 packages/upgrade/source/versions/v5/react/router-navigate.md diff --git a/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md b/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md index 0f1c968a51a..9bd8b4313fc 100644 --- a/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md +++ b/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md @@ -1,16 +1,18 @@ --- -title: '`navigate` prop replaced by `routerPush` and `routerReplace`' +title: '`navigate` prop to `ClerkProvider` replaced by `routerPush` and `routerReplace`' matcher: "" matcherFlags: 'm' --- -The `navigate` prop on `` allowed developers to override the default navigation behavior with a custom function. However, `navigate` was only able to push, not replace routes. The router is now able to do both, and as such, the props for `` were updated. The `routerPush` and `routerReplace` props replace the old `navigate` prop. +The `navigate` prop on ClerkProvider allowed developers to override the default navigation behavior with a custom function. However, navigate was only able to push, not replace routes. We have now added the capability for the router to push or replace, and as such, upgraded the provider prop so that it can handle either depending on the circumstance. -For more information on what push and replace mean in relation to the browser history api, check out the ["Working with the History API"](https://developer.mozilla.org/en-US/docs/Web/API/History_API/Working_with_the_History_API) docs. +Two new props have been added to `ClerkProvider` that replace the single `navigate` prop, and can be used to override the default navigation behavior for either a push or replace navigation. For more information on what push and replace mean in relation to the browser history api, [check out these wonderful MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/History_API/Working_with_the_History_API). -If you’d like to keep the same behavior as you had with the single `navigate` prop, pass the exact same function to both `routerPush` and `routerReplace`. For example: +If you’d like to keep the same behavior as you had with the single `navigate` prop, pass the exact same function to both `routerPush` and `routerReplace` and the behavior will be identical. For example: ```diff -- x} /> -+ x} routerReplace={x => x} /> +- x } /> ++ x } routerReplace={ x => x } /> ``` + +However, you now have the option to differentiate behavior based on whether the navigation will be a push or replace. diff --git a/packages/upgrade/source/versions/v5/js/organization-getdomains-arguments-change.md b/packages/upgrade/source/versions/v5/common/organization-getdomains-arguments-change.md similarity index 76% rename from packages/upgrade/source/versions/v5/js/organization-getdomains-arguments-change.md rename to packages/upgrade/source/versions/v5/common/organization-getdomains-arguments-change.md index 0d9c819e910..177584bd925 100644 --- a/packages/upgrade/source/versions/v5/js/organization-getdomains-arguments-change.md +++ b/packages/upgrade/source/versions/v5/common/organization-getdomains-arguments-change.md @@ -6,12 +6,7 @@ matcher: "\\.getDomains\\(" There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - import Clerk from "@clerk/clerk-js" - - const clerk = new Clerk() - await clerk.load() - - const { data: orgs } = await clerk.organization.getDomains({ + const { data } = await organization.getDomains({ - limit: 10, + pageSize: 10, - offset: 10, diff --git a/packages/upgrade/source/versions/v5/js/organization-getinvitations-arguments-changed.md b/packages/upgrade/source/versions/v5/common/organization-getinvitations-arguments-changed.md similarity index 76% rename from packages/upgrade/source/versions/v5/js/organization-getinvitations-arguments-changed.md rename to packages/upgrade/source/versions/v5/common/organization-getinvitations-arguments-changed.md index 5e772137de6..f7830c51c17 100644 --- a/packages/upgrade/source/versions/v5/js/organization-getinvitations-arguments-changed.md +++ b/packages/upgrade/source/versions/v5/common/organization-getinvitations-arguments-changed.md @@ -6,12 +6,7 @@ matcher: "\\.getInvitations\\(" There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - import Clerk from "@clerk/clerk-js" - - const clerk = new Clerk() - await clerk.load() - - const { data: orgs } = await clerk.organization.getInvitations({ + const { data } = await organization.getInvitations({ - limit: 10, + pageSize: 10, - offset: 10, diff --git a/packages/upgrade/source/versions/v5/js/organization-getmembershiprequests-arguments-changed.md b/packages/upgrade/source/versions/v5/common/organization-getmembershiprequests-arguments-changed.md similarity index 75% rename from packages/upgrade/source/versions/v5/js/organization-getmembershiprequests-arguments-changed.md rename to packages/upgrade/source/versions/v5/common/organization-getmembershiprequests-arguments-changed.md index 89c6b75e46d..b90d67ccee9 100644 --- a/packages/upgrade/source/versions/v5/js/organization-getmembershiprequests-arguments-changed.md +++ b/packages/upgrade/source/versions/v5/common/organization-getmembershiprequests-arguments-changed.md @@ -6,12 +6,7 @@ matcher: "\\.getMembershipRequests\\(" There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - import Clerk from "@clerk/clerk-js" - - const clerk = new Clerk() - await clerk.load() - - const { data: orgs } = await clerk.organization.getMembershipRequests({ + const { data } = await organization.getMembershipRequests({ - limit: 10, + pageSize: 10, - offset: 10, diff --git a/packages/upgrade/source/versions/v5/js/organization-getmemberships-arguments-changed.md b/packages/upgrade/source/versions/v5/common/organization-getmemberships-arguments-changed.md similarity index 76% rename from packages/upgrade/source/versions/v5/js/organization-getmemberships-arguments-changed.md rename to packages/upgrade/source/versions/v5/common/organization-getmemberships-arguments-changed.md index 3a04cea7c13..6c773b72289 100644 --- a/packages/upgrade/source/versions/v5/js/organization-getmemberships-arguments-changed.md +++ b/packages/upgrade/source/versions/v5/common/organization-getmemberships-arguments-changed.md @@ -6,12 +6,7 @@ matcher: "\\.getMemberships\\(" There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - import Clerk from "@clerk/clerk-js" - - const clerk = new Clerk() - await clerk.load() - - const { data: orgs } = await clerk.organization.getMemberships({ + const { data } = await organization.getMemberships({ - limit: 10, + pageSize: 10, - offset: 10, diff --git a/packages/upgrade/source/versions/v5/js/organization-getroles-arguments-changed.md b/packages/upgrade/source/versions/v5/common/organization-getroles-arguments-changed.md similarity index 76% rename from packages/upgrade/source/versions/v5/js/organization-getroles-arguments-changed.md rename to packages/upgrade/source/versions/v5/common/organization-getroles-arguments-changed.md index 026008f3350..49938541b0c 100644 --- a/packages/upgrade/source/versions/v5/js/organization-getroles-arguments-changed.md +++ b/packages/upgrade/source/versions/v5/common/organization-getroles-arguments-changed.md @@ -6,12 +6,7 @@ matcher: "\\.getRoles\\(" There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - import Clerk from "@clerk/clerk-js" - - const clerk = new Clerk() - await clerk.load() - - const { data: orgs } = await clerk.organization.getRoles({ + const { data } = await organization.getRoles({ - limit: 10, + pageSize: 10, - offset: 10, diff --git a/packages/upgrade/source/versions/v5/js/user-getorganizationinvitations-arguments-chanaged.md b/packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-chanaged.md similarity index 76% rename from packages/upgrade/source/versions/v5/js/user-getorganizationinvitations-arguments-chanaged.md rename to packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-chanaged.md index 60073ebdebb..99136586768 100644 --- a/packages/upgrade/source/versions/v5/js/user-getorganizationinvitations-arguments-chanaged.md +++ b/packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-chanaged.md @@ -6,12 +6,7 @@ matcher: "\\.getOrganizationInvitations\\(" There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - import Clerk from "@clerk/clerk-js" - - const clerk = new Clerk() - await clerk.load() - - const { data: orgs } = await clerk.user.getOrganizationInvitations({ + const { data } = await user.getOrganizationInvitations({ - limit: 10, + pageSize: 10, - offset: 10, diff --git a/packages/upgrade/source/versions/v5/js/user-getorganizationmemberships-arguments-chanaged.md b/packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-chanaged.md similarity index 76% rename from packages/upgrade/source/versions/v5/js/user-getorganizationmemberships-arguments-chanaged.md rename to packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-chanaged.md index cf89d2d2b9f..a6ef63e9a58 100644 --- a/packages/upgrade/source/versions/v5/js/user-getorganizationmemberships-arguments-chanaged.md +++ b/packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-chanaged.md @@ -6,12 +6,7 @@ matcher: "\\.getOrganizationMemberships\\(" There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - import Clerk from "@clerk/clerk-js" - - const clerk = new Clerk() - await clerk.load() - - const { data: orgs } = await clerk.user.getOrganizationMemberships({ + const { data } = await user.getOrganizationMemberships({ - limit: 10, + pageSize: 10, - offset: 10, diff --git a/packages/upgrade/source/versions/v5/js/user-getorganizationsuggestions-arguments-chanaged.md b/packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-chanaged.md similarity index 76% rename from packages/upgrade/source/versions/v5/js/user-getorganizationsuggestions-arguments-chanaged.md rename to packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-chanaged.md index 39f9bb5ed18..55c9d21f267 100644 --- a/packages/upgrade/source/versions/v5/js/user-getorganizationsuggestions-arguments-chanaged.md +++ b/packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-chanaged.md @@ -6,12 +6,7 @@ matcher: "\\.getOrganizationSuggestions\\(" There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - import Clerk from "@clerk/clerk-js" - - const clerk = new Clerk() - await clerk.load() - - const { data: orgs } = await clerk.user.getOrganizationSuggestions({ + const { data } = await user.getOrganizationSuggestions({ - limit: 10, + pageSize: 10, - offset: 10, diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index b9797e2aa16..58f715ac5ad 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -51,6 +51,14 @@ const reactChangesList = [ 'getorganizationlist-return-type-change', 'getorganizationinvitationlist-return-type-change', 'getorganizationmembershiplist-return-type-change', + 'organization-getroles-arguments-changed', + 'organization-getmemberships-arguments-changed', + 'organization-getdomains-arguments-change', + 'organization-getinvitations-arguments-changed', + 'organization-getmembershiprequests-arguments-changed', + 'user-getorganizationinvitations-arguments-chanaged', + 'user-getorganizationsuggestions-arguments-chanaged', + 'user-getorganizationmemberships-arguments-chanaged', ]; export default { @@ -136,6 +144,14 @@ export default { 'getorganizationlist-return-type-change', 'getorganizationinvitationlist-return-type-change', 'getorganizationmembershiplist-return-type-change', + 'organization-getroles-arguments-changed', + 'organization-getmemberships-arguments-changed', + 'organization-getdomains-arguments-change', + 'organization-getinvitations-arguments-changed', + 'organization-getmembershiprequests-arguments-changed', + 'user-getorganizationinvitations-arguments-chanaged', + 'user-getorganizationsuggestions-arguments-chanaged', + 'user-getorganizationmemberships-arguments-chanaged', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -179,6 +195,14 @@ export default { 'getorganizationlist-return-type-change', 'getorganizationinvitationlist-return-type-change', 'getorganizationmembershiplist-return-type-change', + 'organization-getroles-arguments-changed', + 'organization-getmemberships-arguments-changed', + 'organization-getdomains-arguments-change', + 'organization-getinvitations-arguments-changed', + 'organization-getmembershiprequests-arguments-changed', + 'user-getorganizationinvitations-arguments-chanaged', + 'user-getorganizationsuggestions-arguments-chanaged', + 'user-getorganizationmemberships-arguments-chanaged', ]), expo: load('expo', [ 'apikey-to-publishable-key', diff --git a/packages/upgrade/source/versions/v5/js/organization-create-string.md b/packages/upgrade/source/versions/v5/js/organization-create-string.md index 511d2d6bbab..4370da02a35 100644 --- a/packages/upgrade/source/versions/v5/js/organization-create-string.md +++ b/packages/upgrade/source/versions/v5/js/organization-create-string.md @@ -6,10 +6,7 @@ matcherFlags: 'm' Passing a string as an argument to `Organization.create` is no longer possible - instead, pass an object with the `name` property. -```js -// before -Organization.create('...'); - -// after -Organization.create({ name: '...' }); +```diff +- Organization.create('...'); ++ Organization.create({ name: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/js/organization-getpendinginvitations.md b/packages/upgrade/source/versions/v5/js/organization-getpendinginvitations.md index 2a30c02a917..84bbffcaf56 100644 --- a/packages/upgrade/source/versions/v5/js/organization-getpendinginvitations.md +++ b/packages/upgrade/source/versions/v5/js/organization-getpendinginvitations.md @@ -5,10 +5,7 @@ matcher: "\\.getPendingInvitations\\(" The `Organization.getPendingInvitations()` method has been removed. You can use `Organization.getInvitations` instead. -```js -// before -Organization.getPendingInvitations(); - -// after -Organization.getInvitations({ status: 'pending' }); +```diff +- Organization.getPendingInvitations(); ++ Organization.getInvitations({ status: 'pending' }); ``` diff --git a/packages/upgrade/source/versions/v5/js/router-navigate-push-replace.md b/packages/upgrade/source/versions/v5/js/router-navigate-push-replace.md new file mode 100644 index 00000000000..aa6a6c44c6d --- /dev/null +++ b/packages/upgrade/source/versions/v5/js/router-navigate-push-replace.md @@ -0,0 +1,18 @@ +--- +title: '`navigate` argument to `Clerk.load` replaced by `routerPush` and `routerReplace`' +matcher: "Clerk\\.load\\([\\s\\S]*?navigate:[\\s\\S]*?\\)" +matcherFlags: 'm' +--- + +The `navigate` option allowed developers to override the default navigation behavior with a custom function. However, navigate was only able to push, not replace routes. We have now added the capability for the router to push or replace, and as such, updated `Clerk.load` so that it can handle either depending on the circumstance. + +Two new arguments have been added to options that can be passed to `Clerk.load` that replace the single `navigate` argument, and can be used to override the default navigation behavior for either a push or replace navigation. For more information on what push and replace mean in relation to the browser history api, [check out these wonderful MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/History_API/Working_with_the_History_API). + +If you’d like to keep the same behavior as you had with the single `navigate` argument, pass the exact same function to as both the `routerPush` and `routerReplace` arguments and the behavior will be identical. For example: + +```diff +- Clerk.load({ navigate: x => x }) ++ Clerk.load({ routerPush: x => x, routerReplace: x => x }) +``` + +However, you now have the option to differentiate behavior based on whether the navigation will be a push or replace. diff --git a/packages/upgrade/source/versions/v5/react/router-navigate.md b/packages/upgrade/source/versions/v5/react/router-navigate.md deleted file mode 100644 index 9bd8b4313fc..00000000000 --- a/packages/upgrade/source/versions/v5/react/router-navigate.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: '`navigate` prop to `ClerkProvider` replaced by `routerPush` and `routerReplace`' -matcher: "" -matcherFlags: 'm' ---- - -The `navigate` prop on ClerkProvider allowed developers to override the default navigation behavior with a custom function. However, navigate was only able to push, not replace routes. We have now added the capability for the router to push or replace, and as such, upgraded the provider prop so that it can handle either depending on the circumstance. - -Two new props have been added to `ClerkProvider` that replace the single `navigate` prop, and can be used to override the default navigation behavior for either a push or replace navigation. For more information on what push and replace mean in relation to the browser history api, [check out these wonderful MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/History_API/Working_with_the_History_API). - -If you’d like to keep the same behavior as you had with the single `navigate` prop, pass the exact same function to both `routerPush` and `routerReplace` and the behavior will be identical. For example: - -```diff -- x } /> -+ x } routerReplace={ x => x } /> -``` - -However, you now have the option to differentiate behavior based on whether the navigation will be a push or replace. From 2a8c89ab4cdd105ffeaaa0b065e325644119c33d Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Mon, 29 Jan 2024 22:10:44 -0500 Subject: [PATCH 087/159] chore(upgrade): A bunch of cleanup and error corrections across change files --- .../versions/v5/backend/api-url-value-changed.md | 1 + .../v5/backend/createclerkclient-frontendapi.md | 2 +- .../source/versions/v5/backend/pkgversion.md | 6 +++--- .../v5/common/afterswitchorganizationurl.md | 9 +++------ .../v5/common/handlemagiclinkverification.md | 2 +- .../v5/common/ismetamaskerror-import-change.md | 13 ------------- .../source/versions/v5/common/setsession.md | 1 + .../source/versions/v5/common/usemagiclink.md | 2 +- .../versions/v5/common/userprofile-prop.md | 7 ++++++- .../v5/expo/clerkprovider-frontendapi.md | 11 ++++------- .../versions/v5/fastify/api-url-value-change.md | 4 +++- .../v5/fastify/clerkplugin-frontendapi.md | 9 +++------ .../v5/fastify/createclerkclient-apikey.md | 11 ++++------- .../v5/fastify/createclerkclient-frontendapi.md | 11 ++++------- .../versions/v5/gatsby/api-url-value-change.md | 4 +++- .../v5/gatsby/createclerkclient-apikey.md | 11 ++++------- .../v5/gatsby/createclerkclient-frontendapi.md | 11 ++++------- .../source/versions/v5/js/redirecttohome.md | 2 +- ...tweb3walletverification-generatedsignature.md | 3 ++- .../js/user-createexternalaccount-redirecturl.md | 2 +- .../versions/v5/js/user-update-password.md | 2 +- .../versions/v5/next/api-url-value-change.md | 1 + .../v5/next/authmiddleware-frontendapi.md | 9 +++++++-- .../versions/v5/next/createclerkclient-apikey.md | 9 +++------ .../v5/next/createclerkclient-frontendapi.md | 9 +++------ .../source/versions/v5/next/getauth-apikey.md | 7 +++++-- .../source/versions/v5/next/import-nextjs-api.md | 2 -- .../versions/v5/node/api-url-value-change.md | 4 +++- .../source/versions/v5/node/cjs-esm-instance.md | 11 ++++------- .../v5/node/clerkexpressrequireauth-apikey.md | 11 ++++------- .../node/clerkexpressrequireauth-frontendapi.md | 11 ++++------- .../v5/node/clerkexpresswithauth-apikey.md | 11 ++++------- .../v5/node/clerkexpresswithauth-frontendapi.md | 11 ++++------- .../versions/v5/node/createclerkclient-apikey.md | 11 ++++------- .../v5/node/createclerkclient-frontendapi.md | 11 ++++------- .../node/createclerkexpressrequireauth-apikey.md | 11 ++++------- .../createclerkexpressrequireauth-frontendapi.md | 11 ++++------- .../v5/node/createclerkexpresswithauth-apikey.md | 11 ++++------- .../createclerkexpresswithauth-frontendapi.md | 11 ++++------- .../versions/v5/node/legacyauthobject-removed.md | 12 ++++++------ .../source/versions/v5/node/setclerkapikey.md | 10 ++++------ .../versions/v5/node/setclerkapiversion.md | 10 ++++------ .../versions/v5/node/setclerkhttpoptions.md | 10 ++++------ .../versions/v5/node/setclerkserverapiurl.md | 16 +++++++--------- .../versions/v5/react/api-url-value-change.md | 4 +++- .../v5/remix/clerkerrorboundary-removed.md | 1 + 46 files changed, 146 insertions(+), 203 deletions(-) delete mode 100644 packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md diff --git a/packages/upgrade/source/versions/v5/backend/api-url-value-changed.md b/packages/upgrade/source/versions/v5/backend/api-url-value-changed.md index 18746f431f0..2471b007078 100644 --- a/packages/upgrade/source/versions/v5/backend/api-url-value-changed.md +++ b/packages/upgrade/source/versions/v5/backend/api-url-value-changed.md @@ -2,6 +2,7 @@ title: '`API_URL` value has changed' matcher: "API_URL[\\s\\S]*?from\\s+['\"]@clerk\\/backend\\/constants['\"]" matcherFlags: 'm' +warning: true --- The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md index b05e04c2ee3..fff88ec4494 100644 --- a/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md @@ -1,6 +1,6 @@ --- title: '`frontendApi` -> `publishableKey` as param to createClerkClient' -matcher: "[createClerkClient|Clerk]\\(\\s*{[\\s\\S]*?frontendApi:[\\s\\S]*?\\)" +matcher: "(?:createClerkClient|Clerk)\\(\\s*{[\\s\\S]*?frontendApi:[\\s\\S]*?\\)" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/backend/pkgversion.md b/packages/upgrade/source/versions/v5/backend/pkgversion.md index 1f436742389..ce5a7554705 100644 --- a/packages/upgrade/source/versions/v5/backend/pkgversion.md +++ b/packages/upgrade/source/versions/v5/backend/pkgversion.md @@ -1,9 +1,9 @@ --- title: '`pkgVersion` -> `clerkJSVersion`' matcher: - - "loadInterstitialFromLocal\\([\\s\\S]*?pkgVersion:" - - "loadInterstitialFromBAPI\\([\\s\\S]*?pkgVersion:" - - "buildPublicInterstitialUrl\\([\\s\\S]*?pkgVersion:" + - "loadInterstitialFromLocal\\([\\s\\S]*?pkgVersion:[\\s\\S]*?\\)" + - "loadInterstitialFromBAPI\\([\\s\\S]*?pkgVersion:[\\s\\S]*?\\)" + - "buildPublicInterstitialUrl\\([\\s\\S]*?pkgVersion:[\\s\\S]*?\\)" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md b/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md index 02560dfcebe..90650b4b42a 100644 --- a/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md +++ b/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md @@ -7,10 +7,7 @@ replaceWithString: 'afterSelectOrganizationUrl' The `afterSwitchOrganizationUrl` prop on the `` component has been renamed to `afterSelectOrganizationUrl`. This is a quick and simple rename. -```js -// before - - -// after - +```diff +- ++ ``` diff --git a/packages/upgrade/source/versions/v5/common/handlemagiclinkverification.md b/packages/upgrade/source/versions/v5/common/handlemagiclinkverification.md index 689053e3ce4..08eb93e7ca7 100644 --- a/packages/upgrade/source/versions/v5/common/handlemagiclinkverification.md +++ b/packages/upgrade/source/versions/v5/common/handlemagiclinkverification.md @@ -4,4 +4,4 @@ matcher: 'handleMagicLinkVerification' replaceWithString: 'handleMagicLinkVerification' --- -Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. +Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. diff --git a/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md deleted file mode 100644 index 440a15e1677..00000000000 --- a/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: '`isMetamaskError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" -matcherFlags: 'm' -replaceWithString: 'nextjs/errors' ---- - -The `isMetamaskError` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - -```diff -- import { isMetamaskError } from "@clerk/nextjs" -+ import { isMetamaskError } from "@clerk/nextjs/errors" -``` diff --git a/packages/upgrade/source/versions/v5/common/setsession.md b/packages/upgrade/source/versions/v5/common/setsession.md index 29f814329b0..00f1e5c87e9 100644 --- a/packages/upgrade/source/versions/v5/common/setsession.md +++ b/packages/upgrade/source/versions/v5/common/setsession.md @@ -24,6 +24,7 @@ await setActive({ organization: 'orgID', beforeEmit: () => void }) + await setActive({ session: sessionObj, organization: orgObj, diff --git a/packages/upgrade/source/versions/v5/common/usemagiclink.md b/packages/upgrade/source/versions/v5/common/usemagiclink.md index 86c49fbf73e..530de4daa12 100644 --- a/packages/upgrade/source/versions/v5/common/usemagiclink.md +++ b/packages/upgrade/source/versions/v5/common/usemagiclink.md @@ -4,4 +4,4 @@ matcher: 'useMagicLink' replaceWithString: 'useEmailLink' --- -Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. +Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. diff --git a/packages/upgrade/source/versions/v5/common/userprofile-prop.md b/packages/upgrade/source/versions/v5/common/userprofile-prop.md index 08985f014f4..7d040f838e5 100644 --- a/packages/upgrade/source/versions/v5/common/userprofile-prop.md +++ b/packages/upgrade/source/versions/v5/common/userprofile-prop.md @@ -5,4 +5,9 @@ matcherFlags: 'm' replaceWithString: 'userProfileProps' --- -The `userProfile` prop on [the `UserButton` component](https://clerk.com/docs/references/javascript/clerk/user-button#user-button-component) has been changed to `userProfileProps`. This is purely a name change, none of the values need to be updated +The `userProfile` prop on [the `UserButton` component](https://clerk.com/docs/references/javascript/clerk/user-button#user-button-component) has been changed to `userProfileProps`. This is purely a name change, none of the values need to be updated. + +```diff +- ++ +``` diff --git a/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md b/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md index ee8cf2bcfc2..f75409a28a2 100644 --- a/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md +++ b/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md @@ -4,14 +4,11 @@ matcher: "" matcherFlags: 'm' --- -The `frontendApi` prop passed to `ClerkProvider` must be changed to `publishableKey`. The value also must be updated to be a publishable key rather than a frontend API key, [here’s more information on how to do this](TODO) +The `frontendApi` prop passed to `ClerkProvider` must be changed to `publishableKey`. The value also must be updated to be a publishable key rather than a frontend API key. Publishable keys can be found in your Clerk dashboard. -```js +```diff import { ClerkProvider } from '@clerk/clerk-expo'; -// before - - -// after - +- ++ ``` diff --git a/packages/upgrade/source/versions/v5/fastify/api-url-value-change.md b/packages/upgrade/source/versions/v5/fastify/api-url-value-change.md index 2d35afe0b50..a961c23f31e 100644 --- a/packages/upgrade/source/versions/v5/fastify/api-url-value-change.md +++ b/packages/upgrade/source/versions/v5/fastify/api-url-value-change.md @@ -1,6 +1,8 @@ --- title: '`API_URL` value has changed' -matcher: "API_URL.*?from\\s['\"]@clerk\\/fastify\\/constants['\"]" +matcher: "API_URL[\\s\\S]*?from\\s*['\"]@clerk\\/fastify\\/constants['\"]" +matcherFlags: 'm' +warning: true --- The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/fastify/clerkplugin-frontendapi.md b/packages/upgrade/source/versions/v5/fastify/clerkplugin-frontendapi.md index 725f0a4e06d..f7b6d2d8530 100644 --- a/packages/upgrade/source/versions/v5/fastify/clerkplugin-frontendapi.md +++ b/packages/upgrade/source/versions/v5/fastify/clerkplugin-frontendapi.md @@ -6,12 +6,9 @@ matcherFlags: 'm' The `frontendApi` argument passed to `clerkPlugin` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. -```js +```diff import { clerkPlugin } from '@clerk/fastify'; -// before -fastify.register(clerkPlugin, { frontendApi: '...' }); - -// after -fastify.register(clerkPlugin, { publishableKey: '...' }); +- fastify.register(clerkPlugin, { frontendApi: '...' }); ++ fastify.register(clerkPlugin, { publishableKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/fastify/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/fastify/createclerkclient-apikey.md index 25668356ec3..de6cfeaa3a3 100644 --- a/packages/upgrade/source/versions/v5/fastify/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/fastify/createclerkclient-apikey.md @@ -1,17 +1,14 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkClient' -matcher: "createClerkClient\\({.*?apiKey:.*?}\\)" +matcher: "createClerkClient\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. -```js +```diff import { createClerkClient } from '@clerk/fastify'; -// before -createClerkClient({ apiKey: '...' }); - -// after -createClerkClient({ secretKey: '...' }); +- createClerkClient({ apiKey: '...' }); ++ createClerkClient({ secretKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/fastify/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/fastify/createclerkclient-frontendapi.md index 7703eb777dd..23752d682e4 100644 --- a/packages/upgrade/source/versions/v5/fastify/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/fastify/createclerkclient-frontendapi.md @@ -1,17 +1,14 @@ --- title: '`frontendApi` -> `publishableKey` as param to createClerkClient' -matcher: "createClerkClient\\({.*?frontendApi:.*?}\\)" +matcher: "createClerkClient\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. -```js +```diff import { createClerkClient } from '@clerk/fastify'; -// before -createClerkClient({ frontendApi: '...' }); - -// after -createClerkClient({ publishableKey: '...' }); +- createClerkClient({ frontendApi: '...' }); ++ createClerkClient({ publishableKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/gatsby/api-url-value-change.md b/packages/upgrade/source/versions/v5/gatsby/api-url-value-change.md index b036255442d..17614a4ed09 100644 --- a/packages/upgrade/source/versions/v5/gatsby/api-url-value-change.md +++ b/packages/upgrade/source/versions/v5/gatsby/api-url-value-change.md @@ -1,6 +1,8 @@ --- title: '`API_URL` value has changed' -matcher: "API_URL.*?from\\s['\"]gatsby-plugin-clerk\\/constants['\"]" +matcher: "import\\s+{[\\s\\S]*?[,\\s]API_URL[,\\s][\\s\\S]*?from\\s+['\"]gatsby-plugin-clerk\\/constants[\\s\\S]*?['\"]" +matcherFlags: 'm' +warning: true --- - The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/gatsby/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/gatsby/createclerkclient-apikey.md index b46b8836533..adef7da7c47 100644 --- a/packages/upgrade/source/versions/v5/gatsby/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/gatsby/createclerkclient-apikey.md @@ -1,17 +1,14 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkClient' -matcher: "createClerkClient\\({.*?apiKey:.*?}\\)" +matcher: "createClerkClient\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. -```js +```diff import { createClerkClient } from 'gatsby-plugin-clerk/api'; -// before -createClerkClient({ apiKey: '...' }); - -// after -createClerkClient({ secretKey: '...' }); +- createClerkClient({ apiKey: '...' }); ++ createClerkClient({ secretKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/gatsby/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/gatsby/createclerkclient-frontendapi.md index 0f62970cd7e..b2f26af61dd 100644 --- a/packages/upgrade/source/versions/v5/gatsby/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/gatsby/createclerkclient-frontendapi.md @@ -1,17 +1,14 @@ --- title: '`frontendApi` -> `publishableKey` as param to createClerkClient' -matcher: "createClerkClient\\({.*?frontendApi:.*?}\\)" +matcher: "createClerkClient\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. -```js +```diff import { createClerkClient } from 'gatsby-plugin-clerk/api'; -// before -createClerkClient({ frontendApi: '...' }); - -// after -createClerkClient({ publishableKey: '...' }); +- createClerkClient({ frontendApi: '...' }); ++ createClerkClient({ publishableKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/js/redirecttohome.md b/packages/upgrade/source/versions/v5/js/redirecttohome.md index d5e77512a90..f853cd3f2d2 100644 --- a/packages/upgrade/source/versions/v5/js/redirecttohome.md +++ b/packages/upgrade/source/versions/v5/js/redirecttohome.md @@ -10,4 +10,4 @@ To set the `afterSignUpUrl` or `afterSignInUrl`, you can: - [pass the desired values into ClerkProvider](https://clerk.com/docs/components/clerk-provider#properties) - if using nextjs SDK, set with `NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL` or `NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL` - if using remix SDK, set with `CLERK_AFTER_SIGN_IN_URL` or `CLERK_AFTER_SIGN_UP_URL` - - If not using a react-based SDK, they can be passed into `Clerk.load` as such: `Clerk.load({ afterSignUpUrl: ‘x’, afterSignInUrl: ‘y’ })` + - If not using a react-based SDK, they can be passed into `Clerk.load` as such: `Clerk.load({ afterSignUpUrl: 'x', afterSignInUrl: 'y' })` diff --git a/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md b/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md index 69ed5239588..bcd0aab6413 100644 --- a/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md +++ b/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md @@ -1,6 +1,7 @@ --- title: '`generatedSignature` -> `signature` as param of Signup.attemptWeb3WalletVerification()' -matcher: "attemptWeb3WalletVerification\\(\\s*{\\.*?generatedSignature:" +matcher: "attemptWeb3WalletVerification\\([\\s\\S]*?generatedSignature:[\\s\\S]*?\\)" +matcherFlags: 'm' --- The `generatedSignature` param to [`Signup.attemptWeb3WalletVerification()`](https://clerk.com/docs/references/javascript/sign-up/web3-verification#attempt-web3-wallet-verification) has been removed. Instead, use the `signature` param. Note that this param takes a string, where the `generatedSignature` param took a function, so both key and value will need to change. diff --git a/packages/upgrade/source/versions/v5/js/user-createexternalaccount-redirecturl.md b/packages/upgrade/source/versions/v5/js/user-createexternalaccount-redirecturl.md index c21cf3c7626..0d10932b0a6 100644 --- a/packages/upgrade/source/versions/v5/js/user-createexternalaccount-redirecturl.md +++ b/packages/upgrade/source/versions/v5/js/user-createexternalaccount-redirecturl.md @@ -1,6 +1,6 @@ --- title: '`redirect_url` -> `redirectUrl` as param of `User.createExternalAccount`' -matcher: "createExternalAccount\\(\\s*{\\.*?(redirect_url):" +matcher: "createExternalAccount\\(\\s*{[\\s\\S]*?(redirect_url):[\\s\\S]*?\\)" replaceWithString: 'redirectUrl' --- diff --git a/packages/upgrade/source/versions/v5/js/user-update-password.md b/packages/upgrade/source/versions/v5/js/user-update-password.md index eaecf6afa80..98f3327ded3 100644 --- a/packages/upgrade/source/versions/v5/js/user-update-password.md +++ b/packages/upgrade/source/versions/v5/js/user-update-password.md @@ -1,6 +1,6 @@ --- title: "`User.update({ password: 'x' })` -> `User.updatePassword('x')`" -matcher: "\\.update\\(\\s*{.*?password:" +matcher: "\\.update\\([\\s\\S]*?password:[\\s\\S]*?\\)" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/api-url-value-change.md b/packages/upgrade/source/versions/v5/next/api-url-value-change.md index ddac88159b3..0e1af39b8e0 100644 --- a/packages/upgrade/source/versions/v5/next/api-url-value-change.md +++ b/packages/upgrade/source/versions/v5/next/api-url-value-change.md @@ -2,6 +2,7 @@ title: '`API_URL` value has changed' matcher: "API_URL[\\s\\S]+?from\\s+['\"]@clerk\\/nextjs\\/server['\"]" matcherFlags: 'm' +warning: true --- The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md b/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md index 7f2f0ede54d..0478f7dfcba 100644 --- a/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md +++ b/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md @@ -4,6 +4,11 @@ matcher: "authMiddleware\\({[\\s\\S]*?frontendApi:[\\s\\S]*?}\\)" matcherFlags: 'm' --- - - The `frontendApi` argument passed to `authMiddleware` must be changed to `publishableKey` + +```diff +import { authMiddleware } from "@clerk/nextjs/server" + +- authMiddleware({ frontendApi: '...' }) ++ authMiddleware({ publishableKey: '...' }) +``` diff --git a/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md index cbe87e31b40..8ac315dbb30 100644 --- a/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md @@ -6,12 +6,9 @@ matcherFlags: 'm' The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. -```js +```diff import { createClerkClient } from '@clerk/nextjs/server'; -// before -createClerkClient({ apiKey: '...' }); - -// after -createClerkClient({ secretKey: '...' }); +- createClerkClient({ apiKey: '...' }); ++ createClerkClient({ secretKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md index 6d55766a93c..e8405f0f6a1 100644 --- a/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md @@ -6,12 +6,9 @@ matcherFlags: 'm' The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. -```js +```diff import { createClerkClient } from '@clerk/nextjs/server'; -// before -createClerkClient({ frontendApi: '...' }); - -// after -createClerkClient({ publishableKey: '...' }); +- createClerkClient({ frontendApi: '...' }); ++ createClerkClient({ publishableKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/next/getauth-apikey.md b/packages/upgrade/source/versions/v5/next/getauth-apikey.md index 57a33df3e50..fe75eaeed6f 100644 --- a/packages/upgrade/source/versions/v5/next/getauth-apikey.md +++ b/packages/upgrade/source/versions/v5/next/getauth-apikey.md @@ -4,6 +4,9 @@ matcher: "getAuth\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" matcherFlags: 'm' --- - +The `apiKey` argument passed to `getAuth` must be changed to `secretKey`. -The `apiKey` argument passed to `getAuth` must be changed to `secretKey` +```diff +- getAuth({ apiKey: '...' }) ++ getAuth({ secretKey: '...' }) +``` diff --git a/packages/upgrade/source/versions/v5/next/import-nextjs-api.md b/packages/upgrade/source/versions/v5/next/import-nextjs-api.md index 9c1bf8fd4fc..4ac9dea8d55 100644 --- a/packages/upgrade/source/versions/v5/next/import-nextjs-api.md +++ b/packages/upgrade/source/versions/v5/next/import-nextjs-api.md @@ -3,8 +3,6 @@ title: '`@clerk/nextjs/api` import removed' matcher: "@clerk\\/nextjs\\/api" --- - - The import subpath `@clerk/nextjs/api` has been removed. This includes the following imports: ```js diff --git a/packages/upgrade/source/versions/v5/node/api-url-value-change.md b/packages/upgrade/source/versions/v5/node/api-url-value-change.md index 6f200508938..1c8f12c98f5 100644 --- a/packages/upgrade/source/versions/v5/node/api-url-value-change.md +++ b/packages/upgrade/source/versions/v5/node/api-url-value-change.md @@ -1,6 +1,8 @@ --- title: '`API_URL` value has changed' -matcher: "API_URL.*?from\\s['\"]@clerk\\/clerk-sdk-node['\"]" +matcher: "import\\s+{[\\s\\S]*?[,\\s]API_URL[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/clerk-sdk-node[\\s\\S]*?['\"]" +matcherFlags: 'm' +warning: true --- The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md b/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md index 1c0026d0271..34c750541bf 100644 --- a/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md +++ b/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md @@ -6,11 +6,8 @@ replaceWithString: '' If you are using either of these import paths, they are no longer necessary and you can import directly from the top level `@clerk/express` path. -```js -// before -import { ... } from "@clerk/clerk-sdk-node/esm/instance"; -import { ... } from "@clerk/clerk-sdk-node/cjs/instance"; - -// after -import { ... } from "@clerk/clerk-sdk-node"; +```diff +- import { ... } from "@clerk/clerk-sdk-node/esm/instance"; +- import { ... } from "@clerk/clerk-sdk-node/cjs/instance"; ++ import { ... } from "@clerk/clerk-sdk-node"; ``` diff --git a/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-apikey.md b/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-apikey.md index 0fe88d44c7e..88df6bb6aea 100644 --- a/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-apikey.md +++ b/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-apikey.md @@ -1,17 +1,14 @@ --- title: '`apiKey` -> `secretKey` as param to ClerkExpressRequireAuth' -matcher: "ClerkExpressRequireAuth\\({.*?apiKey:.*?}\\)" +matcher: "ClerkExpressRequireAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `apiKey` argument passed to `ClerkExpressRequireAuth` must be changed to `secretKey`. -```js +```diff import { ClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; -// before -ClerkExpressRequireAuth({ apiKey: '...' }); - -// after -ClerkExpressRequireAuth({ secretKey: '...' }); +- ClerkExpressRequireAuth({ apiKey: '...' }); ++ ClerkExpressRequireAuth({ secretKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-frontendapi.md b/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-frontendapi.md index 9235f48b5c8..1a0a27d9078 100644 --- a/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-frontendapi.md +++ b/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-frontendapi.md @@ -1,17 +1,14 @@ --- title: '`frontendApi` -> `publishableKey` as param to ClerkExpressRequireAuth' -matcher: "ClerkExpressRequireAuth\\({.*?frontendApi:.*?}\\)" +matcher: "ClerkExpressRequireAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `frontendApi` argument passed to `ClerkExpressRequireAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. -```js +```diff import { ClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; -// before -ClerkExpressRequireAuth({ frontendApi: '...' }); - -// after -ClerkExpressRequireAuth({ publishableKey: '...' }); +- ClerkExpressRequireAuth({ frontendApi: '...' }); ++ ClerkExpressRequireAuth({ publishableKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-apikey.md b/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-apikey.md index 9aa0b049cc5..2125bf6419d 100644 --- a/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-apikey.md +++ b/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-apikey.md @@ -1,17 +1,14 @@ --- title: '`apiKey` -> `secretKey` as param to ClerkExpressWithAuth' -matcher: "ClerkExpressWithAuth\\({.*?apiKey:.*?}\\)" +matcher: "ClerkExpressWithAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `apiKey` argument passed to `ClerkExpressWithAuth` must be changed to `secretKey`. -```js +```diff import { ClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; -// before -ClerkExpressWithAuth({ apiKey: '...' }); - -// after -ClerkExpressWithAuth({ secretKey: '...' }); +- ClerkExpressWithAuth({ apiKey: '...' }); ++ ClerkExpressWithAuth({ secretKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-frontendapi.md b/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-frontendapi.md index 2b809d1e8a0..fad141fa71c 100644 --- a/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-frontendapi.md +++ b/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-frontendapi.md @@ -1,17 +1,14 @@ --- title: '`frontendApi` -> `publishableKey` as param to ClerkExpressWithAuth' -matcher: "ClerkExpressWithAuth\\({.*?frontendApi:.*?}\\)" +matcher: "ClerkExpressWithAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `frontendApi` argument passed to `ClerkExpressWithAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. -```js +```diff import { ClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; -// before -ClerkExpressWithAuth({ frontendApi: '...' }); - -// after -ClerkExpressWithAuth({ publishableKey: '...' }); +- ClerkExpressWithAuth({ frontendApi: '...' }); ++ ClerkExpressWithAuth({ publishableKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/node/createclerkclient-apikey.md index 4435c87ccad..415a7aba2cc 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/node/createclerkclient-apikey.md @@ -1,17 +1,14 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkClient' -matcher: "createClerkClient\\({.*?apiKey:.*?}\\)" +matcher: "createClerkClient\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. -```js +```diff import { createClerkClient } from '@clerk/clerk-sdk-node'; -// before -createClerkClient({ apiKey: '...' }); - -// after -createClerkClient({ secretKey: '...' }); +- createClerkClient({ apiKey: '...' }); ++ createClerkClient({ secretKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/node/createclerkclient-frontendapi.md index bca7da80ec7..76bee754ae8 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/node/createclerkclient-frontendapi.md @@ -1,17 +1,14 @@ --- title: '`frontendApi` -> `publishableKey` as param to createClerkClient' -matcher: "createClerkClient\\({.*?frontendApi:.*?}\\)" +matcher: "createClerkClient\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. -```js +```diff import { createClerkClient } from '@clerk/clerk-sdk-node'; -// before -createClerkClient({ frontendApi: '...' }); - -// after -createClerkClient({ publishableKey: '...' }); +- createClerkClient({ frontendApi: '...' }); ++ createClerkClient({ publishableKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-apikey.md b/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-apikey.md index 70bade1f6ee..626bb7781ef 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-apikey.md +++ b/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-apikey.md @@ -1,17 +1,14 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkExpressRequireAuth' -matcher: "createClerkExpressRequireAuth\\({.*?apiKey:.*?}\\)" +matcher: "createClerkExpressRequireAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `apiKey` argument passed to `createClerkExpressRequireAuth` must be changed to `secretKey`. -```js +```diff import { createClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; -// before -createClerkExpressRequireAuth({ apiKey: '...' }); - -// after -createClerkExpressRequireAuth({ secretKey: '...' }); +- createClerkExpressRequireAuth({ apiKey: '...' }); ++ createClerkExpressRequireAuth({ secretKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-frontendapi.md b/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-frontendapi.md index a2415c99728..b6e6521561e 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-frontendapi.md +++ b/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-frontendapi.md @@ -1,17 +1,14 @@ --- title: '`frontendApi` -> `publishableKey` as param to createClerkExpressRequireAuth' -matcher: "createClerkExpressRequireAuth\\({.*?frontendApi:.*?}\\)" +matcher: "createClerkExpressRequireAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `frontendApi` argument passed to `createClerkExpressRequireAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. -```js +```diff import { createClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; -// before -createClerkExpressRequireAuth({ frontendApi: '...' }); - -// after -createClerkExpressRequireAuth({ publishableKey: '...' }); +- createClerkExpressRequireAuth({ frontendApi: '...' }); ++ createClerkExpressRequireAuth({ publishableKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-apikey.md b/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-apikey.md index 8af23b82f7c..55155fb6de6 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-apikey.md +++ b/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-apikey.md @@ -1,17 +1,14 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkExpressWithAuth' -matcher: "createClerkExpressWithAuth\\({.*?apiKey:.*?}\\)" +matcher: "createClerkExpressWithAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `apiKey` argument passed to `createClerkExpressWithAuth` must be changed to `secretKey`. -```js +```diff import { createClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; -// before -createClerkExpressWithAuth({ apiKey: '...' }); - -// after -createClerkExpressWithAuth({ secretKey: '...' }); +- createClerkExpressWithAuth({ apiKey: '...' }); ++ createClerkExpressWithAuth({ secretKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-frontendapi.md b/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-frontendapi.md index b7ffd73bfbd..1eb81b56ab8 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-frontendapi.md +++ b/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-frontendapi.md @@ -1,17 +1,14 @@ --- title: '`frontendApi` -> `publishableKey` as param to createClerkExpressWithAuth' -matcher: "createClerkExpressWithAuth\\({.*?frontendApi:.*?}\\)" +matcher: "createClerkExpressWithAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" matcherFlags: 'm' --- The `frontendApi` argument passed to `createClerkExpressWithAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. -```js +```diff import { createClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; -// before -createClerkExpressWithAuth({ frontendApi: '...' }); - -// after -createClerkExpressWithAuth({ publishableKey: '...' }); +- createClerkExpressWithAuth({ frontendApi: '...' }); ++ createClerkExpressWithAuth({ publishableKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md b/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md index 40c87bf060f..fdc64dada27 100644 --- a/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md +++ b/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md @@ -15,12 +15,12 @@ We changed the values that our middleware adds to the `request` object after r debug: AuthObjectDebug | null; - claims: JwtPayload | null; - sessionClaims: JwtPayload | null; -+ orgId: string | undefined | null; -+ orgRole: OrganizationCustomRoleKey | undefined | null; -+ orgSlug: string | undefined | null; -+ orgPermissions: OrganizationCustomPermissionKey[] | undefined | null; -+ has: CheckAuthorizationWithCustomPermissions | null; - } ++ orgId: string | undefined | null; ++ orgRole: OrganizationCustomRoleKey | undefined | null; ++ orgSlug: string | undefined | null; ++ orgPermissions: OrganizationCustomPermissionKey[] | undefined | null; ++ has: CheckAuthorizationWithCustomPermissions | null; + } ``` If you were using the `claims` key on the request after running middleware, you will need to instead use `sessionClaims`. Additionally, if you were using the `LooseAuthProp` or `StrictAuthProp` exported types anywhere, note that these have been adjusted to fit the shape of the new middleware response typing. diff --git a/packages/upgrade/source/versions/v5/node/setclerkapikey.md b/packages/upgrade/source/versions/v5/node/setclerkapikey.md index 7312d1977d2..83771d97835 100644 --- a/packages/upgrade/source/versions/v5/node/setclerkapikey.md +++ b/packages/upgrade/source/versions/v5/node/setclerkapikey.md @@ -5,13 +5,11 @@ matcher: "setClerkApiKey\\(" Setters that change options on the singleton `clerkClient` instance have been removed. Instead, pass the option directly to `createClerkClient` - see [the documentation](https://clerk.com/docs/references/nodejs/overview#customizing-resources) for more detail. Note that the name `apiKey` should now be `secretKey` as well. -```js +```diff import { createClerkClient, setClerkApiKey } from '@clerk/clerk-sdk-node'; -// Before -const clerkClient = createClerkClient({ apiKey: '...' }); -setClerkApiKey('...'); +- const clerkClient = createClerkClient({ apiKey: '...' }); +- setClerkApiKey('...'); -// After -const clerkClient = createClerkClient({ secretKey: '...' }); ++ const clerkClient = createClerkClient({ secretKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/setclerkapiversion.md b/packages/upgrade/source/versions/v5/node/setclerkapiversion.md index e3c1b24dd56..1c0ec77a4fe 100644 --- a/packages/upgrade/source/versions/v5/node/setclerkapiversion.md +++ b/packages/upgrade/source/versions/v5/node/setclerkapiversion.md @@ -5,13 +5,11 @@ matcher: "setClerkApiVersion\\(" Setters that change options on the singleton `clerkClient` instance have been removed. Instead, pass the option directly to `createClerkClient` - see [the documentation](https://clerk.com/docs/references/nodejs/overview#customizing-resources) for more detail. -```js +```diff import { clerkClient, setClerkApiKey } from '@clerk/clerk-sdk-node'; -// Before -const clerkClient = createClerkClient({ apiKey: '...' }); -setClerkApiVersion('...'); +- const clerkClient = createClerkClient({ apiKey: '...' }); +- setClerkApiVersion('...'); -// After -const clerkClient = createClerkClient({ secretKey: '...', apiVersion: '...' }); ++ const clerkClient = createClerkClient({ secretKey: '...', apiVersion: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/setclerkhttpoptions.md b/packages/upgrade/source/versions/v5/node/setclerkhttpoptions.md index c47791debe0..b6199adef02 100644 --- a/packages/upgrade/source/versions/v5/node/setclerkhttpoptions.md +++ b/packages/upgrade/source/versions/v5/node/setclerkhttpoptions.md @@ -5,13 +5,11 @@ matcher: "setClerkHttpOptions\\(" Setters that change options on the singleton `clerkClient` instance have been removed. Instead, pass the option directly to `createClerkClient` - see [the documentation](https://clerk.com/docs/references/nodejs/overview#customizing-resources) for more detail. -```js +```diff import { clerkClient, setClerkApiKey } from '@clerk/clerk-sdk-node'; -// Before -const clerkClient = createClerkClient({ apiKey: '...' }); -setClerkHttpOptions('...'); +- const clerkClient = createClerkClient({ apiKey: '...' }); +- setClerkHttpOptions('...'); -// After -const clerkClient = createClerkClient({ secretKey: '...', httpOptions: '...' }); ++ const clerkClient = createClerkClient({ secretKey: '...', httpOptions: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/node/setclerkserverapiurl.md b/packages/upgrade/source/versions/v5/node/setclerkserverapiurl.md index 03abbd78720..6ffce520cc0 100644 --- a/packages/upgrade/source/versions/v5/node/setclerkserverapiurl.md +++ b/packages/upgrade/source/versions/v5/node/setclerkserverapiurl.md @@ -5,16 +5,14 @@ matcher: "setClerkServerApiUrl\\(" Setters that change options on the singleton `clerkClient` instance have been removed. Instead, pass the option directly to `createClerkClient` - see [the documentation](https://clerk.com/docs/references/nodejs/overview#customizing-resources) for more detail. -```js +```diff import { clerkClient, setClerkApiKey } from '@clerk/clerk-sdk-node'; -// Before -const clerkClient = createClerkClient({ apiKey: '...' }); -setClerkServerApiUrl('...'); +- const clerkClient = createClerkClient({ apiKey: '...' }); +- setClerkServerApiUrl('...'); -// After -const clerkClient = createClerkClient({ - secretKey: '...', - serverApiURL: '...', -}); ++ const clerkClient = createClerkClient({ ++ secretKey: '...', ++ serverApiURL: '...', ++ }); ``` diff --git a/packages/upgrade/source/versions/v5/react/api-url-value-change.md b/packages/upgrade/source/versions/v5/react/api-url-value-change.md index 8bd3b028f52..95b8beb227b 100644 --- a/packages/upgrade/source/versions/v5/react/api-url-value-change.md +++ b/packages/upgrade/source/versions/v5/react/api-url-value-change.md @@ -1,6 +1,8 @@ --- title: '`API_URL` value has changed' -matcher: "API_URL.*?from\\s['\"]@clerk\\/clerk-react['\"]" +matcher: "import\\s+{[\\s\\S]*?[,\\s]API_URL[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/clerk-react[\\s\\S]*?['\"]" +matcherFlags: 'm' +warning: true --- - The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md b/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md index 46c60859697..cfb9db7aa08 100644 --- a/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md +++ b/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md @@ -1,6 +1,7 @@ --- title: '`ClerkErrorBoundary` removed' matcher: "import\\s+{[\\s\\S]*?ClerkErrorBoundary[\\s\\S]*?from\\s+['\"]@clerk\\/remix[\\s\\S]*?['\"]" +matcherFlags: 'm' --- `ClerkErrorBoundary` is no longer needed for correct error handling in remix, so we have removed this function from the remix SDK, and it can be removed from your code as well. Example below: From ab90abea5c63db9f8de00c5c5e6decc4f81ce714 Mon Sep 17 00:00:00 2001 From: Lennart Date: Tue, 30 Jan 2024 17:11:15 +0100 Subject: [PATCH 088/159] chore(upgrade): Improvements (#2682) * chore(upgrade): Remove unnecessary files * chore(upgrade): Remove unnecessary deps and add clean script * chore(upgrade): Add proper ESLint * chore(upgrade): Delete more --- package-lock.json | 1283 ++++++++++-------------------- packages/upgrade/.editorconfig | 12 - packages/upgrade/.eslintrc.cjs | 4 + packages/upgrade/.gitattributes | 1 - packages/upgrade/.prettierignore | 1 - packages/upgrade/package.json | 109 ++- 6 files changed, 477 insertions(+), 933 deletions(-) delete mode 100644 packages/upgrade/.editorconfig create mode 100644 packages/upgrade/.eslintrc.cjs delete mode 100644 packages/upgrade/.gitattributes delete mode 100644 packages/upgrade/.prettierignore diff --git a/package-lock.json b/package-lock.json index 09698d1b09a..1ccd5577038 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9202,11 +9202,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vdemedes/prettier-config": { - "version": "2.0.1", - "dev": true, - "license": "ISC" - }, "node_modules/@vercel/webpack-asset-relocator-loader": { "version": "1.7.3", "dev": true, @@ -10264,14 +10259,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-find-index": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "dev": true, @@ -10385,14 +10372,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arrgv": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/arrify": { "version": "2.0.1", "dev": true, @@ -10529,296 +10508,6 @@ "postcss": "^8.1.0" } }, - "node_modules/ava": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.8.2", - "acorn-walk": "^8.2.0", - "ansi-styles": "^6.2.1", - "arrgv": "^1.0.2", - "arrify": "^3.0.0", - "callsites": "^4.0.0", - "cbor": "^8.1.0", - "chalk": "^5.2.0", - "chokidar": "^3.5.3", - "chunkd": "^2.0.1", - "ci-info": "^3.8.0", - "ci-parallel-vars": "^1.0.1", - "clean-yaml-object": "^0.1.0", - "cli-truncate": "^3.1.0", - "code-excerpt": "^4.0.0", - "common-path-prefix": "^3.0.0", - "concordance": "^5.0.4", - "currently-unhandled": "^0.4.1", - "debug": "^4.3.4", - "emittery": "^1.0.1", - "figures": "^5.0.0", - "globby": "^13.1.4", - "ignore-by-default": "^2.1.0", - "indent-string": "^5.0.0", - "is-error": "^2.2.2", - "is-plain-object": "^5.0.0", - "is-promise": "^4.0.0", - "matcher": "^5.0.0", - "mem": "^9.0.2", - "ms": "^2.1.3", - "p-event": "^5.0.1", - "p-map": "^5.5.0", - "picomatch": "^2.3.1", - "pkg-conf": "^4.0.0", - "plur": "^5.1.0", - "pretty-ms": "^8.0.0", - "resolve-cwd": "^3.0.0", - "stack-utils": "^2.0.6", - "strip-ansi": "^7.0.1", - "supertap": "^3.0.1", - "temp-dir": "^3.0.0", - "write-file-atomic": "^5.0.1", - "yargs": "^17.7.2" - }, - "bin": { - "ava": "entrypoints/cli.mjs" - }, - "engines": { - "node": ">=14.19 <15 || >=16.15 <17 || >=18" - }, - "peerDependencies": { - "@ava/typescript": "*" - }, - "peerDependenciesMeta": { - "@ava/typescript": { - "optional": true - } - } - }, - "node_modules/ava/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ava/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ava/node_modules/arrify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/callsites": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ava/node_modules/emittery": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/ava/node_modules/escape-string-regexp": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/figures": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/indent-string": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/is-plain-object": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ava/node_modules/is-promise": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ava/node_modules/matcher": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/mem": { - "version": "9.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sindresorhus/mem?sponsor=1" - } - }, - "node_modules/ava/node_modules/mimic-fn": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/ava/node_modules/p-map": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/parse-ms": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/pretty-ms": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-ms": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ava/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/ava/node_modules/write-file-atomic": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.5", "license": "MIT", @@ -11481,11 +11170,6 @@ "dev": true, "license": "MIT" }, - "node_modules/blueimp-md5": { - "version": "2.19.0", - "dev": true, - "license": "MIT" - }, "node_modules/body-parser": { "version": "1.20.1", "dev": true, @@ -12109,17 +11793,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/cbor": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=12.19" - } - }, "node_modules/cfonts": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cfonts/-/cfonts-3.2.0.tgz", @@ -12299,11 +11972,6 @@ "node": ">=6.0" } }, - "node_modules/chunkd": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/ci-env": { "version": "1.17.0", "dev": true, @@ -12322,11 +11990,6 @@ "node": ">=8" } }, - "node_modules/ci-parallel-vars": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/citty": { "version": "0.1.4", "dev": true, @@ -12382,14 +12045,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/clean-yaml-object": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cli-boxes": { "version": "2.2.1", "dev": true, @@ -13075,24 +12730,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/concordance": { - "version": "5.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "date-time": "^3.1.0", - "esutils": "^2.0.3", - "fast-diff": "^1.2.0", - "js-string-escape": "^1.0.1", - "lodash": "^4.17.15", - "md5-hex": "^3.0.1", - "semver": "^7.3.2", - "well-known-symbols": "^2.0.0" - }, - "engines": { - "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" - } - }, "node_modules/config-chain": { "version": "1.1.13", "dev": true, @@ -13973,17 +13610,6 @@ "dev": true, "license": "MIT" }, - "node_modules/currently-unhandled": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/d": { "version": "1.0.1", "dev": true, @@ -14057,17 +13683,6 @@ "url": "https://opencollective.com/date-fns" } }, - "node_modules/date-time": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "time-zone": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/debug": { "version": "4.3.4", "license": "MIT", @@ -14287,19 +13902,321 @@ "node": ">=14.18.0" } }, - "node_modules/default-browser/node_modules/is-stream": { - "version": "3.0.0", - "license": "MIT", + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/defaults": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", + "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", + "dev": true, + "dependencies": { + "globby": "^13.1.2", + "graceful-fs": "^4.2.10", + "is-glob": "^4.0.3", + "is-path-cwd": "^3.0.0", + "is-path-inside": "^4.0.0", + "p-map": "^5.5.0", + "rimraf": "^3.0.2", + "slash": "^4.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-5.1.0.tgz", + "integrity": "sha512-xwMeh2acluWeccsfzE7VLsG3yTr7nWikbfw+xhMnpRrF15pGSkw+3/vJZWlGoE4I86UiLRNHicmKt4tkIX9Jtg==", + "dev": true, + "dependencies": { + "del": "^7.1.0", + "meow": "^10.1.3" + }, + "bin": { + "del": "cli.js", + "del-cli": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/del-cli/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/del-cli/node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/del-cli/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli/node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-browser/node_modules/mimic-fn": { + "node_modules/del-cli/node_modules/redent": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, "engines": { "node": ">=12" }, @@ -14307,11 +14224,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-browser/node_modules/onetime": { - "version": "6.0.0", - "license": "MIT", + "node_modules/del-cli/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, "dependencies": { - "mimic-fn": "^4.0.0" + "min-indent": "^1.0.1" }, "engines": { "node": ">=12" @@ -14320,81 +14239,117 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-browser/node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "node_modules/defaults": { - "version": "1.0.4", + "node_modules/del-cli/node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", + "node_modules/del-cli/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", + "node_modules/del-cli/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/del-cli/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } }, - "node_modules/define-data-property": { - "version": "1.1.0", - "license": "MIT", + "node_modules/del/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", + "node_modules/del/node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "license": "MIT", + "node_modules/del/node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "aggregate-error": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "node_modules/del/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/del/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/delayed-stream": { @@ -15477,22 +15432,6 @@ "eslint": ">6.6.0" } }, - "node_modules/eslint-config-xo-react": { - "version": "0.27.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "peerDependencies": { - "eslint": ">=8.6.0", - "eslint-plugin-react": ">=7.29.0", - "eslint-plugin-react-hooks": ">=4.3.0" - } - }, "node_modules/eslint-import-resolver-alias": { "version": "1.1.2", "license": "MIT", @@ -16737,11 +16676,6 @@ "version": "3.1.3", "license": "MIT" }, - "node_modules/fast-diff": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/fast-fifo": { "version": "1.3.2", "dev": true, @@ -20147,14 +20081,6 @@ "node": ">= 4" } }, - "node_modules/ignore-by-default": { - "version": "2.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10 <11 || >=12 <13 || >=14" - } - }, "node_modules/ignore-walk": { "version": "5.0.1", "dev": true, @@ -20195,159 +20121,40 @@ } }, "node_modules/immutable": { - "version": "3.7.6", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-jsx": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.0", - "@babel/preset-react": "^7.18.6", - "find-cache-dir": "^4.0.0", - "make-dir": "^3.1.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/import-jsx/node_modules/find-cache-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-jsx/node_modules/find-up": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-jsx/node_modules/locate-path": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-jsx/node_modules/p-limit": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-jsx/node_modules/p-locate": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-jsx/node_modules/path-exists": { - "version": "5.0.0", + "version": "3.7.6", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=0.8.0" } }, - "node_modules/import-jsx/node_modules/pkg-dir": { - "version": "7.0.0", - "dev": true, + "node_modules/import-fresh": { + "version": "3.3.0", "license": "MIT", "dependencies": { - "find-up": "^6.3.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-jsx/node_modules/yocto-queue": { - "version": "1.0.0", + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=12.2" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -20495,22 +20302,6 @@ "ink": ">=4" } }, - "node_modules/ink-testing-library": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "peerDependencies": { - "@types/react": ">=18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/ink/node_modules/ansi-escapes": { "version": "6.2.0", "license": "MIT", @@ -20848,14 +20639,6 @@ "node": ">= 0.10" } }, - "node_modules/irregular-plurals": { - "version": "3.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-absolute": { "version": "1.0.0", "dev": true, @@ -21062,11 +20845,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-error": { - "version": "2.2.2", - "dev": true, - "license": "MIT" - }, "node_modules/is-extendable": { "version": "0.1.1", "license": "MIT", @@ -21243,6 +21021,18 @@ "node": ">=8" } }, + "node_modules/is-path-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "license": "MIT", @@ -23574,14 +23364,6 @@ "node": ">=12" } }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "license": "MIT" @@ -24861,17 +24643,6 @@ "node": ">=10" } }, - "node_modules/md5-hex": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "blueimp-md5": "^2.10.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/mdn-data": { "version": "2.0.14", "dev": true, @@ -25727,14 +25498,6 @@ "node": ">=6" } }, - "node_modules/nofilter": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.19" - } - }, "node_modules/normalize-package-data": { "version": "2.5.0", "license": "BSD-2-Clause", @@ -27123,108 +26886,6 @@ "node": ">= 6" } }, - "node_modules/pkg-conf": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.0.0", - "load-json-file": "^7.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/load-json-file": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-conf/node_modules/yocto-queue": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "devOptional": true, @@ -27393,20 +27054,6 @@ "node": ">=8.0" } }, - "node_modules/plur": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "irregular-plurals": "^3.3.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pluralize": { "version": "8.0.0", "license": "MIT", @@ -31416,56 +31063,6 @@ "dev": true, "license": "MIT" }, - "node_modules/supertap": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^5.0.0", - "js-yaml": "^3.14.1", - "serialize-error": "^7.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/supertap/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/supertap/node_modules/indent-string": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supertap/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/supports-color": { "version": "5.5.0", "license": "MIT", @@ -31704,14 +31301,6 @@ "streamx": "^2.15.0" } }, - "node_modules/temp-dir": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, "node_modules/term-size": { "version": "2.2.1", "dev": true, @@ -31988,14 +31577,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/time-zone": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/timers-ext": { "version": "0.1.7", "dev": true, @@ -34104,14 +33685,6 @@ "node": ">=0.8.0" } }, - "node_modules/well-known-symbols": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=6" - } - }, "node_modules/whatwg-encoding": { "version": "2.0.0", "dev": true, @@ -35714,7 +35287,7 @@ }, "packages/upgrade": { "name": "@clerk/upgrade", - "version": "0.0.1", + "version": "0.1.1", "license": "MIT", "dependencies": { "@inkjs/ui": "^1.0.0", @@ -35738,18 +35311,12 @@ "devDependencies": { "@babel/cli": "^7.21.0", "@babel/preset-react": "^7.18.6", - "@vdemedes/prettier-config": "^2.0.1", - "ava": "^5.2.0", "chalk": "^5.2.0", - "eslint-config-xo-react": "^0.27.0", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "import-jsx": "^5.0.0", - "ink-testing-library": "^3.0.0", - "prettier": "^2.8.7" + "del-cli": "^5.1.0", + "eslint-config-custom": "*" }, "engines": { - "node": ">=16" + "node": ">=18.17.0" } }, "packages/upgrade/@jescalan/ink-markdown": { diff --git a/packages/upgrade/.editorconfig b/packages/upgrade/.editorconfig deleted file mode 100644 index 1c6314a3183..00000000000 --- a/packages/upgrade/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -root = true - -[*] -indent_style = tab -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.yml] -indent_style = space -indent_size = 2 diff --git a/packages/upgrade/.eslintrc.cjs b/packages/upgrade/.eslintrc.cjs new file mode 100644 index 00000000000..c05d7d67503 --- /dev/null +++ b/packages/upgrade/.eslintrc.cjs @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom/node', 'custom/react'], +}; diff --git a/packages/upgrade/.gitattributes b/packages/upgrade/.gitattributes deleted file mode 100644 index 6313b56c578..00000000000 --- a/packages/upgrade/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/packages/upgrade/.prettierignore b/packages/upgrade/.prettierignore deleted file mode 100644 index 1521c8b7652..00000000000 --- a/packages/upgrade/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index e235098e94c..e011525b5cd 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,63 +1,50 @@ { - "name": "@clerk/upgrade", - "version": "0.1.1", - "license": "MIT", - "type": "module", - "bin": "dist/cli.js", - "files": [ - "dist" - ], - "scripts": { - "build": "babel --out-dir=dist source --copy-files", - "dev": "babel --out-dir=dist --watch source --copy-files", - "test": "prettier --check . && xo && ava" - }, - "babel": { - "presets": [ - "@babel/preset-react" - ] - }, - "ava": { - "environmentVariables": { - "NODE_NO_WARNINGS": "1" - }, - "nodeArguments": [ - "--loader=import-jsx" - ] - }, - "dependencies": { - "@inkjs/ui": "^1.0.0", - "@jescalan/ink-markdown": "^2.0.0", - "globby": "^14.0.0", - "gray-matter": "^4.0.3", - "index-to-position": "^0.1.2", - "ink": "^4.4.1", - "ink-big-text": "^2.0.0", - "ink-gradient": "^3.0.0", - "ink-link": "^3.0.0", - "marked": "^11.1.1", - "meow": "^11.0.0", - "react": "^18.2.0", - "read-pkg": "^9.0.1", - "semver-regex": "^4.0.5" - }, - "devDependencies": { - "@babel/cli": "^7.21.0", - "@babel/preset-react": "^7.18.6", - "@vdemedes/prettier-config": "^2.0.1", - "ava": "^5.2.0", - "chalk": "^5.2.0", - "eslint-config-xo-react": "^0.27.0", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "import-jsx": "^5.0.0", - "ink-testing-library": "^3.0.0", - "prettier": "^2.8.7" - }, - "engines": { - "node": ">=16" - }, - "publishConfig": { - "access": "public" - } + "name": "@clerk/upgrade", + "version": "0.1.1", + "license": "MIT", + "type": "module", + "main": "dist/cli.js", + "bin": "dist/cli.js", + "files": [ + "dist" + ], + "scripts": { + "build": "npm run clean && NODE_ENV=production babel --out-dir=dist source --copy-files", + "clean": "del-cli dist/*", + "dev": "babel --out-dir=dist --watch source --copy-files" + }, + "babel": { + "presets": [ + "@babel/preset-react" + ] + }, + "dependencies": { + "@inkjs/ui": "^1.0.0", + "@jescalan/ink-markdown": "^2.0.0", + "globby": "^14.0.0", + "gray-matter": "^4.0.3", + "index-to-position": "^0.1.2", + "ink": "^4.4.1", + "ink-big-text": "^2.0.0", + "ink-gradient": "^3.0.0", + "ink-link": "^3.0.0", + "marked": "^11.1.1", + "meow": "^11.0.0", + "react": "^18.2.0", + "read-pkg": "^9.0.1", + "semver-regex": "^4.0.5" + }, + "devDependencies": { + "@babel/cli": "^7.21.0", + "@babel/preset-react": "^7.18.6", + "chalk": "^5.2.0", + "del-cli": "^5.1.0", + "eslint-config-custom": "*" + }, + "engines": { + "node": ">=18.17.0" + }, + "publishConfig": { + "access": "public" + } } From ee0d1ce231c68b3036822e5b5b2a8c2df8dea53c Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 30 Jan 2024 15:35:11 -0500 Subject: [PATCH 089/159] feat(upgrade): Add deduping when scanning for multiple sdks --- packages/upgrade/source/scan.js | 271 +++++++++++++++++--------------- 1 file changed, 141 insertions(+), 130 deletions(-) diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index cd880da97bd..82bf7abfde5 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -1,147 +1,158 @@ -import React, { useState, useEffect } from 'react'; -import { Text, Newline, Box } from 'ink'; -import { globby } from 'globby'; -import fs from 'fs/promises'; -import path from 'path'; import { ProgressBar } from '@inkjs/ui'; +import fs from 'fs/promises'; +import { globby } from 'globby'; import indexToPosition from 'index-to-position'; +import { Newline, Text } from 'ink'; +import path from 'path'; +import React, { useEffect, useState } from 'react'; + import ExpandableList from './util/expandable-list.js'; export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarnings }) { - // NOTE: if the difference between fromVersion and toVersion is greater than 1 - // we need to do a little extra work here and import two matchers, - // sequence them after each other, and clearly mark which version migration - // applies to each log. - // - // This is not yet implemented though since the current state of the script - // only handles a single version. - const [status, setStatus] = useState('Initializing'); - const [progress, setProgress] = useState(0); - const [complete, setComplete] = useState(false); - const [matchers, setMatchers] = useState(); - const [files, setFiles] = useState(); - const [results, setResults] = useState([]); + // NOTE: if the difference between fromVersion and toVersion is greater than 1 + // we need to do a little extra work here and import two matchers, + // sequence them after each other, and clearly mark which version migration + // applies to each log. + // + // This is not yet implemented though since the current state of the script + // only handles a single version. + const [status, setStatus] = useState('Initializing'); + const [progress, setProgress] = useState(0); + const [complete, setComplete] = useState(false); + const [matchers, setMatchers] = useState(); + const [files, setFiles] = useState(); + const [results, setResults] = useState([]); + + // Load matchers + // ------------- + // result = `matchers` set to format: + // { sdkName: [{ title: 'x', matcher: /x/, slug: 'x', ... }] } + useEffect(() => { + setStatus(`Loading data for v${toVersion} migration`); + import(`./versions/v${toVersion}/index.js`).then(version => { + setMatchers( + sdks.reduce((m, sdk) => { + m[sdk] = version.default[sdk]; + return m; + }, {}), + ); + }); + }, [toVersion, sdks]); + + // Get all files from the glob matcher + // ----------------------------------- + // result = `files` set to format: ['/filename', '/other/filename'] + useEffect(() => { + setStatus('Collecting files to scan'); + ignore.push( + '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)+', // common image files + '**/*.(mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg)+', // common video files + ); + globby(path.resolve(dir), { ignore: [...ignore.filter(x => x)] }).then(files => { + setFiles(files); + }); + }, [dir, ignore]); - // Load matchers - // ------------- - // result = `matchers` set to format: - // { sdkName: [{ title: 'x', matcher: /x/, slug: 'x', ... }] } - useEffect(() => { - setStatus(`Loading data for v${toVersion} migration`); - import(`./versions/v${toVersion}/index.js`).then(version => { - setMatchers( - sdks.reduce((m, sdk) => { - m[sdk] = version.default[sdk]; - return m; - }, {}), - ); - }); - }, [toVersion]); + // Read files and scan regexes + // --------------------------- + // result = `results` set to format + useEffect(() => { + if (!matchers || !files) return; + const allResults = {}; - // Get all files from the glob matcher - // ----------------------------------- - // result = `files` set to format: ['/filename', '/other/filename'] - useEffect(() => { - setStatus('Collecting files to scan'); - ignore.push( - '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)+', // common image files - '**/*.(mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg)+', // common video files - ); - globby(path.resolve(dir), { ignore: [...ignore.filter(x => x)] }).then(files => { - setFiles(files); - }); - }, [dir, ignore]); + Promise.all( + // first we read all the files + files.map(async (file, idx) => { + const content = await fs.readFile(file, 'utf8'); - // Read files and scan regexes - // --------------------------- - // result = `results` set to format - // - useEffect(() => { - if (!matchers || !files) return; - const allResults = {}; + // then we run each of the matchers against the file contents + for (const sdk in matchers) { + // returns [{ ...matcher, instances: [{sdk, file, position}] }] + matchers[sdk].map(matcherConfig => { + // run regex against file content, return array of matches + // matcher can be an array or string + let matches = []; + if (Array.isArray(matcherConfig.matcher)) { + matcherConfig.matcher.map(m => { + matches = matches.concat(Array.from(content.matchAll(m))); + }); + } else { + matches = Array.from(content.matchAll(matcherConfig.matcher)); + } + if (matches.length < 1) return; - Promise.all( - // first we read all the files - files.map(async (file, idx) => { - const content = await fs.readFile(file, 'utf8'); + // for each match, add to `instances` array + matches.map(match => { + if (noWarnings && matcherConfig.warning) return; - // then we run each of the matchers against the file contents - for (const sdk in matchers) { - // returns [{ ...matcher, instances: [{sdk, file, position}] }] - matchers[sdk].map(matcherConfig => { - // run regex against file content, return array of matches - // matcher can be an array or string - let matches = []; - if (Array.isArray(matcherConfig.matcher)) { - matcherConfig.matcher.map(m => { - matches = matches.concat(Array.from(content.matchAll(m))); - }); - } else { - matches = Array.from(content.matchAll(matcherConfig.matcher)); - } - if (matches.length < 1) return; + // create if not exists + if (!allResults[matcherConfig.title]) + allResults[matcherConfig.title] = { instances: [], ...matcherConfig }; - // for each match, add to `instances` array of a key, create if not exists - matches.map(match => { - if (noWarnings && matcherConfig.warning) return; + const position = indexToPosition(content, match.index, { oneBased: true }); + const fileRelative = path.relative(process.cwd(), file); - if (!allResults[matcherConfig.title]) - allResults[matcherConfig.title] = { instances: [], ...matcherConfig }; + // when scanning for multiple SDKs, you can get a double match, this logic ensures you don't + if ( + allResults[matcherConfig.title].instances.filter(i => { + return ( + i.position.line === position.line && + i.position.column === position.column && + i.file === fileRelative + ); + }).length > 0 + ) + return; - // TODO: there's a small bug where we can see multiple instances of the same position - allResults[matcherConfig.title].instances.push({ - sdk, - file: path.relative(process.cwd(), file), - position: indexToPosition(content, match.index, { oneBased: true }), - }); - }); - }); - } + allResults[matcherConfig.title].instances.push({ + sdk, + position, + file: fileRelative, + }); + }); + }); + } - setStatus(`Scanning ${file}`); - setProgress(Math.ceil((idx / files.length) * 100)); - }), - ) - .then(() => { - setResults([...results, ...Object.keys(allResults).map(k => allResults[k])]); + setStatus(`Scanning ${file}`); + setProgress(Math.ceil((idx / files.length) * 100)); + }), + ) + .then(() => { + setResults([...results, ...Object.keys(allResults).map(k => allResults[k])]); - setComplete(true); - if (Object.keys(allResults).length < 1) { - setStatus('It looks like you have nothing you need to change, upgrade away!'); - } else { - setStatus('File scan complete. See results below!'); - } - }) - .catch(err => { - console.error(err); - }); - }, [matchers, files]); + setComplete(true); + if (Object.keys(allResults).length < 1) { + setStatus('It looks like you have nothing you need to change, upgrade away!'); + } else { + setStatus('File scan complete. See results below!'); + } + }) + .catch(err => { + console.error(err); + }); + }, [matchers, files, noWarnings]); - return ( - <> - {complete ? ( - <> - ✓ {status} - - {!!results.length && } - - ) : ( - <> - - {status} - - )} - - ); + return complete ? ( + <> + ✓ {status} + + {!!results.length && } + + ) : ( + <> + + {status} + + ); } From 104c99003fc1f498e872fe4fcef96f023098305d Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 30 Jan 2024 15:41:26 -0500 Subject: [PATCH 090/159] chore(upgrade): Apply linting to all files --- packages/upgrade/source/app.js | 387 +++++++++--------- packages/upgrade/source/cli.js | 47 +-- packages/upgrade/source/constants/sdks.js | 30 +- packages/upgrade/source/constants/versions.js | 4 +- .../upgrade/source/util/expandable-list.js | 375 +++++++++-------- .../upgrade/source/util/generate-changelog.js | 33 +- .../source/util/generate-export-change.js | 28 -- .../upgrade/source/util/get-clerk-version.js | 6 +- .../upgrade/source/util/guess-framework.js | 29 +- packages/upgrade/source/util/load-change.js | 50 +-- .../upgrade/source/util/step-sequencer.js | 38 +- 11 files changed, 500 insertions(+), 527 deletions(-) delete mode 100644 packages/upgrade/source/util/generate-export-change.js diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index bbfa2e44b4e..11906802c06 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -1,135 +1,136 @@ +import { MultiSelect, Select, TextInput } from '@inkjs/ui'; +import { Newline, Text } from 'ink'; +import BigText from 'ink-big-text'; +import Gradient from 'ink-gradient'; import React, { useState } from 'react'; -import { Text, Newline } from 'ink'; -import { Select, MultiSelect, TextInput } from '@inkjs/ui'; + import SDKS from './constants/sdks.js'; -import VERSIONS from './constants/versions.js'; import Scan from './scan.js'; -import guessFrameworks from './util/guess-framework.js'; import getClerkMajorVersion from './util/get-clerk-version.js'; -import Gradient from 'ink-gradient'; -import BigText from 'ink-big-text'; +import guessFrameworks from './util/guess-framework.js'; export default function App({ - _fromVersion, - _toVersion, - _sdk, - _dir = false, - _ignore = [], - _yolo = false, - noWarnings = false, + _fromVersion, + _toVersion, + _sdk, + _dir = false, + _ignore = [], + _yolo = false, + noWarnings = false, }) { - const [yolo, setYolo] = useState(_yolo); - const [sdks, setSdks] = useState(_sdk ? [_sdk] : []); - const [sdkGuesses, setSdkGuesses] = useState([]); - const [sdkGuessConfirmed, setSdkGuessConfirmed] = useState(false); - const [sdkGuessAttempted, setSdkGuessAttempted] = useState(false); - const [fromVersion, setFromVersion] = useState(_fromVersion); - const [fromVersionGuessAttempted, fromVersionSdkGuessAttempted] = useState(false); - const [toVersion, setToVersion] = useState(_toVersion); - const [dir, setDir] = useState(_dir); - const [ignore, setIgnore] = useState(_ignore); - const [configComplete, setConfigComplete] = useState(false); - const [configVerified, setConfigVerified] = useState(false); - let fromVersionGuess = false; + const [yolo, setYolo] = useState(_yolo); + const [sdks, setSdks] = useState(_sdk ? [_sdk] : []); + const [sdkGuesses, setSdkGuesses] = useState([]); + const [sdkGuessConfirmed, setSdkGuessConfirmed] = useState(false); + const [sdkGuessAttempted, setSdkGuessAttempted] = useState(false); + const [fromVersion, setFromVersion] = useState(_fromVersion); + const [fromVersionGuessAttempted, setFromVersionGuessAttempted] = useState(false); + const [toVersion, setToVersion] = useState(_toVersion); + const [dir, setDir] = useState(_dir); + const [ignore, setIgnore] = useState(_ignore); + const [configComplete, setConfigComplete] = useState(false); + const [configVerified, setConfigVerified] = useState(false); + let fromVersionGuess = false; - if (yolo) { - setSdks(SDKS.map(s => s.value)); - setYolo(false); - } + if (yolo) { + setSdks(SDKS.map(s => s.value)); + setYolo(false); + } - // We try to guess which SDK they are using - if (isEmpty(sdks) && isEmpty(sdkGuesses) && !sdkGuessAttempted) { - if (!dir) return setDir(process.cwd()); - setSdkGuesses(guessFrameworks(dir)); // this is the suspect line - setSdkGuessAttempted(true); - } + // We try to guess which SDK they are using + if (isEmpty(sdks) && isEmpty(sdkGuesses) && !sdkGuessAttempted) { + if (!dir) return setDir(process.cwd()); + setSdkGuesses(guessFrameworks(dir)); // this is the suspect line + setSdkGuessAttempted(true); + } - // We try to guess which version of Clerk they are using - if (!fromVersion && !fromVersionGuess && !fromVersionGuessAttempted) { - fromVersionGuess = getClerkMajorVersion(); - setFromVersionGuessAttempted(true); - } + // We try to guess which version of Clerk they are using + if (!fromVersion && !fromVersionGuess && !fromVersionGuessAttempted) { + fromVersionGuess = getClerkMajorVersion(); + setFromVersionGuessAttempted(true); + } - // No support for v3 or below, sadly - if (parseInt(fromVersion) < 4) { - return We're so sorry, but this tool only supports migration from version 4 and above.; - } + // No support for v3 or below, sadly + if (parseInt(fromVersion) < 4) { + return We're so sorry, but this tool only supports migration from version 4 and above.; + } - // If they are trying to/from the same version, that's an error - if (parseInt(fromVersion) === parseInt(toVersion)) { - return You are already on version {toVersion}, so there's no need to migrate!; - } + // If they are trying to/from the same version, that's an error + if (parseInt(fromVersion) === parseInt(toVersion)) { + return You are already on version {toVersion}, so there's no need to migrate!; + } - return ( - <> - - - - {/* Welcome to the upgrade script! */} - {!configComplete && ( - <> - - Hello friend! We're excited to help you upgrade Clerk - {fromVersion ? ` from v${fromVersion}` : ''} - {toVersion ? ` to v${toVersion}` : ''}. Before we get started, a couple questions... - - - - )} + return ( + <> + + + - {/* Verify our guess at what their SDK is, if we have one */} - {isEmpty(sdks) && !isEmpty(sdkGuesses) && !sdkGuessConfirmed && ( - <> - {sdkGuesses.length > 1 ? ( - <> - It looks like you are using the following Clerk SDKs in your project: - {sdkGuesses.map(guess => ( - - {' '}- {guess.label} - - ))} - Is that right? - - ) : ( - - It looks like you are using the "{sdkGuesses[0].label}" Clerk SDK in your project. Is that right? - - )} + {/* Welcome to the upgrade script! */} + {!configComplete && ( + <> + + Hello friend! We're excited to help you upgrade Clerk + {fromVersion ? ` from v${fromVersion}` : ''} + {toVersion ? ` to v${toVersion}` : ''}. Before we get started, a couple questions... + + + + )} - { + setSdkGuessConfirmed(true); + // if true, we were right so we set the sdk + if (item === 'yes') setSdks(sdkGuesses.map(guess => guess.value)); + }} + /> + + )} + + {/* If we tried to guess and failed, user must manually select */} + {isEmpty(sdks) && isEmpty(sdkGuesses) && ( + <> + Please select which Clerk SDK(s) you're using for your app: + (select with space bar, multiple can be selected, press enter when finished) + setSdks(value)} + visibleOptionCount={SDKS.length} + /> + + )} + {/* NOTE: The sections below will not render for the current version of this tool because we only support migrating v4 to v5 right now, so they have been commented out to make this clear. */} - {/* If we couldn't find their clerk version, verify it */} - {/* {!fromVersion && !fromVersionGuessAttempted && fromVersionGuess && ( + {/* If we couldn't find their clerk version, verify it */} + {/* {!fromVersion && !fromVersionGuessAttempted && fromVersionGuess && ( <> It looks like you currently are using version {fromVersionGuess} of @@ -148,8 +149,8 @@ export default function App({ /> )} */} - {/* If we tried to guess and failed, user must manually select */} - {/* {fromVersionGuessAttempted && !fromVersion && ( + {/* If we tried to guess and failed, user must manually select */} + {/* {fromVersionGuessAttempted && !fromVersion && ( <> Please select which major version of the Clerk {sdk} SDK you are @@ -161,8 +162,8 @@ export default function App({ /> )} */} - {/* Specify which version the user would like to migrate to */} - {/* {!toVersion && ( + {/* Specify which version the user would like to migrate to */} + {/* {!toVersion && ( <> Please select which major version of the Clerk {sdk} SDK you would like to migrate to: @@ -173,85 +174,83 @@ export default function App({ /> )} */} - {!isEmpty(sdks) > 0 && fromVersion && toVersion && !dir && ( - <> - Where would you like for us to scan for files in your project? - (globstar syntax supported) - setDir(val)} - /> - - )} - {!isEmpty(sdks) && fromVersion && toVersion && dir && isEmpty(ignore) && !configComplete && ( - <> - - Are there any files or directories you'd like to ignore? If so, you can add them below, separated by commas. - We ignore "node_modules" and ".git" by default. - - (globstar syntax supported) - { - setIgnore(val.includes(',') ? val.split(/\s*,\s*/) : [].concat(val)); - setConfigComplete(true); - }} - /> - - )} - {configComplete && !configVerified && ( - <> - Ok, here's our configuration: - - - Clerk {sdks.length > 1 ? 'SDKs' : 'SDK'} used: - {sdks.toString()} - - - Migrating from - v{fromVersion} - to - v{toVersion} - - - Looking in the directory - {dir} - {ignore.length > 0 && ( - <> - and ignoring - {ignore.join(', ')} - - )} - - - Does this look right? - { + if (!value) { + process.exit(); + } else { + setConfigVerified(true); + } + }} + /> + + )} + + {configVerified && } + + ); } // small util to make the logic blocks easier to visually parse function isEmpty(arr) { - return !arr.length; + return !arr.length; } diff --git a/packages/upgrade/source/cli.js b/packages/upgrade/source/cli.js index a1525d7ea4b..5fdae08efc0 100644 --- a/packages/upgrade/source/cli.js +++ b/packages/upgrade/source/cli.js @@ -1,12 +1,13 @@ #!/usr/bin/env node -import React from 'react'; import { render } from 'ink'; import meow from 'meow'; +import React from 'react'; + import App from './app.js'; import sdks from './constants/sdks.js'; const cli = meow( - ` + ` Usage $ clerk-upgrade @@ -21,28 +22,28 @@ const cli = meow( Examples $ clerk-upgrade --sdk=nextjs --dir=src/** `, - { - importMeta: import.meta, - flags: { - from: { type: 'string', default: '4' }, - to: { type: 'string', default: '5' }, - sdk: { type: 'string', choices: sdks.map(i => i.value) }, - dir: { type: 'string' }, - ignore: { type: 'string', isMultiple: true }, - yolo: { type: 'boolean' }, - noWarnings: { type: 'boolean' }, - }, - }, + { + importMeta: import.meta, + flags: { + from: { type: 'string', default: '4' }, + to: { type: 'string', default: '5' }, + sdk: { type: 'string', choices: sdks.map(i => i.value) }, + dir: { type: 'string' }, + ignore: { type: 'string', isMultiple: true }, + yolo: { type: 'boolean' }, + noWarnings: { type: 'boolean' }, + }, + }, ); render( - , - // { debug: true }, if having issues with errors being swallowed, uncomment this + , + // { debug: true }, if having issues with errors being swallowed, uncomment this ); diff --git a/packages/upgrade/source/constants/sdks.js b/packages/upgrade/source/constants/sdks.js index 75bd86986ac..3468bb3de9a 100644 --- a/packages/upgrade/source/constants/sdks.js +++ b/packages/upgrade/source/constants/sdks.js @@ -1,17 +1,17 @@ export default [ - { label: '@clerk/nextjs', value: 'nextjs' }, - { label: '@clerk/remix', value: 'remix' }, - { label: 'gatsby-plugin-clerk', value: 'gatsby' }, - { label: '@clerk/redwood', value: 'redwood' }, - { label: '@clerk/react', value: 'react' }, - { label: '@clerk/expo', value: 'expo' }, - { label: '@clerk/fastify', value: 'fastify' }, - { label: '@clerk/express', value: 'express' }, - { label: '@clerk/clerk-js', value: 'js' }, - { label: '@clerk/clerk-sdk-node', value: 'node' }, - { label: '@clerk/backend', value: 'backend' }, - { label: '@clerk/localizations', value: 'localizations' }, - { label: '@clerk/shared', value: 'shared' }, - { label: '@clerk/types', value: 'types' }, - { label: '@clerk/chrome-extension', value: 'chromeExtension' }, + { label: '@clerk/nextjs', value: 'nextjs' }, + { label: '@clerk/remix', value: 'remix' }, + { label: 'gatsby-plugin-clerk', value: 'gatsby' }, + { label: '@clerk/redwood', value: 'redwood' }, + { label: '@clerk/react', value: 'react' }, + { label: '@clerk/expo', value: 'expo' }, + { label: '@clerk/fastify', value: 'fastify' }, + { label: '@clerk/express', value: 'express' }, + { label: '@clerk/clerk-js', value: 'js' }, + { label: '@clerk/clerk-sdk-node', value: 'node' }, + { label: '@clerk/backend', value: 'backend' }, + { label: '@clerk/localizations', value: 'localizations' }, + { label: '@clerk/shared', value: 'shared' }, + { label: '@clerk/types', value: 'types' }, + { label: '@clerk/chrome-extension', value: 'chromeExtension' }, ]; diff --git a/packages/upgrade/source/constants/versions.js b/packages/upgrade/source/constants/versions.js index 8a3c3d52f2e..bc9dde31842 100644 --- a/packages/upgrade/source/constants/versions.js +++ b/packages/upgrade/source/constants/versions.js @@ -1,4 +1,4 @@ export default [ - { label: 'v5', value: 5 }, - { label: 'v4', value: 4 }, + { label: 'v5', value: 5 }, + { label: 'v4', value: 4 }, ]; diff --git a/packages/upgrade/source/util/expandable-list.js b/packages/upgrade/source/util/expandable-list.js index 5480b523221..f6a9256f568 100644 --- a/packages/upgrade/source/util/expandable-list.js +++ b/packages/upgrade/source/util/expandable-list.js @@ -1,204 +1,203 @@ -import React, { useReducer, useMemo } from 'react'; -import { Text, Newline, useInput, Box } from 'ink'; -import Link from 'ink-link'; import Markdown from '@jescalan/ink-markdown'; +import { Box, Newline, Text, useInput } from 'ink'; +import React, { useReducer } from 'react'; // A listing of items which can be navigated with arrow keys and expanded/contracted // with space bar. Limits the number visible at a time to prevent rendering issues with // super long lists export default function ExpandableList({ items, numberVisible = 10 }) { - // set up our little state machine - const [state, dispatch] = useReducer(reducer, items, items => { - // add focused/expanded state on the set of items - const all = items.map((i, idx) => { - i.focused = idx === 0 ? true : false; - i.expanded = false; - return i; - }); - - // start idx, end idx - const visible = [0, numberVisible]; - - return { numberVisible, all, visible }; - }); - - // this is what lets us respond to keyboard input - useInput((input, key) => { - if (key.downArrow) { - dispatch({ type: 'focus-next-option' }); - } - - if (key.upArrow) { - dispatch({ type: 'focus-previous-option' }); - } - - if (input === ' ') { - dispatch({ type: 'toggle-focused-option' }); - } - }); - - // and here's the actual markup we render for each list item! - return ( - <> - Navigation Instructions: - - Navigate through items with ↑ and ↓ arrow keys. Expand the details of any item with space bar. ↓ key on the last - item goes to the next page, ↑ on the first item goes to the previous page. To exit this interface, use "control - + c". - - - - {state.all.reduce((memo, item, idx) => { - if (idx < state.visible[0] || idx >= state.visible[1]) return memo; - - const locations = item.instances.map( - instance => `${instance.file}:${instance.position.line}:${instance.position.column}`, - ); - - memo.push( - - {item.title} - {locations.length > 1 ? ( - Found {locations.length} instances, expand for detail - ) : ( - Location: {locations[0]} - )} - {item.expanded && ( - <> - - - {locations.length > 1 && ( - <> - Locations: - {locations.map(loc => ( - - {' '}- {loc} - - ))} - - - )} - - {item.warning && ( - <> - - ⚠️ This is a WARNING and will still match even if you corrected the issue or if no correction is - necessary. To dismiss warnings, pass the `--noWarnings` flag to the CLI when running. - - - - )} - - - - {/* This didn't feel like useful information, but keeping it for future reference */} - {/* changed in {item.sdk} SDK */} - {item.content} - {/* We are not generating the upgrade guide from the slugs this round, so this is commented out */} - {/* */} - {/* */} - {/* + // set up our little state machine + const [state, dispatch] = useReducer(reducer, items, items => { + // add focused/expanded state on the set of items + const all = items.map((i, idx) => { + i.focused = idx === 0 ? true : false; + i.expanded = false; + return i; + }); + + // start idx, end idx + const visible = [0, numberVisible]; + + return { numberVisible, all, visible }; + }); + + // this is what lets us respond to keyboard input + useInput((input, key) => { + if (key.downArrow) { + dispatch({ type: 'focus-next-option' }); + } + + if (key.upArrow) { + dispatch({ type: 'focus-previous-option' }); + } + + if (input === ' ') { + dispatch({ type: 'toggle-focused-option' }); + } + }); + + // and here's the actual markup we render for each list item! + return ( + <> + Navigation Instructions: + + Navigate through items with ↑ and ↓ arrow keys. Expand the details of any item with space bar. ↓ key on the last + item goes to the next page, ↑ on the first item goes to the previous page. To exit this interface, use "control + + c". + + + + {state.all.reduce((memo, item, idx) => { + if (idx < state.visible[0] || idx >= state.visible[1]) return memo; + + const locations = item.instances.map( + instance => `${instance.file}:${instance.position.line}:${instance.position.column}`, + ); + + memo.push( + + {item.title} + {locations.length > 1 ? ( + Found {locations.length} instances, expand for detail + ) : ( + Location: {locations[0]} + )} + {item.expanded && ( + <> + + + {locations.length > 1 && ( + <> + Locations: + {locations.map(loc => ( + + {' '}- {loc} + + ))} + + + )} + + {item.warning && ( + <> + + ⚠️ This is a WARNING and will still match even if you corrected the issue or if no correction is + necessary. To dismiss warnings, pass the `--noWarnings` flag to the CLI when running. + + + + )} + + + + {/* This didn't feel like useful information, but keeping it for future reference */} + {/* changed in {item.sdk} SDK */} + {item.content} + {/* We are not generating the upgrade guide from the slugs this round, so this is commented out */} + {/* */} + {/* */} + {/* Open in migration guide » */} - - )} - , - ); - return memo; - }, [])} - - {state.all.length > state.numberVisible && ( - - Showing {state.visible[0] + 1} - {Math.min(state.visible[1], state.all.length)} of {state.all.length} - - )} - - ); + + )} + , + ); + return memo; + }, [])} + + {state.all.length > state.numberVisible && ( + + Showing {state.visible[0] + 1} - {Math.min(state.visible[1], state.all.length)} of {state.all.length} + + )} + + ); } const Line = () => ( - + ); // I'd like to recognize that this logic is kinda crazy, but it works 💖 function reducer(state, action) { - if (action.type === 'focus-next-option') { - let nextIdx; - - // if the current item is focused and a next item exists - // un-focus it and tee up the next one to be focused - const all = state.all.map((item, idx) => { - if (item.focused && state.all[idx + 1]) { - nextIdx = idx + 1; - item.focused = false; - return item; - } - - if (idx === nextIdx) { - item.focused = true; - return item; - } - - return item; - }); - - // if we're scrolling past the last item in the list, shift the visible window - let visible = state.visible; - if (nextIdx >= state.visible[1]) { - visible = [state.visible[0] + state.numberVisible, state.visible[1] + state.numberVisible]; - } - - return { all, visible, numberVisible: state.numberVisible }; - } - - if (action.type === 'focus-previous-option') { - let nextIdx; - - // if the next item is focused, focus this one and tee up the next one to be un-focused - const all = state.all.map((item, idx) => { - if (state.all[idx + 1]?.focused) { - item.focused = true; - nextIdx = idx + 1; - return item; - } - - if (idx === nextIdx) { - item.focused = false; - return item; - } - - return item; - }); - - // if we're scrolling to before the first item in the list, shift the visible window - let visible = state.visible; - if (nextIdx - 1 < state.visible[0]) { - visible = [state.visible[0] - state.numberVisible, state.visible[1] - state.numberVisible]; - } - - return { all, visible, numberVisible: state.numberVisible }; - } - - // if the space bar is hit, toggle expand/contract on the currently focused item - if (action.type === 'toggle-focused-option') { - const all = state.all.map(item => { - if (item.focused) { - item.expanded = !item.expanded; - } - return item; - }); - console.log(''); // this is strange but seems to solve a rendering bug - return { all, visible: state.visible, numberVisible: state.numberVisible }; - } + if (action.type === 'focus-next-option') { + let nextIdx; + + // if the current item is focused and a next item exists + // un-focus it and tee up the next one to be focused + const all = state.all.map((item, idx) => { + if (item.focused && state.all[idx + 1]) { + nextIdx = idx + 1; + item.focused = false; + return item; + } + + if (idx === nextIdx) { + item.focused = true; + return item; + } + + return item; + }); + + // if we're scrolling past the last item in the list, shift the visible window + let visible = state.visible; + if (nextIdx >= state.visible[1]) { + visible = [state.visible[0] + state.numberVisible, state.visible[1] + state.numberVisible]; + } + + return { all, visible, numberVisible: state.numberVisible }; + } + + if (action.type === 'focus-previous-option') { + let nextIdx; + + // if the next item is focused, focus this one and tee up the next one to be un-focused + const all = state.all.map((item, idx) => { + if (state.all[idx + 1]?.focused) { + item.focused = true; + nextIdx = idx + 1; + return item; + } + + if (idx === nextIdx) { + item.focused = false; + return item; + } + + return item; + }); + + // if we're scrolling to before the first item in the list, shift the visible window + let visible = state.visible; + if (nextIdx - 1 < state.visible[0]) { + visible = [state.visible[0] - state.numberVisible, state.visible[1] - state.numberVisible]; + } + + return { all, visible, numberVisible: state.numberVisible }; + } + + // if the space bar is hit, toggle expand/contract on the currently focused item + if (action.type === 'toggle-focused-option') { + const all = state.all.map(item => { + if (item.focused) { + item.expanded = !item.expanded; + } + return item; + }); + console.log(''); // this is strange but seems to solve a rendering bug + return { all, visible: state.visible, numberVisible: state.numberVisible }; + } } diff --git a/packages/upgrade/source/util/generate-changelog.js b/packages/upgrade/source/util/generate-changelog.js index 2e50ffed1eb..2e1301aabea 100644 --- a/packages/upgrade/source/util/generate-changelog.js +++ b/packages/upgrade/source/util/generate-changelog.js @@ -1,34 +1,35 @@ -import SDKS from '../constants/sdks.js'; import { parseInline } from 'marked'; +import SDKS from '../constants/sdks.js'; + const VERSION = 'v5'; async function generate() { - let output = ''; - output += `# Clerk SDKs ${VERSION} Changelog\n\n`; - output += `Below is a listing of all the changes made to Clerk SDKs in ${VERSION} - each section describes the changes to one SDK. Note that some changes may be repeated between different SDKs.\n\n`; - const data = (await import(`../versions/${VERSION}/index.js`)).default; - - for (let sdk in data) { - output += `### ${getSdkName(sdk)}\n\n---\n\n`; - data[sdk].map(entry => { - // Note: make sure to add a custom anchor link here to match the cli output - // anchor should be `entry.slug` - output += `
+ let output = ''; + output += `# Clerk SDKs ${VERSION} Changelog\n\n`; + output += `Below is a listing of all the changes made to Clerk SDKs in ${VERSION} - each section describes the changes to one SDK. Note that some changes may be repeated between different SDKs.\n\n`; + const data = (await import(`../versions/${VERSION}/index.js`)).default; + + for (let sdk in data) { + output += `### ${getSdkName(sdk)}\n\n---\n\n`; + data[sdk].map(entry => { + // Note: make sure to add a custom anchor link here to match the cli output + // anchor should be `entry.slug` + output += `
${parseInline(entry.title)} Regex matcher: \`${entry.matcher}\` ${entry.content}
\n\n`; - }); - } + }); + } - return output; + return output; } generate().then(console.log); function getSdkName(val) { - return SDKS.find(sdk => val === sdk.value).label; + return SDKS.find(sdk => val === sdk.value).label; } diff --git a/packages/upgrade/source/util/generate-export-change.js b/packages/upgrade/source/util/generate-export-change.js deleted file mode 100644 index 9ddcbcd65d3..00000000000 --- a/packages/upgrade/source/util/generate-export-change.js +++ /dev/null @@ -1,28 +0,0 @@ -import fs from 'fs'; -import path from 'path'; - -// WIP, a util script used for quickly generating a large number of nearly identical change files -const movedToServer = [ - 'MultisessionAppSupport', - 'auth', - 'currentUser', - 'authMiddleware', // deprecated - 'clerkMiddleware', // new - 'redirectToSignIn', - 'redirectToSignUp', - 'buildClerkProps', - 'verifyToken', - 'isClerkAPIResponseError', - 'isEmailLinkError', - 'isKnownError', - 'isMetamaskError', - 'EmailLinkErrorCode', - 'withClerk', - 'withSession', - 'withUser', - 'WithClerk', - 'WithSession', - 'WithUser', -]; - -const clerkBackendExports = ['createClerkClient', 'verifyToken']; diff --git a/packages/upgrade/source/util/get-clerk-version.js b/packages/upgrade/source/util/get-clerk-version.js index c65ca5b2322..98baeddc9fc 100644 --- a/packages/upgrade/source/util/get-clerk-version.js +++ b/packages/upgrade/source/util/get-clerk-version.js @@ -2,7 +2,7 @@ import { readPackageSync } from 'read-pkg'; import semverRegex from 'semver-regex'; export default function getClerkMajorVersion() { - const pkg = readPackageSync(); - const clerk = pkg.dependencies.clerk; - return clerk ? semverRegex.exec(clerk)[0][0] : false; + const pkg = readPackageSync(); + const clerk = pkg.dependencies.clerk; + return clerk ? semverRegex.exec(clerk)[0][0] : false; } diff --git a/packages/upgrade/source/util/guess-framework.js b/packages/upgrade/source/util/guess-framework.js index 0acfe4513ef..75dbafa2045 100644 --- a/packages/upgrade/source/util/guess-framework.js +++ b/packages/upgrade/source/util/guess-framework.js @@ -1,21 +1,22 @@ import { readPackageSync } from 'read-pkg'; + import SDKS from '../constants/sdks.js'; export default function guessFrameworks(dir) { - let pkg; - try { - pkg = readPackageSync({ cwd: dir }); - } catch (err) { - return []; - } + let pkg; + try { + pkg = readPackageSync({ cwd: dir }); + } catch (err) { + return []; + } - // no guessing if there are no deps - if (!pkg.dependencies && !pkg.devDependencies) return []; - const deps = pkg.dependencies ? Object.keys(pkg.dependencies) : []; - const devDeps = pkg.devDependencies ? Object.keys(pkg.devDependencies) : []; + // no guessing if there are no deps + if (!pkg.dependencies && !pkg.devDependencies) return []; + const deps = pkg.dependencies ? Object.keys(pkg.dependencies) : []; + const devDeps = pkg.devDependencies ? Object.keys(pkg.devDependencies) : []; - return SDKS.reduce((m, { label, value }) => { - if (deps.includes(label) || devDeps.includes(label)) m.push({ label, value }); - return m; - }, []); + return SDKS.reduce((m, { label, value }) => { + if (deps.includes(label) || devDeps.includes(label)) m.push({ label, value }); + return m; + }, []); } diff --git a/packages/upgrade/source/util/load-change.js b/packages/upgrade/source/util/load-change.js index 97b77f0ade0..40270edd7ed 100644 --- a/packages/upgrade/source/util/load-change.js +++ b/packages/upgrade/source/util/load-change.js @@ -1,35 +1,35 @@ import fs from 'fs'; -import path from 'path'; import matter from 'gray-matter'; +import path from 'path'; import { fileURLToPath } from 'url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); export default function createLoader({ version, baseUrl }) { - return function load(sdk, slugs) { - // Note: This could benefit perf-wise by being converted to async, but it would - // make the code a decent amount more complex. - return slugs.map(slug => { - const sdkPath = path.join(__dirname, '../versions', `v${version}`, sdk, `${slug}.md`); - const sharedPath = path.join(__dirname, '../versions', `v${version}`, 'common', `${slug}.md`); + return function load(sdk, slugs) { + // Note: This could benefit perf-wise by being converted to async, but it would + // make the code a decent amount more complex. + return slugs.map(slug => { + const sdkPath = path.join(__dirname, '../versions', `v${version}`, sdk, `${slug}.md`); + const sharedPath = path.join(__dirname, '../versions', `v${version}`, 'common', `${slug}.md`); - const loadPath = fs.existsSync(sdkPath) ? sdkPath : sharedPath; - const content = fs.readFileSync(loadPath, 'utf8'); - const parsed = matter(content); - const fm = parsed.data; + const loadPath = fs.existsSync(sdkPath) ? sdkPath : sharedPath; + const content = fs.readFileSync(loadPath, 'utf8'); + const parsed = matter(content); + const fm = parsed.data; - return { - title: fm.title, - matcher: Array.isArray(fm.matcher) - ? fm.matcher.map(m => new RegExp(m, `g${fm.matcherFlags ? fm.matcherFlags : ''}`)) - : new RegExp(fm.matcher, `g${fm.matcherFlags ? fm.matcherFlags : ''}`), - replaceWithString: fm.replaceWithString, - slug, - sdk: sdk, - content: parsed.content, - warning: fm.warning, - link: `${baseUrl}#${slug}`, - }; - }); - }; + return { + title: fm.title, + matcher: Array.isArray(fm.matcher) + ? fm.matcher.map(m => new RegExp(m, `g${fm.matcherFlags ? fm.matcherFlags : ''}`)) + : new RegExp(fm.matcher, `g${fm.matcherFlags ? fm.matcherFlags : ''}`), + replaceWithString: fm.replaceWithString, + slug, + sdk: sdk, + content: parsed.content, + warning: fm.warning, + link: `${baseUrl}#${slug}`, + }; + }); + }; } diff --git a/packages/upgrade/source/util/step-sequencer.js b/packages/upgrade/source/util/step-sequencer.js index 52930448ad6..c5bd6429502 100644 --- a/packages/upgrade/source/util/step-sequencer.js +++ b/packages/upgrade/source/util/step-sequencer.js @@ -4,28 +4,28 @@ import { useState } from 'react'; // nature of the CLI but I couldn't get it working the way I wanted quick enough // so shelving it for now. export function createStepSequence() { - const [step, setStep] = useState(0); + const [step, setStep] = useState(0); - const StepSequence = ({ children }) => { - const stepToRender = [].concat(children).filter((_, idx) => { - return idx === step; - }); - if (!stepToRender.length) return []; + const StepSequence = ({ children }) => { + const stepToRender = [].concat(children).filter((_, idx) => { + return idx === step; + }); + if (!stepToRender.length) return []; - if (stepToRender[0].props.condition === false) { - setStep(step + 1); - } else { - return stepToRender; - } - }; + if (stepToRender[0].props.condition === false) { + setStep(step + 1); + } else { + return stepToRender; + } + }; - const Step = ({ condition, children }) => { - return children; - }; + const Step = ({ condition, children }) => { + return children; + }; - const nextStep = () => { - setStep(step + 1); - }; + const nextStep = () => { + setStep(step + 1); + }; - return [StepSequence, Step, nextStep]; + return [StepSequence, Step, nextStep]; } From ce67dd3a2b7d1d862062d0b39317bd06e00e5e17 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 30 Jan 2024 17:31:58 -0500 Subject: [PATCH 091/159] feat(upgrade): Add minimal, anonymous telemetry for tracking breaking change frequency --- package-lock.json | 38 +++++++++++++++- packages/upgrade/.eslintrc.cjs | 1 + packages/upgrade/package.json | 4 +- packages/upgrade/source/app.js | 10 ++++- packages/upgrade/source/cli.js | 15 ++++--- packages/upgrade/source/scan.js | 37 +++++++++++++++- .../upgrade/source/util/guess-framework.js | 44 ++++++++++++++++--- .../upgrade/source/util/step-sequencer.js | 31 ------------- .../v5/next/with-clerk-middleware-removed.md | 4 +- 9 files changed, 132 insertions(+), 52 deletions(-) delete mode 100644 packages/upgrade/source/util/step-sequencer.js diff --git a/package-lock.json b/package-lock.json index 1ccd5577038..ca62c2c9802 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11914,6 +11914,14 @@ "dev": true, "license": "MIT" }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, "node_modules/check-error": { "version": "1.0.2", "dev": true, @@ -13310,6 +13318,14 @@ "node": ">= 8" } }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, "node_modules/crypto-random-string": { "version": "2.0.0", "dev": true, @@ -24643,6 +24659,16 @@ "node": ">=10" } }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "node_modules/mdn-data": { "version": "2.0.14", "dev": true, @@ -31301,6 +31327,14 @@ "streamx": "^2.15.0" } }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "engines": { + "node": ">=14.16" + } + }, "node_modules/term-size": { "version": "2.2.1", "dev": true, @@ -35300,10 +35334,12 @@ "ink-gradient": "^3.0.0", "ink-link": "^3.0.0", "marked": "^11.1.1", + "md5": "^2.3.0", "meow": "^11.0.0", "react": "^18.2.0", "read-pkg": "^9.0.1", - "semver-regex": "^4.0.5" + "semver-regex": "^4.0.5", + "temp-dir": "^3.0.0" }, "bin": { "upgrade": "dist/cli.js" diff --git a/packages/upgrade/.eslintrc.cjs b/packages/upgrade/.eslintrc.cjs index c05d7d67503..dd635d5e282 100644 --- a/packages/upgrade/.eslintrc.cjs +++ b/packages/upgrade/.eslintrc.cjs @@ -1,4 +1,5 @@ module.exports = { root: true, extends: ['custom/node', 'custom/react'], + rules: { 'react/no-unescaped-entities': 0, 'import/no-unresolved': 0 }, }; diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index e011525b5cd..3c04be13ac3 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -29,10 +29,12 @@ "ink-gradient": "^3.0.0", "ink-link": "^3.0.0", "marked": "^11.1.1", + "md5": "^2.3.0", "meow": "^11.0.0", "react": "^18.2.0", "read-pkg": "^9.0.1", - "semver-regex": "^4.0.5" + "semver-regex": "^4.0.5", + "temp-dir": "^3.0.0" }, "devDependencies": { "@babel/cli": "^7.21.0", diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index 11906802c06..38ba8b27196 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -17,6 +17,7 @@ export default function App({ _ignore = [], _yolo = false, noWarnings = false, + disableTelemetry = false, }) { const [yolo, setYolo] = useState(_yolo); const [sdks, setSdks] = useState(_sdk ? [_sdk] : []); @@ -30,6 +31,7 @@ export default function App({ const [ignore, setIgnore] = useState(_ignore); const [configComplete, setConfigComplete] = useState(false); const [configVerified, setConfigVerified] = useState(false); + const [uuid, setUuid] = useState(); let fromVersionGuess = false; if (yolo) { @@ -40,7 +42,9 @@ export default function App({ // We try to guess which SDK they are using if (isEmpty(sdks) && isEmpty(sdkGuesses) && !sdkGuessAttempted) { if (!dir) return setDir(process.cwd()); - setSdkGuesses(guessFrameworks(dir)); // this is the suspect line + const { guesses, _uuid } = guessFrameworks(dir, disableTelemetry); + setUuid(_uuid); + setSdkGuesses(guesses); setSdkGuessAttempted(true); } @@ -245,7 +249,9 @@ export default function App({ )} - {configVerified && } + {configVerified && ( + + )} ); } diff --git a/packages/upgrade/source/cli.js b/packages/upgrade/source/cli.js index 5fdae08efc0..bb5b7759b3e 100644 --- a/packages/upgrade/source/cli.js +++ b/packages/upgrade/source/cli.js @@ -12,12 +12,13 @@ const cli = meow( $ clerk-upgrade Options - --from Major version number you're upgrading from - --to Major version number you're upgrading to - --sdk Name of the SDK you're upgrading - --dir Directory you'd like to scan for files - --ignore Any files or directories you'd like to ignore - --noWarnings Do not print warnings, only items that must be fixed + --from Major version number you're upgrading from + --to Major version number you're upgrading to + --sdk Name of the SDK you're upgrading + --dir Directory you'd like to scan for files + --ignore Any files or directories you'd like to ignore + --noWarnings Do not print warnings, only items that must be fixed + --disableTelemetry Do not send anonymous usage telemetry Examples $ clerk-upgrade --sdk=nextjs --dir=src/** @@ -32,6 +33,7 @@ const cli = meow( ignore: { type: 'string', isMultiple: true }, yolo: { type: 'boolean' }, noWarnings: { type: 'boolean' }, + disableTelemetry: { type: 'boolean' }, }, }, ); @@ -44,6 +46,7 @@ render( _dir={cli.flags.dir} _yolo={cli.flags.yolo} noWarnings={cli.flags.noWarnings} + disableTelemetry={cli.flags.disableTelemetry} />, // { debug: true }, if having issues with errors being swallowed, uncomment this ); diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index 82bf7abfde5..5ec610c90e2 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -8,7 +8,7 @@ import React, { useEffect, useState } from 'react'; import ExpandableList from './util/expandable-list.js'; -export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarnings }) { +export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarnings, uuid, disableTelemetry }) { // NOTE: if the difference between fromVersion and toVersion is greater than 1 // we need to do a little extra work here and import two matchers, // sequence them after each other, and clearly mark which version migration @@ -129,7 +129,40 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarn }), ) .then(() => { - setResults([...results, ...Object.keys(allResults).map(k => allResults[k])]); + const newResults = [...results, ...Object.keys(allResults).map(k => allResults[k])]; + setResults(newResults); + + // Anonymously track how many instances of each breaking change item were encountered. + // This only tracks the name of the breaking change found, and how many instances of it + // were found. It does not send any part of the scanned codebase or any PII. + // It is used internally to help us understand what the most common sticking points are + // for our users so we can appropriate prioritize support/guidance/docs around them. + if (!disableTelemetry) { + fetch('https://api.segment.io/v1/batch', { + method: 'POST', + headers: { + Authorization: `Basic ${Buffer.from('5TkC1SM87VX2JRJcIGBBmL7sHLRWaIvc:').toString('base64')}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + batch: newResults.map(item => { + return { + type: 'track', + userId: 'clerk-upgrade-tool', + event: 'Clerk Migration Tool_CLI_Breaking Change Found', + properties: { + appId: `cmt_${uuid}`, + title: item.title, + surface: 'Clerk Migration Tool', + location: 'CLI', + instances: item.instances.length, + }, + timestamp: new Date().toISOString(), + }; + }), + }), + }); + } setComplete(true); if (Object.keys(allResults).length < 1) { diff --git a/packages/upgrade/source/util/guess-framework.js b/packages/upgrade/source/util/guess-framework.js index 75dbafa2045..f9b5c358311 100644 --- a/packages/upgrade/source/util/guess-framework.js +++ b/packages/upgrade/source/util/guess-framework.js @@ -1,22 +1,52 @@ +import { randomUUID } from 'crypto'; +import fs from 'fs'; +import md5 from 'md5'; +import path from 'path'; import { readPackageSync } from 'read-pkg'; +import tempDir from 'temp-dir'; import SDKS from '../constants/sdks.js'; -export default function guessFrameworks(dir) { +// Telemetry Note +// -------------- +// We collect fully anonymous telemetry as part of this tool. The only data we send is which +// breaking changes were detected in your app scan. This data helps us to know what the most often +// encountered issues are so that we can prioritize documentation and support for these areas. +// We do not send any information from your source code or any PII as part of the telemetry. + +export default function guessFrameworks(dir, disableTelemetry) { let pkg; try { pkg = readPackageSync({ cwd: dir }); } catch (err) { - return []; + const tmpPath = path.join(tempDir, 'clerk-upgrade-uuid'); + let uuid; + + if (!disableTelemetry) { + // if there's no package.json, create a uuid in tempfile so that multiple runs on the same app can be consolidated + if (fs.existsSync(tmpPath)) { + uuid = fs.readFileSync(tmpPath, 'utf8'); + } else { + uuid = randomUUID(); + fs.writeFileSync(tmpPath, uuid); + } + } + return { guesses: [], _uuid: uuid }; } + // if there is a package.json + const _uuid = md5(pkg); + // no guessing if there are no deps - if (!pkg.dependencies && !pkg.devDependencies) return []; + if (!pkg.dependencies && !pkg.devDependencies) return { guesses: [], _uuid }; const deps = pkg.dependencies ? Object.keys(pkg.dependencies) : []; const devDeps = pkg.devDependencies ? Object.keys(pkg.devDependencies) : []; - return SDKS.reduce((m, { label, value }) => { - if (deps.includes(label) || devDeps.includes(label)) m.push({ label, value }); - return m; - }, []); + return { + _uuid, + guesses: SDKS.reduce((m, { label, value }) => { + if (deps.includes(label) || devDeps.includes(label)) m.push({ label, value }); + return m; + }, []), + }; } diff --git a/packages/upgrade/source/util/step-sequencer.js b/packages/upgrade/source/util/step-sequencer.js deleted file mode 100644 index c5bd6429502..00000000000 --- a/packages/upgrade/source/util/step-sequencer.js +++ /dev/null @@ -1,31 +0,0 @@ -import { useState } from 'react'; - -// This was an attempt to write a function that would clean up the step-by-step -// nature of the CLI but I couldn't get it working the way I wanted quick enough -// so shelving it for now. -export function createStepSequence() { - const [step, setStep] = useState(0); - - const StepSequence = ({ children }) => { - const stepToRender = [].concat(children).filter((_, idx) => { - return idx === step; - }); - if (!stepToRender.length) return []; - - if (stepToRender[0].props.condition === false) { - setStep(step + 1); - } else { - return stepToRender; - } - }; - - const Step = ({ condition, children }) => { - return children; - }; - - const nextStep = () => { - setStep(step + 1); - }; - - return [StepSequence, Step, nextStep]; -} diff --git a/packages/upgrade/source/versions/v5/next/with-clerk-middleware-removed.md b/packages/upgrade/source/versions/v5/next/with-clerk-middleware-removed.md index 2cbc3226a25..e4d7902640d 100644 --- a/packages/upgrade/source/versions/v5/next/with-clerk-middleware-removed.md +++ b/packages/upgrade/source/versions/v5/next/with-clerk-middleware-removed.md @@ -1,6 +1,6 @@ --- -title: 'withClerkMiddleware removed' -matcher: 'withClerkMiddleware' +title: '`withClerkMiddleware` removed' +matcher: "withClerkMiddleware\\(" --- `withClerkMiddleware` has been deprecated and is now removed in v5. We recommend moving to `clerkMiddleware` instead. Here’s an example of how the code would look before and after: From 32200d6df97474ea9f9e035e5d9037a31e1fb9b7 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 30 Jan 2024 17:33:48 -0500 Subject: [PATCH 092/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 3c04be13ac3..3cdcc0a49e9 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.1.1", + "version": "0.2.0", "license": "MIT", "type": "module", "main": "dist/cli.js", From 94ac49418e9c5f921fbbb8ce30af0c0a257edf26 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 30 Jan 2024 17:38:16 -0500 Subject: [PATCH 093/159] fix(upgrade): Add to/from version to the telemetry data --- packages/upgrade/source/scan.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index 5ec610c90e2..e2489ecfa07 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -152,10 +152,12 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarn event: 'Clerk Migration Tool_CLI_Breaking Change Found', properties: { appId: `cmt_${uuid}`, - title: item.title, surface: 'Clerk Migration Tool', location: 'CLI', + title: item.title, instances: item.instances.length, + fromVersion, + toVersion, }, timestamp: new Date().toISOString(), }; From b70c817901107113ef66befbd9aee6a9d1be7272 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 31 Jan 2024 10:51:52 -0500 Subject: [PATCH 094/159] chore(upgrade): Add bin command name --- packages/upgrade/package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 3cdcc0a49e9..c098e125759 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -4,7 +4,9 @@ "license": "MIT", "type": "module", "main": "dist/cli.js", - "bin": "dist/cli.js", + "bin": { + "clerk-upgrade": "dist/cli.js" + }, "files": [ "dist" ], From 2f758f5c080a2ebf3105d16045da5a0ac3d949f0 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 31 Jan 2024 10:52:12 -0500 Subject: [PATCH 095/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index c098e125759..081a6b2a477 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.2.0", + "version": "0.2.1", "license": "MIT", "type": "module", "main": "dist/cli.js", From 1f8cb6113b82773d9a6e0a891af213e3b6d433ad Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 2 Feb 2024 17:15:11 -0500 Subject: [PATCH 096/159] feat(upgrade): Add migration guide generation script --- packages/upgrade/source/util/load-change.js | 1 + .../v5-nextjs-guide/after-sign-x-handling.mdx | 10 + .../v5-nextjs-guide/deprecation-removals.mdx | 9 + .../source/util/v5-nextjs-guide/generate.js | 90 +++ .../util/v5-nextjs-guide/import-changes.mdx | 98 +++ .../source/util/v5-nextjs-guide/intro.mdx | 22 + .../v5-nextjs-guide/middleware-changes.mdx | 251 ++++++ .../util/v5-nextjs-guide/retheme-changes.mdx | 11 + .../v5-nextjs-guide/version-requirements.mdx | 35 + .../aftersigninurl-behavior-change-2.md | 7 - .../common/aftersignouturl-behavior-change.md | 7 - .../common/aftersignupurl-behavior-change.md | 7 - .../v5/common/afterswitchorganizationurl.md | 1 + .../v5/common/alternativemethods-backlink.md | 1 + .../v5/common/api-key-to-secret-key.md | 1 + ...rganizationpreview-organizationswitcher.md | 1 + ...ationlistcreateorganizationactionbutton.md | 1 + .../source/versions/v5/common/card-changes.md | 1 + .../v5/common/changed-localization-keys.md | 241 +++--- .../v5/common/clerkprovider-frontendapi-2.md | 1 + .../clerkprovideroptionswrapper-dropped.md | 1 + .../v5/common/connected-accounts-dropdown.md | 1 + .../common/frontend-api-to-publishable-key.md | 1 + .../source/versions/v5/common/mfa-dropdown.md | 1 + .../versions/v5/common/min-react-version.md | 2 + .../v5/common/new-localization-keys.md | 241 +++--- .../v5/common/organizationprofile-settings.md | 1 + ...switcherpopoveractionbuttontext-removed.md | 1 + .../common/remove-identitypreview-avatar.md | 1 + .../remove-socialbuttonsblockbuttonarrow.md | 1 + .../v5/common/removed-localization-keys.md | 147 ++-- ...erbuttonpopoveractionbuttontext-removed.md | 1 + .../userbuttontrigger-userbuttonbox-invert.md | 3 +- .../v5/common/userprofile-security.md | 1 + .../v5/common/withclerk-hof-removed.md | 29 +- .../versions/v5/common/withclerk-removed.md | 1 + .../v5/common/withsession-hof-removed.md | 29 +- .../versions/v5/common/withsession-removed.md | 1 + .../v5/common/withuser-hof-removed.md | 29 +- .../versions/v5/common/withuser-removed-2.md | 3 +- packages/upgrade/source/versions/v5/index.js | 715 +++++++++--------- .../versions/v5/next/auth-import-change.md | 1 + .../v5/next/auth-middleware-deprecated.md | 15 +- .../versions/v5/next/authmiddleware-apikey.md | 12 +- .../v5/next/authmiddleware-frontendapi.md | 3 +- .../v5/next/authmiddleware-import-change.md | 1 + .../v5/next/buildclerkprops-import-change.md | 1 + .../versions/v5/next/clerk-import-change.md | 1 + .../v5/next/clerk-js-version-next-public.md | 1 + .../v5/next/constants-import-change.md | 1 + ...createauthenticaterequest-import-change.md | 1 + .../v5/next/createclerkclient-apikey.md | 3 +- .../v5/next/createclerkclient-frontendapi.md | 3 +- .../createisomorphicrequest-import-change.md | 1 + .../v5/next/currentuser-import-change.md | 1 + .../v5/next/decodejwt-import-change.md | 1 + .../next/emaillinkerrorcode-import-change.md | 1 + .../source/versions/v5/next/getauth-apikey.md | 3 +- .../source/versions/v5/next/import-api-url.md | 1 + .../versions/v5/next/import-api-version.md | 1 + .../versions/v5/next/import-clerk-js-url.md | 1 + .../v5/next/import-clerk-js-version.md | 1 + .../source/versions/v5/next/import-domain.md | 1 + .../versions/v5/next/import-is-satellite.md | 1 + .../versions/v5/next/import-nextjs-api.md | 13 +- .../v5/next/import-nextjs-app-beta.md | 1 + .../v5/next/import-nextjs-edge-middleware.md | 1 + .../import-nextjs-edge-middlewarefiles.md | 1 + .../versions/v5/next/import-nextjs-ssr.md | 1 + .../versions/v5/next/import-proxy-url.md | 1 + .../v5/next/import-publishable-key.md | 1 + .../versions/v5/next/import-secret-key.md | 1 + .../versions/v5/next/import-sign-in-url.md | 1 + .../versions/v5/next/import-sign-up-url.md | 1 + .../isclerkapiresponserror-import-change.md | 1 + .../v5/next/isemaillinkerror-import-change.md | 1 + .../v5/next/isknownerror-import-change.md | 1 + .../v5/next/ismetamaskerror-import-change.md | 1 + .../versions/v5/next/min-nextjs-version.md | 2 + .../multisessionappsupport-import-change.md | 1 + .../v5/next/next-public-clerk-js-url.md | 1 + .../v5/next/redirect-import-change.md | 1 + .../v5/next/redirecttosignin-import-path.md | 3 +- .../v5/next/redirecttosignup-import-path.md | 3 +- .../versions/v5/next/signjwt-import-change.md | 1 + .../v5/next/verifyjwt-import-change.md | 1 + .../v5/next/verifytoken-import-change.md | 1 + .../v5/next/with-clerk-middleware-removed.md | 1 + 88 files changed, 1333 insertions(+), 770 deletions(-) create mode 100644 packages/upgrade/source/util/v5-nextjs-guide/after-sign-x-handling.mdx create mode 100644 packages/upgrade/source/util/v5-nextjs-guide/deprecation-removals.mdx create mode 100644 packages/upgrade/source/util/v5-nextjs-guide/generate.js create mode 100644 packages/upgrade/source/util/v5-nextjs-guide/import-changes.mdx create mode 100644 packages/upgrade/source/util/v5-nextjs-guide/intro.mdx create mode 100644 packages/upgrade/source/util/v5-nextjs-guide/middleware-changes.mdx create mode 100644 packages/upgrade/source/util/v5-nextjs-guide/retheme-changes.mdx create mode 100644 packages/upgrade/source/util/v5-nextjs-guide/version-requirements.mdx delete mode 100644 packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change-2.md delete mode 100644 packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md delete mode 100644 packages/upgrade/source/versions/v5/common/aftersignupurl-behavior-change.md diff --git a/packages/upgrade/source/util/load-change.js b/packages/upgrade/source/util/load-change.js index 40270edd7ed..2dac153b65e 100644 --- a/packages/upgrade/source/util/load-change.js +++ b/packages/upgrade/source/util/load-change.js @@ -28,6 +28,7 @@ export default function createLoader({ version, baseUrl }) { sdk: sdk, content: parsed.content, warning: fm.warning, + category: fm.category, link: `${baseUrl}#${slug}`, }; }); diff --git a/packages/upgrade/source/util/v5-nextjs-guide/after-sign-x-handling.mdx b/packages/upgrade/source/util/v5-nextjs-guide/after-sign-x-handling.mdx new file mode 100644 index 00000000000..4fbbbad8548 --- /dev/null +++ b/packages/upgrade/source/util/v5-nextjs-guide/after-sign-x-handling.mdx @@ -0,0 +1,10 @@ +## After sign up/in/out URL handling + +Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. + +As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. + +```diff +- ++ +``` diff --git a/packages/upgrade/source/util/v5-nextjs-guide/deprecation-removals.mdx b/packages/upgrade/source/util/v5-nextjs-guide/deprecation-removals.mdx new file mode 100644 index 00000000000..193278e503b --- /dev/null +++ b/packages/upgrade/source/util/v5-nextjs-guide/deprecation-removals.mdx @@ -0,0 +1,9 @@ +## Deprecation removals & housekeeping + +As part of this major version, we have removed a large number of previously deprecated props, arugments, methods, etc, and made changes to things that are only realistically used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. + + + For this section more than any other one, we recommend using the CLI upgrade tool (`npx @clerk/upgrade`), since there + are a lot of changes, each of which are very unlikely to appear in your codebase, that would take a very long time to + look for manually. + diff --git a/packages/upgrade/source/util/v5-nextjs-guide/generate.js b/packages/upgrade/source/util/v5-nextjs-guide/generate.js new file mode 100644 index 00000000000..3025cce6aae --- /dev/null +++ b/packages/upgrade/source/util/v5-nextjs-guide/generate.js @@ -0,0 +1,90 @@ +import { readFileSync } from 'fs'; +import { parseInline } from 'marked'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const VERSION = 'v5'; + +async function generate() { + const data = (await import(`../../versions/${VERSION}/index.js`)).default['nextjs']; + + let output = ''; + output += `--- +title: Upgrading Next.js from v4 to v5 +description: Learn how to upgrade Clerk's Next.js SDK from v4 to v5. +---`; + output += '\n\n'; + output += read('intro'); + output += '\n\n'; + output += read('version-requirements'); + + // This is a guide-specific item, no matcher for this + const defaultsChangeItem = { + title: 'Changes to default variables', + content: `\nThe default values of some [appearance variables](/docs/components/customization/variables) have changed which may impact your UI (if you are not already overriding them). + + - The default \`colorPrimary\` value changed from \`#103FEF\` to \`#2F3037\`. As the new color is a dark grey, the \`colorPrimary\` of the dark theme was changed to \`#FFFFFF\`. + - The default \`fontSize\` value changed from \`1rem\` to \`0.8125rem\` + - The default \`fontWeight\` values changed from \`{ normal: 400, medium: 500, bold: 600 }\` to \`{ normal: 400, medium: 500, bold: 700 }\` + - Previously, the default value for \`fontSmoothing\` was \`auto\`. This value is now unset. If you want to pass a custom value to it, you can still do so.\n`, + }; + + output += '\n\n'; + output += read('retheme-changes'); + + const apperanceChanges = data.filter(i => i.category === 'appearance'); + apperanceChanges.push(defaultsChangeItem); + const localizationChanges = data.filter(i => i.category === 'localization'); + + output += '\n\n'; + output += '#### Appearance changes'; + output += '\n\n'; + output += ` `"${parseInline(i.title)}"`).join(', ')}]}>`; + output += '\n'; + output += apperanceChanges.map(i => `${i.content}`).join('\n'); + output += ''; + output += '\n\n'; + output += '#### Localization changes'; + output += '\n\n'; + output += ` `"${parseInline(i.title)}"`).join(', ')}]}>`; + output += '\n'; + output += localizationChanges.map(i => `${i.content}`).join('\n'); + output += ''; + + output += '\n\n'; + output += read('middleware-changes'); + output += '\n\n'; + output += read('import-changes'); + output += '\n\n'; + output += read('after-sign-x-handling'); + output += '\n\n'; + output += read('deprecation-removals'); + + const deprecationRemovals = data.filter(i => i.category === 'deprecation-removal'); + const otherChanges = data.filter(i => !i.category); + + output += '\n\n'; + output += '#### Deprecation removals'; + output += '\n\n'; + output += ` `"${parseInline(i.title)}"`).join(', ')}]}>`; + output += '\n'; + output += deprecationRemovals.map(i => `${i.content}`).join('\n'); + output += ''; + output += '\n\n'; + output += '#### Other breaking changes'; + output += '\n\n'; + output += ` `"${parseInline(i.title)}"`).join(', ')}]}>`; + output += '\n'; + output += otherChanges.map(i => `${i.content}`).join('\n'); + output += ''; + output += '\n\n'; + + return output; +} + +generate().then(console.log); + +function read(p) { + return readFileSync(path.join(__dirname, p + '.mdx'), 'utf8'); +} diff --git a/packages/upgrade/source/util/v5-nextjs-guide/import-changes.mdx b/packages/upgrade/source/util/v5-nextjs-guide/import-changes.mdx new file mode 100644 index 00000000000..5ca178e5c59 --- /dev/null +++ b/packages/upgrade/source/util/v5-nextjs-guide/import-changes.mdx @@ -0,0 +1,98 @@ +## Changes to top level exports + +As part of this release, we changed some of the top-level exports of `@clerk/nextjs` in order to improve bundle size and tree-shaking efficiency. These changes have resulted in a ~75% reduction in build size for middleware bundles. However, you will likely need to make some changes to import paths as a result. + + + We recommend using our CLI tool, `npx @clerk/upgrade`, to automatically find occurences of old imports. + + + + + Previously these exports have been exported both from `@clerk/nextjs` and `@clerk/nextjs/server`. As of v5 they are only exported from the latter. + + ```diff + import { + auth, + currentUser, + authMiddleware, + buildClerkProps, + verifyToken, + verifyJwt, + decodeJwt, + signJwt, + constants, + redirect, + createAuthenticateRequest, + createIsomorphicRequest, + - } from "@clerk/nextjs" + + } from "@clerk/nextjs/server" + ``` + + + + Exports related to errors are now under `@clerk/nextjs/errors`. + + ```diff + import { + isClerkAPIResponseError, + isEmailLinkError, + isKnownError, + isMetamaskError, + EmailLinkErrorCode, + - } from "@clerk/nextjs" + + } from "@clerk/nextjs/errors" + ``` + + + + The `@clerk/nextjs` import will work with both the app and pages router. + + ```diff + - import { } from "@clerk/nextjs/app-beta" + + import { } from "@clerk/nextjs" + ``` + + Some behavior may have changed between Clerk's beta and the stable release. Please check on your end if behavior stayed the same. + + + + The top-level exports support SSR by default now. + + ```diff + - import { } from "@clerk/nextjs/ssr" + + import { } from "@clerk/nextjs" + ``` + + + + ```diff + - import { } from "@clerk/nextjs/edge-middleware" + + import { } from "@clerk/nextjs" + ``` + + + ```diff + - import { } from "@clerk/nextjs/edge-middlewarefiles" + + import { } from "@clerk/nextjs" + ``` + + + The `@clerk/nextjs/api` subpath was removed completely. It re-exported helpers from `@clerk/clerk-sdk-node` and its types. If you relied on these, import from `@clerk/clerk-sdk-node` directly instead. + + ```diff + import type { + ClerkMiddleware, + ClerkMiddlewareOptions, + LooseAuthProp, + RequireAuthProp, + StrictAuthProp, + WithAuthProp + - } from "@clerk/nextjs/api" + + } from "@clerk/clerk-sdk-node" + + - import { requireAuth, withAuth } from "@clerk/nextjs/api" + + import { requireAuth, withAuth } from "@clerk/clerk-sdk-node" + ``` + + + diff --git a/packages/upgrade/source/util/v5-nextjs-guide/intro.mdx b/packages/upgrade/source/util/v5-nextjs-guide/intro.mdx new file mode 100644 index 00000000000..261cab231c2 --- /dev/null +++ b/packages/upgrade/source/util/v5-nextjs-guide/intro.mdx @@ -0,0 +1,22 @@ +# Upgrading Next.js from v4 to v5 + +By the end of this guide, you’ll have successfully upgraded your Next.js project to use `@clerk/nextjs` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. + +Step-by-step instructions will lead you through the process. If you’re looking for a reference list of changes, check out the general [upgrading from v4 to v5 guide](/docs/upgrade-guides/upgrading-from-v4-to-v5). + +To aid you in this upgrade, Clerk built a CLI called [`@clerk/upgrade`](https://www.npmjs.com/package/@clerk/upgrade). Throughout this guide you'll see prompts to use the CLI which you can invoke directly in your terminal. + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + diff --git a/packages/upgrade/source/util/v5-nextjs-guide/middleware-changes.mdx b/packages/upgrade/source/util/v5-nextjs-guide/middleware-changes.mdx new file mode 100644 index 00000000000..dca3ed26120 --- /dev/null +++ b/packages/upgrade/source/util/v5-nextjs-guide/middleware-changes.mdx @@ -0,0 +1,251 @@ +## New middleware architecture + +User and customer feedback about `authMiddleware()` has been clear in that middleware logic was a often friction point. As such, in v5 you will find a completely new middleware helper called [`clerkMiddleware()`](/docs/references/nextjs/clerk-middleware) that will hopefully alleviate all of the issues folks had with `authMiddleware()`. + +Additionally, there are now new helpers that enable controlling auth on a _per-page and/or per-layout basis_ when using app router. While you can still configure which routes are protected via middleware, the page-based protection strategy is what is now recommended, as the co-location of auth protection configuration with the code for the pages themselves results in a superior developer experience that adds clarity as you navigate your codebase. + +### Per-route auth config + +Sometimes, code speaks louder than words. Let's get right into an example: + + + +```ts filename="app/src/dashboard/layout.tsx" +import { auth } from '@clerk/nextjs/server' + +export default async function DashboardLayout({ children }) { + auth().protect(); + // 👆 This one line is all it takes - the layout and all its children + // will now redirect to your sign in page for un-authenticated users. + + return <>{children} + +} + +```` + + +```ts filename="app/src/dashboard/page.tsx" +import { auth } from '@clerk/nextjs/server' + +export default async function DashboardPage() { + auth().protect(); + // 👆 This one line is all it takes - the layout and all its children + // will now redirect to your sign in page for un-authenticated users. + + return

This page is now protected!

+} +```` + +
+
+ +In this example, we add `auth().protect()` to a layout, and like magic, that layout and all of it's children will be gated by auth. The same logic can be applied for pages. + +Want to get more specific with permission gating? Just add the role you are gating as a param: + +```ts filename="app/src/admin/layout.tsx" +import { auth } from '@clerk/nextjs/server'; + +export default async function AdminLayout({ children }) { + auth().protect({ role: 'org:admin' }); + + return <>{children}; +} +``` + +Note that in order for this to work, you will still need middleware to be present, but it only requires the most minimal configuration: + +```ts filename="middleware.ts" +import { clerkMiddleware } from '@clerk/nextjs/server'; + +export default clerkMiddleware(); + +export const config = { + matcher: ['/((?!.*\\..*|_next).*)', '/', '/(api|trpc)(.*)'], +}; +``` + +If you are using the pages router, we instead recommend middleware auth config as seen below. + +### Middleware auth config + +If you'd still prefer to define your auth logic within the middleware, we support this fully as well, and have put a lot of work into improving the ergonomics as well. The primary change was to make `clerkMiddleware()` not protect any routes by default, instead requiring the developer to add routes they would like to be protected by auth. This is a substantial contrast to the previous `authMiddleware()`, which protected all routes by default, requiring the developer to add exceptions. We have also made efforts to substantially simplify the API and make it easier to combine with other middleware helpers smoothly. + +Here's an example that replicates the auth protection scheme above, but entirely inside the middleware: + +```ts filename="middleware.ts" +import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'; + +const isDashboardRoute = createRouteMatcher(['/dashboard(.*)']); +const isAdminRoute = createRouteMatcher(['/admin']); + +export default clerkMiddleware((auth, req) => { + // Restrict admin route to users with specific role + if (isAdminRoute(req)) auth().protect({ role: 'org:admin' }); + + // Restrict dashboard routes to logged in users + if (isDashboardRoute(req)) auth().protect(); +}); + +export const config = { + matcher: ['/((?!.*\\..*|_next).*)', '/', '/(api|trpc)(.*)'], +}; +``` + +A couple things to note here: + +- The `createRouteMatcher` helper makes it easy to define route groups that you can leverage inside the middleware function and check in whichever order you'd like. Note that it can take an array of routes as well. +- With `clerkMiddleware`, we are defining the routes we want **to be protected**, rather than the routes we don't want to be protected. +- We are able to use the same `auth().protect()` helpers that we can use within layouts/pages here in the middleware. + +### Migrating to `clerkMiddleware()` + +We strongly recommend migrating to the new `clerkMiddleware()` for an improved DX and access to all present and upcoming features, but also want to note that `authMiddleware()`, while deprecated, will continue to work in v5 and will not be removed until the next major version, so you do not _need_ to make any changes to your middleware setup this version. + +The most basic migration will be updating the import and changing out the default export. + +```diff +- import { authMiddleware } from "@clerk/nextjs" ++ import { clerkMiddleware } from '@clerk/nextjs/server' + +- export default authMiddleware() ++ export default clerkMiddleware() + + export const config = { + matcher: ["/((?!.*\\..*|_next).*)", "/", "/(api|trpc)(.*)"], + } +``` + +Of course, in most cases you'll have a more complicated setup than this. You can find some examples below for how to migrate a few common use cases. Be sure to review the [`clerkMiddleware()` documentation](/docs/references/nextjs/clerk-middleware) and [route protection guide](/docs/references/nextjs/route-protection) if your specific use case is not mentioned. + + + + By default, `clerkMiddleware()` treats all pages as public, so you no longer need to explcitly set `/` as public. + + Before: + + ```ts filename="middleware.ts" + import { authMiddleware } from "@clerk/nextjs" + + export default authMiddleware({ + publicRoutes: ["/"], + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + After: + + ```ts filename="middleware.ts" + import { + clerkMiddleware, + createRouteMatcher + } from "@clerk/nextjs/server" + + export default clerkMiddleware() + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + + + Having all routes public except everything under `/dashboard`. + + Before: + + ```ts filename="middleware.ts" + import { authMiddleware } from "@clerk/nextjs" + + export default authMiddleware({ + publicRoutes: (req) => !req.url.includes("/dashboard"), + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + After: + + ```ts filename="middleware.ts" + import { + clerkMiddleware, + createRouteMatcher + } from "@clerk/nextjs/server" + + const isDashboardRoute = createRouteMatcher(["/dashboard(.*)"]) + + export default clerkMiddleware((auth, request) => { + if (isDashboardRoute(request)) { + auth().protect() + } + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + + + You can call other middlewares inside `clerkMiddleware()`, giving you more direct control over what is called where. An example would be [next-intl](https://next-intl-docs.vercel.app/) to add internationalization to your app. + + Before: + + ```ts filename="middleware.ts" + import { authMiddleware } from "@clerk/nextjs" + import createMiddleware from "next-intl/middleware" + + const intlMiddleware = createMiddleware({ + locales: ["en", "de"], + defaultLocale: "en", + }) + + export default authMiddleware({ + beforeAuth: (req) => { + return intlMiddleware(req); + }, + publicRoutes: ["((?!^/dashboard/).*)"], + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + After: + + ```ts filename="middleware.ts" + import { + clerkMiddleware, + createRouteMatcher + } from "@clerk/nextjs/server" + import createMiddleware from "next-intl/middleware" + + const intlMiddleware = createMiddleware({ + locales: ["en", "de"], + defaultLocale: "en", + }) + + const isDashboardRoute = createRouteMatcher(["/dashboard(.*)"]) + + export default clerkMiddleware((auth, request) => { + if (isDashboardRoute(request)) { + auth().protect() + } + + return intlMiddleware(request) + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + + diff --git a/packages/upgrade/source/util/v5-nextjs-guide/retheme-changes.mdx b/packages/upgrade/source/util/v5-nextjs-guide/retheme-changes.mdx new file mode 100644 index 00000000000..8bca83a7d45 --- /dev/null +++ b/packages/upgrade/source/util/v5-nextjs-guide/retheme-changes.mdx @@ -0,0 +1,11 @@ +## Redesigned components + +The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. + + + If you are not customizing the appearance of your components, or using `localization`, you can skip this section. If + you are, we recommend using our CLI (`npx @clerk/upgrade`) to scan for changes required as part of the component + redesign more quickly. + + +The sections below contain more info on each change made to the customization ids and localization keys for reference. Regardless of how thoroughly you have reviewed the following information, we still recommend that you ensure that you have taken some time to manually look through each of your views to ensure that everything looks good still. diff --git a/packages/upgrade/source/util/v5-nextjs-guide/version-requirements.mdx b/packages/upgrade/source/util/v5-nextjs-guide/version-requirements.mdx new file mode 100644 index 00000000000..4d2e61c6268 --- /dev/null +++ b/packages/upgrade/source/util/v5-nextjs-guide/version-requirements.mdx @@ -0,0 +1,35 @@ +## Minimum version requirements + +We have updated some of our minumum version requirements for Node.js, React, and Next.js such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. Please take a moment to check your dependencies and ensure you are up to date! + +#### Updating Node.js + +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). + +#### Updating React + +`@clerk/nextjs` now requires you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. + + + ```bash filename="terminal" + npm install react@latest react-dom@latest + ``` + + ```bash filename="terminal" + yarn add react@latest react-dom@latest + ``` + + ```bash filename="terminal" + pnpm add react@latest react-dom@latest + ``` + + + +If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. + +#### Updating Next.js + +`@clerk/nextjs` now requires you to use Next.js version `13.0.4` or later. Check out Next's upgrade guides for more guidance if you have not yet upgraded to Next.js 13: + +- [Upgrading from 12 to 13](https://nextjs.org/docs/pages/building-your-application/upgrading/version-13) +- [Upgrading from 13 to 14](https://nextjs.org/docs/app/building-your-application/upgrading/version-14) diff --git a/packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change-2.md b/packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change-2.md deleted file mode 100644 index 4f74dd99afd..00000000000 --- a/packages/upgrade/source/versions/v5/common/aftersigninurl-behavior-change-2.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: '`afterSignInUrl` prop behavior change' -matcher: 'afterSignInUrl=' -warning: true ---- - -The default value of `afterSignInUrl` has been changed to `/`. The URLs defined in your `Dashboard > Account Portal > Redirects` section will no longer affect these values. Read the [Customizing your Account Portal redirects](https://clerk.com/docs/account-portal/custom-redirects) guide to learn how to override these defaults. diff --git a/packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md b/packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md deleted file mode 100644 index 1f37d73d635..00000000000 --- a/packages/upgrade/source/versions/v5/common/aftersignouturl-behavior-change.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: '`afterSignOutUrl` prop behavior change' -matcher: 'afterSignOutUrl=' -warning: true ---- - -The default value of `afterSignOutUrl` has been changed to `/`. The URLs defined in your `Dashboard > Account Portal > Redirects` section will no longer affect these values. Read the [Customizing your Account Portal redirects](https://clerk.com/docs/account-portal/custom-redirects) guide to learn how to override these defaults. If you are setting the value to `/`, you can remove the prop entirely. diff --git a/packages/upgrade/source/versions/v5/common/aftersignupurl-behavior-change.md b/packages/upgrade/source/versions/v5/common/aftersignupurl-behavior-change.md deleted file mode 100644 index ab5bb9c7968..00000000000 --- a/packages/upgrade/source/versions/v5/common/aftersignupurl-behavior-change.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: '`afterSignUpUrl` prop behavior change' -matcher: 'afterSignUpUrl=' -warning: true ---- - -The default value of `afterSignUpUrl` has been changed to `/`. The URLs defined in your `Dashboard > Account Portal > Redirects` section will no longer affect these values. Read the [Customizing your Account Portal redirects](https://clerk.com/docs/account-portal/custom-redirects) guide to learn how to override these defaults. diff --git a/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md b/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md index 90650b4b42a..e2f094842a2 100644 --- a/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md +++ b/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md @@ -1,6 +1,7 @@ --- title: '`afterSwitchOrganizationUrl` -> `afterSelectOrganizationUrl` in `OrganizationSwitcher`' matcher: "" +category: 'deprecation-removal' matcherFlags: 'm' replaceWithString: 'afterSelectOrganizationUrl' --- diff --git a/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md b/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md index bb8ce2add76..c4c64bae4af 100644 --- a/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md +++ b/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md @@ -1,5 +1,6 @@ --- title: 'Back button customization ids change on alternative 2fa methods page' +category: 'appearance' image: true matcherFlags: 'm' matcher: diff --git a/packages/upgrade/source/versions/v5/common/api-key-to-secret-key.md b/packages/upgrade/source/versions/v5/common/api-key-to-secret-key.md index 133ba344f2d..6d2d0e1ba4c 100644 --- a/packages/upgrade/source/versions/v5/common/api-key-to-secret-key.md +++ b/packages/upgrade/source/versions/v5/common/api-key-to-secret-key.md @@ -1,5 +1,6 @@ --- title: '`CLERK_API_KEY` replaced by `CLERK_SECRET_KEY`' +category: 'deprecation-removal' matcher: 'CLERK_API_KEY' --- diff --git a/packages/upgrade/source/versions/v5/common/appearance-organizationpreview-organizationswitcher.md b/packages/upgrade/source/versions/v5/common/appearance-organizationpreview-organizationswitcher.md index 6fb436000ed..396e0b5d76d 100644 --- a/packages/upgrade/source/versions/v5/common/appearance-organizationpreview-organizationswitcher.md +++ b/packages/upgrade/source/versions/v5/common/appearance-organizationpreview-organizationswitcher.md @@ -2,6 +2,7 @@ title: '`elements.organizationPreview__organizationSwitcher` -> `elements.organizationPreview__organizationSwitcherTrigger` in `` appearance prop' matcher: "" matcherFlags: 'm' +category: 'appearance' replaceWithString: 'organizationPreview__organizationSwitcherTrigger' --- diff --git a/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md b/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md index 1fb3381f0c7..c3039f5b54a 100644 --- a/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md +++ b/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md @@ -2,6 +2,7 @@ title: '`button` -> `organizationListCreateOrganizationActionButton` customization id' image: true replaceWithString: 'organizationListCreateOrganizationActionButton' +category: 'appearance' matcherFlags: 'm' matcher: - "\\.cl-(button)" diff --git a/packages/upgrade/source/versions/v5/common/card-changes.md b/packages/upgrade/source/versions/v5/common/card-changes.md index b4539c2be51..84d5b998c7a 100644 --- a/packages/upgrade/source/versions/v5/common/card-changes.md +++ b/packages/upgrade/source/versions/v5/common/card-changes.md @@ -1,6 +1,7 @@ --- title: 'Changes to the `card` customization id' warning: true +category: 'appearance' matcherFlags: 'm' matcher: - "\\.cl-card" diff --git a/packages/upgrade/source/versions/v5/common/changed-localization-keys.md b/packages/upgrade/source/versions/v5/common/changed-localization-keys.md index 278f16577db..9e1eeedb1ed 100644 --- a/packages/upgrade/source/versions/v5/common/changed-localization-keys.md +++ b/packages/upgrade/source/versions/v5/common/changed-localization-keys.md @@ -1,6 +1,7 @@ --- title: 'Localization keys changed' matcherFlags: 'm' +category: 'localization' matcher: - 'formFieldLabel__organizationName:' - 'formFieldLabel__organizationSlug:' @@ -55,125 +56,125 @@ The values of some keys have been changed on the default [en-US localization obj ```js const changedValues = { - formFieldLabel__organizationName: 'Name', - formFieldLabel__organizationSlug: 'Slug', - formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', - formFieldInputPlaceholder__organizationSlug: 'my-org', - signUp: { - start: { - subtitle: 'Welcome! Please fill in the details to get started.', - actionText: 'Already have an account?', - }, - emailCode: { - subtitle: 'Enter the verification code sent to your email', - }, - phoneCode: { - subtitle: 'Enter the verification code sent to your phone', - }, - continue: { - subtitle: 'Please fill in the remaining details to continue.', - actionText: 'Already have an account?', - }, - }, - signIn: { - start: { - title: 'Sign in to {{applicationName}}', - subtitle: 'Welcome back! Please sign in to continue', - actionText: 'Don’t have an account?', - }, - password: { - subtitle: 'Enter the password associated with your account', - }, - forgotPasswordAlternativeMethods: { - label__alternativeMethods: 'Or, sign in with another method', - }, - resetPassword: { - title: 'Set new password', - }, - phoneCodeMfa: { - subtitle: 'To continue, please enter the verification code sent to your phone', - }, - totpMfa: { - subtitle: 'To continue, please enter the verification code generated by your authenticator app', - }, - backupCodeMfa: { - subtitle: 'Your backup code is the one you got when setting up two-step authentication.', - }, - }, - userProfile: { - formButtonPrimary__continue: 'Save', - start: { - headerTitle__account: 'Profile details', - profileSection: { - primaryButton: 'Edit profile', - }, - emailAddressesSection: { - detailsAction__unverified: 'Verify', - destructiveAction: 'Remove email', - }, - mfaSection: { - phoneCode: { - destructiveActionLabel: 'Remove', - }, - backupCodes: { - actionLabel__regenerate: 'Regenerate', - }, - }, - dangerSection: { - title: 'Account termination', - deleteAccountButton: 'Delete account', - }, - }, - profilePage: { - imageFormSubtitle: 'Upload', - imageFormDestructiveActionSubtitle: 'Remove', - }, - phoneNumberPage: { - title: 'Add a phone number', - infoText: - 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', - }, - connectedAccountPage: { - socialButtonsBlockButton: '{{provider|titleize}}', - }, - mfaPhoneCodePage: { - subtitle__availablePhoneNumbers: - 'Select an existing phone number to register for SMS code two-step verification or add a new one.', - subtitle__unavailablePhoneNumbers: - 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', - }, - deletePage: { - actionDescription: 'Type "Delete account" below to continue.', - }, - }, - organizationSwitcher: { - action__createOrganization: 'Create organization', - action__manageOrganization: 'Manage', - }, - organizationProfile: { - profilePage: { - title: 'Update Profile', - dangerSection: { - title: 'Danger', - leaveOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', - }, - deleteOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', - }, - }, - }, - invitePage: { - title: 'Invite new members', - subtitle: 'Enter or paste one or more email addresses, separated by spaces or commas.', - }, - }, - createOrganization: { - title: 'Create organization', - }, - organizationList: { - title: 'Choose an account', - titleWithoutPersonal: 'Choose an organization', - }, + formFieldLabel__organizationName: 'Name', + formFieldLabel__organizationSlug: 'Slug', + formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', + formFieldInputPlaceholder__organizationSlug: 'my-org', + signUp: { + start: { + subtitle: 'Welcome! Please fill in the details to get started.', + actionText: 'Already have an account?', + }, + emailCode: { + subtitle: 'Enter the verification code sent to your email', + }, + phoneCode: { + subtitle: 'Enter the verification code sent to your phone', + }, + continue: { + subtitle: 'Please fill in the remaining details to continue.', + actionText: 'Already have an account?', + }, + }, + signIn: { + start: { + title: 'Sign in to {{applicationName}}', + subtitle: 'Welcome back! Please sign in to continue', + actionText: 'Don’t have an account?', + }, + password: { + subtitle: 'Enter the password associated with your account', + }, + forgotPasswordAlternativeMethods: { + label__alternativeMethods: 'Or, sign in with another method', + }, + resetPassword: { + title: 'Set new password', + }, + phoneCodeMfa: { + subtitle: 'To continue, please enter the verification code sent to your phone', + }, + totpMfa: { + subtitle: 'To continue, please enter the verification code generated by your authenticator app', + }, + backupCodeMfa: { + subtitle: 'Your backup code is the one you got when setting up two-step authentication.', + }, + }, + userProfile: { + formButtonPrimary__continue: 'Save', + start: { + headerTitle__account: 'Profile details', + profileSection: { + primaryButton: 'Edit profile', + }, + emailAddressesSection: { + detailsAction__unverified: 'Verify', + destructiveAction: 'Remove email', + }, + mfaSection: { + phoneCode: { + destructiveActionLabel: 'Remove', + }, + backupCodes: { + actionLabel__regenerate: 'Regenerate', + }, + }, + dangerSection: { + title: 'Account termination', + deleteAccountButton: 'Delete account', + }, + }, + profilePage: { + imageFormSubtitle: 'Upload', + imageFormDestructiveActionSubtitle: 'Remove', + }, + phoneNumberPage: { + title: 'Add a phone number', + infoText: + 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', + }, + connectedAccountPage: { + socialButtonsBlockButton: '{{provider|titleize}}', + }, + mfaPhoneCodePage: { + subtitle__availablePhoneNumbers: + 'Select an existing phone number to register for SMS code two-step verification or add a new one.', + subtitle__unavailablePhoneNumbers: + 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', + }, + deletePage: { + actionDescription: 'Type "Delete account" below to continue.', + }, + }, + organizationSwitcher: { + action__createOrganization: 'Create organization', + action__manageOrganization: 'Manage', + }, + organizationProfile: { + profilePage: { + title: 'Update Profile', + dangerSection: { + title: 'Danger', + leaveOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + deleteOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + }, + }, + invitePage: { + title: 'Invite new members', + subtitle: 'Enter or paste one or more email addresses, separated by spaces or commas.', + }, + }, + createOrganization: { + title: 'Create organization', + }, + organizationList: { + title: 'Choose an account', + titleWithoutPersonal: 'Choose an organization', + }, }; ``` diff --git a/packages/upgrade/source/versions/v5/common/clerkprovider-frontendapi-2.md b/packages/upgrade/source/versions/v5/common/clerkprovider-frontendapi-2.md index 4f90cc4085b..33238534760 100644 --- a/packages/upgrade/source/versions/v5/common/clerkprovider-frontendapi-2.md +++ b/packages/upgrade/source/versions/v5/common/clerkprovider-frontendapi-2.md @@ -1,6 +1,7 @@ --- title: '`frontendApi` -> `publishableKey` as prop to `ClerkProvider`' matcher: "" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/clerkprovideroptionswrapper-dropped.md b/packages/upgrade/source/versions/v5/common/clerkprovideroptionswrapper-dropped.md index a0afa9675f7..6adf44078df 100644 --- a/packages/upgrade/source/versions/v5/common/clerkprovideroptionswrapper-dropped.md +++ b/packages/upgrade/source/versions/v5/common/clerkprovideroptionswrapper-dropped.md @@ -1,5 +1,6 @@ --- title: '`ClerkProviderOptionsWrapper` type removed' +category: 'deprecation-removal' matcher: 'ClerkProviderOptionsWrapper' --- diff --git a/packages/upgrade/source/versions/v5/common/connected-accounts-dropdown.md b/packages/upgrade/source/versions/v5/common/connected-accounts-dropdown.md index 0307c43693b..79000633c9d 100644 --- a/packages/upgrade/source/versions/v5/common/connected-accounts-dropdown.md +++ b/packages/upgrade/source/versions/v5/common/connected-accounts-dropdown.md @@ -1,6 +1,7 @@ --- title: 'Within ``, Connected Accounts Added via Dropdown' matcher: '(?:`, Multi-Factor Auth is Added via Dropdown' matcher: '(?:|=|\\s)*(?:12|13|14|15|16|17)\\..*?" +matcherFlags: 'm' --- If you're using `react`, you will need to update your Next.js project to `v18` or later to ensure that the latest version of Clerk's SDKs work properly. diff --git a/packages/upgrade/source/versions/v5/common/new-localization-keys.md b/packages/upgrade/source/versions/v5/common/new-localization-keys.md index 7859cf52a0c..41bb37d211e 100644 --- a/packages/upgrade/source/versions/v5/common/new-localization-keys.md +++ b/packages/upgrade/source/versions/v5/common/new-localization-keys.md @@ -2,6 +2,7 @@ title: 'New localization keys added' matcher: "" matcherFlags: 'm' +category: 'localization' warning: true --- @@ -9,125 +10,125 @@ As part of the redesign of Clerk's components, a number of new localization keys ```js const newValues = { - formFieldLabel__organizationName: 'Name', - formFieldLabel__organizationSlug: 'Slug', - formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', - formFieldInputPlaceholder__organizationSlug: 'my-org', - signUp: { - start: { - subtitle: 'Welcome! Please fill in the details to get started.', - actionText: 'Already have an account?', - }, - emailCode: { - subtitle: 'Enter the verification code sent to your email', - }, - phoneCode: { - subtitle: 'Enter the verification code sent to your phone', - }, - continue: { - subtitle: 'Please fill in the remaining details to continue.', - actionText: 'Already have an account?', - }, - }, - signIn: { - start: { - title: 'Sign in to {{applicationName}}', - subtitle: 'Welcome back! Please sign in to continue', - actionText: 'Don’t have an account?', - }, - password: { - subtitle: 'Enter the password associated with your account', - }, - forgotPasswordAlternativeMethods: { - label__alternativeMethods: 'Or, sign in with another method', - }, - resetPassword: { - title: 'Set new password', - }, - phoneCodeMfa: { - subtitle: 'To continue, please enter the verification code sent to your phone', - }, - totpMfa: { - subtitle: 'To continue, please enter the verification code generated by your authenticator app', - }, - backupCodeMfa: { - subtitle: 'Your backup code is the one you got when setting up two-step authentication.', - }, - }, - userProfile: { - formButtonPrimary__continue: 'Save', - start: { - headerTitle__account: 'Profile details', - profileSection: { - primaryButton: 'Edit profile', - }, - emailAddressesSection: { - detailsAction__unverified: 'Verify', - destructiveAction: 'Remove email', - }, - mfaSection: { - phoneCode: { - destructiveActionLabel: 'Remove', - }, - backupCodes: { - actionLabel__regenerate: 'Regenerate', - }, - }, - dangerSection: { - title: 'Account termination', - deleteAccountButton: 'Delete account', - }, - }, - profilePage: { - imageFormSubtitle: 'Upload', - imageFormDestructiveActionSubtitle: 'Remove', - }, - phoneNumberPage: { - title: 'Add a phone number', - infoText: - 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', - }, - connectedAccountPage: { - socialButtonsBlockButton: '{{provider|titleize}}', - }, - mfaPhoneCodePage: { - subtitle__availablePhoneNumbers: - 'Select an existing phone number to register for SMS code two-step verification or add a new one.', - subtitle__unavailablePhoneNumbers: - 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', - }, - deletePage: { - actionDescription: 'Type "Delete account" below to continue.', - }, - }, - organizationSwitcher: { - action__createOrganization: 'Create organization', - action__manageOrganization: 'Manage', - }, - organizationProfile: { - profilePage: { - title: 'Update Profile', - dangerSection: { - title: 'Danger', - leaveOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', - }, - deleteOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', - }, - }, - }, - invitePage: { - title: 'Invite new members', - subtitle: 'Enter or paste one or more email addresses, separated by spaces or commas.', - }, - }, - createOrganization: { - title: 'Create organization', - }, - organizationList: { - title: 'Choose an account', - titleWithoutPersonal: 'Choose an organization', - }, + formFieldLabel__organizationName: 'Name', + formFieldLabel__organizationSlug: 'Slug', + formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', + formFieldInputPlaceholder__organizationSlug: 'my-org', + signUp: { + start: { + subtitle: 'Welcome! Please fill in the details to get started.', + actionText: 'Already have an account?', + }, + emailCode: { + subtitle: 'Enter the verification code sent to your email', + }, + phoneCode: { + subtitle: 'Enter the verification code sent to your phone', + }, + continue: { + subtitle: 'Please fill in the remaining details to continue.', + actionText: 'Already have an account?', + }, + }, + signIn: { + start: { + title: 'Sign in to {{applicationName}}', + subtitle: 'Welcome back! Please sign in to continue', + actionText: 'Don’t have an account?', + }, + password: { + subtitle: 'Enter the password associated with your account', + }, + forgotPasswordAlternativeMethods: { + label__alternativeMethods: 'Or, sign in with another method', + }, + resetPassword: { + title: 'Set new password', + }, + phoneCodeMfa: { + subtitle: 'To continue, please enter the verification code sent to your phone', + }, + totpMfa: { + subtitle: 'To continue, please enter the verification code generated by your authenticator app', + }, + backupCodeMfa: { + subtitle: 'Your backup code is the one you got when setting up two-step authentication.', + }, + }, + userProfile: { + formButtonPrimary__continue: 'Save', + start: { + headerTitle__account: 'Profile details', + profileSection: { + primaryButton: 'Edit profile', + }, + emailAddressesSection: { + detailsAction__unverified: 'Verify', + destructiveAction: 'Remove email', + }, + mfaSection: { + phoneCode: { + destructiveActionLabel: 'Remove', + }, + backupCodes: { + actionLabel__regenerate: 'Regenerate', + }, + }, + dangerSection: { + title: 'Account termination', + deleteAccountButton: 'Delete account', + }, + }, + profilePage: { + imageFormSubtitle: 'Upload', + imageFormDestructiveActionSubtitle: 'Remove', + }, + phoneNumberPage: { + title: 'Add a phone number', + infoText: + 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', + }, + connectedAccountPage: { + socialButtonsBlockButton: '{{provider|titleize}}', + }, + mfaPhoneCodePage: { + subtitle__availablePhoneNumbers: + 'Select an existing phone number to register for SMS code two-step verification or add a new one.', + subtitle__unavailablePhoneNumbers: + 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', + }, + deletePage: { + actionDescription: 'Type "Delete account" below to continue.', + }, + }, + organizationSwitcher: { + action__createOrganization: 'Create organization', + action__manageOrganization: 'Manage', + }, + organizationProfile: { + profilePage: { + title: 'Update Profile', + dangerSection: { + title: 'Danger', + leaveOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + deleteOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + }, + }, + invitePage: { + title: 'Invite new members', + subtitle: 'Enter or paste one or more email addresses, separated by spaces or commas.', + }, + }, + createOrganization: { + title: 'Create organization', + }, + organizationList: { + title: 'Choose an account', + titleWithoutPersonal: 'Choose an organization', + }, }; ``` diff --git a/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md b/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md index 0a96da275e8..a7ab28199b0 100644 --- a/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md +++ b/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md @@ -2,6 +2,7 @@ title: '`Settings` -> `General` tab in `OrganizationProfile`' matcher: '. If you are applying style customization to either of these elements, your customizations may need to be adjusted. +We have swapped the parent-child relationship of the two elements `userButtonTrigger` and `userButtonBox`. Previously, `userButtonTrigger` was nested inside of `userButtonBox`, and now `userButtonBox` is nested inside of `userButtonTrigger`. This change resolves [some usability issues](https://github.com/clerk/javascript/issues/1625) in ``. If you are applying style customization to either of these elements, your customizations may need to be adjusted. diff --git a/packages/upgrade/source/versions/v5/common/userprofile-security.md b/packages/upgrade/source/versions/v5/common/userprofile-security.md index f7ea7db7066..738f9f0e20f 100644 --- a/packages/upgrade/source/versions/v5/common/userprofile-security.md +++ b/packages/upgrade/source/versions/v5/common/userprofile-security.md @@ -1,6 +1,7 @@ --- title: 'Within ``, Account and Security Pages Separated' matcher: '(?: { - const clerk = useIsomorphicClerkContext(); + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const clerk = useIsomorphicClerkContext(); - if (!clerk.loaded) return null; + if (!clerk.loaded) return null; - return ( - - ); - }; + return ( + + ); + }; - HOC.displayName = `withClerk(${displayName})`; - return HOC; + HOC.displayName = `withClerk(${displayName})`; + return HOC; } ``` diff --git a/packages/upgrade/source/versions/v5/common/withclerk-removed.md b/packages/upgrade/source/versions/v5/common/withclerk-removed.md index b5b24ff1792..808d9e2bca5 100644 --- a/packages/upgrade/source/versions/v5/common/withclerk-removed.md +++ b/packages/upgrade/source/versions/v5/common/withclerk-removed.md @@ -1,6 +1,7 @@ --- title: '`WithClerk` component removed' matcher: "import\\s+{[\\s\\S]*?WithClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md b/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md index 9ab61237089..81b44040025 100644 --- a/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md +++ b/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md @@ -1,6 +1,7 @@ --- title: '`withSession` function removed' matcher: "import\\s+{[\\s\\S]*?withSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- @@ -8,22 +9,22 @@ The `withSession` higher order function has been removed. If you would still lik ```js function withSession(Component, displayName) { - displayName = displayName || Component.displayName || Component.name || 'Component'; - Component.displayName = displayName; - const HOC = props => { - const session = useSessionContext(); + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const session = useSessionContext(); - if (!session) return null; + if (!session) return null; - return ( - - ); - }; + return ( + + ); + }; - HOC.displayName = `withSession(${displayName})`; - return HOC; + HOC.displayName = `withSession(${displayName})`; + return HOC; } ``` diff --git a/packages/upgrade/source/versions/v5/common/withsession-removed.md b/packages/upgrade/source/versions/v5/common/withsession-removed.md index c5b3aaafa4d..6c93d5da353 100644 --- a/packages/upgrade/source/versions/v5/common/withsession-removed.md +++ b/packages/upgrade/source/versions/v5/common/withsession-removed.md @@ -1,6 +1,7 @@ --- title: '`WithSession` component removed' matcher: "import\\s+{[\\s\\S]*?WithSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md b/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md index d3ad1a9d33b..ef323cf3a50 100644 --- a/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md +++ b/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md @@ -1,6 +1,7 @@ --- title: '`withUser` function removed' matcher: "import\\s+{[\\s\\S]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- @@ -8,22 +9,22 @@ The `withUser` higher order function has been removed. If you would still like t ```js function withUser(Component, displayName) { - displayName = displayName || Component.displayName || Component.name || 'Component'; - Component.displayName = displayName; - const HOC = props => { - const clerk = useUserContext(); + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const clerk = useUserContext(); - if (!user) return null; + if (!user) return null; - return ( - - ); - }; + return ( + + ); + }; - HOC.displayName = `withUser(${displayName})`; - return HOC; + HOC.displayName = `withUser(${displayName})`; + return HOC; } ``` diff --git a/packages/upgrade/source/versions/v5/common/withuser-removed-2.md b/packages/upgrade/source/versions/v5/common/withuser-removed-2.md index 1afa19709b8..71a879deab6 100644 --- a/packages/upgrade/source/versions/v5/common/withuser-removed-2.md +++ b/packages/upgrade/source/versions/v5/common/withuser-removed-2.md @@ -1,11 +1,10 @@ --- title: '`WithUser` component removed' matcher: "import\\s+{[\\s\\S]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- - - The `WithUser` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: ```js diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 58f715ac5ad..3b01580a309 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -1,378 +1,363 @@ import createLoader from '../../util/load-change.js'; const load = createLoader({ - version: '5', - baseUrl: 'https://clerk.com/docs/upgrade-guides/v5', + version: '5', + baseUrl: 'https://clerk.com/docs/upgrade-guides/v5', }); const reactChangesList = [ - 'magiclinkerrorcode', - 'usemagiclink', - 'ismagiclinkerror', - 'magiclinkerror', - 'handlemagiclinkverification', - 'clerkprovider-frontendapi-2', - 'setsession', - 'navigate-to-routerpush-routerreplace', - 'afterswitchorganizationurl', - 'appearance-organizationpreview-organizationswitcher', - 'useorganization-invitationlist', - 'useorganization-membershiplist', - 'useorganizations', - 'userprofile-prop', - 'organizationprofile-settings', - 'userprofile-security', - 'mfa-dropdown', - 'connected-accounts-dropdown', - 'userbuttonpopoveractionbuttontext-removed', - 'userbuttontrigger-userbuttonbox-invert', - 'organizationswitcherpopoveractionbuttontext-removed', - 'card-changes', - 'alternativemethods-backlink', - 'button-to-organizationlistcreateorganizationactionbutton', - 'remove-socialbuttonsblockbuttonarrow', - 'remove-identitypreview-avatar', - 'withsession-removed', - 'withclerk-removed', - 'withuser-removed-2', - 'withclerk-hof-removed', - 'withsession-hof-removed', - 'withuser-hof-removed', - 'multisessionappsupport-import-change', - 'clerkprovideroptionswrapper-dropped', - 'aftersignouturl-behavior-change', - 'aftersigninurl-behavior-change-2', - 'aftersignupurl-behavior-change', - 'new-localization-keys', - 'removed-localization-keys', - 'changed-localization-keys', - 'signoutcallback-to-redirecturl', - 'min-react-version', - 'getorganizationlist-return-type-change', - 'getorganizationinvitationlist-return-type-change', - 'getorganizationmembershiplist-return-type-change', - 'organization-getroles-arguments-changed', - 'organization-getmemberships-arguments-changed', - 'organization-getdomains-arguments-change', - 'organization-getinvitations-arguments-changed', - 'organization-getmembershiprequests-arguments-changed', - 'user-getorganizationinvitations-arguments-chanaged', - 'user-getorganizationsuggestions-arguments-chanaged', - 'user-getorganizationmemberships-arguments-chanaged', + 'magiclinkerrorcode', + 'usemagiclink', + 'ismagiclinkerror', + 'magiclinkerror', + 'handlemagiclinkverification', + 'clerkprovider-frontendapi-2', + 'setsession', + 'navigate-to-routerpush-routerreplace', + 'afterswitchorganizationurl', + 'appearance-organizationpreview-organizationswitcher', + 'useorganization-invitationlist', + 'useorganization-membershiplist', + 'useorganizations', + 'userprofile-prop', + 'organizationprofile-settings', + 'userprofile-security', + 'mfa-dropdown', + 'connected-accounts-dropdown', + 'userbuttonpopoveractionbuttontext-removed', + 'userbuttontrigger-userbuttonbox-invert', + 'organizationswitcherpopoveractionbuttontext-removed', + 'card-changes', + 'alternativemethods-backlink', + 'button-to-organizationlistcreateorganizationactionbutton', + 'remove-socialbuttonsblockbuttonarrow', + 'remove-identitypreview-avatar', + 'withsession-removed', + 'withclerk-removed', + 'withuser-removed-2', + 'withclerk-hof-removed', + 'withsession-hof-removed', + 'withuser-hof-removed', + 'multisessionappsupport-import-change', + 'clerkprovideroptionswrapper-dropped', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', + 'signoutcallback-to-redirecturl', + 'min-react-version', + 'getorganizationlist-return-type-change', + 'getorganizationinvitationlist-return-type-change', + 'getorganizationmembershiplist-return-type-change', + 'organization-getroles-arguments-changed', + 'organization-getmemberships-arguments-changed', + 'organization-getdomains-arguments-change', + 'organization-getinvitations-arguments-changed', + 'organization-getmembershiprequests-arguments-changed', + 'user-getorganizationinvitations-arguments-chanaged', + 'user-getorganizationsuggestions-arguments-chanaged', + 'user-getorganizationmemberships-arguments-chanaged', ]; export default { - nextjs: load('next', [ - 'api-key-to-secret-key', - 'frontend-api-to-publishable-key', - 'with-clerk-middleware-removed', - 'auth-middleware-deprecated', - 'clerk-js-version-next-public', - 'authmiddleware-apikey', - 'authmiddleware-frontendapi', - 'createclerkclient-apikey', - 'createclerkclient-frontendapi', - 'getauth-apikey', - 'clerkprovider-frontendapi-2', - 'import-nextjs-app-beta', - 'import-nextjs-ssr', - 'import-nextjs-edge-middleware', - 'import-nextjs-edge-middlewarefiles', - 'import-api-url', - 'import-api-version', - 'import-clerk-js-url', - 'import-clerk-js-version', - 'import-domain', - 'import-is-satellite', - 'import-proxy-url', - 'import-publishable-key', - 'import-secret-key', - 'import-sign-in-url', - 'import-sign-up-url', - 'import-nextjs-api', - 'api-url-value-change', - 'ismagiclinkerror', - 'usemagiclink', - 'magiclinkerrorcode', - 'setsession', - 'organizationprofile-settings', - 'userprofile-security', - 'mfa-dropdown', - 'connected-accounts-dropdown', - 'userbuttonpopoveractionbuttontext-removed', - 'userbuttontrigger-userbuttonbox-invert', - 'organizationswitcherpopoveractionbuttontext-removed', - 'card-changes', - 'alternativemethods-backlink', - 'button-to-organizationlistcreateorganizationactionbutton', - 'remove-socialbuttonsblockbuttonarrow', - 'remove-identitypreview-avatar', - 'multisessionappsupport-import-change', - 'auth-import-change', - 'currentuser-import-change', - 'authmiddleware-import-change', - 'buildclerkprops-import-change', - 'verifytoken-import-change', - 'verifyjwt-import-change', - 'decodejwt-import-change', - 'signjwt-import-change', - 'constants-import-change', - 'createauthenticaterequest-import-change', - 'createisomorphicrequest-import-change', - 'clerk-import-change', - 'isclerkapiresponserror-import-change', - 'isemaillinkerror-import-change', - 'isknownerror-import-change', - 'ismetamaskerror-import-change', - 'withsession-removed', - 'withclerk-removed', - 'withuser-removed-2', - 'withclerk-hof-removed', - 'withsession-hof-removed', - 'withuser-hof-removed', - 'next-public-clerk-js-url', - 'aftersignouturl-behavior-change', - 'aftersigninurl-behavior-change-2', - 'aftersignupurl-behavior-change', - 'new-localization-keys', - 'removed-localization-keys', - 'changed-localization-keys', - 'signoutcallback-to-redirecturl', - 'min-nextjs-version', - 'redirecttosignin-import-path', - 'redirecttosignup-import-path', - 'getorganizationlist-return-type-change', - 'getorganizationinvitationlist-return-type-change', - 'getorganizationmembershiplist-return-type-change', - 'organization-getroles-arguments-changed', - 'organization-getmemberships-arguments-changed', - 'organization-getdomains-arguments-change', - 'organization-getinvitations-arguments-changed', - 'organization-getmembershiprequests-arguments-changed', - 'user-getorganizationinvitations-arguments-chanaged', - 'user-getorganizationsuggestions-arguments-chanaged', - 'user-getorganizationmemberships-arguments-chanaged', - ]), - // since we export clerk-react at the top level from the gatsby plugin - // if you're using gatsby, we also need to scan for the react changes - gatsby: load( - 'gatsby', - dedupeMerge(reactChangesList, [ - 'api-key-to-secret-key', - 'createclerkclient-apikey', - 'apikey-to-publishable-key', - 'createclerkclient-frontendapi', - 'ismagiclinkerror', - 'usemagiclink', - 'magiclinkerrorcode', - 'setsession', - 'api-url-value-change', - 'withserverauth-return-type', - 'clerk-import-change', - ]), - ), - remix: load('remix', [ - 'clerkerrorboundary-removed', - 'createclerkclient-apikey', - 'rootauthloader-apikey', - 'getauth-apikey', - 'clerkprovider-frontendapi-2', - 'rootauthloader-frontendapi', - 'frontend-api-to-publishable-key', - 'api-key-to-secret-key', - 'ismagiclinkerror', - 'magiclinkerrorcode', - 'usemagiclink', - 'setsession', - 'aftersignouturl-behavior-change', - 'aftersigninurl-behavior-change-2', - 'aftersignupurl-behavior-change', - 'new-localization-keys', - 'removed-localization-keys', - 'changed-localization-keys', - 'signoutcallback-to-redirecturl', - 'clerk-import-change', - 'getorganizationlist-return-type-change', - 'getorganizationinvitationlist-return-type-change', - 'getorganizationmembershiplist-return-type-change', - 'organization-getroles-arguments-changed', - 'organization-getmemberships-arguments-changed', - 'organization-getdomains-arguments-change', - 'organization-getinvitations-arguments-changed', - 'organization-getmembershiprequests-arguments-changed', - 'user-getorganizationinvitations-arguments-chanaged', - 'user-getorganizationsuggestions-arguments-chanaged', - 'user-getorganizationmemberships-arguments-chanaged', - ]), - expo: load('expo', [ - 'apikey-to-publishable-key', - 'ismagiclinkerror', - 'usemagiclink', - 'magiclinkerrorcode', - 'setsession', - 'organizationprofile-settings', - 'userprofile-security', - 'mfa-dropdown', - 'connected-accounts-dropdown', - 'userbuttonpopoveractionbuttontext-removed', - 'userbuttontrigger-userbuttonbox-invert', - 'organizationswitcherpopoveractionbuttontext-removed', - 'card-changes', - 'alternativemethods-backlink', - 'button-to-organizationlistcreateorganizationactionbutton', - 'remove-socialbuttonsblockbuttonarrow', - 'remove-identitypreview-avatar', - 'aftersignouturl-behavior-change', - 'aftersigninurl-behavior-change-2', - 'aftersignupurl-behavior-change', - 'new-localization-keys', - 'removed-localization-keys', - 'changed-localization-keys', - 'signoutcallback-to-redirecturl', - 'getorganizationlist-return-type-change', - 'getorganizationinvitationlist-return-type-change', - 'getorganizationmembershiplist-return-type-change', - ]), - fastify: load('fastify', [ - 'api-key-to-secret-key', - 'api-url-value-change', - 'frontend-api-to-publishable-key', - 'createclerkclient-apikey', - 'createclerkclient-frontendapi', - 'clerkplugin-frontendapi', - 'clerk-import-change', - ]), - node: load('node', [ - 'api-key-to-secret-key', - 'api-url-value-change', - 'frontend-api-to-publishable-key', - 'clerkexpressrequireauth-apikey', - 'clerkexpresswithauth-apikey', - 'createclerkclient-apikey', - 'createclerkexpressrequireauth-apikey', - 'createclerkexpresswithauth-apikey', - 'createclerkclient-frontendapi', - 'createclerkexpressrequireauth-frontendapi', - 'clerkexpressrequireauth-frontendapi', - 'createclerkexpresswithauth-frontendapi', - 'clerkexpresswithauth-frontendapi', - 'setclerkapikey', - 'setclerkapiversion', - 'setclerkhttpoptions', - 'setclerkserverapiurl', - 'cjs-esm-instance', - 'legacyauthobject-removed', - 'clerk-import-change', - ]), - react: load('react', reactChangesList), - js: load('js', [ - 'magiclinkerror', - 'ismagiclinkerror', - 'magiclinkerrorcode', - 'usemagiclink', - 'handlemagiclinkverification', - 'external-account-avatarurl', // shared w/ all - 'organization-logourl', // shared w/ all - 'user-orgpublicdata-profileimageurl', // shared w/ all - 'setsession', - 'user-update-password', // shared w/ all - 'experimental-canusecaptcha', - 'experimental-captchaurl', - 'experimental-captchasitekey', - 'getorganizationmemberships', - 'lastorganizationinvitation-member', - 'unstable-invitationupdate', - 'unstable-membershipupdate', - 'organization-create-string', // maybe shared with all? - 'organization-getpendinginvitations', // maybe shared with all? - 'user-createexternalaccount-redirecturl', // maybe shared with all? - 'signup-attemptweb3walletverification-generatedsignature', - 'redirecttohome', - 'organizationprofile-settings', - 'userprofile-security', - 'mfa-dropdown', - 'connected-accounts-dropdown', - 'userbuttonpopoveractionbuttontext-removed', - 'userbuttontrigger-userbuttonbox-invert', - 'organizationswitcherpopoveractionbuttontext-removed', - 'card-changes', - 'alternativemethods-backlink', - 'button-to-organizationlistcreateorganizationactionbutton', - 'remove-socialbuttonsblockbuttonarrow', - 'remove-identitypreview-avatar', - 'organization-getroles-arguments-changed', - 'organization-getdomains-arguments-change', - 'organization-getmembershiprequests-arguments-changed', - 'organization-getmemberships-arguments-changed', - 'organization-getinvitations-arguments-changed', - 'user-getorganizationinvitations-arguments-chanaged', - 'user-getorganizationsuggestions-arguments-chanaged', - 'user-getorganizationmemberships-arguments-chanaged', - 'aftersignouturl-behavior-change', - 'aftersigninurl-behavior-change-2', - 'aftersignupurl-behavior-change', - 'clerk-isready-removed', - 'new-localization-keys', - 'removed-localization-keys', - 'changed-localization-keys', - 'signoutcallback-to-redirecturl', - ]), - shared: load('shared', [ - 'magiclinkerror', - 'ismagiclinkerror', - 'magiclinkerrorcode', - 'usemagiclink', - 'getrequesturl', - 'organizationcontext', - 'useorganizationlist-organizationlist', // shared outside this pkg? - ]), - chromeExtension: load('chromeExtension', ['clerkprovider-tokencache']), - localizations: load('localization', [ - 'new-localization-keys', - 'removed-localization-keys', - 'changed-localization-keys', - ]), - backend: load('backend', [ - 'api-url-value-changed', - 'verifyjwt-import-path-move', - 'decodejwt-import-path-move', - 'signjwt-import-path-move', - 'constants-import-path-move', - 'redirect-import-path-move', - 'createauthenticaterequest-import-path-move', - 'createisomorphicrequest-import-path-move', - 'createclerkclient-frontendapi', - 'authenticaterequest-params-change', - 'clerk-import', - 'externalaccount-picture', - 'externalaccountjson-avatarurl', - 'organization-logourl', - 'organizationjson-logourl', - 'user-profileimageurl', - 'userjson-profileimageurl', - 'organizationmembershippublicuserdata-profileimageurl', - 'organizationmembershippublicuserdatajson-profileimageurl', - 'clockskewinseconds', - 'pkgversion', - 'client-unstableoptions-removed', - 'httpoptions-removed', - 'createisomorphicrequest-removed', - 'createemail-removed', - 'signjwterror-import-move', - 'tokenverificationerror-import-move', - 'tokenverificationerroraction-import-move', - 'tokenverificationerrorreason-import-move', - 'membershiprole', - 'getorganizationmembershiplist-return-signature', - 'getorganizationlist-return-signature', - 'getorganizationinvitationlist-return-signature', - 'buildrequesturl-removed', - ]), - types: [], - redwood: [], - express: [], + nextjs: load('next', [ + 'api-key-to-secret-key', + 'frontend-api-to-publishable-key', + 'with-clerk-middleware-removed', + 'auth-middleware-deprecated', + 'clerk-js-version-next-public', + 'authmiddleware-apikey', + 'authmiddleware-frontendapi', + 'createclerkclient-apikey', + 'createclerkclient-frontendapi', + 'getauth-apikey', + 'clerkprovider-frontendapi-2', + 'import-nextjs-app-beta', + 'import-nextjs-ssr', + 'import-nextjs-edge-middleware', + 'import-nextjs-edge-middlewarefiles', + 'import-api-url', + 'import-api-version', + 'import-clerk-js-url', + 'import-clerk-js-version', + 'import-domain', + 'import-is-satellite', + 'import-proxy-url', + 'import-publishable-key', + 'import-secret-key', + 'import-sign-in-url', + 'import-sign-up-url', + 'import-nextjs-api', + 'api-url-value-change', + 'ismagiclinkerror', + 'usemagiclink', + 'magiclinkerrorcode', + 'setsession', + 'organizationprofile-settings', + 'userprofile-security', + 'mfa-dropdown', + 'connected-accounts-dropdown', + 'userbuttonpopoveractionbuttontext-removed', + 'userbuttontrigger-userbuttonbox-invert', + 'organizationswitcherpopoveractionbuttontext-removed', + 'card-changes', + 'alternativemethods-backlink', + 'button-to-organizationlistcreateorganizationactionbutton', + 'remove-socialbuttonsblockbuttonarrow', + 'remove-identitypreview-avatar', + 'multisessionappsupport-import-change', + 'auth-import-change', + 'currentuser-import-change', + 'authmiddleware-import-change', + 'buildclerkprops-import-change', + 'verifytoken-import-change', + 'verifyjwt-import-change', + 'decodejwt-import-change', + 'signjwt-import-change', + 'constants-import-change', + 'createauthenticaterequest-import-change', + 'createisomorphicrequest-import-change', + 'clerk-import-change', + 'isclerkapiresponserror-import-change', + 'isemaillinkerror-import-change', + 'isknownerror-import-change', + 'ismetamaskerror-import-change', + 'withsession-removed', + 'withclerk-removed', + 'withuser-removed-2', + 'withclerk-hof-removed', + 'withsession-hof-removed', + 'withuser-hof-removed', + 'next-public-clerk-js-url', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', + 'signoutcallback-to-redirecturl', + 'min-nextjs-version', + 'redirecttosignin-import-path', + 'redirecttosignup-import-path', + 'getorganizationlist-return-type-change', + 'getorganizationinvitationlist-return-type-change', + 'getorganizationmembershiplist-return-type-change', + 'organization-getroles-arguments-changed', + 'organization-getmemberships-arguments-changed', + 'organization-getdomains-arguments-change', + 'organization-getinvitations-arguments-changed', + 'organization-getmembershiprequests-arguments-changed', + 'user-getorganizationinvitations-arguments-chanaged', + 'user-getorganizationsuggestions-arguments-chanaged', + 'user-getorganizationmemberships-arguments-chanaged', + ]), + // since we export clerk-react at the top level from the gatsby plugin + // if you're using gatsby, we also need to scan for the react changes + gatsby: load( + 'gatsby', + dedupeMerge(reactChangesList, [ + 'api-key-to-secret-key', + 'createclerkclient-apikey', + 'apikey-to-publishable-key', + 'createclerkclient-frontendapi', + 'ismagiclinkerror', + 'usemagiclink', + 'magiclinkerrorcode', + 'setsession', + 'api-url-value-change', + 'withserverauth-return-type', + 'clerk-import-change', + ]), + ), + remix: load('remix', [ + 'clerkerrorboundary-removed', + 'createclerkclient-apikey', + 'rootauthloader-apikey', + 'getauth-apikey', + 'clerkprovider-frontendapi-2', + 'rootauthloader-frontendapi', + 'frontend-api-to-publishable-key', + 'api-key-to-secret-key', + 'ismagiclinkerror', + 'magiclinkerrorcode', + 'usemagiclink', + 'setsession', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', + 'signoutcallback-to-redirecturl', + 'clerk-import-change', + 'getorganizationlist-return-type-change', + 'getorganizationinvitationlist-return-type-change', + 'getorganizationmembershiplist-return-type-change', + 'organization-getroles-arguments-changed', + 'organization-getmemberships-arguments-changed', + 'organization-getdomains-arguments-change', + 'organization-getinvitations-arguments-changed', + 'organization-getmembershiprequests-arguments-changed', + 'user-getorganizationinvitations-arguments-chanaged', + 'user-getorganizationsuggestions-arguments-chanaged', + 'user-getorganizationmemberships-arguments-chanaged', + ]), + expo: load('expo', [ + 'apikey-to-publishable-key', + 'ismagiclinkerror', + 'usemagiclink', + 'magiclinkerrorcode', + 'setsession', + 'organizationprofile-settings', + 'userprofile-security', + 'mfa-dropdown', + 'connected-accounts-dropdown', + 'userbuttonpopoveractionbuttontext-removed', + 'userbuttontrigger-userbuttonbox-invert', + 'organizationswitcherpopoveractionbuttontext-removed', + 'card-changes', + 'alternativemethods-backlink', + 'button-to-organizationlistcreateorganizationactionbutton', + 'remove-socialbuttonsblockbuttonarrow', + 'remove-identitypreview-avatar', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', + 'signoutcallback-to-redirecturl', + 'getorganizationlist-return-type-change', + 'getorganizationinvitationlist-return-type-change', + 'getorganizationmembershiplist-return-type-change', + ]), + fastify: load('fastify', [ + 'api-key-to-secret-key', + 'api-url-value-change', + 'frontend-api-to-publishable-key', + 'createclerkclient-apikey', + 'createclerkclient-frontendapi', + 'clerkplugin-frontendapi', + 'clerk-import-change', + ]), + node: load('node', [ + 'api-key-to-secret-key', + 'api-url-value-change', + 'frontend-api-to-publishable-key', + 'clerkexpressrequireauth-apikey', + 'clerkexpresswithauth-apikey', + 'createclerkclient-apikey', + 'createclerkexpressrequireauth-apikey', + 'createclerkexpresswithauth-apikey', + 'createclerkclient-frontendapi', + 'createclerkexpressrequireauth-frontendapi', + 'clerkexpressrequireauth-frontendapi', + 'createclerkexpresswithauth-frontendapi', + 'clerkexpresswithauth-frontendapi', + 'setclerkapikey', + 'setclerkapiversion', + 'setclerkhttpoptions', + 'setclerkserverapiurl', + 'cjs-esm-instance', + 'legacyauthobject-removed', + 'clerk-import-change', + ]), + react: load('react', reactChangesList), + js: load('js', [ + 'magiclinkerror', + 'ismagiclinkerror', + 'magiclinkerrorcode', + 'usemagiclink', + 'handlemagiclinkverification', + 'external-account-avatarurl', // shared w/ all + 'organization-logourl', // shared w/ all + 'user-orgpublicdata-profileimageurl', // shared w/ all + 'setsession', + 'user-update-password', // shared w/ all + 'experimental-canusecaptcha', + 'experimental-captchaurl', + 'experimental-captchasitekey', + 'getorganizationmemberships', + 'lastorganizationinvitation-member', + 'unstable-invitationupdate', + 'unstable-membershipupdate', + 'organization-create-string', // maybe shared with all? + 'organization-getpendinginvitations', // maybe shared with all? + 'user-createexternalaccount-redirecturl', // maybe shared with all? + 'signup-attemptweb3walletverification-generatedsignature', + 'redirecttohome', + 'organizationprofile-settings', + 'userprofile-security', + 'mfa-dropdown', + 'connected-accounts-dropdown', + 'userbuttonpopoveractionbuttontext-removed', + 'userbuttontrigger-userbuttonbox-invert', + 'organizationswitcherpopoveractionbuttontext-removed', + 'card-changes', + 'alternativemethods-backlink', + 'button-to-organizationlistcreateorganizationactionbutton', + 'remove-socialbuttonsblockbuttonarrow', + 'remove-identitypreview-avatar', + 'organization-getroles-arguments-changed', + 'organization-getdomains-arguments-change', + 'organization-getmembershiprequests-arguments-changed', + 'organization-getmemberships-arguments-changed', + 'organization-getinvitations-arguments-changed', + 'user-getorganizationinvitations-arguments-chanaged', + 'user-getorganizationsuggestions-arguments-chanaged', + 'user-getorganizationmemberships-arguments-chanaged', + 'clerk-isready-removed', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', + 'signoutcallback-to-redirecturl', + ]), + shared: load('shared', [ + 'magiclinkerror', + 'ismagiclinkerror', + 'magiclinkerrorcode', + 'usemagiclink', + 'getrequesturl', + 'organizationcontext', + 'useorganizationlist-organizationlist', // shared outside this pkg? + ]), + chromeExtension: load('chromeExtension', ['clerkprovider-tokencache']), + localizations: load('localization', [ + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', + ]), + backend: load('backend', [ + 'api-url-value-changed', + 'verifyjwt-import-path-move', + 'decodejwt-import-path-move', + 'signjwt-import-path-move', + 'constants-import-path-move', + 'redirect-import-path-move', + 'createauthenticaterequest-import-path-move', + 'createisomorphicrequest-import-path-move', + 'createclerkclient-frontendapi', + 'authenticaterequest-params-change', + 'clerk-import', + 'externalaccount-picture', + 'externalaccountjson-avatarurl', + 'organization-logourl', + 'organizationjson-logourl', + 'user-profileimageurl', + 'userjson-profileimageurl', + 'organizationmembershippublicuserdata-profileimageurl', + 'organizationmembershippublicuserdatajson-profileimageurl', + 'clockskewinseconds', + 'pkgversion', + 'client-unstableoptions-removed', + 'httpoptions-removed', + 'createisomorphicrequest-removed', + 'createemail-removed', + 'signjwterror-import-move', + 'tokenverificationerror-import-move', + 'tokenverificationerroraction-import-move', + 'tokenverificationerrorreason-import-move', + 'membershiprole', + 'getorganizationmembershiplist-return-signature', + 'getorganizationlist-return-signature', + 'getorganizationinvitationlist-return-type-change', + 'buildrequesturl-removed', + ]), + types: [], + redwood: [], + express: [], }; function dedupeMerge(arr1, arr2) { - return [...new Set(arr1.concat(arr2))]; + return [...new Set(arr1.concat(arr2))]; } diff --git a/packages/upgrade/source/versions/v5/next/auth-import-change.md b/packages/upgrade/source/versions/v5/next/auth-import-change.md index 1fd07d180ec..cb1ee814beb 100644 --- a/packages/upgrade/source/versions/v5/next/auth-import-change.md +++ b/packages/upgrade/source/versions/v5/next/auth-import-change.md @@ -2,6 +2,7 @@ title: '`auth` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?[,\\s]auth[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md b/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md index 47c461eabf4..72de5898dd8 100644 --- a/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md +++ b/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md @@ -1,6 +1,7 @@ --- title: '`authMiddleware` deprecated' matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'middleware' matcherFlags: 'm' warning: true --- @@ -17,11 +18,11 @@ For more documentation on the new `clerkMiddleware` function, check out [our off import { authMiddleware } from '@clerk/nextjs'; export default authMiddleware({ - publicRoutes: req => !req.url.includes('/dashboard'), + publicRoutes: req => !req.url.includes('/dashboard'), }); export const config = { - matcher: ['/((?!.+\\.[\\w]+$|_next)._)', '/', '/(api|trpc)(._)'], + matcher: ['/((?!.+\\.[\\w]+$|_next)._)', '/', '/(api|trpc)(._)'], }; ``` @@ -36,14 +37,14 @@ import { NextResponse } from 'next/server'; const isProtectedRoute = createRouteMatcher(['/dashboard(.*)']); export default clerkMiddleware((auth, request) => { - if (isProtectedRoute(request)) { - auth().protect(); - } + if (isProtectedRoute(request)) { + auth().protect(); + } - return NextResponse.next(); + return NextResponse.next(); }); export const config = { - matcher: ['/((?!.+\\.[\\w]+$|_next)._)', '/', '/(api|trpc)(._)'], + matcher: ['/((?!.+\\.[\\w]+$|_next)._)', '/', '/(api|trpc)(._)'], }; ``` diff --git a/packages/upgrade/source/versions/v5/next/authmiddleware-apikey.md b/packages/upgrade/source/versions/v5/next/authmiddleware-apikey.md index d39c0321794..358a13cdca5 100644 --- a/packages/upgrade/source/versions/v5/next/authmiddleware-apikey.md +++ b/packages/upgrade/source/versions/v5/next/authmiddleware-apikey.md @@ -1,17 +1,15 @@ --- -title: '`apiKey` -> `secretKey` as param to authMiddleware' +title: '`apiKey` -> `secretKey` as param to `authMiddleware`' matcher: "authMiddleware\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- The `apiKey` argument passed to `authMiddleware` must be changed to `secretKey`. -```js +```diff import { authMiddleware } from '@clerk/nextjs'; -// before -authMiddleware({ apiKey: '...' }); - -// after -authMiddleware({ secretKey: '...' }); +- authMiddleware({ apiKey: '...' }); ++ authMiddleware({ secretKey: '...' }); ``` diff --git a/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md b/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md index 0478f7dfcba..f2ef1a71a59 100644 --- a/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md +++ b/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md @@ -1,6 +1,7 @@ --- -title: '`frontendApi` -> `publishableKey` as param to authMiddleware' +title: '`frontendApi` -> `publishableKey` as param to `authMiddleware`' matcher: "authMiddleware\\({[\\s\\S]*?frontendApi:[\\s\\S]*?}\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md b/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md index b2dce218e73..d1f3a6fe169 100644 --- a/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md +++ b/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md @@ -2,6 +2,7 @@ title: '`authMiddleware` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md b/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md index 7620bf1a479..6fcda0f5264 100644 --- a/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md +++ b/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md @@ -2,6 +2,7 @@ title: '`buildClerkProps` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?buildClerkProps[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/clerk-import-change.md b/packages/upgrade/source/versions/v5/next/clerk-import-change.md index cc1db4b0281..28384d97fe0 100644 --- a/packages/upgrade/source/versions/v5/next/clerk-import-change.md +++ b/packages/upgrade/source/versions/v5/next/clerk-import-change.md @@ -1,6 +1,7 @@ --- title: '`Clerk` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'top-level-imports' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/clerk-js-version-next-public.md b/packages/upgrade/source/versions/v5/next/clerk-js-version-next-public.md index 873c80c0445..2ee0c00d468 100644 --- a/packages/upgrade/source/versions/v5/next/clerk-js-version-next-public.md +++ b/packages/upgrade/source/versions/v5/next/clerk-js-version-next-public.md @@ -1,5 +1,6 @@ --- title: '`CLERK_JS_VERSION` should be `NEXT_PUBLIC_CLERK_JS_VERSION`' +category: 'deprecation-removal' matcher: '^[^_]*CLERK_JS_VERSION' --- diff --git a/packages/upgrade/source/versions/v5/next/constants-import-change.md b/packages/upgrade/source/versions/v5/next/constants-import-change.md index 9d6165a8a43..c7757ccfdb1 100644 --- a/packages/upgrade/source/versions/v5/next/constants-import-change.md +++ b/packages/upgrade/source/versions/v5/next/constants-import-change.md @@ -2,6 +2,7 @@ title: '`constants` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md b/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md index 3e940591445..690502e19dc 100644 --- a/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md +++ b/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md @@ -2,6 +2,7 @@ title: '`createAuthenticateRequest` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?createAuthenticateRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md index 8ac315dbb30..a4f4b71e306 100644 --- a/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md @@ -1,6 +1,7 @@ --- -title: '`apiKey` -> `secretKey` as param to createClerkClient' +title: '`apiKey` -> `secretKey` as param to `createClerkClient`' matcher: "createClerkClient\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md index e8405f0f6a1..be66087dbf9 100644 --- a/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md @@ -1,6 +1,7 @@ --- -title: '`frontendApi` -> `publishableKey` as param to createClerkClient' +title: '`frontendApi` -> `publishableKey` as param to `createClerkClient`' matcher: "createClerkClient\\({[\\s\\S]*?frontendApi:[\\s\\S]*?}\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md b/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md index 01c610b4cb7..7107f699e9f 100644 --- a/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md +++ b/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md @@ -2,6 +2,7 @@ title: '`createIsomorphicRequest` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/currentuser-import-change.md b/packages/upgrade/source/versions/v5/next/currentuser-import-change.md index 9f2977b1094..0dd610673e5 100644 --- a/packages/upgrade/source/versions/v5/next/currentuser-import-change.md +++ b/packages/upgrade/source/versions/v5/next/currentuser-import-change.md @@ -2,6 +2,7 @@ title: '`currentUser` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?currentUser[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md b/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md index 154e4d808a2..a9baf5ccb12 100644 --- a/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md +++ b/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md @@ -2,6 +2,7 @@ title: '`decodeJwt` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md index 5b2f19a0d87..0472db1b8c9 100644 --- a/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md +++ b/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md @@ -2,6 +2,7 @@ title: '`EmailLinkErrorCode` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/errors' --- diff --git a/packages/upgrade/source/versions/v5/next/getauth-apikey.md b/packages/upgrade/source/versions/v5/next/getauth-apikey.md index fe75eaeed6f..478c88ec8d4 100644 --- a/packages/upgrade/source/versions/v5/next/getauth-apikey.md +++ b/packages/upgrade/source/versions/v5/next/getauth-apikey.md @@ -1,6 +1,7 @@ --- -title: '`apiKey` -> `secretKey` as param to getAuth' +title: '`apiKey` -> `secretKey` as param to `getAuth`' matcher: "getAuth\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-api-url.md b/packages/upgrade/source/versions/v5/next/import-api-url.md index 26a8abcc7de..13af568a9e2 100644 --- a/packages/upgrade/source/versions/v5/next/import-api-url.md +++ b/packages/upgrade/source/versions/v5/next/import-api-url.md @@ -1,6 +1,7 @@ --- title: '`API_URL` constant removed' matcher: "import\\s+{[\\s\\S]*?API_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-api-version.md b/packages/upgrade/source/versions/v5/next/import-api-version.md index 7415621c2e7..39cd25fdc78 100644 --- a/packages/upgrade/source/versions/v5/next/import-api-version.md +++ b/packages/upgrade/source/versions/v5/next/import-api-version.md @@ -1,6 +1,7 @@ --- title: '`API_VERSION` constant removed' matcher: "import\\s+{[\\s\\S]*?API_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md b/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md index b39d29ca841..4fa0701413c 100644 --- a/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md +++ b/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md @@ -1,6 +1,7 @@ --- title: '`CLERK_JS_URL` constant removed' matcher: "import\\s+{[\\s\\S]*?CLERK_JS_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md b/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md index 167cab1fc81..5c445632ea3 100644 --- a/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md +++ b/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md @@ -1,6 +1,7 @@ --- title: '`CLERK_JS_VERSION` constant removed' matcher: "import\\s+{[\\s\\S]*?CLERK_JS_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-domain.md b/packages/upgrade/source/versions/v5/next/import-domain.md index 31ccd8d8a91..d9883a4600f 100644 --- a/packages/upgrade/source/versions/v5/next/import-domain.md +++ b/packages/upgrade/source/versions/v5/next/import-domain.md @@ -1,6 +1,7 @@ --- title: '`DOMAIN` constant removed' matcher: "import\\s+{[\\s\\S]*?DOMAIN[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-is-satellite.md b/packages/upgrade/source/versions/v5/next/import-is-satellite.md index c6a14ab4661..5cf08339085 100644 --- a/packages/upgrade/source/versions/v5/next/import-is-satellite.md +++ b/packages/upgrade/source/versions/v5/next/import-is-satellite.md @@ -1,6 +1,7 @@ --- title: '`IS_SATELLITE` constant removed' matcher: "import\\s+{[\\s\\S]*?IS_SATELLITE[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-nextjs-api.md b/packages/upgrade/source/versions/v5/next/import-nextjs-api.md index 4ac9dea8d55..4529b649f12 100644 --- a/packages/upgrade/source/versions/v5/next/import-nextjs-api.md +++ b/packages/upgrade/source/versions/v5/next/import-nextjs-api.md @@ -1,5 +1,6 @@ --- title: '`@clerk/nextjs/api` import removed' +category: 'deprecation-removal' matcher: "@clerk\\/nextjs\\/api" --- @@ -8,12 +9,12 @@ The import subpath `@clerk/nextjs/api` has been removed. This includes the follo ```js // These have been removed import { - ClerkMiddleware, - ClerkMiddlewareOptions, - LooseAuthProp, - RequireAuthProp, - StrictAuthProp, - WithAuthProp, + ClerkMiddleware, + ClerkMiddlewareOptions, + LooseAuthProp, + RequireAuthProp, + StrictAuthProp, + WithAuthProp, } from '@clerk/nextjs/api'; ``` diff --git a/packages/upgrade/source/versions/v5/next/import-nextjs-app-beta.md b/packages/upgrade/source/versions/v5/next/import-nextjs-app-beta.md index 07d28b43bcc..15f9c68d365 100644 --- a/packages/upgrade/source/versions/v5/next/import-nextjs-app-beta.md +++ b/packages/upgrade/source/versions/v5/next/import-nextjs-app-beta.md @@ -1,5 +1,6 @@ --- title: '`@clerk/nextjs/app-beta` import removed' +category: 'deprecation-removal' matcher: "@clerk\\/nextjs\\/app-beta" --- diff --git a/packages/upgrade/source/versions/v5/next/import-nextjs-edge-middleware.md b/packages/upgrade/source/versions/v5/next/import-nextjs-edge-middleware.md index 75ce148ea19..7001086e96f 100644 --- a/packages/upgrade/source/versions/v5/next/import-nextjs-edge-middleware.md +++ b/packages/upgrade/source/versions/v5/next/import-nextjs-edge-middleware.md @@ -1,5 +1,6 @@ --- title: '`@clerk/nextjs/edge-middleware` import removed' +category: 'deprecation-removal' matcher: "@clerk\\/nextjs\\/edge-middleware" --- diff --git a/packages/upgrade/source/versions/v5/next/import-nextjs-edge-middlewarefiles.md b/packages/upgrade/source/versions/v5/next/import-nextjs-edge-middlewarefiles.md index d5cba1982f5..6ce9acf258c 100644 --- a/packages/upgrade/source/versions/v5/next/import-nextjs-edge-middlewarefiles.md +++ b/packages/upgrade/source/versions/v5/next/import-nextjs-edge-middlewarefiles.md @@ -1,5 +1,6 @@ --- title: '`@clerk/nextjs/edge-middlewarefiles` import removed' +category: 'deprecation-removal' matcher: "@clerk\\/nextjs\\/edge-middlewarefiles" --- diff --git a/packages/upgrade/source/versions/v5/next/import-nextjs-ssr.md b/packages/upgrade/source/versions/v5/next/import-nextjs-ssr.md index 29fe76bd8ad..055a7cf7263 100644 --- a/packages/upgrade/source/versions/v5/next/import-nextjs-ssr.md +++ b/packages/upgrade/source/versions/v5/next/import-nextjs-ssr.md @@ -1,6 +1,7 @@ --- title: '`@clerk/nextjs/ssr` import removed' matcher: "@clerk\\/nextjs\\/ssr" +category: 'deprecation-removal' replaceWithString: '@clerk/nextjs' --- diff --git a/packages/upgrade/source/versions/v5/next/import-proxy-url.md b/packages/upgrade/source/versions/v5/next/import-proxy-url.md index ab5854c1ac1..67c18dbb21c 100644 --- a/packages/upgrade/source/versions/v5/next/import-proxy-url.md +++ b/packages/upgrade/source/versions/v5/next/import-proxy-url.md @@ -1,6 +1,7 @@ --- title: '`PROXY_URL` constant removed' matcher: "import\\s+{[\\s\\S]*?PROXY_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-publishable-key.md b/packages/upgrade/source/versions/v5/next/import-publishable-key.md index cfb9070155e..06d7bbd5a28 100644 --- a/packages/upgrade/source/versions/v5/next/import-publishable-key.md +++ b/packages/upgrade/source/versions/v5/next/import-publishable-key.md @@ -1,6 +1,7 @@ --- title: '`PUBLISHABLE_KEY` constant removed' matcher: "import\\s+{[\\s\\S]*?PUBLISHABLE_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-secret-key.md b/packages/upgrade/source/versions/v5/next/import-secret-key.md index c51bcd53762..1ba3f580c3e 100644 --- a/packages/upgrade/source/versions/v5/next/import-secret-key.md +++ b/packages/upgrade/source/versions/v5/next/import-secret-key.md @@ -1,6 +1,7 @@ --- title: '`SECRET_KEY` constant removed' matcher: "import\\s+{[\\s\\S]*?SECRET_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-sign-in-url.md b/packages/upgrade/source/versions/v5/next/import-sign-in-url.md index 59f3575ff55..4d6823e4775 100644 --- a/packages/upgrade/source/versions/v5/next/import-sign-in-url.md +++ b/packages/upgrade/source/versions/v5/next/import-sign-in-url.md @@ -1,6 +1,7 @@ --- title: '`SIGN_IN_URL` constant removed' matcher: "import\\s+{[\\s\\S]*?SIGN_IN_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/import-sign-up-url.md b/packages/upgrade/source/versions/v5/next/import-sign-up-url.md index 9bb41f6a156..80d34cffd51 100644 --- a/packages/upgrade/source/versions/v5/next/import-sign-up-url.md +++ b/packages/upgrade/source/versions/v5/next/import-sign-up-url.md @@ -1,6 +1,7 @@ --- title: '`SIGN_UP_URL` constant removed' matcher: "import\\s+{[\\s\\S]*?SIGN_UP_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md index 595088d24a3..221290607bf 100644 --- a/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md +++ b/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md @@ -2,6 +2,7 @@ title: '`isClerkAPIResponseError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/errors' --- diff --git a/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md index af452fdca44..9f730bb0d4a 100644 --- a/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md +++ b/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md @@ -2,6 +2,7 @@ title: '`isEmailLinkError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/errors' --- diff --git a/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md b/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md index 41f68ecf02b..0017d8f082b 100644 --- a/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md +++ b/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md @@ -2,6 +2,7 @@ title: '`isKnownError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/errors' --- diff --git a/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md index 440a15e1677..b6d7d4b72bd 100644 --- a/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md +++ b/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md @@ -2,6 +2,7 @@ title: '`isMetamaskError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/errors' --- diff --git a/packages/upgrade/source/versions/v5/next/min-nextjs-version.md b/packages/upgrade/source/versions/v5/next/min-nextjs-version.md index 05e7680f40d..c000ce378b5 100644 --- a/packages/upgrade/source/versions/v5/next/min-nextjs-version.md +++ b/packages/upgrade/source/versions/v5/next/min-nextjs-version.md @@ -1,6 +1,8 @@ --- title: 'Upgrade nextjs to v13 or higher' +category: 'version' matcher: "dependencies\":\\s*{[\\s\\S]*?\"next\":\\s*\"(?:^|~|>|=|\\s)*(?:10|11|12)\\..*?" +matcherFlags: 'm' --- If you're using `@clerk/nextjs`, you will need to update your Next.js project to `13.0.4` or later. Check out Next's upgrade guides for help: diff --git a/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md index b3d0668e4d0..fabb411b6f8 100644 --- a/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md +++ b/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md @@ -1,6 +1,7 @@ --- title: '`MultiSessionAppSupport` import moved under `/internal`' matcher: "import\\s+{[\\s\\S]*?MultiSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' replaceWithString: 'nextjs/internal' --- diff --git a/packages/upgrade/source/versions/v5/next/next-public-clerk-js-url.md b/packages/upgrade/source/versions/v5/next/next-public-clerk-js-url.md index f95c2e03786..33a98b094ea 100644 --- a/packages/upgrade/source/versions/v5/next/next-public-clerk-js-url.md +++ b/packages/upgrade/source/versions/v5/next/next-public-clerk-js-url.md @@ -1,5 +1,6 @@ --- title: '`NEXT_PUBLIC_CLERK_JS` should be `NEXT_PUBLIC_CLERK_JS_URL`' +category: 'deprecation-removal' matcher: 'NEXT_PUBLIC_CLERK_JS[^_]*$' --- diff --git a/packages/upgrade/source/versions/v5/next/redirect-import-change.md b/packages/upgrade/source/versions/v5/next/redirect-import-change.md index e050620deb4..3079ec7e30a 100644 --- a/packages/upgrade/source/versions/v5/next/redirect-import-change.md +++ b/packages/upgrade/source/versions/v5/next/redirect-import-change.md @@ -2,6 +2,7 @@ title: '`redirect` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?[,\\s]redirect[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/redirecttosignin-import-path.md b/packages/upgrade/source/versions/v5/next/redirecttosignin-import-path.md index f85516998f8..50bf2c7957e 100644 --- a/packages/upgrade/source/versions/v5/next/redirecttosignin-import-path.md +++ b/packages/upgrade/source/versions/v5/next/redirecttosignin-import-path.md @@ -1,6 +1,7 @@ --- -title: '`redirectToSignIn` import moved under `/server/' +title: '`redirectToSignIn` import moved under `/server' matcher: "import\\s+{[\\s\\S]*?[,\\s]redirectToSignIn[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/redirecttosignup-import-path.md b/packages/upgrade/source/versions/v5/next/redirecttosignup-import-path.md index 1b47290c8e5..d7cfffb1b74 100644 --- a/packages/upgrade/source/versions/v5/next/redirecttosignup-import-path.md +++ b/packages/upgrade/source/versions/v5/next/redirecttosignup-import-path.md @@ -1,6 +1,7 @@ --- -title: '`redirectToSignUp` import path changed' +title: '`redirectToSignUp` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?[,\\s]redirectToSignUp[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/signjwt-import-change.md b/packages/upgrade/source/versions/v5/next/signjwt-import-change.md index 3e569231a70..1e6b59986cb 100644 --- a/packages/upgrade/source/versions/v5/next/signjwt-import-change.md +++ b/packages/upgrade/source/versions/v5/next/signjwt-import-change.md @@ -2,6 +2,7 @@ title: '`signJwt` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md b/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md index ff3bc67a756..15074804a66 100644 --- a/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md +++ b/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md @@ -2,6 +2,7 @@ title: '`verifyJwt` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md b/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md index 907c0c0b6bb..be89954572c 100644 --- a/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md +++ b/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md @@ -2,6 +2,7 @@ title: '`verifyToken` import moved under `/server`' matcher: "import\\s+{[\\s\\S]*?verifyToken[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/v5/next/with-clerk-middleware-removed.md b/packages/upgrade/source/versions/v5/next/with-clerk-middleware-removed.md index e4d7902640d..e83b8e2e52f 100644 --- a/packages/upgrade/source/versions/v5/next/with-clerk-middleware-removed.md +++ b/packages/upgrade/source/versions/v5/next/with-clerk-middleware-removed.md @@ -1,5 +1,6 @@ --- title: '`withClerkMiddleware` removed' +category: 'middleware' matcher: "withClerkMiddleware\\(" --- From a6565dcfe14e8c1a8483b60abf9fd5840f51d8c5 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Mon, 12 Feb 2024 23:06:18 -0500 Subject: [PATCH 097/159] feat(upgrade): Huge refactors and progress on guide generation --- package-lock.json | 132 ++- packages/upgrade/package.json | 1 + .../guide-generators/text-generation.js | 108 ++ .../guide-generators/v5/backend/index.js | 6 + .../guide-generators/v5/expo/__output.mdx | 414 +++++++ .../source/guide-generators/v5/expo/index.js | 43 + .../source/guide-generators/v5/expo/intro.mdx | 3 + .../guide-generators/v5/fastify/__output.mdx | 204 ++++ .../guide-generators/v5/fastify/index.js | 40 + .../guide-generators/v5/fastify/intro.mdx | 3 + .../guide-generators/v5/gatsby/__output.mdx | 704 +++++++++++ .../guide-generators/v5/gatsby/index.js | 43 + .../guide-generators/v5/gatsby/intro.mdx | 3 + .../guide-generators/v5/js/__output.mdx | 497 ++++++++ .../source/guide-generators/v5/js/index.js | 48 + .../source/guide-generators/v5/js/intro.mdx | 3 + .../v5/js/pagination-args.mdx | 3 + .../v5/js/pagination-return.mdx | 3 + .../guide-generators/v5/nextjs/__output.mdx | 1043 +++++++++++++++++ .../v5/nextjs}/import-changes.mdx | 8 +- .../guide-generators/v5/nextjs/index.js | 47 + .../guide-generators/v5/nextjs/intro.mdx | 3 + .../v5/nextjs}/middleware-changes.mdx | 28 +- .../v5/nextjs/nextjs-version.mdx | 6 + .../guide-generators/v5/node/__output.mdx | 345 ++++++ .../source/guide-generators/v5/node/index.js | 43 + .../source/guide-generators/v5/node/intro.mdx | 3 + .../v5/node/node-setters-removals.mdx | 34 + .../guide-generators/v5/overview/intro.mdx | 18 + .../guide-generators/v5/overview/per-sdk.mdx | 16 + .../guide-generators/v5/react/__output.mdx | 652 +++++++++++ .../v5/react/hof-removals.mdx | 3 + .../source/guide-generators/v5/react/index.js | 46 + .../guide-generators/v5/react/intro.mdx | 3 + .../guide-generators/v5/remix/__output.mdx | 367 ++++++ .../source/guide-generators/v5/remix/index.js | 46 + .../guide-generators/v5/remix/intro.mdx | 3 + .../guide-generators/v5/retheme/__output.mdx | 436 +++++++ .../guide-generators/v5/retheme/index.js | 32 + .../v5/retheme/intro.mdx} | 2 - .../v5/shared}/after-sign-x-handling.mdx | 0 .../source/guide-generators/v5/shared/cli.mdx | 22 + .../v5/shared/deprecation-removals.mdx | 7 + .../guide-generators/v5/shared/image-url.mdx | 3 + .../v5/shared/node-version.mdx | 3 + .../guide-generators/v5/shared/orgs-claim.mdx | 50 + .../v5/shared/path-routing.mdx | 51 + .../guide-generators/v5/shared/prepare.mdx | 7 + .../v5/shared/react-version.mdx | 20 + .../v5/shared/redesign-preview.mdx | 5 + .../guide-generators/v5/shared/update-v5.mdx | 18 + .../v5-nextjs-guide/deprecation-removals.mdx | 9 - .../source/util/v5-nextjs-guide/generate.js | 90 -- .../source/util/v5-nextjs-guide/intro.mdx | 22 - .../v5-nextjs-guide/version-requirements.mdx | 35 - .../backend/externalaccountjson-avatarurl.md | 1 + ...nizationinvitationlist-return-signature.md | 1 + ...zationinvitationlist-return-type-change.md | 12 +- .../getorganizationlist-return-signature.md | 1 + ...nizationmembershiplist-return-signature.md | 1 + .../v5/backend/organization-logourl.md | 6 - .../v5/backend/organizationjson-logourl.md | 1 + ...rshippublicuserdatajson-profileimageurl.md | 1 + .../v5/backend/userjson-profileimageurl.md | 1 + .../source/versions/v5/common/card-changes.md | 4 +- .../emaillinkerrorcode-import-change.md | 1 + .../externalaccount-picture.md | 1 + .../getorganizationlist-return-type-change.md | 1 + ...zationmembershiplist-return-type-change.md | 1 + .../isclerkapiresponserror-import-change.md | 1 + .../common/isemaillinkerror-import-change.md | 1 + .../v5/common/isknownerror-import-change.md | 1 + .../common/ismetamaskerror-import-change.md | 14 + .../navigate-to-routerpush-routerreplace.md | 1 + ...rganization-getdomains-arguments-change.md | 1 + ...zation-getinvitations-arguments-changed.md | 1 + ...getmembershiprequests-arguments-changed.md | 1 + ...zation-getmemberships-arguments-changed.md | 1 + ...organization-getroles-arguments-changed.md | 1 + .../v5/{js => common}/organization-logourl.md | 1 + ...embershippublicuserdata-profileimageurl.md | 1 + ...anizationinvitations-arguments-chanaged.md | 1 + ...anizationmemberships-arguments-chanaged.md | 1 + ...anizationsuggestions-arguments-chanaged.md | 1 + .../user-profileimageurl.md | 1 + .../userbuttontrigger-userbuttonbox-invert.md | 2 +- .../v5/common/withclerk-hof-removed.md | 2 +- .../versions/v5/common/withclerk-removed.md | 2 +- .../v5/common/withsession-hof-removed.md | 2 +- .../versions/v5/common/withsession-removed.md | 2 +- .../v5/common/withuser-hof-removed.md | 2 +- .../versions/v5/common/withuser-removed-2.md | 2 +- .../v5/expo/apikey-to-publishable-key.md | 1 + .../v5/expo/clerkprovider-frontendapi.md | 1 + .../v5/fastify/clerkplugin-frontendapi.md | 3 +- .../v5/fastify/createclerkclient-apikey.md | 1 + .../fastify/createclerkclient-frontendapi.md | 1 + .../v5/gatsby/api-url-value-change.md | 2 +- .../v5/gatsby/apikey-to-publishable-key.md | 1 + .../v5/gatsby/createclerkclient-apikey.md | 1 + .../gatsby/createclerkclient-frontendapi.md | 1 + .../v5/gatsby/withserverauth-return-type.md | 52 +- packages/upgrade/source/versions/v5/index.js | 39 +- .../v5/js/experimental-canusecaptcha.md | 1 + .../v5/js/experimental-captchasitekey.md | 1 + .../versions/v5/js/experimental-captchaurl.md | 1 + .../v5/js/getorganizationmemberships.md | 9 +- ...b3walletverification-generatedsignature.md | 3 +- .../v5/js/unstable-invitationupdate.md | 1 + .../v5/js/unstable-membershipupdate.md | 1 + .../user-createexternalaccount-redirecturl.md | 1 + .../versions/v5/js/user-update-password.md | 17 +- .../v5/next/ismetamaskerror-import-change.md | 14 - .../{next => nextjs}/api-url-value-change.md | 0 .../v5/{next => nextjs}/auth-import-change.md | 0 .../auth-middleware-deprecated.md | 0 .../{next => nextjs}/authmiddleware-apikey.md | 0 .../authmiddleware-frontendapi.md | 0 .../authmiddleware-import-change.md | 0 .../buildclerkprops-import-change.md | 0 .../{next => nextjs}/clerk-import-change.md | 0 .../clerk-js-version-next-public.md | 0 .../constants-import-change.md | 0 ...createauthenticaterequest-import-change.md | 0 .../createclerkclient-apikey.md | 0 .../createclerkclient-frontendapi.md | 0 .../createisomorphicrequest-import-change.md | 0 .../currentuser-import-change.md | 0 .../decodejwt-import-change.md | 0 .../emaillinkerrorcode-import-change.md | 0 .../v5/{next => nextjs}/getauth-apikey.md | 0 .../v5/{next => nextjs}/import-api-url.md | 2 +- .../v5/{next => nextjs}/import-api-version.md | 2 +- .../{next => nextjs}/import-clerk-js-url.md | 2 +- .../import-clerk-js-version.md | 2 +- .../v5/{next => nextjs}/import-domain.md | 2 +- .../{next => nextjs}/import-is-satellite.md | 2 +- .../v5/{next => nextjs}/import-nextjs-api.md | 0 .../import-nextjs-app-beta.md | 2 +- .../import-nextjs-edge-middleware.md | 0 .../import-nextjs-edge-middlewarefiles.md | 0 .../v5/{next => nextjs}/import-nextjs-ssr.md | 0 .../v5/{next => nextjs}/import-proxy-url.md | 2 +- .../import-publishable-key.md | 2 +- .../v5/{next => nextjs}/import-secret-key.md | 2 +- .../v5/{next => nextjs}/import-sign-in-url.md | 2 +- .../v5/{next => nextjs}/import-sign-up-url.md | 2 +- .../isclerkapiresponserror-import-change.md | 0 .../isemaillinkerror-import-change.md | 0 .../isknownerror-import-change.md | 0 .../v5/{next => nextjs}/min-nextjs-version.md | 0 .../multisessionappsupport-import-change.md | 0 .../next-public-clerk-js-url.md | 2 +- .../redirect-import-change.md | 0 .../redirecttosignin-import-path.md | 0 .../redirecttosignup-import-path.md | 0 .../{next => nextjs}/signjwt-import-change.md | 0 .../verifyjwt-import-change.md | 0 .../verifytoken-import-change.md | 0 .../with-clerk-middleware-removed.md | 0 .../versions/v5/node/cjs-esm-instance.md | 1 + .../v5/node/clerkexpressrequireauth-apikey.md | 1 + .../clerkexpressrequireauth-frontendapi.md | 1 + .../v5/node/clerkexpresswithauth-apikey.md | 1 + .../node/clerkexpresswithauth-frontendapi.md | 1 + .../v5/node/createclerkclient-apikey.md | 1 + .../v5/node/createclerkclient-frontendapi.md | 1 + .../createclerkexpressrequireauth-apikey.md | 1 + ...eateclerkexpressrequireauth-frontendapi.md | 1 + .../node/createclerkexpresswithauth-apikey.md | 1 + .../createclerkexpresswithauth-frontendapi.md | 1 + .../v5/node/legacyauthobject-removed.md | 2 +- .../source/versions/v5/node/setclerkapikey.md | 1 + .../versions/v5/node/setclerkapiversion.md | 1 + .../versions/v5/node/setclerkhttpoptions.md | 1 + .../versions/v5/node/setclerkserverapiurl.md | 1 + .../versions/v5/react/api-url-value-change.md | 2 +- .../versions/v5/remix/clerk-import-change.md | 1 + .../v5/remix/clerkerrorboundary-removed.md | 1 + .../v5/remix/createclerkclient-apikey.md | 1 + .../versions/v5/remix/getauth-apikey.md | 1 + .../v5/remix/rootauthloader-apikey.md | 1 + .../v5/remix/rootauthloader-frontendapi.md | 1 + 183 files changed, 5781 insertions(+), 282 deletions(-) create mode 100644 packages/upgrade/source/guide-generators/text-generation.js create mode 100644 packages/upgrade/source/guide-generators/v5/backend/index.js create mode 100644 packages/upgrade/source/guide-generators/v5/expo/__output.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/expo/index.js create mode 100644 packages/upgrade/source/guide-generators/v5/expo/intro.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/fastify/__output.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/fastify/index.js create mode 100644 packages/upgrade/source/guide-generators/v5/fastify/intro.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/gatsby/index.js create mode 100644 packages/upgrade/source/guide-generators/v5/gatsby/intro.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/js/__output.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/js/index.js create mode 100644 packages/upgrade/source/guide-generators/v5/js/intro.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/js/pagination-args.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/js/pagination-return.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx rename packages/upgrade/source/{util/v5-nextjs-guide => guide-generators/v5/nextjs}/import-changes.mdx (84%) create mode 100644 packages/upgrade/source/guide-generators/v5/nextjs/index.js create mode 100644 packages/upgrade/source/guide-generators/v5/nextjs/intro.mdx rename packages/upgrade/source/{util/v5-nextjs-guide => guide-generators/v5/nextjs}/middleware-changes.mdx (77%) create mode 100644 packages/upgrade/source/guide-generators/v5/nextjs/nextjs-version.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/node/__output.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/node/index.js create mode 100644 packages/upgrade/source/guide-generators/v5/node/intro.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/node/node-setters-removals.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/overview/intro.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/overview/per-sdk.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/react/__output.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/react/hof-removals.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/react/index.js create mode 100644 packages/upgrade/source/guide-generators/v5/react/intro.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/remix/__output.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/remix/index.js create mode 100644 packages/upgrade/source/guide-generators/v5/remix/intro.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/retheme/__output.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/retheme/index.js rename packages/upgrade/source/{util/v5-nextjs-guide/retheme-changes.mdx => guide-generators/v5/retheme/intro.mdx} (97%) rename packages/upgrade/source/{util/v5-nextjs-guide => guide-generators/v5/shared}/after-sign-x-handling.mdx (100%) create mode 100644 packages/upgrade/source/guide-generators/v5/shared/cli.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/shared/image-url.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/shared/node-version.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/shared/orgs-claim.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/shared/path-routing.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/shared/prepare.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/shared/react-version.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/shared/redesign-preview.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/shared/update-v5.mdx delete mode 100644 packages/upgrade/source/util/v5-nextjs-guide/deprecation-removals.mdx delete mode 100644 packages/upgrade/source/util/v5-nextjs-guide/generate.js delete mode 100644 packages/upgrade/source/util/v5-nextjs-guide/intro.mdx delete mode 100644 packages/upgrade/source/util/v5-nextjs-guide/version-requirements.mdx rename packages/upgrade/source/versions/v5/{common => backend}/getorganizationinvitationlist-return-type-change.md (56%) delete mode 100644 packages/upgrade/source/versions/v5/backend/organization-logourl.md rename packages/upgrade/source/versions/v5/{backend => common}/externalaccount-picture.md (91%) create mode 100644 packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md rename packages/upgrade/source/versions/v5/{js => common}/organization-logourl.md (92%) rename packages/upgrade/source/versions/v5/{backend => common}/organizationmembershippublicuserdata-profileimageurl.md (91%) rename packages/upgrade/source/versions/v5/{backend => common}/user-profileimageurl.md (88%) delete mode 100644 packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md rename packages/upgrade/source/versions/v5/{next => nextjs}/api-url-value-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/auth-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/auth-middleware-deprecated.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/authmiddleware-apikey.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/authmiddleware-frontendapi.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/authmiddleware-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/buildclerkprops-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/clerk-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/clerk-js-version-next-public.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/constants-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/createauthenticaterequest-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/createclerkclient-apikey.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/createclerkclient-frontendapi.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/createisomorphicrequest-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/currentuser-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/decodejwt-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/emaillinkerrorcode-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/getauth-apikey.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-api-url.md (71%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-api-version.md (71%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-clerk-js-url.md (71%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-clerk-js-version.md (70%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-domain.md (69%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-is-satellite.md (69%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-nextjs-api.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-nextjs-app-beta.md (89%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-nextjs-edge-middleware.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-nextjs-edge-middlewarefiles.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-nextjs-ssr.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-proxy-url.md (69%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-publishable-key.md (69%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-secret-key.md (71%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-sign-in-url.md (69%) rename packages/upgrade/source/versions/v5/{next => nextjs}/import-sign-up-url.md (69%) rename packages/upgrade/source/versions/v5/{next => nextjs}/isclerkapiresponserror-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/isemaillinkerror-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/isknownerror-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/min-nextjs-version.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/multisessionappsupport-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/next-public-clerk-js-url.md (62%) rename packages/upgrade/source/versions/v5/{next => nextjs}/redirect-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/redirecttosignin-import-path.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/redirecttosignup-import-path.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/signjwt-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/verifyjwt-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/verifytoken-import-change.md (100%) rename packages/upgrade/source/versions/v5/{next => nextjs}/with-clerk-middleware-removed.md (100%) diff --git a/package-lock.json b/package-lock.json index ca62c2c9802..640a8f0ade6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14825,6 +14825,20 @@ "dev": true, "license": "MIT" }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.510", "license": "ISC" @@ -16999,6 +17013,33 @@ "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/filesize": { "version": "8.0.7", "dev": true, @@ -21477,6 +21518,92 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/javascript-stringify": { "version": "2.1.0", "dev": true, @@ -35321,11 +35448,12 @@ }, "packages/upgrade": { "name": "@clerk/upgrade", - "version": "0.1.1", + "version": "0.2.1", "license": "MIT", "dependencies": { "@inkjs/ui": "^1.0.0", "@jescalan/ink-markdown": "^2.0.0", + "ejs": "3.1.9", "globby": "^14.0.0", "gray-matter": "^4.0.3", "index-to-position": "^0.1.2", @@ -35342,7 +35470,7 @@ "temp-dir": "^3.0.0" }, "bin": { - "upgrade": "dist/cli.js" + "clerk-upgrade": "dist/cli.js" }, "devDependencies": { "@babel/cli": "^7.21.0", diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 081a6b2a477..2fae73ca271 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -23,6 +23,7 @@ "dependencies": { "@inkjs/ui": "^1.0.0", "@jescalan/ink-markdown": "^2.0.0", + "ejs": "3.1.9", "globby": "^14.0.0", "gray-matter": "^4.0.3", "index-to-position": "^0.1.2", diff --git a/packages/upgrade/source/guide-generators/text-generation.js b/packages/upgrade/source/guide-generators/text-generation.js new file mode 100644 index 00000000000..6071bb30425 --- /dev/null +++ b/packages/upgrade/source/guide-generators/text-generation.js @@ -0,0 +1,108 @@ +import ejs from 'ejs'; +import { existsSync, readFileSync, writeFileSync } from 'fs'; +import { parseInline } from 'marked'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +export async function loadVersionChangeData(version, sdk) { + return (await import(`../versions/${version}/index.js`)).default[sdk]; +} + +// Small utility for assembling and spacing out content pieces. +export function assembleContent(options, content) { + return content.reduce((output, item) => { + output += typeof item === 'function' ? item(options) : item; + output += '\n\n'; + return output; + }, ''); +} + +// Renders an object into a frontmatter string +export function frontmatter(obj) { + return `--- +${Object.keys(obj) + .map(k => `${k}: "${obj[k]}"`) + .join('\n')} +---`; +} + +// Renders a markdown file, partial-style - will read out of shared if not found in sdk dir +export const markdown = partial((p, { cwd }) => { + const defaultPath = path.join(__dirname, cwd, p + '.mdx'); + const sharedPath = path.join(__dirname, cwd, '../shared', p + '.mdx'); + + return readFileSync(existsSync(defaultPath) ? defaultPath : sharedPath, 'utf8').trim(); +}); + +// Renders a markdown file with EJS template valyes +export const markdownTemplate = partial((p, data, { cwd }) => { + const defaultPath = path.join(__dirname, cwd, p + '.mdx'); + const sharedPath = path.join(__dirname, cwd, '../shared', p + '.mdx'); + + return ejs.render(readFileSync(existsSync(defaultPath) ? defaultPath : sharedPath, 'utf8').trim(), data); +}); + +// Given a single change item, renders it as its own markdown section. +// Typically used to highlight a specific change item that has a larger +// impact and/or is likely to affect most users. +export const singleItem = partial((slug, { data }) => { + const item = data.find(i => i.slug === slug); + return `### ${item.title} + +${item.content.trim()}`; +}); + +// Given a set of change data and one or more categories, renders each item +// in the given categories into an accordion. +// Typically used to present a set of related changes or a longer list of changes +// that are de-emphasized as they are unlikely to be present for most users. +export const accordionForCategory = partial((categories, options, { data }) => { + const items = data.filter(i => [].concat(categories).includes(i.category)); + options ||= {}; + + if (options.additionalItems) items.push(...[].concat(options.additionalItems)); + + return ` `"${parseInline(i.title)}"`).join(', ')}]}> +${items.map(i => ` ${indent('\n' + i.content.trim(), 4)}\n `).join('\n')} +`; +}); + +// The "deprecation removals & housekeeping" section is standard at the bottom of +// each migration guide, and comprises a set of breaking changes that any given +// user is very unlikely to run into, so it is de-emphasized to make the upgrade +// process feel less scary. +export const deprecationRemovalsAndHousekeeping = partial((includeCategories, opts) => { + includeCategories ||= []; + + return assembleContent(opts, [ + '## Deprecation removals & housekeeping', + markdown('deprecation-removals'), + + '### Deprecation removals', + accordionForCategory('deprecation-removal'), + + '### Other Breaking Changes', + accordionForCategory([undefined, ...includeCategories]), + ]); +}); + +// writes output to an mdx file +export const writeToFile = partial((cwd, content) => { + writeFileSync(path.join(__dirname, cwd, '__output.mdx'), content); +}); + +// Small internal utility to ensure proper indentation within the resulting markup. +function indent(str, numSpaces) { + return str + .split('\n') + .map(l => `${' '.repeat(numSpaces)}${l}`) + .join('\n'); +} + +// Partial application utility, enables assembleContent to pass data into every child easily. +// This is one of the craziest functions I have written in my day 🥹 +function partial(fn) { + return (...args) => fn.bind(null, ...args.concat(Array(fn.length - args.length - 1))); +} diff --git a/packages/upgrade/source/guide-generators/v5/backend/index.js b/packages/upgrade/source/guide-generators/v5/backend/index.js new file mode 100644 index 00000000000..d0d51d65cf1 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/backend/index.js @@ -0,0 +1,6 @@ +// buildrequesturl, createisomorphicrequest, createEmail removed +// clockskewinms +// error api import move +// membershiprole -> organizationcustomrolekey +// orgs claim dropped +// Deprecation removals & housekeeping diff --git a/packages/upgrade/source/guide-generators/v5/expo/__output.mdx b/packages/upgrade/source/guide-generators/v5/expo/__output.mdx new file mode 100644 index 00000000000..c668dd8cef5 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/expo/__output.mdx @@ -0,0 +1,414 @@ +--- +title: 'Upgrading Expo from v4 to v5' +description: "Learn how to upgrade Clerk's Expo SDK from v4 to v5." +--- + +# Upgrading `@clerk/expo` from v4 to v5 + +Version 5 of the Expo SDK ships with an improved design and UX for its built-in components and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Expo project to use `@clerk/expo` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. + +## Preparing to upgrade + +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. + +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. + +Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. + +**Updating Node.js** + +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). + +**Updating React** + +All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. + + + ```bash filename="terminal" + npm install react@latest react-dom@latest + ``` + + ```bash filename="terminal" + yarn add react@latest react-dom@latest + ``` + + ```bash filename="terminal" + pnpm add react@latest react-dom@latest + ``` + + + +If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. + +## Updating to v5 + +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: + + + ```bash filename="terminal" + npm install @clerk/expo@beta + ``` + + ```bash filename="terminal" + yarn add @clerk/expo@beta + ``` + + ```bash filename="terminal" + pnpm add @clerk/expo@beta + ``` + + + +## CLI Upgrade Helper + +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. + +To run the CLI tool, navigate to your project and run it in the terminal: + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + + +If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. + +## Breaking Changes + +### Component design adjustments + +The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. + +[More detail on these changes »](/components-redesigned) + +## After sign up/in/out URL handling + +Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. + +As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. + +```diff +- ++ +``` + +### Removed: `orgs` claim on JWT + +In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. + +The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. + + + + ```typescript filename="Next.js" + import { getAuth } from "@clerk/nextjs/server" + const claims: JwtPayload = getAuth(request).sessionClaims + + import { getAuth } from "@clerk/ssr.server" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + + ```typescript filename="Fastify" + import { getAuth } from "@clerk/fastify" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + ```typescript filename="@clerk/backend" + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "" }) + const requestState = await clerkClient.authenticateRequest( + request, + { publishableKey: "" } + ) + const claims: JwtPayload = requestState.toAuth().sessionClaims + ``` + + + + ```typescript filename="@clerk/clerk-sdk-node" + import { clerkClient } from "@clerk/clerk-sdk-node" + + router.use((...args) => clerkClient.expressRequireAuth()(...args)) + router.get("/me", async (req, reply: Response) => { + return reply.json({ auth: req.auth }) + }) + ``` + + + + +If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. + +### Path routing is now the default + +On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. + +In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: + +- `` +- `` +- `` +- `` +- `` + +Here's how you'd use the components going forward: + +```jsx + + + + + +``` + +If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. + +```jsx + + +``` + +However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. + + +```env filename=".env.local" +NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in +NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up +``` + +```env filename=".env" +CLERK_SIGN_IN_URL=/sign-in +CLERK_SIGN_UP_URL=/sign-up +``` + + + +**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. + +```jsx +// Only works for Next.js / Remix when environment variables are set + + +``` + +### Image URL Name Consolidation + +There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: + +isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.logoUrl -> Organization.imageUrl"]}> + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: + + ```diff + - await setSession('sessionID', () => void) + + await setActive({ session: 'sessionID', beforeEmit: () => void }) + + - await setSession(sessionObj) + + await setActive({ session: sessionObj }) + + - await setSession(sessionObj, () => void) + + await setActive({ session: sessionObj, beforeEmit: () => void }) + ``` + + `setActive` also supports setting an active organization: + + ```js + await setActive({ + session: 'sessionID', + organization: 'orgID', + beforeEmit: () => void + }) + + await setActive({ + session: sessionObj, + organization: orgObj, + beforeEmit: () => void + }) + ``` + + + The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: + + ```diff + import { SignOutButton } from "@clerk/clerk-react"; + + export const Signout = () => { + return ( + { window.location.href = "/your-path" }} + + redirectUrl="/your-path" + > + + + ) + } + ``` + + + The `logoUrl` property of any [`Organization` object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to `imageUrl`. + + + +## Deprecation removals & housekeeping + +As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. + + + For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of + changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for + manually. + + +### Deprecation removals + +isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.logoUrl -> Organization.imageUrl"]}> + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: + + ```diff + - await setSession('sessionID', () => void) + + await setActive({ session: 'sessionID', beforeEmit: () => void }) + + - await setSession(sessionObj) + + await setActive({ session: sessionObj }) + + - await setSession(sessionObj, () => void) + + await setActive({ session: sessionObj, beforeEmit: () => void }) + ``` + + `setActive` also supports setting an active organization: + + ```js + await setActive({ + session: 'sessionID', + organization: 'orgID', + beforeEmit: () => void + }) + + await setActive({ + session: sessionObj, + organization: orgObj, + beforeEmit: () => void + }) + ``` + + + The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: + + ```diff + import { SignOutButton } from "@clerk/clerk-react"; + + export const Signout = () => { + return ( + { window.location.href = "/your-path" }} + + redirectUrl="/your-path" + > + + + ) + } + ``` + + + The `logoUrl` property of any [`Organization` object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to `imageUrl`. + + + +### Other Breaking Changes + +isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.logoUrl -> Organization.imageUrl"]}> + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: + + ```diff + - await setSession('sessionID', () => void) + + await setActive({ session: 'sessionID', beforeEmit: () => void }) + + - await setSession(sessionObj) + + await setActive({ session: sessionObj }) + + - await setSession(sessionObj, () => void) + + await setActive({ session: sessionObj, beforeEmit: () => void }) + ``` + + `setActive` also supports setting an active organization: + + ```js + await setActive({ + session: 'sessionID', + organization: 'orgID', + beforeEmit: () => void + }) + + await setActive({ + session: sessionObj, + organization: orgObj, + beforeEmit: () => void + }) + ``` + + + The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: + + ```diff + import { SignOutButton } from "@clerk/clerk-react"; + + export const Signout = () => { + return ( + { window.location.href = "/your-path" }} + + redirectUrl="/your-path" + > + + + ) + } + ``` + + + The `logoUrl` property of any [`Organization` object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to `imageUrl`. + + diff --git a/packages/upgrade/source/guide-generators/v5/expo/index.js b/packages/upgrade/source/guide-generators/v5/expo/index.js new file mode 100644 index 00000000000..5f4b94adaba --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/expo/index.js @@ -0,0 +1,43 @@ +import { + accordionForCategory, + assembleContent, + deprecationRemovalsAndHousekeeping, + frontmatter, + loadVersionChangeData, + markdown, + markdownTemplate, + writeToFile, +} from '../../text-generation.js'; + +const version = 'v5'; +const name = 'expo'; +const properName = 'Expo'; +const cwd = `${version}/${name}`; + +async function generate() { + const data = await loadVersionChangeData(version, name); + + return assembleContent({ data, cwd }, [ + frontmatter({ + title: `Upgrading ${properName} from v4 to v5`, + description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + }), + `# Upgrading \`@clerk/${name}\` from v4 to v5`, + markdown('intro'), + markdown('prepare'), + markdown('node-version'), + markdown('react-version'), + markdownTemplate('update-v5', { packageName: '@clerk/expo' }), + markdown('cli'), + '## Breaking Changes', + markdown('redesign-preview'), + markdown('after-sign-x-handling'), + markdown('orgs-claim'), + markdown('path-routing'), + markdown('image-url'), + accordionForCategory('image-url'), + deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/guide-generators/v5/expo/intro.mdx b/packages/upgrade/source/guide-generators/v5/expo/intro.mdx new file mode 100644 index 00000000000..18f14b8f45b --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/expo/intro.mdx @@ -0,0 +1,3 @@ +Version 5 of the Expo SDK ships with an improved design and UX for its built-in components and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Expo project to use `@clerk/expo` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/fastify/__output.mdx b/packages/upgrade/source/guide-generators/v5/fastify/__output.mdx new file mode 100644 index 00000000000..afba6c5a470 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/fastify/__output.mdx @@ -0,0 +1,204 @@ +--- +title: 'Upgrading Fastify from v4 to v5' +description: "Learn how to upgrade Clerk's Fastify SDK from v4 to v5." +--- + +# Upgrading `@clerk/fastify` from v4 to v5 + +Version 5 of the Fastify SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Fastify project to use `@clerk/fastify` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. + +## Preparing to upgrade + +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. + +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. + +Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. + +**Updating Node.js** + +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). + +## Updating to v5 + +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: + + + ```bash filename="terminal" + npm install @clerk/fastify@beta + ``` + + ```bash filename="terminal" + yarn add @clerk/fastify@beta + ``` + + ```bash filename="terminal" + pnpm add @clerk/fastify@beta + ``` + + + +## CLI Upgrade Helper + +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. + +To run the CLI tool, navigate to your project and run it in the terminal: + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + + +If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. + +## Breaking Changes + +### Removed: `orgs` claim on JWT + +In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. + +The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. + + + + ```typescript filename="Next.js" + import { getAuth } from "@clerk/nextjs/server" + const claims: JwtPayload = getAuth(request).sessionClaims + + import { getAuth } from "@clerk/ssr.server" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + + ```typescript filename="Fastify" + import { getAuth } from "@clerk/fastify" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + ```typescript filename="@clerk/backend" + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "" }) + const requestState = await clerkClient.authenticateRequest( + request, + { publishableKey: "" } + ) + const claims: JwtPayload = requestState.toAuth().sessionClaims + ``` + + + + ```typescript filename="@clerk/clerk-sdk-node" + import { clerkClient } from "@clerk/clerk-sdk-node" + + router.use((...args) => clerkClient.expressRequireAuth()(...args)) + router.get("/me", async (req, reply: Response) => { + return reply.json({ auth: req.auth }) + }) + ``` + + + + +If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. + +### Image URL Name Consolidation + +There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: + +API_URL value has changed', + 'Clerk -> { createClerkClient }', + 'Organization.logoUrl -> Organization.imageUrl', + ]} +> + + The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on + the text content of this value not changing, you may need to make adjustments. + + + The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. + You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + ```diff - import Clerk from "@clerk/fastify" + import {createClerkClient} from "@clerk/fastify" ``` + + + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. + + + +## Deprecation removals & housekeeping + +As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. + + + For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of + changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for + manually. + + +### Deprecation removals + +API_URL value has changed', + 'Clerk -> { createClerkClient }', + 'Organization.logoUrl -> Organization.imageUrl', + ]} +> + + The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on + the text content of this value not changing, you may need to make adjustments. + + + The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. + You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + ```diff - import Clerk from "@clerk/fastify" + import {createClerkClient} from "@clerk/fastify" ``` + + + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. + + + +### Other Breaking Changes + +API_URL value has changed', + 'Clerk -> { createClerkClient }', + 'Organization.logoUrl -> Organization.imageUrl', + ]} +> + + The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on + the text content of this value not changing, you may need to make adjustments. + + + The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. + You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + ```diff - import Clerk from "@clerk/fastify" + import {createClerkClient} from "@clerk/fastify" ``` + + + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. + + diff --git a/packages/upgrade/source/guide-generators/v5/fastify/index.js b/packages/upgrade/source/guide-generators/v5/fastify/index.js new file mode 100644 index 00000000000..f30d0bb7f7d --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/fastify/index.js @@ -0,0 +1,40 @@ +import { + accordionForCategory, + assembleContent, + deprecationRemovalsAndHousekeeping, + frontmatter, + loadVersionChangeData, + markdown, + markdownTemplate, + writeToFile, +} from '../../text-generation.js'; + +const version = 'v5'; +const name = 'fastify'; +const properName = 'Fastify'; +const packageName = '@clerk/fastify'; +const cwd = `${version}/${name}`; + +async function generate() { + const data = await loadVersionChangeData(version, name); + + return assembleContent({ data, cwd }, [ + frontmatter({ + title: `Upgrading ${properName} from v4 to v5`, + description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + }), + `# Upgrading \`${packageName}\` from v4 to v5`, + markdown('intro'), + markdown('prepare'), + markdown('node-version'), + markdownTemplate('update-v5', { packageName }), + markdown('cli'), + '## Breaking Changes', + markdown('orgs-claim'), + markdown('image-url'), + accordionForCategory('image-url'), + deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/guide-generators/v5/fastify/intro.mdx b/packages/upgrade/source/guide-generators/v5/fastify/intro.mdx new file mode 100644 index 00000000000..4345583d4d0 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/fastify/intro.mdx @@ -0,0 +1,3 @@ +Version 5 of the Fastify SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Fastify project to use `@clerk/fastify` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx b/packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx new file mode 100644 index 00000000000..840a080a790 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx @@ -0,0 +1,704 @@ +--- +title: 'Upgrading Gatsby from v4 to v5' +description: "Learn how to upgrade Clerk's Gatsby SDK from v4 to v5." +--- + +# Upgrading `gatsby-plugin-clerk` from v4 to v5 + +Version 5 of the Gatsby SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Expo project to use `gatsby-plugin-clerk` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. + +## Preparing to upgrade + +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. + +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. + +Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. + +**Updating Node.js** + +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). + +**Updating React** + +All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. + + + ```bash filename="terminal" + npm install react@latest react-dom@latest + ``` + + ```bash filename="terminal" + yarn add react@latest react-dom@latest + ``` + + ```bash filename="terminal" + pnpm add react@latest react-dom@latest + ``` + + + +If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. + +## Updating to v5 + +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: + + + ```bash filename="terminal" + npm install gatsby-plugin-clerk@beta + ``` + + ```bash filename="terminal" + yarn add gatsby-plugin-clerk@beta + ``` + + ```bash filename="terminal" + pnpm add gatsby-plugin-clerk@beta + ``` + + + +## CLI Upgrade Helper + +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. + +To run the CLI tool, navigate to your project and run it in the terminal: + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + + +If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. + +## Breaking Changes + +### Component design adjustments + +The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. + +[More detail on these changes »](/components-redesigned) + +## After sign up/in/out URL handling + +Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. + +As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. + +```diff +- ++ +``` + +### Removed: `orgs` claim on JWT + +In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. + +The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. + + + + ```typescript filename="Next.js" + import { getAuth } from "@clerk/nextjs/server" + const claims: JwtPayload = getAuth(request).sessionClaims + + import { getAuth } from "@clerk/ssr.server" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + + ```typescript filename="Fastify" + import { getAuth } from "@clerk/fastify" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + ```typescript filename="@clerk/backend" + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "" }) + const requestState = await clerkClient.authenticateRequest( + request, + { publishableKey: "" } + ) + const claims: JwtPayload = requestState.toAuth().sessionClaims + ``` + + + + ```typescript filename="@clerk/clerk-sdk-node" + import { clerkClient } from "@clerk/clerk-sdk-node" + + router.use((...args) => clerkClient.expressRequireAuth()(...args)) + router.get("/me", async (req, reply: Response) => { + return reply.json({ auth: req.auth }) + }) + ``` + + + + +If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. + +### Path routing is now the default + +On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. + +In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: + +- `` +- `` +- `` +- `` +- `` + +Here's how you'd use the components going forward: + +```jsx + + + + + +``` + +If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. + +```jsx + + +``` + +However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. + + +```env filename=".env.local" +NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in +NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up +``` + +```env filename=".env" +CLERK_SIGN_IN_URL=/sign-in +CLERK_SIGN_UP_URL=/sign-up +``` + + + +**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. + +```jsx +// Only works for Next.js / Remix when environment variables are set + + +``` + +### Image URL Name Consolidation + +There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: + +ExternalAccount.picture -> .imageUrl', + 'Organization.logoUrl -> .imageUrl', + 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', + ]} +> + + The `picture` property of any [`ExternalAcccount` + object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. + + The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. + + The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. + + + +## Deprecation removals & housekeeping + +As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. + + + For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of + changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for + manually. + + +### Deprecation removals + +frontendApi -> publishableKey as prop to ClerkProvider", "afterSwitchOrganizationUrl -> afterSelectOrganizationUrl in OrganizationSwitcher", "ClerkProviderOptionsWrapper type removed", "CLERK_API_KEY replaced by CLERK_SECRET_KEY", "apiKey -> secretKey as param to createClerkClient", "GASTBY_CLERK_FRONTEND_API replaced by GATSBY_CLERK_PUBLISHABLE_KEY", "frontendApi -> publishableKey as param to createClerkClient"]}> + + The `frontendApi` prop passed to `` was renamed to `publishableKey`. **Note:** The values are different, so this is not just a key replacement. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). [More information](/docs/deployments/overview#api-keys-and-environment-variables). + + + The `afterSwitchOrganizationUrl` prop on the `` component has been renamed to `afterSelectOrganizationUrl`. This is a quick and simple rename. + + ```diff + - + + + ``` + + + This type was extending `ClerkProviderProps` with but was not necessary. This type is typically used internally and is not required to be imported and used directly. If needed, import and use `ClerkProviderProps` instead. + + + The `CLERK_API_KEY` environment variable was renamed to `CLERK_SECRET_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). + + + The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. + + ```diff + import { createClerkClient } from 'gatsby-plugin-clerk/api'; + + - createClerkClient({ apiKey: '...' }); + + createClerkClient({ secretKey: '...' }); + ``` + + + If you are using a `GATSBY_CLERK_FRONTEND_API` environment variable, the name must be changed to `GATSBY_CLERK_PUBLISHABLE_KEY` instead. Note that the values are different as well, so this is not just a key replacement. You can find the publishable key in your Clerk dashboard. Make sure you do this in both your dev and production environments. + + + The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. + + ```diff + import { createClerkClient } from 'gatsby-plugin-clerk/api'; + + - createClerkClient({ frontendApi: '...' }); + + createClerkClient({ publishableKey: '...' }); + ``` + + + +### Other Breaking Changes + +MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "isMagicLinkError -> isEmailLinkError", "MagicLinkError -> EmailLinkError", "handleMagicLinkVerification -> handleEmailLinkVerification", "setSession -> setActive", "invitationList -> invitations as param to useOrganizations", "membershipList -> members as param to useOrganization", "useOrganizations -> useOrganizationList", "userProfile -> userProfileProps for UserButton", "WithSession component removed", "WithClerk component removed", "WithUser component removed", "withClerk function removed", "withSession function removed", "withUser function removed", "MultisessionAppSupport import moved to /internal", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.getOrganizationList() return type changed", "User.getOrganizationMembershipList() return type changed", "Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed", "API_URL value has changed", "withServerAuth props.auth return type changed", "Clerk -> { createClerkClient }"]}> + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + + + `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: + + ```diff + - await setSession('sessionID', () => void) + + await setActive({ session: 'sessionID', beforeEmit: () => void }) + + - await setSession(sessionObj) + + await setActive({ session: sessionObj }) + + - await setSession(sessionObj, () => void) + + await setActive({ session: sessionObj, beforeEmit: () => void }) + ``` + + `setActive` also supports setting an active organization: + + ```js + await setActive({ + session: 'sessionID', + organization: 'orgID', + beforeEmit: () => void + }) + + await setActive({ + session: sessionObj, + organization: orgObj, + beforeEmit: () => void + }) + ``` + + + The `invitationList` param to the `useOrganizations` hook has been replaced by `invitations`. This param also has a slightly different way of working, examples included below. Note also that `useOrganizations` is deprecated and should be updated to `useOrganization` instead. + + ```js + // before + const { invitationList } = useOrganization({ + invitationList: { limit: 10, offset: 1 }, + }); + + // after + const { invitations } = useOrganization({ + invitations: { + initialPage: 1, + pageSize: 10, + }, + }); + + // you can also simply return all invitations + const { invitations } = useOrganization({ invitations: true }); + ``` + + + The `membershipList` param from the `useOrganization` hook has been removed. Instead, [use the `memberships` param](https://clerk.com/docs/references/react/use-organization#parameters). Examples of each can be seen here: + + ```js + // before + const { membershipList } = useOrganization({ + membershipList: { limit: 10, offset: 1 }, + }); + + // after + const { memberships } = useOrganization({ + memberships: { + initialPage: 1, + pageSize: 10, + }, + }); + + // you can also simply return all memberships + const { memberships } = useOrganization({ memberships: true }); + ``` + + + Any place where `useOrganizations` is used should be switched to [`useOrganizationList`](https://clerk.com/docs/references/react/use-organization-list) or [`useOrganization`](https://clerk.com/docs/references/react/use-organization) instead. The return signature has also changed, so take note of this when making the upgrade. + + ```js + // before: useOrganizations return values + { + isLoaded: boolean, + createOrganization: clerk.createOrganization, + getOrganizationMemberships: clerk.getOrganizationMemberships, + getOrganization: clerk.getOrganization, + } + + // after: useOrganizationList return values + { + isLoaded: boolean, + createOrganization: clerk.createOrganization, + userMemberships: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, + userInvitations: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, + userSuggestions: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, + setActive: clerk.setActive, + } + ``` + + + The `userProfile` prop on [the `UserButton` component](https://clerk.com/docs/references/javascript/clerk/user-button#user-button-component) has been changed to `userProfileProps`. This is purely a name change, none of the values need to be updated. + + ```diff + - + + + ``` + + + The `WithSession` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + export const WithSession = ({ children }) => { + const session = useSession(); + if (typeof children !== 'function') throw new Error(); + + return {children(session)}; + }; + ``` + + + The `WithClerk` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + export const WithClerk = ({ children }) => { + const clerk = useClerk(); + if (typeof children !== 'function') throw new Error(); + + return {children(clerk)}; + }; + ``` + + + The `WithUser` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + export const WithUser = ({ children }) => { + const user = useUser(); + if (typeof children !== 'function') throw new Error(); + + return {children(user)}; + }; + ``` + + + The `withClerk` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + function withClerk(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const clerk = useIsomorphicClerkContext(); + + if (!clerk.loaded) return null; + + return ( + + ); + }; + + HOC.displayName = `withClerk(${displayName})`; + return HOC; + } + ``` + + + The `withSession` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + function withSession(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const session = useSessionContext(); + + if (!session) return null; + + return ( + + ); + }; + + HOC.displayName = `withSession(${displayName})`; + return HOC; + } + ``` + + + The `withUser` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + function withUser(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const clerk = useUserContext(); + + if (!user) return null; + + return ( + + ); + }; + + HOC.displayName = `withUser(${displayName})`; + return HOC; + } + ``` + + + `MultiSessionAppSupport` is a component that handles the intermediate “undefined” state for multisession apps by unmounting and remounting the components during the session switch (` setActive`` call) in order to solve theoretical edge-cases that can arise while switching sessions. It is undocumented and intended only for internal use, so it has been moved to an `/internal` import path. Please note that internal imports are not intended for public use, and are outside the scope of semver. + + ```diff + - import { MultiSessionAppSupport } from '@clerk/clerk-react' + + import { MultiSessionAppSupport } from '@clerk/clerk-react/internal' + ``` + + + The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: + + ```diff + import { SignOutButton } from "@clerk/clerk-react"; + + export const Signout = () => { + return ( + { window.location.href = "/your-path" }} + + redirectUrl="/your-path" + > + + + ) + } + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { organization } = useOrganization() + const orgList = organization.getOrganizationList() + + - orgList.forEach(() => {}) + + orgList.data.forEach(() => {}) + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { user } = useUser() + const membershipList = user.getOrganizationMembershipList() + + - membershipList.forEach(() => {}) + + membershipList.data.forEach(() => {}) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getRoles({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getDomains({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMembershipRequests({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationSuggestions({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. + + + When utilizing the `withServerAuth` helper in Gatsby, it expects a callback function that is called with props from Clerk internals. The `.auth` property on the returned object from the callback has seen a substantial change in its return type. Below is a code example of where the `auth` prop might be found: + + ```js + import { withServerAuth } from 'gatsby-plugin-clerk/ssr'; + + export const getServerData: GetServerData = withServerAuth(async props => { + return { props: { data: '...', auth: props.auth } }; + }); + ``` + + And here's a diff of the changes in the return type. The breaking change here specifically is that the property `auth.claims` was changed to `auth.sessionClaims`. Additionally, there is more information on the response that can be utilized if helpful. + + ```diff + // return type diff + { + sessionId: string | null; + userId: string | null; + actor: ActJWTClaim | null; + getToken: ServerGetToken; + - claims: ClerkJWTClaims | null; + + sessionClaims: JwtPayload; + + session: Session | undefined | null; + + user: User | undefined | null; + + orgId: string | undefined | null; + + orgRole: string | undefined | null; + + orgSlug: string | undefined | null; + + organization: Organization | undefined | null; + + debug: AuthObjectDebug; + }; + ``` + + + The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + + ```diff + - import Clerk from "gatsby-plugin-clerk" + + import { createClerkClient } from "gatsby-plugin-clerk" + ``` + + diff --git a/packages/upgrade/source/guide-generators/v5/gatsby/index.js b/packages/upgrade/source/guide-generators/v5/gatsby/index.js new file mode 100644 index 00000000000..0b72ad0783b --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/gatsby/index.js @@ -0,0 +1,43 @@ +import { + accordionForCategory, + assembleContent, + deprecationRemovalsAndHousekeeping, + frontmatter, + loadVersionChangeData, + markdown, + markdownTemplate, + writeToFile, +} from '../../text-generation.js'; + +const version = 'v5'; +const name = 'gatsby'; +const properName = 'Gatsby'; +const cwd = `${version}/${name}`; + +async function generate() { + const data = await loadVersionChangeData(version, name); + + return assembleContent({ data, cwd }, [ + frontmatter({ + title: `Upgrading ${properName} from v4 to v5`, + description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + }), + '# Upgrading `gatsby-plugin-clerk` from v4 to v5', + markdown('intro'), + markdown('prepare'), + markdown('node-version'), + markdown('react-version'), + markdownTemplate('update-v5', { packageName: 'gatsby-plugin-clerk' }), + markdown('cli'), + '## Breaking Changes', + markdown('redesign-preview'), + markdown('after-sign-x-handling'), + markdown('orgs-claim'), + markdown('path-routing'), + markdown('image-url'), + accordionForCategory('image-url'), + deprecationRemovalsAndHousekeeping(), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/guide-generators/v5/gatsby/intro.mdx b/packages/upgrade/source/guide-generators/v5/gatsby/intro.mdx new file mode 100644 index 00000000000..5cdefc1d67e --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/gatsby/intro.mdx @@ -0,0 +1,3 @@ +Version 5 of the Gatsby SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Expo project to use `gatsby-plugin-clerk` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/js/__output.mdx b/packages/upgrade/source/guide-generators/v5/js/__output.mdx new file mode 100644 index 00000000000..35c3a815d82 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/js/__output.mdx @@ -0,0 +1,497 @@ +--- +title: 'Upgrading Javascript from v4 to v5' +description: "Learn how to upgrade Clerk's Javascript SDK from v4 to v5." +--- + +# Upgrading `@clerk/clerk-js` from v4 to v5 + +Version 5 of the Javascript SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your JS project to use `@clerk/clerk-js` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. + +## Preparing to upgrade + +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. + +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. + +Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. + +## Updating to v5 + +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: + + + ```bash filename="terminal" + npm install @clerk/clerk-js@beta + ``` + + ```bash filename="terminal" + yarn add @clerk/clerk-js@beta + ``` + + ```bash filename="terminal" + pnpm add @clerk/clerk-js@beta + ``` + + + +## CLI Upgrade Helper + +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. + +To run the CLI tool, navigate to your project and run it in the terminal: + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + + +If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. + +## Breaking Changes + +### Component design adjustments + +The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. + +[More detail on these changes »](/components-redesigned) + +## After sign up/in/out URL handling + +Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. + +As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. + +```diff +- ++ +``` + +### Removed: `orgs` claim on JWT + +In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. + +The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. + + + + ```typescript filename="Next.js" + import { getAuth } from "@clerk/nextjs/server" + const claims: JwtPayload = getAuth(request).sessionClaims + + import { getAuth } from "@clerk/ssr.server" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + + ```typescript filename="Fastify" + import { getAuth } from "@clerk/fastify" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + ```typescript filename="@clerk/backend" + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "" }) + const requestState = await clerkClient.authenticateRequest( + request, + { publishableKey: "" } + ) + const claims: JwtPayload = requestState.toAuth().sessionClaims + ``` + + + + ```typescript filename="@clerk/clerk-sdk-node" + import { clerkClient } from "@clerk/clerk-sdk-node" + + router.use((...args) => clerkClient.expressRequireAuth()(...args)) + router.get("/me", async (req, reply: Response) => { + return reply.json({ auth: req.auth }) + }) + ``` + + + + +If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. + +### Path routing is now the default + +On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. + +In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: + +- `` +- `` +- `` +- `` +- `` + +Here's how you'd use the components going forward: + +```jsx + + + + + +``` + +If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. + +```jsx + + +``` + +However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. + + +```env filename=".env.local" +NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in +NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up +``` + +```env filename=".env" +CLERK_SIGN_IN_URL=/sign-in +CLERK_SIGN_UP_URL=/sign-up +``` + + + +**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. + +```jsx +// Only works for Next.js / Remix when environment variables are set + + +``` + +### Image URL Name Consolidation + +There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: + +Organization.logoUrl -> Organization.imageUrl', + 'ExternalAccount.picture -> .imageUrl', + 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', + 'User.profileImageUrl -> .imageUrl', + ]} +> + + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. + + + The `picture` property of any [`ExternalAcccount` + object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. + + + The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. + + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. + + +#### Changes to pagination arguments for some functions + +There were some changes made to pagination-related arguments passed into functions, in order to make it more clear how to control paginated results. See each function impacted by these changes below: + +Organization.getRoles arguments changed", "Organization.getDomains arguments changed", "Organization.getMembershipRequests arguments changed", "Organization.getMemberships arguments changed", "Organization.getInvitations arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed"]}> + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getRoles({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getDomains({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMembershipRequests({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationSuggestions({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + +#### Changes to some function return signatures + +There have been changes to return signatures for some functions. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. This change also aligns the response shape with what is returned from the Clerk backend API. Each impacted function is listed below, along with code examples: + + + + + +## Deprecation removals & housekeeping + +As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. + + + For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of + changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for + manually. + + +### Deprecation removals + +User.update({ password: 'x' }) -> User.updatePassword('x')", "Clerk.experimental_canUseCaptcha property removed", "Clerk.experimental_captchaURL property removed", "Clerk.experimental_captchaSiteKey property removed", "Clerk.__unstable__invitationUpdate removed", "Clerk.__unstable__membershipUpdate removed", "redirect_url -> redirectUrl as param of User.createExternalAccount", "generatedSignature -> signature as param of Signup.attemptWeb3WalletVerification()"]}> + + If you are updating a user's password via the [`User.update` method](https://clerk.com/docs/references/javascript/user/user#update), it must be changed to [`User.updatePassword`](https://clerk.com/docs/references/javascript/user/password-management#update-password) instead. This method will require the current password as well as the desired new password. We made this update to improve the security of password changes. Example below: + + ```diff + - user.update({ password: 'foo' }); + + + user.updatePassword({ + + currentPassword: 'bar', + + newPassword: 'foo', + + signOutOfOtherSessions: true, + + }); + ``` + + + The experimental property `Clerk.experimental_canUseCaptcha` has been removed. There is no replacement for this functionality currently. If this is problematic for your application, please [reach out to our support team](https://clerk.com/support)! + + + The experimental property `Clerk.experimental_captchaURL` has been removed. There is no replacement for this functionality currently. If this is problematic for your application, please [reach out to our support team](https://clerk.com/support)! + + + The experimental property `Clerk.experimental_captchaSiteKey` has been removed. There is no replacement for this functionality currently. If this is problematic for your application, please [reach out to our support team](https://clerk.com/support)! + + + The `Clerk.__unstable__invitationUpdate` experimental property has been removed, and has no current replacement. If this is an issue in your codebase, please [reach out to Clerk support](https://clerk.com/support)! + + + The `Clerk.__unstable__membershipUpdate` experimental property has been removed, and has no current replacement. If this is an issue in your codebase, please [reach out to Clerk support](https://clerk.com/support)! + + + The param `redirect_url` of [`User.createExternalAccount`](https://clerk.com/docs/references/javascript/user/create-metadata#create-external-account) has been updated to `redirectUrl`. This is a simple text replacement without any signature changes. + + + The `generatedSignature` param to [`Signup.attemptWeb3WalletVerification()`](https://clerk.com/docs/references/javascript/sign-up/web3-verification#attempt-web3-wallet-verification) has been removed. Instead, use the `signature` param. Note that this param takes a string, where the `generatedSignature` param took a function, so both key and value will need to change. + + ```js + // before + s.attemptWeb3WalletVerification({ + generatedSignature: async () => 'signatureString', + }); + + // after + s.attemptWeb3WalletVerification({ signature: 'signatureString' }); + + // or, if you still need to fetch the signature async + const signatureString = await (async () => 'signatureString'); + s.attemptWeb3WalletVerification({ signature: signatureString }); + ``` + + + +### Other Breaking Changes + +MagicLinkError -> EmailLinkError", "isMagicLinkError -> isEmailLinkError", "MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "handleMagicLinkVerification -> handleEmailLinkVerification", "ExternalAccount.avatarUrl -> ExternalAccount.imageUrl", "[User|OrganizationMembershipPublicData].profileImageUrl -> [User|OrganizationMembershipPublicData].imageUrl", "setSession -> setActive", "Clerk.getOrganizationMemberships() -> user.getOrganizationMemberships()", "lastOrganizationInvitation and lastOrganizationMember dropped from event emitter", "Organization.create('x') -> Organization.create({ name: 'x' })", "Organization.getPendingInvitations() -> Organization.getInvitations({ status: 'pending' })", "Clerk.redirectToHome() removed", "Clerk.isReady() removed", "Replace signOutCallback prop on SignOutButton with redirectUrl"]}> + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + + + The `avatarUrl` property of any [`ExternalAcccount` object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. + + + The `profileImageUrl` property of any [`User` object](https://clerk.com/docs/references/javascript/user/user#user) or [`OrganizationMembershipPublicData` object](https://github.com/clerk/javascript/blob/37f36e538d8879981f76f4a433066e057afb06de/packages/backend/src/api/resources/OrganizationMembership.ts#L31) has been changed to `imageUrl`. + + + `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: + + ```diff + - await setSession('sessionID', () => void) + + await setActive({ session: 'sessionID', beforeEmit: () => void }) + + - await setSession(sessionObj) + + await setActive({ session: sessionObj }) + + - await setSession(sessionObj, () => void) + + await setActive({ session: sessionObj, beforeEmit: () => void }) + ``` + + `setActive` also supports setting an active organization: + + ```js + await setActive({ + session: 'sessionID', + organization: 'orgID', + beforeEmit: () => void + }) + + await setActive({ + session: sessionObj, + organization: orgObj, + beforeEmit: () => void + }) + ``` + + + The `getOrganizationMemberships` [method on the `Clerk` class](https://clerk.com/docs/references/javascript/clerk/clerk#organization) has been removed. Instead, use `getOrganizationMemberships` on a user instance. + + ```diff + - Clerk.getOrganizationMemberships(); + + user.getOrganizationMemberships(); + ``` + + + If you are using [`Clerk.addListener`](https://clerk.com/docs/references/javascript/clerk/clerk#add-listener) or `OrganizationContext` and utilizing either the `lastOrganizationInvitation` and/or `lastOrganizationMember` emitted events, these properties have been removed, as they were only relevant for internal use. We are not providing a way to backfill this functionality at the moment. If you are using it and this is an issue for you, please [reach out to Clerk support](https://clerk.com/support) and we can find a way to resolve the issue! + + + Passing a string as an argument to `Organization.create` is no longer possible - instead, pass an object with the `name` property. + + ```diff + - Organization.create('...'); + + Organization.create({ name: '...' }); + ``` + + + The `Organization.getPendingInvitations()` method has been removed. You can use `Organization.getInvitations` instead. + + ```diff + - Organization.getPendingInvitations(); + + Organization.getInvitations({ status: 'pending' }); + ``` + + + The `Clerk.redirectToHome` method has been removed. If you are looking for a generic replacement for this method, you can instead use `window.Clerk.redirectToAfterSignUp()` or `window.Clerk.redirectAfterSignIn()`. + + To set the `afterSignUpUrl` or `afterSignInUrl`, you can: + + - [pass the desired values into ClerkProvider](https://clerk.com/docs/components/clerk-provider#properties) + - if using nextjs SDK, set with `NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL` or `NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL` + - if using remix SDK, set with `CLERK_AFTER_SIGN_IN_URL` or `CLERK_AFTER_SIGN_UP_URL` + - If not using a react-based SDK, they can be passed into `Clerk.load` as such: `Clerk.load({ afterSignUpUrl: 'x', afterSignInUrl: 'y' })` + + + We have removed the `Clerk.isReady()` function - instead, please use the `Clerk.loaded` property to check whether Clerk has completed loading. + + + The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: + + ```diff + import { SignOutButton } from "@clerk/clerk-react"; + + export const Signout = () => { + return ( + { window.location.href = "/your-path" }} + + redirectUrl="/your-path" + > + + + ) + } + ``` + + diff --git a/packages/upgrade/source/guide-generators/v5/js/index.js b/packages/upgrade/source/guide-generators/v5/js/index.js new file mode 100644 index 00000000000..94f420d72df --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/js/index.js @@ -0,0 +1,48 @@ +import { + accordionForCategory, + assembleContent, + deprecationRemovalsAndHousekeeping, + frontmatter, + loadVersionChangeData, + markdown, + markdownTemplate, + writeToFile, +} from '../../text-generation.js'; + +const version = 'v5'; +const name = 'js'; +const properName = 'Javascript'; +const packageName = '@clerk/clerk-js'; +const cwd = `${version}/${name}`; + +async function generate() { + const data = await loadVersionChangeData(version, name); + + return assembleContent({ data, cwd }, [ + frontmatter({ + title: `Upgrading ${properName} from v4 to v5`, + description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + }), + `# Upgrading \`${packageName}\` from v4 to v5`, + markdown('intro'), + markdown('prepare'), + markdownTemplate('update-v5', { packageName }), + markdown('cli'), + '## Breaking Changes', + markdown('redesign-preview'), + markdown('after-sign-x-handling'), + markdown('orgs-claim'), + markdown('path-routing'), + markdown('image-url'), + accordionForCategory('image-url'), + markdown('pagination-args'), + accordionForCategory('pagination-args'), + markdown('pagination-return'), + accordionForCategory('pagination-return'), + // createOrganization args? + // attemptweb3wallet? + deprecationRemovalsAndHousekeeping(['error-imports']), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/guide-generators/v5/js/intro.mdx b/packages/upgrade/source/guide-generators/v5/js/intro.mdx new file mode 100644 index 00000000000..32f63d0487d --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/js/intro.mdx @@ -0,0 +1,3 @@ +Version 5 of the Javascript SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your JS project to use `@clerk/clerk-js` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/js/pagination-args.mdx b/packages/upgrade/source/guide-generators/v5/js/pagination-args.mdx new file mode 100644 index 00000000000..9f33b5f2173 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/js/pagination-args.mdx @@ -0,0 +1,3 @@ +#### Changes to pagination arguments for some functions + +There were some changes made to pagination-related arguments passed into functions, in order to make it more clear how to control paginated results. See each function impacted by these changes below: diff --git a/packages/upgrade/source/guide-generators/v5/js/pagination-return.mdx b/packages/upgrade/source/guide-generators/v5/js/pagination-return.mdx new file mode 100644 index 00000000000..c5c54233c14 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/js/pagination-return.mdx @@ -0,0 +1,3 @@ +#### Changes to some function return signatures + +There have been changes to return signatures for some functions. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. This change also aligns the response shape with what is returned from the Clerk backend API. Each impacted function is listed below, along with code examples: diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx b/packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx new file mode 100644 index 00000000000..2b0c9f05026 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx @@ -0,0 +1,1043 @@ +--- +title: 'Upgrading Next.js from v4 to v5' +description: "Learn how to upgrade Clerk's Next.js SDK from v4 to v5." +--- + +# Upgrading `@clerk/nextjs` from v4 to v5 + +Version 5 of the Next.js SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, a substantially improved middleware import, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Next.js project to use `@clerk/nextjs` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. + +## Preparing to upgrade + +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. + +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. + +Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. + +**Updating Node.js** + +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). + +**Updating React** + +All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. + + + ```bash filename="terminal" + npm install react@latest react-dom@latest + ``` + + ```bash filename="terminal" + yarn add react@latest react-dom@latest + ``` + + ```bash filename="terminal" + pnpm add react@latest react-dom@latest + ``` + + + +If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. + +**Updating Next.js** + +`@clerk/nextjs` now requires you to use Next.js version `13.0.4` or later. Check out Next's upgrade guides for more guidance if you have not yet upgraded to Next.js 13: + +- [Upgrading from 12 to 13](https://nextjs.org/docs/pages/building-your-application/upgrading/version-13) +- [Upgrading from 13 to 14](https://nextjs.org/docs/app/building-your-application/upgrading/version-14) + +## Updating to v5 + +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: + + + ```bash filename="terminal" + npm install @clerk/nextjs@beta + ``` + + ```bash filename="terminal" + yarn add @clerk/nextjs@beta + ``` + + ```bash filename="terminal" + pnpm add @clerk/nextjs@beta + ``` + + + +## CLI Upgrade Helper + +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. + +To run the CLI tool, navigate to your project and run it in the terminal: + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + + +If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. + +## Breaking Changes + +### Component design adjustments + +The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. + +[More detail on these changes »](/components-redesigned) + +## New Middleware architecture + +User and customer feedback about `authMiddleware()` has been clear in that Middleware logic was a often friction point. As such, in v5 you will find a completely new Middleware helper called [`clerkMiddleware()`](/docs/references/nextjs/clerk-middleware) that will hopefully alleviate all of the issues folks had with `authMiddleware()`. + +Additionally, there are now new helpers that enable controlling auth on a _per-page and/or per-layout basis_ when using App Router. While you can still configure which routes are protected via Middleware, the page-based protection strategy is what is now recommended, as the co-location of auth protection configuration with the code for the pages themselves results in a superior developer experience that adds clarity as you navigate your codebase. + +### Per-route auth config + +Sometimes, code speaks louder than words. Let's get right into an example: + + + +```ts filename="app/src/dashboard/layout.tsx" +import { auth } from '@clerk/nextjs/server' + +export default async function DashboardLayout({ children }) { + auth().protect(); + // 👆 This one line is all it takes - the layout and all its children + // will now redirect to your sign in page for un-authenticated users. + + return <>{children} + +} + +```` + + +```ts filename="app/src/dashboard/page.tsx" +import { auth } from '@clerk/nextjs/server' + +export default async function DashboardPage() { + auth().protect(); + // 👆 This one line is all it takes - the layout and all its children + // will now redirect to your sign in page for un-authenticated users. + + return

This page is now protected!

+} +```` + +
+
+ +In this example, we add `auth().protect()` to a layout, and like magic, that layout and all of it's children will be gated by auth. The same logic can be applied for pages. + +Want to get more specific with permission gating? Add the role you are gating as a param: + +```ts filename="app/src/admin/layout.tsx" +import { auth } from '@clerk/nextjs/server'; + +export default async function AdminLayout({ children }) { + auth().protect({ role: 'org:admin' }); + + return <>{children}; +} +``` + +Note that in order for this to work, you will still need Middleware to be present, but it only requires the most minimal configuration: + +```ts filename="middleware.ts" +import { clerkMiddleware } from '@clerk/nextjs/server'; + +export default clerkMiddleware(); + +export const config = { + matcher: ['/((?!.*\\..*|_next).*)', '/', '/(api|trpc)(.*)'], +}; +``` + +If you are using the pages router, per-route gating won't work. Instead, configure your auth gating via Middleware as described in the next section. + +### Middleware auth config + +If you prefer to define your auth logic within the Middleware, you can still do this using the new `clerkMiddleware`. The primary change from the previous `authMiddleware()` is that `clerkMiddleware()` does not protect any routes by default, instead requiring the developer to add routes they would like to be protected by auth. This is a substantial contrast to the previous `authMiddleware()`, which protected all routes by default, requiring the developer to add exceptions. The API was also substantially simplified, and it has become easier to combine with other Middleware helpers smoothly as well. + +Here's an example that replicates the auth protection scheme above, but entirely inside the Middleware: + +```ts filename="middleware.ts" +import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'; + +const isDashboardRoute = createRouteMatcher(['/dashboard(.*)']); +const isAdminRoute = createRouteMatcher(['/admin']); + +export default clerkMiddleware((auth, req) => { + // Restrict admin route to users with specific role + if (isAdminRoute(req)) auth().protect({ role: 'org:admin' }); + + // Restrict dashboard routes to logged in users + if (isDashboardRoute(req)) auth().protect(); +}); + +export const config = { + matcher: ['/((?!.*\\..*|_next).*)', '/', '/(api|trpc)(.*)'], +}; +``` + +A couple things to note here: + +- The `createRouteMatcher` helper makes it easy to define route groups that you can leverage inside the Middleware function and check in whichever order you'd like. Note that it can take an array of routes as well. +- With `clerkMiddleware`, you're defining the routes you want **to be protected**, rather than the routes you don't want to be protected. +- You are able to use the same `auth().protect()` helpers that you can use within layouts/pages here in the Middleware. + +### Migrating to `clerkMiddleware()` + +Clerk strongly recommends migrating to the new `clerkMiddleware()` for an improved DX and access to all present and upcoming features, but also want to note that `authMiddleware()`, while deprecated, will continue to work in v5 and will not be removed until the next major version, so you do not _need_ to make any changes to your Middleware setup this version. + +The most basic migration will be updating the import and changing out the default export. + +```diff +- import { authMiddleware } from "@clerk/nextjs" ++ import { clerkMiddleware } from '@clerk/nextjs/server' + +- export default authMiddleware() ++ export default clerkMiddleware() + + export const config = { + matcher: ["/((?!.*\\..*|_next).*)", "/", "/(api|trpc)(.*)"], + } +``` + +Of course, in most cases you'll have a more complicated setup than this. You can find some examples below for how to migrate a few common use cases. Be sure to review the [`clerkMiddleware()` documentation](/docs/references/nextjs/clerk-middleware) and [route protection guide](/docs/references/nextjs/route-protection) if your specific use case is not mentioned. + + + + By default, `clerkMiddleware()` treats all pages as public, so you no longer need to explcitly set `/` as public. + + Before: + + ```ts filename="middleware.ts" + import { authMiddleware } from "@clerk/nextjs" + + export default authMiddleware({ + publicRoutes: ["/"], + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + After: + + ```ts filename="middleware.ts" + import { + clerkMiddleware, + createRouteMatcher + } from "@clerk/nextjs/server" + + export default clerkMiddleware() + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + + + Having all routes public except everything under `/dashboard`. + + Before: + + ```ts filename="middleware.ts" + import { authMiddleware } from "@clerk/nextjs" + + export default authMiddleware({ + publicRoutes: (req) => !req.url.includes("/dashboard"), + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + After: + + ```ts filename="middleware.ts" + import { + clerkMiddleware, + createRouteMatcher + } from "@clerk/nextjs/server" + + const isDashboardRoute = createRouteMatcher(["/dashboard(.*)"]) + + export default clerkMiddleware((auth, request) => { + if (isDashboardRoute(request)) { + auth().protect() + } + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + + + You can call other Middlewares inside `clerkMiddleware()`, giving you more direct control over what is called where. An example would be [next-intl](https://next-intl-docs.vercel.app/) to add internationalization to your app. + + Before: + + ```ts filename="middleware.ts" + import { authMiddleware } from "@clerk/nextjs" + import createMiddleware from "next-intl/middleware" + + const intlMiddleware = createMiddleware({ + locales: ["en", "de"], + defaultLocale: "en", + }) + + export default authMiddleware({ + beforeAuth: (req) => { + return intlMiddleware(req); + }, + publicRoutes: ["((?!^/dashboard/).*)"], + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + After: + + ```ts filename="middleware.ts" + import { + clerkMiddleware, + createRouteMatcher + } from "@clerk/nextjs/server" + import createMiddleware from "next-intl/middleware" + + const intlMiddleware = createMiddleware({ + locales: ["en", "de"], + defaultLocale: "en", + }) + + const isDashboardRoute = createRouteMatcher(["/dashboard(.*)"]) + + export default clerkMiddleware((auth, request) => { + if (isDashboardRoute(request)) { + auth().protect() + } + + return intlMiddleware(request) + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + + + +## Changes to top-level exports + +As part of this release, some of the top-level exports of `@clerk/nextjs` have been changed in order to improve bundle size and tree-shaking efficiency. These changes have resulted in a ~75% reduction in build size for middleware bundles. However, you will likely need to make some changes to import paths as a result. + +Use the CLI tool, `npx @clerk/upgrade`, to automatically find occurences of old imports. + + + + Previously these exports have been exported both from `@clerk/nextjs` and `@clerk/nextjs/server`. As of v5 they are only exported from the latter. + + ```diff + import { + auth, + currentUser, + authMiddleware, + buildClerkProps, + verifyToken, + verifyJwt, + decodeJwt, + signJwt, + constants, + redirect, + createAuthenticateRequest, + createIsomorphicRequest, + - } from "@clerk/nextjs" + + } from "@clerk/nextjs/server" + ``` + + + + Exports related to errors are now under `@clerk/nextjs/errors`. + + ```diff + import { + isClerkAPIResponseError, + isEmailLinkError, + isKnownError, + isMetamaskError, + EmailLinkErrorCode, + - } from "@clerk/nextjs" + + } from "@clerk/nextjs/errors" + ``` + + + + The `@clerk/nextjs` import will work with both the app and pages router. + + ```diff + - import { } from "@clerk/nextjs/app-beta" + + import { } from "@clerk/nextjs" + ``` + + Some behavior may have changed between Clerk's beta and the stable release. Please check on your end if behavior stayed the same. + + + + The top-level exports support SSR by default now. + + ```diff + - import { } from "@clerk/nextjs/ssr" + + import { } from "@clerk/nextjs" + ``` + + + + ```diff + - import { } from "@clerk/nextjs/edge-middleware" + + import { } from "@clerk/nextjs" + ``` + + + ```diff + - import { } from "@clerk/nextjs/edge-middlewarefiles" + + import { } from "@clerk/nextjs" + ``` + + + The `@clerk/nextjs/api` subpath was removed completely. It re-exported helpers from `@clerk/clerk-sdk-node` and its types. If you relied on these, import from `@clerk/clerk-sdk-node` directly instead. + + ```diff + import type { + ClerkMiddleware, + ClerkMiddlewareOptions, + LooseAuthProp, + RequireAuthProp, + StrictAuthProp, + WithAuthProp + - } from "@clerk/nextjs/api" + + } from "@clerk/clerk-sdk-node" + + - import { requireAuth, withAuth } from "@clerk/nextjs/api" + + import { requireAuth, withAuth } from "@clerk/clerk-sdk-node" + ``` + + + + +## After sign up/in/out URL handling + +Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. + +As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. + +```diff +- ++ +``` + +### Removed: `orgs` claim on JWT + +In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. + +The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. + + + + ```typescript filename="Next.js" + import { getAuth } from "@clerk/nextjs/server" + const claims: JwtPayload = getAuth(request).sessionClaims + + import { getAuth } from "@clerk/ssr.server" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + + ```typescript filename="Fastify" + import { getAuth } from "@clerk/fastify" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + ```typescript filename="@clerk/backend" + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "" }) + const requestState = await clerkClient.authenticateRequest( + request, + { publishableKey: "" } + ) + const claims: JwtPayload = requestState.toAuth().sessionClaims + ``` + + + + ```typescript filename="@clerk/clerk-sdk-node" + import { clerkClient } from "@clerk/clerk-sdk-node" + + router.use((...args) => clerkClient.expressRequireAuth()(...args)) + router.get("/me", async (req, reply: Response) => { + return reply.json({ auth: req.auth }) + }) + ``` + + + + +If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. + +### Path routing is now the default + +On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. + +In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: + +- `` +- `` +- `` +- `` +- `` + +Here's how you'd use the components going forward: + +```jsx + + + + + +``` + +If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. + +```jsx + + +``` + +However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. + + +```env filename=".env.local" +NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in +NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up +``` + +```env filename=".env" +CLERK_SIGN_IN_URL=/sign-in +CLERK_SIGN_UP_URL=/sign-up +``` + + + +**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. + +```jsx +// Only works for Next.js / Remix when environment variables are set + + +``` + +### Image URL Name Consolidation + +There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: + +ExternalAccount.picture -> .imageUrl', + 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', + 'User.profileImageUrl -> .imageUrl', + ]} +> + + The `picture` property of any [`ExternalAcccount` + object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. + + + The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. + + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. + + +## Deprecation removals & housekeeping + +As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. + + + For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of + changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for + manually. + + +### Deprecation removals + +CLERK_API_KEY replaced by CLERK_SECRET_KEY", "CLERK_FRONTEND_API replaced by CLERK_PUBLISHABLE_KEY", "CLERK_JS_VERSION should be NEXT_PUBLIC_CLERK_JS_VERSION", "apiKey -> secretKey as param to authMiddleware", "frontendApi -> publishableKey as param to authMiddleware", "apiKey -> secretKey as param to createClerkClient", "frontendApi -> publishableKey as param to createClerkClient", "apiKey -> secretKey as param to getAuth", "frontendApi -> publishableKey as prop to ClerkProvider", "@clerk/nextjs/app-beta import removed", "@clerk/nextjs/ssr import removed", "@clerk/nextjs/edge-middleware import removed", "@clerk/nextjs/edge-middlewarefiles import removed", "API_URL constant removed", "API_VERSION constant removed", "CLERK_JS_URL constant removed", "CLERK_JS_VERSION constant removed", "DOMAIN constant removed", "IS_SATELLITE constant removed", "PROXY_URL constant removed", "PUBLISHABLE_KEY constant removed", "SECRET_KEY constant removed", "SIGN_IN_URL constant removed", "SIGN_UP_URL constant removed", "@clerk/nextjs/api import removed", "MultiSessionAppSupport import moved under /internal", "NEXT_PUBLIC_CLERK_JS should be NEXT_PUBLIC_CLERK_JS_URL"]}> + + The `CLERK_API_KEY` environment variable was renamed to `CLERK_SECRET_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). + + + The `CLERK_FRONTEND_API` environment variable was renamed to `CLERK_PUBLISHABLE_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). **Note:** The values are different, so this is not just a key replacement. [More information](/docs/deployments/overview#api-keys-and-environment-variables). + + + If you are using `CLERK_JS_VERSION` as an environment variable, it should be changed to `NEXT_PUBLIC_CLERK_JS_VERSION` instead. + + This change brings our SDK up to date with the latest standards for next.js - that public environment variables should have the `NEXT_PUBLIC_` prefix. This env variable is not private, so it should get the public prefix. + + + The `apiKey` argument passed to `authMiddleware` must be changed to `secretKey`. + + ```diff + import { authMiddleware } from '@clerk/nextjs'; + + - authMiddleware({ apiKey: '...' }); + + authMiddleware({ secretKey: '...' }); + ``` + + + The `frontendApi` argument passed to `authMiddleware` must be changed to `publishableKey` + + ```diff + import { authMiddleware } from "@clerk/nextjs/server" + + - authMiddleware({ frontendApi: '...' }) + + authMiddleware({ publishableKey: '...' }) + ``` + + + The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. + + ```diff + import { createClerkClient } from '@clerk/nextjs/server'; + + - createClerkClient({ apiKey: '...' }); + + createClerkClient({ secretKey: '...' }); + ``` + + + The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. + + ```diff + import { createClerkClient } from '@clerk/nextjs/server'; + + - createClerkClient({ frontendApi: '...' }); + + createClerkClient({ publishableKey: '...' }); + ``` + + + The `apiKey` argument passed to `getAuth` must be changed to `secretKey`. + + ```diff + - getAuth({ apiKey: '...' }) + + getAuth({ secretKey: '...' }) + ``` + + + The `frontendApi` prop passed to `` was renamed to `publishableKey`. **Note:** The values are different, so this is not just a key replacement. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). [More information](/docs/deployments/overview#api-keys-and-environment-variables). + + + If you are using the `@clerk/nextjs/app-beta` import anywhere, it should use `@clerk/nextjs` instead. The `app-beta` import has been removed as our approuter support is stable, if there are any places you’re using it you can remove. + + Make this change carefully as some behavior may have changed between our beta and stable releases. You can refer to [our documentation](https://clerk.com/docs/quickstarts/nextjs) and/or [approuter example](https://github.com/clerk/clerk-nextjs-app-quickstart) for up-to-date usage. + + The `@clerk/nextjs` import will work with both App Router and Pages Router. + + + If you are importing from `@clerk/nextjs/ssr`, you can use `@clerk/nextjs` instead. Our top-level import supports SSR functionality by default now, so the subpath on the import is no longer needed. This import can be directly replaced without any other considerations. + + + This deprecated import has been replaced by `@clerk/nextjs`. Usage should now look as such: `import { authMiddleware } from @clerk/nextjs`. There may be changes in functionality between the two exports depending on how old the version used is, so upgrade with caution. + + + This deprecated import has been replaced by `@clerk/nextjs`. Usage should now look as such: `import { authMiddleware } from @clerk/nextjs`. There may be changes in functionality between the two exports depending on how old the version used is, so upgrade with caution. + + + This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `CLERK_API_URL` environment variable. + + + This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `CLERK_API_VERSION` environment variable. + + + This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_JS` environment variable. + + + This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_JS_VERSION` environment variable. + + + This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_DOMAIN` environment variable. + + + This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_IS_SATELLITE` environment variable. + + + This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_PROXY_URL` environment variable. + + + This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` environment variable. + + + This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `CLERK_SECRET_KEY` environment variable. + + + This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_SIGN_IN_URL` environment variable. + + + This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_SIGN_UP_URL` environment variable. + + + The import subpath `@clerk/nextjs/api` has been removed. This includes the following imports: + + ```js + // These have been removed + import { + ClerkMiddleware, + ClerkMiddlewareOptions, + LooseAuthProp, + RequireAuthProp, + StrictAuthProp, + WithAuthProp, + } from '@clerk/nextjs/api'; + ``` + + If you still need to use any of these functions, they can be instead imported from `@clerk/clerk-sdk-node`. + + + The `MultiSessionAppSupport` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/internal`. You must update your import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside the scope of semver. Example below of the fix that needs to be made: + + ```diff + - import { MultiSessionAppSupport } from "@clerk/nextjs" + + import { MultiSessionAppSupport } from "@clerk/nextjs/internal" + ``` + + + If you are using `NEXT_PUBLIC_CLERK_JS` as an environment variable, it should be changed to `NEXT_PUBLIC_CLERK_JS_URL` instead. This variable was renamed for consistency across public APIs. Make sure to also check your production host configuration when changing environment variable values. + + + +### Other Breaking Changes + +API_URL value has changed", "isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "isMetamaskError import moved under /errors", "WithSession component removed", "WithClerk component removed", "WithUser component removed", "withClerk function removed", "withSession function removed", "withUser function removed", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.getOrganizationList() return type changed", "User.getOrganizationMembershipList() return type changed", "Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed", "Organization.logoUrl -> Organization.imageUrl"]}> + + The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: + + ```diff + - await setSession('sessionID', () => void) + + await setActive({ session: 'sessionID', beforeEmit: () => void }) + + - await setSession(sessionObj) + + await setActive({ session: sessionObj }) + + - await setSession(sessionObj, () => void) + + await setActive({ session: sessionObj, beforeEmit: () => void }) + ``` + + `setActive` also supports setting an active organization: + + ```js + await setActive({ + session: 'sessionID', + organization: 'orgID', + beforeEmit: () => void + }) + + await setActive({ + session: sessionObj, + organization: orgObj, + beforeEmit: () => void + }) + ``` + + + The `isMetamaskError` import path has changed from `@clerk/react` to `@clerk/react/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + + ```diff + - import { isMetamaskError } from "@clerk/react" + + import { isMetamaskError } from "@clerk/react/errors" + ``` + + + The `WithSession` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + export const WithSession = ({ children }) => { + const session = useSession(); + if (typeof children !== 'function') throw new Error(); + + return {children(session)}; + }; + ``` + + + The `WithClerk` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + export const WithClerk = ({ children }) => { + const clerk = useClerk(); + if (typeof children !== 'function') throw new Error(); + + return {children(clerk)}; + }; + ``` + + + The `WithUser` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + export const WithUser = ({ children }) => { + const user = useUser(); + if (typeof children !== 'function') throw new Error(); + + return {children(user)}; + }; + ``` + + + The `withClerk` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + function withClerk(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const clerk = useIsomorphicClerkContext(); + + if (!clerk.loaded) return null; + + return ( + + ); + }; + + HOC.displayName = `withClerk(${displayName})`; + return HOC; + } + ``` + + + The `withSession` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + function withSession(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const session = useSessionContext(); + + if (!session) return null; + + return ( + + ); + }; + + HOC.displayName = `withSession(${displayName})`; + return HOC; + } + ``` + + + The `withUser` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + function withUser(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const clerk = useUserContext(); + + if (!user) return null; + + return ( + + ); + }; + + HOC.displayName = `withUser(${displayName})`; + return HOC; + } + ``` + + + The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: + + ```diff + import { SignOutButton } from "@clerk/clerk-react"; + + export const Signout = () => { + return ( + { window.location.href = "/your-path" }} + + redirectUrl="/your-path" + > + + + ) + } + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { organization } = useOrganization() + const orgList = organization.getOrganizationList() + + - orgList.forEach(() => {}) + + orgList.data.forEach(() => {}) + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { user } = useUser() + const membershipList = user.getOrganizationMembershipList() + + - membershipList.forEach(() => {}) + + membershipList.data.forEach(() => {}) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getRoles({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getDomains({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMembershipRequests({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationSuggestions({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + The `logoUrl` property of any [`Organization` object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to `imageUrl`. + + diff --git a/packages/upgrade/source/util/v5-nextjs-guide/import-changes.mdx b/packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx similarity index 84% rename from packages/upgrade/source/util/v5-nextjs-guide/import-changes.mdx rename to packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx index 5ca178e5c59..a5f496e68c6 100644 --- a/packages/upgrade/source/util/v5-nextjs-guide/import-changes.mdx +++ b/packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx @@ -1,10 +1,8 @@ -## Changes to top level exports +## Changes to top-level exports -As part of this release, we changed some of the top-level exports of `@clerk/nextjs` in order to improve bundle size and tree-shaking efficiency. These changes have resulted in a ~75% reduction in build size for middleware bundles. However, you will likely need to make some changes to import paths as a result. +As part of this release, some of the top-level exports of `@clerk/nextjs` have been changed in order to improve bundle size and tree-shaking efficiency. These changes have resulted in a ~75% reduction in build size for middleware bundles. However, you will likely need to make some changes to import paths as a result. - - We recommend using our CLI tool, `npx @clerk/upgrade`, to automatically find occurences of old imports. - +Use the CLI tool, `npx @clerk/upgrade`, to automatically find occurences of old imports. diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/index.js b/packages/upgrade/source/guide-generators/v5/nextjs/index.js new file mode 100644 index 00000000000..40905668bc8 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/nextjs/index.js @@ -0,0 +1,47 @@ +import { + accordionForCategory, + assembleContent, + deprecationRemovalsAndHousekeeping, + frontmatter, + loadVersionChangeData, + markdown, + markdownTemplate, + writeToFile, +} from '../../text-generation.js'; + +const version = 'v5'; +const name = 'nextjs'; +const properName = 'Next.js'; +const packageName = '@clerk/nextjs'; +const cwd = 'v5/nextjs'; + +async function generate() { + const data = loadVersionChangeData(version, name); + + return assembleContent({ data, cwd }, [ + frontmatter({ + title: `Upgrading ${properName} from v4 to v5`, + description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + }), + `# Upgrading \`${packageName}\` from v4 to v5`, + markdown('intro'), + markdown('prepare'), + markdown('node-version'), + markdown('react-version'), + markdown('nextjs-version'), + markdownTemplate('update-v5', { packageName }), + markdown('cli'), + '## Breaking Changes', + markdown('redesign-preview'), + markdown('middleware-changes'), + markdown('import-changes'), + markdown('after-sign-x-handling'), + markdown('orgs-claim'), + markdown('path-routing'), + markdown('image-url'), + accordionForCategory('image-url', {}), + deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/intro.mdx b/packages/upgrade/source/guide-generators/v5/nextjs/intro.mdx new file mode 100644 index 00000000000..5f837394976 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/nextjs/intro.mdx @@ -0,0 +1,3 @@ +Version 5 of the Next.js SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, a substantially improved middleware import, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Next.js project to use `@clerk/nextjs` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/util/v5-nextjs-guide/middleware-changes.mdx b/packages/upgrade/source/guide-generators/v5/nextjs/middleware-changes.mdx similarity index 77% rename from packages/upgrade/source/util/v5-nextjs-guide/middleware-changes.mdx rename to packages/upgrade/source/guide-generators/v5/nextjs/middleware-changes.mdx index dca3ed26120..e4457a30a21 100644 --- a/packages/upgrade/source/util/v5-nextjs-guide/middleware-changes.mdx +++ b/packages/upgrade/source/guide-generators/v5/nextjs/middleware-changes.mdx @@ -1,8 +1,8 @@ -## New middleware architecture +## New Middleware architecture -User and customer feedback about `authMiddleware()` has been clear in that middleware logic was a often friction point. As such, in v5 you will find a completely new middleware helper called [`clerkMiddleware()`](/docs/references/nextjs/clerk-middleware) that will hopefully alleviate all of the issues folks had with `authMiddleware()`. +User and customer feedback about `authMiddleware()` has been clear in that Middleware logic was a often friction point. As such, in v5 you will find a completely new Middleware helper called [`clerkMiddleware()`](/docs/references/nextjs/clerk-middleware) that will hopefully alleviate all of the issues folks had with `authMiddleware()`. -Additionally, there are now new helpers that enable controlling auth on a _per-page and/or per-layout basis_ when using app router. While you can still configure which routes are protected via middleware, the page-based protection strategy is what is now recommended, as the co-location of auth protection configuration with the code for the pages themselves results in a superior developer experience that adds clarity as you navigate your codebase. +Additionally, there are now new helpers that enable controlling auth on a _per-page and/or per-layout basis_ when using App Router. While you can still configure which routes are protected via Middleware, the page-based protection strategy is what is now recommended, as the co-location of auth protection configuration with the code for the pages themselves results in a superior developer experience that adds clarity as you navigate your codebase. ### Per-route auth config @@ -42,7 +42,7 @@ export default async function DashboardPage() { In this example, we add `auth().protect()` to a layout, and like magic, that layout and all of it's children will be gated by auth. The same logic can be applied for pages. -Want to get more specific with permission gating? Just add the role you are gating as a param: +Want to get more specific with permission gating? Add the role you are gating as a param: ```ts filename="app/src/admin/layout.tsx" import { auth } from '@clerk/nextjs/server'; @@ -54,7 +54,7 @@ export default async function AdminLayout({ children }) { } ``` -Note that in order for this to work, you will still need middleware to be present, but it only requires the most minimal configuration: +Note that in order for this to work, you will still need Middleware to be present, but it only requires the most minimal configuration: ```ts filename="middleware.ts" import { clerkMiddleware } from '@clerk/nextjs/server'; @@ -66,13 +66,13 @@ export const config = { }; ``` -If you are using the pages router, we instead recommend middleware auth config as seen below. +If you are using the pages router, per-route gating won't work. Instead, configure your auth gating via Middleware as described in the next section. ### Middleware auth config -If you'd still prefer to define your auth logic within the middleware, we support this fully as well, and have put a lot of work into improving the ergonomics as well. The primary change was to make `clerkMiddleware()` not protect any routes by default, instead requiring the developer to add routes they would like to be protected by auth. This is a substantial contrast to the previous `authMiddleware()`, which protected all routes by default, requiring the developer to add exceptions. We have also made efforts to substantially simplify the API and make it easier to combine with other middleware helpers smoothly. +If you prefer to define your auth logic within the Middleware, you can still do this using the new `clerkMiddleware`. The primary change from the previous `authMiddleware()` is that `clerkMiddleware()` does not protect any routes by default, instead requiring the developer to add routes they would like to be protected by auth. This is a substantial contrast to the previous `authMiddleware()`, which protected all routes by default, requiring the developer to add exceptions. The API was also substantially simplified, and it has become easier to combine with other Middleware helpers smoothly as well. -Here's an example that replicates the auth protection scheme above, but entirely inside the middleware: +Here's an example that replicates the auth protection scheme above, but entirely inside the Middleware: ```ts filename="middleware.ts" import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'; @@ -95,13 +95,13 @@ export const config = { A couple things to note here: -- The `createRouteMatcher` helper makes it easy to define route groups that you can leverage inside the middleware function and check in whichever order you'd like. Note that it can take an array of routes as well. -- With `clerkMiddleware`, we are defining the routes we want **to be protected**, rather than the routes we don't want to be protected. -- We are able to use the same `auth().protect()` helpers that we can use within layouts/pages here in the middleware. +- The `createRouteMatcher` helper makes it easy to define route groups that you can leverage inside the Middleware function and check in whichever order you'd like. Note that it can take an array of routes as well. +- With `clerkMiddleware`, you're defining the routes you want **to be protected**, rather than the routes you don't want to be protected. +- You are able to use the same `auth().protect()` helpers that you can use within layouts/pages here in the Middleware. ### Migrating to `clerkMiddleware()` -We strongly recommend migrating to the new `clerkMiddleware()` for an improved DX and access to all present and upcoming features, but also want to note that `authMiddleware()`, while deprecated, will continue to work in v5 and will not be removed until the next major version, so you do not _need_ to make any changes to your middleware setup this version. +Clerk strongly recommends migrating to the new `clerkMiddleware()` for an improved DX and access to all present and upcoming features, but also want to note that `authMiddleware()`, while deprecated, will continue to work in v5 and will not be removed until the next major version, so you do not _need_ to make any changes to your Middleware setup this version. The most basic migration will be updating the import and changing out the default export. @@ -119,7 +119,7 @@ The most basic migration will be updating the import and changing out the defaul Of course, in most cases you'll have a more complicated setup than this. You can find some examples below for how to migrate a few common use cases. Be sure to review the [`clerkMiddleware()` documentation](/docs/references/nextjs/clerk-middleware) and [route protection guide](/docs/references/nextjs/route-protection) if your specific use case is not mentioned. - + By default, `clerkMiddleware()` treats all pages as public, so you no longer need to explcitly set `/` as public. @@ -193,7 +193,7 @@ Of course, in most cases you'll have a more complicated setup than this. You can - You can call other middlewares inside `clerkMiddleware()`, giving you more direct control over what is called where. An example would be [next-intl](https://next-intl-docs.vercel.app/) to add internationalization to your app. + You can call other Middlewares inside `clerkMiddleware()`, giving you more direct control over what is called where. An example would be [next-intl](https://next-intl-docs.vercel.app/) to add internationalization to your app. Before: diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/nextjs-version.mdx b/packages/upgrade/source/guide-generators/v5/nextjs/nextjs-version.mdx new file mode 100644 index 00000000000..fd543e128b3 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/nextjs/nextjs-version.mdx @@ -0,0 +1,6 @@ +**Updating Next.js** + +`@clerk/nextjs` now requires you to use Next.js version `13.0.4` or later. Check out Next's upgrade guides for more guidance if you have not yet upgraded to Next.js 13: + +- [Upgrading from 12 to 13](https://nextjs.org/docs/pages/building-your-application/upgrading/version-13) +- [Upgrading from 13 to 14](https://nextjs.org/docs/app/building-your-application/upgrading/version-14) diff --git a/packages/upgrade/source/guide-generators/v5/node/__output.mdx b/packages/upgrade/source/guide-generators/v5/node/__output.mdx new file mode 100644 index 00000000000..d7a54b41303 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/node/__output.mdx @@ -0,0 +1,345 @@ +--- +title: 'Upgrading Node from v4 to v5' +description: "Learn how to upgrade Clerk's Node SDK from v4 to v5." +--- + +# Upgrading `@clerk/clerk-sdk-node` from v4 to v5 + +Version 5 of the Node SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Node project to use `@clerk/clerk-sdk-node` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. + +## Preparing to upgrade + +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. + +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. + +Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. + +**Updating Node.js** + +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). + +## Updating to v5 + +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: + + + ```bash filename="terminal" + npm install @clerk/clerk-sdk-node@beta + ``` + + ```bash filename="terminal" + yarn add @clerk/clerk-sdk-node@beta + ``` + + ```bash filename="terminal" + pnpm add @clerk/clerk-sdk-node@beta + ``` + + + +## CLI Upgrade Helper + +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. + +To run the CLI tool, navigate to your project and run it in the terminal: + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + + +If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. + +## Breaking Changes + +### `cjs/instance` and `esm/instance` imports no longer needed + +If you are using either of these import paths, they are no longer necessary and you can import directly from the top level `@clerk/express` path. + +```diff +- import { ... } from "@clerk/clerk-sdk-node/esm/instance"; +- import { ... } from "@clerk/clerk-sdk-node/cjs/instance"; ++ import { ... } from "@clerk/clerk-sdk-node"; +``` + +### Clerk client setters removed in favor of `createClerkClient` options + +The following setter methods have been removed in the lastest version. If you were using any of these functions, their functionality can be replaced by instead passing the correponding option to `createClerkClient`. + +- `setClerkApiVersion` +- `setClerkHttpOptions` +- `setClerkServerApiUrl` +- `setClerkApiKey` + +Code example: + +```diff + import { + clerkClient, +- setClerkApiKey, +- setClerkApiVersion, +- setClerkHttpOptions, +- setClerkServerApiUrl +} from "@clerk/clerk-sdk-node" + +- setClerkApiKey("...") +- setClerkApiVersion("...") +- setClerkHttpOptions("...") +- setClerkServerApiUrl("...") + + const clerkClient = createClerkClient({ ++ secretKey: "..." ++ apiVersion: "..." ++ httpOptions: "..." ++ serverApiUrl: "..." + }) + + await clerkClient.users.getUser(userId); +``` + +### Removed: `orgs` claim on JWT + +In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. + +The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. + + + + ```typescript filename="Next.js" + import { getAuth } from "@clerk/nextjs/server" + const claims: JwtPayload = getAuth(request).sessionClaims + + import { getAuth } from "@clerk/ssr.server" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + + ```typescript filename="Fastify" + import { getAuth } from "@clerk/fastify" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + ```typescript filename="@clerk/backend" + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "" }) + const requestState = await clerkClient.authenticateRequest( + request, + { publishableKey: "" } + ) + const claims: JwtPayload = requestState.toAuth().sessionClaims + ``` + + + + ```typescript filename="@clerk/clerk-sdk-node" + import { clerkClient } from "@clerk/clerk-sdk-node" + + router.use((...args) => clerkClient.expressRequireAuth()(...args)) + router.get("/me", async (req, reply: Response) => { + return reply.json({ auth: req.auth }) + }) + ``` + + + + +If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. + +### Image URL Name Consolidation + +There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: + +ExternalAccount.picture -> .imageUrl', + 'Organization.logoUrl -> .imageUrl', + 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', + 'Organization.logoUrl -> .imageUrl', + ]} +> + + The `picture` property of any [`ExternalAcccount` + object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. + + The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. + + The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. + + The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. + + +## Deprecation removals & housekeeping + +As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. + + + For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of + changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for + manually. + + +### Deprecation removals + +CLERK_API_KEY replaced by CLERK_SECRET_KEY", "CLERK_FRONTEND_API replaced by CLERK_PUBLISHABLE_KEY", "apiKey -> secretKey as param to ClerkExpressRequireAuth", "apiKey -> secretKey as param to ClerkExpressWithAuth", "apiKey -> secretKey as param to createClerkClient", "apiKey -> secretKey as param to createClerkExpressRequireAuth", "apiKey -> secretKey as param to createClerkExpressWithAuth", "frontendApi -> publishableKey as param to createClerkClient", "frontendApi -> publishableKey as param to createClerkExpressRequireAuth", "frontendApi -> publishableKey as param to ClerkExpressRequireAuth", "frontendApi -> publishableKey as param to createClerkExpressWithAuth", "frontendApi -> publishableKey as param to ClerkExpressWithAuth"]}> + + The `CLERK_API_KEY` environment variable was renamed to `CLERK_SECRET_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). + + + The `CLERK_FRONTEND_API` environment variable was renamed to `CLERK_PUBLISHABLE_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). **Note:** The values are different, so this is not just a key replacement. [More information](/docs/deployments/overview#api-keys-and-environment-variables). + + + The `apiKey` argument passed to `ClerkExpressRequireAuth` must be changed to `secretKey`. + + ```diff + import { ClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; + + - ClerkExpressRequireAuth({ apiKey: '...' }); + + ClerkExpressRequireAuth({ secretKey: '...' }); + ``` + + + The `apiKey` argument passed to `ClerkExpressWithAuth` must be changed to `secretKey`. + + ```diff + import { ClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; + + - ClerkExpressWithAuth({ apiKey: '...' }); + + ClerkExpressWithAuth({ secretKey: '...' }); + ``` + + + The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. + + ```diff + import { createClerkClient } from '@clerk/clerk-sdk-node'; + + - createClerkClient({ apiKey: '...' }); + + createClerkClient({ secretKey: '...' }); + ``` + + + The `apiKey` argument passed to `createClerkExpressRequireAuth` must be changed to `secretKey`. + + ```diff + import { createClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; + + - createClerkExpressRequireAuth({ apiKey: '...' }); + + createClerkExpressRequireAuth({ secretKey: '...' }); + ``` + + + The `apiKey` argument passed to `createClerkExpressWithAuth` must be changed to `secretKey`. + + ```diff + import { createClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; + + - createClerkExpressWithAuth({ apiKey: '...' }); + + createClerkExpressWithAuth({ secretKey: '...' }); + ``` + + + The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. + + ```diff + import { createClerkClient } from '@clerk/clerk-sdk-node'; + + - createClerkClient({ frontendApi: '...' }); + + createClerkClient({ publishableKey: '...' }); + ``` + + + The `frontendApi` argument passed to `createClerkExpressRequireAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. + + ```diff + import { createClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; + + - createClerkExpressRequireAuth({ frontendApi: '...' }); + + createClerkExpressRequireAuth({ publishableKey: '...' }); + ``` + + + The `frontendApi` argument passed to `ClerkExpressRequireAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. + + ```diff + import { ClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; + + - ClerkExpressRequireAuth({ frontendApi: '...' }); + + ClerkExpressRequireAuth({ publishableKey: '...' }); + ``` + + + The `frontendApi` argument passed to `createClerkExpressWithAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. + + ```diff + import { createClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; + + - createClerkExpressWithAuth({ frontendApi: '...' }); + + createClerkExpressWithAuth({ publishableKey: '...' }); + ``` + + + The `frontendApi` argument passed to `ClerkExpressWithAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. + + ```diff + import { ClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; + + - ClerkExpressWithAuth({ frontendApi: '...' }); + + ClerkExpressWithAuth({ publishableKey: '...' }); + ``` + + + +### Other Breaking Changes + +API_URL value has changed", "LegacyAuthObject type -> AuthObject", "Clerk -> { createClerkClient }"]}> + + The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. + + + We changed the values that our middleware adds to the `request` object after running. Previously it returned a `LegacyAuthObject` type, and now it returns an `AuthObject` type, the difference between the two types is as such: + + ```diff + - type LegacyAuthObject = { + + type AuthObject = { + sessionId: string | null; + actor: ActClaim | undefined | null; + userId: string | null; + getToken: ServerGetToken | null; + debug: AuthObjectDebug | null; + - claims: JwtPayload | null; + + sessionClaims: JwtPayload | null; + + orgId: string | undefined | null; + + orgRole: OrganizationCustomRoleKey | undefined | null; + + orgSlug: string | undefined | null; + + orgPermissions: OrganizationCustomPermissionKey[] | undefined | null; + + has: CheckAuthorizationWithCustomPermissions | null; + } + ``` + + If you were using the `claims` key on the request after running middleware, you will need to instead use `sessionClaims`. Additionally, if you were using the `LooseAuthProp` or `StrictAuthProp` exported types anywhere, note that these have been adjusted to fit the shape of the new middleware response typing. + + + The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + + ```diff + - import Clerk from "@clerk/clerk-sdk-node" + + import { createClerkClient } from "@clerk/clerk-sdk-node" + ``` + + diff --git a/packages/upgrade/source/guide-generators/v5/node/index.js b/packages/upgrade/source/guide-generators/v5/node/index.js new file mode 100644 index 00000000000..4cd826fa7b8 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/node/index.js @@ -0,0 +1,43 @@ +import { + accordionForCategory, + assembleContent, + deprecationRemovalsAndHousekeeping, + frontmatter, + loadVersionChangeData, + markdown, + markdownTemplate, + singleItem, + writeToFile, +} from '../../text-generation.js'; + +const version = 'v5'; +const name = 'node'; +const properName = 'Node'; +const packageName = '@clerk/clerk-sdk-node'; +const cwd = `${version}/${name}`; + +async function generate() { + const data = loadVersionChangeData(version, name); + + return assembleContent({ data, cwd }, [ + frontmatter({ + title: `Upgrading ${properName} from v4 to v5`, + description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + }), + `# Upgrading \`${packageName}\` from v4 to v5`, + markdown('intro'), + markdown('prepare'), + markdown('node-version'), + markdownTemplate('update-v5', { packageName }), + markdown('cli'), + '## Breaking Changes', + singleItem('cjs-esm-instance'), + markdown('node-setters-removals'), + markdown('orgs-claim'), + markdown('image-url'), + accordionForCategory('image-url', {}), + deprecationRemovalsAndHousekeeping(), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/guide-generators/v5/node/intro.mdx b/packages/upgrade/source/guide-generators/v5/node/intro.mdx new file mode 100644 index 00000000000..25261a140a9 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/node/intro.mdx @@ -0,0 +1,3 @@ +Version 5 of the Node SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Node project to use `@clerk/clerk-sdk-node` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/node/node-setters-removals.mdx b/packages/upgrade/source/guide-generators/v5/node/node-setters-removals.mdx new file mode 100644 index 00000000000..b5d9d4f1a64 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/node/node-setters-removals.mdx @@ -0,0 +1,34 @@ +### Clerk client setters removed in favor of `createClerkClient` options + +The following setter methods have been removed in the lastest version. If you were using any of these functions, their functionality can be replaced by instead passing the correponding option to `createClerkClient`. + +- `setClerkApiVersion` +- `setClerkHttpOptions` +- `setClerkServerApiUrl` +- `setClerkApiKey` + +Code example: + +```diff + import { + clerkClient, +- setClerkApiKey, +- setClerkApiVersion, +- setClerkHttpOptions, +- setClerkServerApiUrl +} from "@clerk/clerk-sdk-node" + +- setClerkApiKey("...") +- setClerkApiVersion("...") +- setClerkHttpOptions("...") +- setClerkServerApiUrl("...") + + const clerkClient = createClerkClient({ ++ secretKey: "..." ++ apiVersion: "..." ++ httpOptions: "..." ++ serverApiUrl: "..." + }) + + await clerkClient.users.getUser(userId); +``` diff --git a/packages/upgrade/source/guide-generators/v5/overview/intro.mdx b/packages/upgrade/source/guide-generators/v5/overview/intro.mdx new file mode 100644 index 00000000000..e8c0910f37f --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/overview/intro.mdx @@ -0,0 +1,18 @@ +# Upgrading from v4 to v5 + +Clerk's SDKs include React, Next.js, Remix, Expo, Redwood, and others. This guide helps you with uprading to the next major version of your SDK. + +Version 5 ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a new middleware for Next.js which defaults to not protecting any routes. Along with these highly requested features some smaller DX improvements and housekeeping items made its way into the release. If you want to know everything that's new, read the [v5 announcement post](https://clerk.com/changelog/2024-01-16). + + + Version 5/v5 refers to the [`@clerk/clerk-js`](https://www.npmjs.com/package/@clerk/clerk-js) package version. + However, other SDKs like `@clerk/backend` or `@clerk/clerk-expo` are versioned independently (and would upgrade from + v1 to v2). To make this page easier to read for instances of general advice only v5 is mentioned. You can think of v4 + as the previous major of your SDK and v5 as the current in those cases. + + +If you're curious about Clerk's approach to versioning and support, head to the [long term support](/docs/upgrade-guides/long-term-support) document. Version 5 includes [potentially breaking changes](#breaking-changes), as well as the removal of [previously deprecated features](#previously-deprecated-features). + +For most users we expect a smooth upgrade path as only a couple of changes will be required: [Update dependencies](#update-dependencies), run the `@clerk/upgrade` CLI, [update Clerk](#update-clerk), and handle any [breaking changes](#breaking-changes). + +If you're using **Next.js**, you can read a more streamlined [Upgrading Next.js from v4 to v5](/docs/upgrade-guides/upgrading-nextjs-from-v4-to-v5) guide. diff --git a/packages/upgrade/source/guide-generators/v5/overview/per-sdk.mdx b/packages/upgrade/source/guide-generators/v5/overview/per-sdk.mdx new file mode 100644 index 00000000000..b9975ffae04 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/overview/per-sdk.mdx @@ -0,0 +1,16 @@ +## SDK Guides + +Select the SDK(s) you are using for your project from the list below to read through a summary of all the breaking changes: + +> Note: I want a prettier selection component here, in it's absence for now there's a list + +- [Next.js](upgrading-nextjs-from-v4-to-v5) +- [Remix](#remix) +- [Expo](#expo) +- [Gatsby](#gatsby) +- [Backend](#backend) +- [Node](#node) +- [Fastify](#fastify) +- [React](#react) +- [JS](#js) +- [Chrome Extension](#chrome-extension) diff --git a/packages/upgrade/source/guide-generators/v5/react/__output.mdx b/packages/upgrade/source/guide-generators/v5/react/__output.mdx new file mode 100644 index 00000000000..330530a38e2 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/react/__output.mdx @@ -0,0 +1,652 @@ +--- +title: 'Upgrading React from v4 to v5' +description: "Learn how to upgrade Clerk's React SDK from v4 to v5." +--- + +# Upgrading `@clerk/clerk-react` from v4 to v5 + +Version 5 of the React SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your React project to use `@clerk/clerk-react` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. + +## Preparing to upgrade + +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. + +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. + +Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. + +**Updating Node.js** + +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). + +**Updating React** + +All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. + + + ```bash filename="terminal" + npm install react@latest react-dom@latest + ``` + + ```bash filename="terminal" + yarn add react@latest react-dom@latest + ``` + + ```bash filename="terminal" + pnpm add react@latest react-dom@latest + ``` + + + +If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. + +## Updating to v5 + +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: + + + ```bash filename="terminal" + npm install @clerk/clerk-react@beta + ``` + + ```bash filename="terminal" + yarn add @clerk/clerk-react@beta + ``` + + ```bash filename="terminal" + pnpm add @clerk/clerk-react@beta + ``` + + + +## CLI Upgrade Helper + +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. + +To run the CLI tool, navigate to your project and run it in the terminal: + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + + +If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. + +## Breaking Changes + +### Component design adjustments + +The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. + +[More detail on these changes »](/components-redesigned) + +## After sign up/in/out URL handling + +Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. + +As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. + +```diff +- ++ +``` + +### `navigate` prop to `ClerkProvider` replaced by `routerPush` and `routerReplace` + +The `navigate` prop on ClerkProvider allowed developers to override the default navigation behavior with a custom function. However, navigate was only able to push, not replace routes. We have now added the capability for the router to push or replace, and as such, upgraded the provider prop so that it can handle either depending on the circumstance. + +Two new props have been added to `ClerkProvider` that replace the single `navigate` prop, and can be used to override the default navigation behavior for either a push or replace navigation. For more information on what push and replace mean in relation to the browser history api, [check out these wonderful MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/History_API/Working_with_the_History_API). + +If you’d like to keep the same behavior as you had with the single `navigate` prop, pass the exact same function to both `routerPush` and `routerReplace` and the behavior will be identical. For example: + +```diff +- x } /> ++ x } routerReplace={ x => x } /> +``` + +However, you now have the option to differentiate behavior based on whether the navigation will be a push or replace. + +### Removed: `orgs` claim on JWT + +In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. + +The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. + + + + ```typescript filename="Next.js" + import { getAuth } from "@clerk/nextjs/server" + const claims: JwtPayload = getAuth(request).sessionClaims + + import { getAuth } from "@clerk/ssr.server" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + + ```typescript filename="Fastify" + import { getAuth } from "@clerk/fastify" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + ```typescript filename="@clerk/backend" + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "" }) + const requestState = await clerkClient.authenticateRequest( + request, + { publishableKey: "" } + ) + const claims: JwtPayload = requestState.toAuth().sessionClaims + ``` + + + + ```typescript filename="@clerk/clerk-sdk-node" + import { clerkClient } from "@clerk/clerk-sdk-node" + + router.use((...args) => clerkClient.expressRequireAuth()(...args)) + router.get("/me", async (req, reply: Response) => { + return reply.json({ auth: req.auth }) + }) + ``` + + + + +If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. + +### Path routing is now the default + +On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. + +In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: + +- `` +- `` +- `` +- `` +- `` + +Here's how you'd use the components going forward: + +```jsx + + + + + +``` + +If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. + +```jsx + + +``` + +However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. + + +```env filename=".env.local" +NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in +NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up +``` + +```env filename=".env" +CLERK_SIGN_IN_URL=/sign-in +CLERK_SIGN_UP_URL=/sign-up +``` + + + +**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. + +```jsx +// Only works for Next.js / Remix when environment variables are set + + +``` + +### Image URL Name Consolidation + +There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: + +ExternalAccount.picture -> .imageUrl', + 'Organization.logoUrl -> .imageUrl', + 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', + 'Organization.logoUrl -> .imageUrl', + ]} +> + + The `picture` property of any [`ExternalAcccount` + object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. + + The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. + + The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. + + The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. + + +## Deprecation removals & housekeeping + +As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. + + + For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of + changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for + manually. + + +### Deprecation removals + +frontendApi -> publishableKey as prop to ClerkProvider", "afterSwitchOrganizationUrl -> afterSelectOrganizationUrl in OrganizationSwitcher", "ClerkProviderOptionsWrapper type removed"]}> + + The `frontendApi` prop passed to `` was renamed to `publishableKey`. **Note:** The values are different, so this is not just a key replacement. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). [More information](/docs/deployments/overview#api-keys-and-environment-variables). + + + The `afterSwitchOrganizationUrl` prop on the `` component has been renamed to `afterSelectOrganizationUrl`. This is a quick and simple rename. + + ```diff + - + + + ``` + + + This type was extending `ClerkProviderProps` with but was not necessary. This type is typically used internally and is not required to be imported and used directly. If needed, import and use `ClerkProviderProps` instead. + + + +### Other Breaking Changes + +MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "isMagicLinkError -> isEmailLinkError", "MagicLinkError -> EmailLinkError", "handleMagicLinkVerification -> handleEmailLinkVerification", "setSession -> setActive", "invitationList -> invitations as param to useOrganizations", "membershipList -> members as param to useOrganization", "useOrganizations -> useOrganizationList", "userProfile -> userProfileProps for UserButton", "WithSession component removed", "WithClerk component removed", "WithUser component removed", "withClerk function removed", "withSession function removed", "withUser function removed", "MultisessionAppSupport import moved to /internal", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.getOrganizationList() return type changed", "User.getOrganizationMembershipList() return type changed", "Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed"]}> + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + + + `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: + + ```diff + - await setSession('sessionID', () => void) + + await setActive({ session: 'sessionID', beforeEmit: () => void }) + + - await setSession(sessionObj) + + await setActive({ session: sessionObj }) + + - await setSession(sessionObj, () => void) + + await setActive({ session: sessionObj, beforeEmit: () => void }) + ``` + + `setActive` also supports setting an active organization: + + ```js + await setActive({ + session: 'sessionID', + organization: 'orgID', + beforeEmit: () => void + }) + + await setActive({ + session: sessionObj, + organization: orgObj, + beforeEmit: () => void + }) + ``` + + + The `invitationList` param to the `useOrganizations` hook has been replaced by `invitations`. This param also has a slightly different way of working, examples included below. Note also that `useOrganizations` is deprecated and should be updated to `useOrganization` instead. + + ```js + // before + const { invitationList } = useOrganization({ + invitationList: { limit: 10, offset: 1 }, + }); + + // after + const { invitations } = useOrganization({ + invitations: { + initialPage: 1, + pageSize: 10, + }, + }); + + // you can also simply return all invitations + const { invitations } = useOrganization({ invitations: true }); + ``` + + + The `membershipList` param from the `useOrganization` hook has been removed. Instead, [use the `memberships` param](https://clerk.com/docs/references/react/use-organization#parameters). Examples of each can be seen here: + + ```js + // before + const { membershipList } = useOrganization({ + membershipList: { limit: 10, offset: 1 }, + }); + + // after + const { memberships } = useOrganization({ + memberships: { + initialPage: 1, + pageSize: 10, + }, + }); + + // you can also simply return all memberships + const { memberships } = useOrganization({ memberships: true }); + ``` + + + Any place where `useOrganizations` is used should be switched to [`useOrganizationList`](https://clerk.com/docs/references/react/use-organization-list) or [`useOrganization`](https://clerk.com/docs/references/react/use-organization) instead. The return signature has also changed, so take note of this when making the upgrade. + + ```js + // before: useOrganizations return values + { + isLoaded: boolean, + createOrganization: clerk.createOrganization, + getOrganizationMemberships: clerk.getOrganizationMemberships, + getOrganization: clerk.getOrganization, + } + + // after: useOrganizationList return values + { + isLoaded: boolean, + createOrganization: clerk.createOrganization, + userMemberships: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, + userInvitations: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, + userSuggestions: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, + setActive: clerk.setActive, + } + ``` + + + The `userProfile` prop on [the `UserButton` component](https://clerk.com/docs/references/javascript/clerk/user-button#user-button-component) has been changed to `userProfileProps`. This is purely a name change, none of the values need to be updated. + + ```diff + - + + + ``` + + + The `WithSession` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + export const WithSession = ({ children }) => { + const session = useSession(); + if (typeof children !== 'function') throw new Error(); + + return {children(session)}; + }; + ``` + + + The `WithClerk` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + export const WithClerk = ({ children }) => { + const clerk = useClerk(); + if (typeof children !== 'function') throw new Error(); + + return {children(clerk)}; + }; + ``` + + + The `WithUser` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + export const WithUser = ({ children }) => { + const user = useUser(); + if (typeof children !== 'function') throw new Error(); + + return {children(user)}; + }; + ``` + + + The `withClerk` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + function withClerk(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const clerk = useIsomorphicClerkContext(); + + if (!clerk.loaded) return null; + + return ( + + ); + }; + + HOC.displayName = `withClerk(${displayName})`; + return HOC; + } + ``` + + + The `withSession` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + function withSession(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const session = useSessionContext(); + + if (!session) return null; + + return ( + + ); + }; + + HOC.displayName = `withSession(${displayName})`; + return HOC; + } + ``` + + + The `withUser` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: + + ```js + function withUser(Component, displayName) { + displayName = displayName || Component.displayName || Component.name || 'Component'; + Component.displayName = displayName; + const HOC = props => { + const clerk = useUserContext(); + + if (!user) return null; + + return ( + + ); + }; + + HOC.displayName = `withUser(${displayName})`; + return HOC; + } + ``` + + + `MultiSessionAppSupport` is a component that handles the intermediate “undefined” state for multisession apps by unmounting and remounting the components during the session switch (` setActive`` call) in order to solve theoretical edge-cases that can arise while switching sessions. It is undocumented and intended only for internal use, so it has been moved to an `/internal` import path. Please note that internal imports are not intended for public use, and are outside the scope of semver. + + ```diff + - import { MultiSessionAppSupport } from '@clerk/clerk-react' + + import { MultiSessionAppSupport } from '@clerk/clerk-react/internal' + ``` + + + The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: + + ```diff + import { SignOutButton } from "@clerk/clerk-react"; + + export const Signout = () => { + return ( + { window.location.href = "/your-path" }} + + redirectUrl="/your-path" + > + + + ) + } + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { organization } = useOrganization() + const orgList = organization.getOrganizationList() + + - orgList.forEach(() => {}) + + orgList.data.forEach(() => {}) + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { user } = useUser() + const membershipList = user.getOrganizationMembershipList() + + - membershipList.forEach(() => {}) + + membershipList.data.forEach(() => {}) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getRoles({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getDomains({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMembershipRequests({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationSuggestions({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + diff --git a/packages/upgrade/source/guide-generators/v5/react/hof-removals.mdx b/packages/upgrade/source/guide-generators/v5/react/hof-removals.mdx new file mode 100644 index 00000000000..3500c38803b --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/react/hof-removals.mdx @@ -0,0 +1,3 @@ +### Some higher-order functions and components removed + +A set of higher-order functions and components that are easily replicated with userland code and were rarely used have been removed. Each of them are listed below, along with code snippets with which they can be reproduced if need be. diff --git a/packages/upgrade/source/guide-generators/v5/react/index.js b/packages/upgrade/source/guide-generators/v5/react/index.js new file mode 100644 index 00000000000..8647c4d20a2 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/react/index.js @@ -0,0 +1,46 @@ +import { + accordionForCategory, + assembleContent, + deprecationRemovalsAndHousekeeping, + frontmatter, + loadVersionChangeData, + markdown, + markdownTemplate, + singleItem, + writeToFile, +} from '../../text-generation.js'; + +const version = 'v5'; +const name = 'react'; +const properName = 'React'; +const packageName = '@clerk/clerk-react'; +const cwd = `${version}/${name}`; + +async function generate() { + const data = loadVersionChangeData(version, name); + + return assembleContent({ data, cwd }, [ + frontmatter({ + title: `Upgrading ${properName} from v4 to v5`, + description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + }), + `# Upgrading \`${packageName}\` from v4 to v5`, + markdown('intro'), + markdown('prepare'), + markdown('node-version'), + markdown('react-version'), + markdownTemplate('update-v5', { packageName }), + markdown('cli'), + '## Breaking Changes', + markdown('redesign-preview'), + markdown('after-sign-x-handling'), + singleItem('navigate-to-routerpush-routerreplace'), + markdown('orgs-claim'), + markdown('path-routing'), + markdown('image-url'), + accordionForCategory('image-url', {}), + deprecationRemovalsAndHousekeeping(), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/guide-generators/v5/react/intro.mdx b/packages/upgrade/source/guide-generators/v5/react/intro.mdx new file mode 100644 index 00000000000..618e7277420 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/react/intro.mdx @@ -0,0 +1,3 @@ +Version 5 of the React SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your React project to use `@clerk/clerk-react` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/remix/__output.mdx b/packages/upgrade/source/guide-generators/v5/remix/__output.mdx new file mode 100644 index 00000000000..da7b6d031ef --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/remix/__output.mdx @@ -0,0 +1,367 @@ +--- +title: 'Upgrading Remix from v4 to v5' +description: 'Learn how to upgrade from version 4 to version 5 of the Clerk Remix SDK.' +--- + +# Upgrading `@clerk/remix` from v4 to v5 + +Version 5 of the Remix SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, no more need to add a custom error boundary, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Next.js project to use `@clerk/remix` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. + +## Preparing to upgrade + +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. + +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. + +Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. + +**Updating Node.js** + +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). + +**Updating React** + +All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. + + + ```bash filename="terminal" + npm install react@latest react-dom@latest + ``` + + ```bash filename="terminal" + yarn add react@latest react-dom@latest + ``` + + ```bash filename="terminal" + pnpm add react@latest react-dom@latest + ``` + + + +If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. + +## Updating to v5 + +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: + + + ```bash filename="terminal" + npm install @clerk/remix@beta + ``` + + ```bash filename="terminal" + yarn add @clerk/remix@beta + ``` + + ```bash filename="terminal" + pnpm add @clerk/remix@beta + ``` + + + +## CLI Upgrade Helper + +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. + +To run the CLI tool, navigate to your project and run it in the terminal: + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + + +If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. + +## Breaking Changes + +### `ClerkErrorBoundary` removed + +`ClerkErrorBoundary` is no longer needed for correct error handling in remix, so we have removed this function from the remix SDK, and it can be removed from your code as well. Example below: + +```diff + import { rootAuthLoader } from '@clerk/remix/ssr.server'; + import { + ClerkApp, +- ClerkErrorBoundary + } from '@clerk/remix'; + + export const loader = (args: DataFunctionArgs) => { + return rootAuthLoader(args); + }; + + export default ClerkApp(App); + +- export const ErrorBoundary = ClerkErrorBoundary(); +``` + +### Component design adjustments + +The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. + +[More detail on these changes »](#redesigned-components) + +## Deprecation removals & housekeeping + +As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. + + + For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of + changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for + manually. + + +### Deprecation removals + +apiKey -> secretKey as argument to createClerkClient", "apiKey -> secretKey as argument to rootAuthLoader", "apiKey -> secretKey as argument to getAuth", "frontendApi -> publishableKey as prop to ClerkProvider", "frontendApi -> publishableKey as argument to rootAuthLoader", "CLERK_FRONTEND_API replaced by CLERK_PUBLISHABLE_KEY", "CLERK_API_KEY replaced by CLERK_SECRET_KEY", "Clerk -> { createClerkClient }"]}> + + The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. + + ```diff + import { createClerkClient } from '@clerk/remix/api.server'; + + - createClerkClient({ apiKey: '...' }); + + createClerkClient({ secretKey: '...' }); + ``` + + + The `apiKey` argument passed to `rootAuthLoader` must be changed to `secretKey`. + + ```diff + import { rootAuthLoader } from '@clerk/remix/ssr.server'; + + - export const loader = args => rootAuthLoader(args, { apiKey: '...' }); + + export const loader = args => rootAuthLoader(args, { secretKey: '...' }); + ``` + + + The `apiKey` argument passed to `getAuth` must be changed to `secretKey`. + + ```diff + import { getAuth } from '@clerk/remix/ssr.server'; + + export const loader: LoaderFunction = async args => { + - return getAuth(args, { apiKey: '...' }); + + return getAuth(args, { secretKey: '...' }); + }; + ``` + + + The `frontendApi` prop passed to `` was renamed to `publishableKey`. **Note:** The values are different, so this is not just a key replacement. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). [More information](/docs/deployments/overview#api-keys-and-environment-variables). + + + The `frontendApi` argument passed to `rootAuthLoader` must be changed to `publishableKey`. + + ```diff + import { rootAuthLoader } from '@clerk/remix/ssr.server'; + + - export const loader = args => rootAuthLoader(args, { frontendApi: '...' }); + + export const loader = args => rootAuthLoader(args, { publishableKey: '...' }); + ``` + + + The `CLERK_FRONTEND_API` environment variable was renamed to `CLERK_PUBLISHABLE_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). **Note:** The values are different, so this is not just a key replacement. [More information](/docs/deployments/overview#api-keys-and-environment-variables). + + + The `CLERK_API_KEY` environment variable was renamed to `CLERK_SECRET_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). + + + The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + + ```diff + - import Clerk from "@clerk/remix" + + import { createClerkClient } from "@clerk/remix" + ``` + + + +### Other Breaking Changes + +isMagicLinkError -> isEmailLinkError", "MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.getOrganizationList() return type changed", "User.getOrganizationMembershipList() return type changed", "Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed"]}> + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + + + Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + + + `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: + + ```diff + - await setSession('sessionID', () => void) + + await setActive({ session: 'sessionID', beforeEmit: () => void }) + + - await setSession(sessionObj) + + await setActive({ session: sessionObj }) + + - await setSession(sessionObj, () => void) + + await setActive({ session: sessionObj, beforeEmit: () => void }) + ``` + + `setActive` also supports setting an active organization: + + ```js + await setActive({ + session: 'sessionID', + organization: 'orgID', + beforeEmit: () => void + }) + + await setActive({ + session: sessionObj, + organization: orgObj, + beforeEmit: () => void + }) + ``` + + + The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: + + ```diff + import { SignOutButton } from "@clerk/clerk-react"; + + export const Signout = () => { + return ( + { window.location.href = "/your-path" }} + + redirectUrl="/your-path" + > + + + ) + } + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { organization } = useOrganization() + const orgList = organization.getOrganizationList() + + - orgList.forEach(() => {}) + + orgList.data.forEach(() => {}) + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { user } = useUser() + const membershipList = user.getOrganizationMembershipList() + + - membershipList.forEach(() => {}) + + membershipList.data.forEach(() => {}) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getRoles({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getDomains({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMembershipRequests({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationSuggestions({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + diff --git a/packages/upgrade/source/guide-generators/v5/remix/index.js b/packages/upgrade/source/guide-generators/v5/remix/index.js new file mode 100644 index 00000000000..f8430b8b5ac --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/remix/index.js @@ -0,0 +1,46 @@ +import { + accordionForCategory, + assembleContent, + deprecationRemovalsAndHousekeeping, + frontmatter, + loadVersionChangeData, + markdown, + markdownTemplate, + singleItem, + writeToFile, +} from '../../text-generation.js'; + +const version = 'v5'; +const name = 'remix'; +const properName = 'Remix'; +const packageName = '@clerk/remix'; +const cwd = `${version}/${name}`; + +async function generate() { + const data = loadVersionChangeData(version, name); + + return assembleContent({ data: data, cwd }, [ + frontmatter({ + title: `Upgrading ${properName} from v4 to v5`, + description: `Learn how to upgrade from version 4 to version 5 of the Clerk ${properName} SDK.`, + }), + `# Upgrading \`${packageName}\` from v4 to v5`, + markdown('intro'), + markdown('prepare'), + markdown('node-version'), + markdown('react-version'), + markdownTemplate('update-v5', { packageName }), + markdown('cli'), + '## Breaking Changes', + singleItem('clerkerrorboundary-removed'), + markdown('redesign-preview'), + markdown('after-sign-x-handling'), + markdown('orgs-claim'), + markdown('path-routing'), + markdown('image-url'), + accordionForCategory('image-url'), + deprecationRemovalsAndHousekeeping(), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/guide-generators/v5/remix/intro.mdx b/packages/upgrade/source/guide-generators/v5/remix/intro.mdx new file mode 100644 index 00000000000..348599a4d35 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/remix/intro.mdx @@ -0,0 +1,3 @@ +Version 5 of the Remix SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, no more need to add a custom error boundary, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Next.js project to use `@clerk/remix` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/retheme/__output.mdx b/packages/upgrade/source/guide-generators/v5/retheme/__output.mdx new file mode 100644 index 00000000000..4816ece6ed0 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/retheme/__output.mdx @@ -0,0 +1,436 @@ +--- +title: 'Redesigned Components in v5' +description: 'Learn how to handle changes as a result of redesigned components in Clerk version 5' +--- + +# Redesigned Components in v5 + +The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. + + + If you are not customizing the appearance of your components, or using `localization`, you can skip this section. If + you are, we recommend using our CLI (`npx @clerk/upgrade`) to scan for changes required as part of the component + redesign more quickly. + + +The sections below contain more info on each change made to the customization ids and localization keys for reference. Regardless of how thoroughly you have reviewed the following information, we still recommend that you ensure that you have taken some time to manually look through each of your views to ensure that everything looks good still. + +## Appearance Changes + +Settings -> General tab in OrganizationProfile", "Within <UserProfile />, Account and Security Pages Separated", "Within <UserProfile />, Multi-Factor Auth is Added via Dropdown", "Within <UserProfile />, Connected Accounts Added via Dropdown", "userButtonPopoverActionButtonText customization id removed", "userButtonBox is now a child of userButtonTrigger", "organizationSwitcherPopoverActionButtonText customization id removed", "Changes to the card customization id", "Back button customization ids change on alternative 2fa methods page", "button -> organizationListCreateOrganizationActionButton customization id", "socialButtonsBlockButtonArrow customization id removed", "Identity preview avatar customization ids removed", "Changes to default variables"]}> + + The "Settings" tab within the `` component has been renamed to "General". If you are linking directly to `/organization-settings` from anywhere, the link will need to be updated to `/organization-general`. + + If you are [customizing the component](https://clerk.com/docs/components/customization/organization-profile) by re-ordering the pages, the label used to target this page must be changed from `settings` to `general` as well. + + If you are using the [appearance prop](https://clerk.com/docs/components/customization/overview) to customize the appearance of the `` component, please note that the `cl-profilePage__organizationSettings` key has also been changed to `cl-profilePage__organizationGeneral` to be consistent with the naming change. + + + Within the `` component (which is also rendered by ``), the "Account" and "Security" pages now live within their own tabs. Previously, "Security" was a section within the "Account" tab. The "Security" page can now be directly linked to under the `/security` path if desired. + + + Within the `` component (which is also rendered by ``), adding a multi-factor auth (MFA) method is now rendered as a dropdown instead of a modal. If you were relying on the modal for any sort of customizations, these customizations will need to be adjusted to the new form factor. + + Two new appearance prop keys were added to aid with this process: `cl-menuList__mfa` for styling the list of MFA factors, and `cl-menuItem__mfa` for styling individual items. + + + Within the `` component (which is also rendered by ``), adding a connected account is now rendered as a dropdown instead of a modal. If you were relying on the modal for any sort of customizations, these customizations will need to be adjusted to the new form factor. + + New appearance prop keys were added to aid with customization, if desired: + + - `cl-menuList__connectedAccounts` for styling the list of connected account addition options + - `cl-menuItem__connectedAccounts` for styling individual items in the connected account options list + - `cl-menuList__web3Wallets` for styling the list of web3 wallet addition options + - `cl-menuItem__web3Wallets` for styling individual items in the web3 wallets options list + + + The `userButtonPopoverActionButtonText` customization id has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. The nested ids `userButtonPopoverActionButtonText__signOut` and `userButtonPopoverActionButtonText__manageAccount` have also been removed. Any styling that needs to apply to the text can be applied to its direct parent `cl-userButtonPopoverActionButton`. + + + The parent-child relationship of the two elements `userButtonTrigger` and `userButtonBox` has been swapped. Previously, `userButtonTrigger` was nested inside of `userButtonBox`, and now `userButtonBox` is nested inside of `userButtonTrigger`. This change resolves [some usability issues](https://github.com/clerk/javascript/issues/1625) in ``. If you are applying style customization to either of these elements, your customizations may need to be adjusted. + + + The `organizationSwitcherPopoverActionButtonText` customization id has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. The nested ids `organizationSwitcherPopoverActionButtonText__manageOrganization` and `organizationSwitcherPopoverActionButtonText__createOrganization` have also been removed. Any styling that needs to apply to the text can be applied to its direct parent `cl-organizationSwitcherPopoverActionButton`. + + + The `card` customization id in the previous major version was the main and only container element for components. Outside the `card` element, a new `cardBox` id was introduced that allows more fine-grained style customization. + + As a note, if you are changing the background color of `card`, you will also need to also apply the same color on the `footer` id as well. The `footer` now gray by default, and it’s located outside `card`, but inside `cardBox`. + + A `footerItem` id was also added for more targeted styling of items inside the `footer`. + + + The "back" button on the panel within `` that lists out alternative two factor auth methods has changed location, and there have been some changes to the ids as a result of this: + + - `headerBackIcon` has been removed, as there is no longer an associated icon + - `headerBackRow` has been renamed to `backRow` as it's no longer in the header + - `headerBackLink` has been renamed to `backLink` as it's no longer in the header + + + The `button` customization id was used only in one place, for a button to create a new organization in the `` component. This id has been removed and replaced by the more appropriately named `organizationListCreateOrganizationActionButton` customization id instead. + + + Social sign-in buttons in the new component designs no longer include arrows, so the `socialButtonsBlockButtonArrow` customization id has been removed. You can use the `socialButtonsIconButton` to apply custom styling to the social buttons if desired. + + + When signing in with Clerk's `` component, after entering a username or email the user is brought to a second pane where they can enter a second factor such as a password. On this pane, there is an area called "identity preview" that shows the username/email that they are entering a password/etc for. Previously, this area included the user's avatar, but this is no longer the case in updated designs. As such, the customization ids related to the user's avatar have been removed. + + + The default values of some [appearance variables](/docs/components/customization/variables) have changed which may impact your UI (if you are not already overriding them). + + - The default `colorPrimary` value changed from `#103FEF` to `#2F3037`. As the new color is a dark grey, the `colorPrimary` of the dark theme was changed to `#FFFFFF`. + - The default `fontSize` value changed from `1rem` to `0.8125rem` + - The default `fontWeight` values changed from `{ normal: 400, medium: 500, bold: 600 }` to `{ normal: 400, medium: 500, bold: 700 }` + - Previously, the default value for `fontSmoothing` was `auto`. This value is now unset. If you want to pass a custom value to it, you can still do so. + + + +## Localization Changes + + + + As part of the redesign of Clerk's components, a number of new localization keys have been added and can be seen along with their default english values in the code block below. If you do not supply translated values for these keys in your custom localization, they will fall back to the default english values specified below. + + ```js + const newValues = { + formFieldLabel__organizationName: 'Name', + formFieldLabel__organizationSlug: 'Slug', + formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', + formFieldInputPlaceholder__organizationSlug: 'my-org', + signUp: { + start: { + subtitle: 'Welcome! Please fill in the details to get started.', + actionText: 'Already have an account?', + }, + emailCode: { + subtitle: 'Enter the verification code sent to your email', + }, + phoneCode: { + subtitle: 'Enter the verification code sent to your phone', + }, + continue: { + subtitle: 'Please fill in the remaining details to continue.', + actionText: 'Already have an account?', + }, + }, + signIn: { + start: { + title: 'Sign in to {{applicationName}}', + subtitle: 'Welcome back! Please sign in to continue', + actionText: 'Don’t have an account?', + }, + password: { + subtitle: 'Enter the password associated with your account', + }, + forgotPasswordAlternativeMethods: { + label__alternativeMethods: 'Or, sign in with another method', + }, + resetPassword: { + title: 'Set new password', + }, + phoneCodeMfa: { + subtitle: 'To continue, please enter the verification code sent to your phone', + }, + totpMfa: { + subtitle: 'To continue, please enter the verification code generated by your authenticator app', + }, + backupCodeMfa: { + subtitle: 'Your backup code is the one you got when setting up two-step authentication.', + }, + }, + userProfile: { + formButtonPrimary__continue: 'Save', + start: { + headerTitle__account: 'Profile details', + profileSection: { + primaryButton: 'Edit profile', + }, + emailAddressesSection: { + detailsAction__unverified: 'Verify', + destructiveAction: 'Remove email', + }, + mfaSection: { + phoneCode: { + destructiveActionLabel: 'Remove', + }, + backupCodes: { + actionLabel__regenerate: 'Regenerate', + }, + }, + dangerSection: { + title: 'Account termination', + deleteAccountButton: 'Delete account', + }, + }, + profilePage: { + imageFormSubtitle: 'Upload', + imageFormDestructiveActionSubtitle: 'Remove', + }, + phoneNumberPage: { + title: 'Add a phone number', + infoText: + 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', + }, + connectedAccountPage: { + socialButtonsBlockButton: '{{provider|titleize}}', + }, + mfaPhoneCodePage: { + subtitle__availablePhoneNumbers: + 'Select an existing phone number to register for SMS code two-step verification or add a new one.', + subtitle__unavailablePhoneNumbers: + 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', + }, + deletePage: { + actionDescription: 'Type "Delete account" below to continue.', + }, + }, + organizationSwitcher: { + action__createOrganization: 'Create organization', + action__manageOrganization: 'Manage', + }, + organizationProfile: { + profilePage: { + title: 'Update Profile', + dangerSection: { + title: 'Danger', + leaveOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + deleteOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + }, + }, + invitePage: { + title: 'Invite new members', + subtitle: 'Enter or paste one or more email addresses, separated by spaces or commas.', + }, + }, + createOrganization: { + title: 'Create organization', + }, + organizationList: { + title: 'Choose an account', + titleWithoutPersonal: 'Choose an organization', + }, + }; + ``` + + + As part of the redesign of Clerk's components, a number of localization keys have been removed as they were no longer present in the new designs. You should remove any of these keys that are present in your localization object as they are no longer needed. + + ```js + const deletedKeys = [ + 'signIn.forgotPassword.title_email', + 'signIn.forgotPassword.title_phone', + 'signIn.forgotPassword.formSubtitle_email', + 'signIn.forgotPassword.formSubtitle_phone', + 'signIn.emailCode.formSubtitle', + 'signIn.phoneCode.formSubtitle', + 'signIn.phoneCodeMfa.formSubtitle', + 'signIn.totpMfa.formSubtitle', + 'signIn.backupCodeMfa.formTitle', + 'signIn.backupCodeMfa.formSubtitle', + 'userProfile.start.emailAddressesSection.detailsTitle__primary', + 'userProfile.start.emailAddressesSection.detailsSubtitle__primary', + 'userProfile.start.emailAddressesSection.detailsTitle__nonPrimary', + 'userProfile.start.emailAddressesSection.detailsSubtitle__nonPrimary', + 'userProfile.start.emailAddressesSection.detailsTitle__unverified', + 'userProfile.start.emailAddressesSection.detailsSubtitle__unverified', + 'userProfile.start.emailAddressesSection.destructiveActionTitle', + 'userProfile.start.emailAddressesSection.destructiveActionSubtitle', + 'userProfile.start.phoneNumbersSection.detailsTitle__primary', + 'userProfile.start.phoneNumbersSection.detailsSubtitle__primary', + 'userProfile.start.phoneNumbersSection.detailsTitle__nonPrimary', + 'userProfile.start.phoneNumbersSection.detailsSubtitle__nonPrimary', + 'userProfile.start.phoneNumbersSection.detailsTitle__unverified', + 'userProfile.start.phoneNumbersSection.detailsSubtitle__unverified', + 'userProfile.start.phoneNumbersSection.destructiveActionTitle', + 'userProfile.start.phoneNumbersSection.destructiveActionSubtitle', + 'userProfile.start.connectedAccountsSection.title__conectionFailed', + 'userProfile.start.connectedAccountsSection.title__connectionFailed', + 'userProfile.start.connectedAccountsSection.title__reauthorize', + 'userProfile.start.connectedAccountsSection.subtitle__reauthorize', + 'userProfile.start.connectedAccountsSection.actionLabel__conectionFailed', + 'userProfile.start.connectedAccountsSection.destructiveActionSubtitle', + 'userProfile.start.connectedAccountsSection.destructiveActionAccordionSubtitle', + 'userProfile.start.mfaSection.phoneCode.destructiveActionTitle', + 'userProfile.start.mfaSection.phoneCode.destructiveActionSubtitle', + 'userProfile.start.mfaSection.phoneCode.title__default', + 'userProfile.start.mfaSection.phoneCode.title__setDefault', + 'userProfile.start.mfaSection.phoneCode.subtitle__default', + 'userProfile.start.mfaSection.phoneCode.subtitle__setDefault', + 'userProfile.start.mfaSection.totp.title', + 'userProfile.start.mfaSection.totp.subtitle', + 'userProfile.start.mfaSection.totp.destructiveActionSubtitle', + 'userProfile.start.mfaSection.totp.destructiveActionLabel', + 'userProfile.start.activeDevicesSection.primaryButton', + 'userProfile.start.activeDevicesSection.detailsTitle', + 'userProfile.start.activeDevicesSection.detailsSubtitle', + 'userProfile.start.activeDevicesSection.destructiveActionTitle', + 'userProfile.start.activeDevicesSection.destructiveActionSubtitle', + 'userProfile.start.web3WalletsSection.destructiveActionTitle', + 'userProfile.start.web3WalletsSection.destructiveActionSubtitle', + 'userProfile.start.dangerSection.deleteAccountTitle', + 'userProfile.start.dangerSection.deleteAccountDescription', + 'userProfile.start.headerSubtitle__account', + 'userProfile.start.headerSubtitle__security', + 'organizationProfile.start.headerTitle__settings', + 'organizationProfile.start.headerSubtitle__members', + 'organizationProfile.start.headerSubtitle__settings', + 'organizationProfile.profilePage.domainSection.unverifiedDomain_menuAction__verify', + 'organizationProfile.profilePage.domainSection.unverifiedDomain_menuAction__remove', + 'organizationProfile.profilePage.subtitle', + 'organizationProfile.membersPage.start.headerTitle__active', + 'organizationProfile.membersPage.start.headerTitle__invited', + 'createOrganization.subtitle', + 'formFieldLabel__emailAddress_phoneNumber', + 'formFieldLabel__phoneNumber_username', + 'formFieldLabel__emailAddress_phoneNumber_username', + 'formFieldInputPlaceholder__emailAddress_phoneNumber', + 'formFieldInputPlaceholder__phoneNumber_username', + 'formFieldInputPlaceholder__emailAddress_phoneNumber_username', + 'userProfile.phoneNumberPage.infoText__secondary', + 'userProfile.mfaPhoneCodePage.successMessage', + 'userProfile.profilePage.fileDropAreaTitle', + 'userProfile.profilePage.fileDropAreaAction', + ]; + ``` + + If you'd like to automate this, you can use the [lodash omit function](https://lodash.com/docs/#omit) as such: + + ```js + import { omit } from 'lodash-es'; + + const localization = omit(yourOldOject, deletedKeys); + ``` + + + The values of some keys have been changed on the default [en-US localization object](https://github.com/clerk/javascript/blob/main/packages/localizations/src/en-US.ts). The list below shows you the new defaults (as of writing this guide) which you can either use or overwrite. If you have overridden these values, make sure to double check so you can be sure that your modifications are appropriate. + + ```js + const changedValues = { + formFieldLabel__organizationName: 'Name', + formFieldLabel__organizationSlug: 'Slug', + formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', + formFieldInputPlaceholder__organizationSlug: 'my-org', + signUp: { + start: { + subtitle: 'Welcome! Please fill in the details to get started.', + actionText: 'Already have an account?', + }, + emailCode: { + subtitle: 'Enter the verification code sent to your email', + }, + phoneCode: { + subtitle: 'Enter the verification code sent to your phone', + }, + continue: { + subtitle: 'Please fill in the remaining details to continue.', + actionText: 'Already have an account?', + }, + }, + signIn: { + start: { + title: 'Sign in to {{applicationName}}', + subtitle: 'Welcome back! Please sign in to continue', + actionText: 'Don’t have an account?', + }, + password: { + subtitle: 'Enter the password associated with your account', + }, + forgotPasswordAlternativeMethods: { + label__alternativeMethods: 'Or, sign in with another method', + }, + resetPassword: { + title: 'Set new password', + }, + phoneCodeMfa: { + subtitle: 'To continue, please enter the verification code sent to your phone', + }, + totpMfa: { + subtitle: 'To continue, please enter the verification code generated by your authenticator app', + }, + backupCodeMfa: { + subtitle: 'Your backup code is the one you got when setting up two-step authentication.', + }, + }, + userProfile: { + formButtonPrimary__continue: 'Save', + start: { + headerTitle__account: 'Profile details', + profileSection: { + primaryButton: 'Edit profile', + }, + emailAddressesSection: { + detailsAction__unverified: 'Verify', + destructiveAction: 'Remove email', + }, + mfaSection: { + phoneCode: { + destructiveActionLabel: 'Remove', + }, + backupCodes: { + actionLabel__regenerate: 'Regenerate', + }, + }, + dangerSection: { + title: 'Account termination', + deleteAccountButton: 'Delete account', + }, + }, + profilePage: { + imageFormSubtitle: 'Upload', + imageFormDestructiveActionSubtitle: 'Remove', + }, + phoneNumberPage: { + title: 'Add a phone number', + infoText: + 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', + }, + connectedAccountPage: { + socialButtonsBlockButton: '{{provider|titleize}}', + }, + mfaPhoneCodePage: { + subtitle__availablePhoneNumbers: + 'Select an existing phone number to register for SMS code two-step verification or add a new one.', + subtitle__unavailablePhoneNumbers: + 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', + }, + deletePage: { + actionDescription: 'Type "Delete account" below to continue.', + }, + }, + organizationSwitcher: { + action__createOrganization: 'Create organization', + action__manageOrganization: 'Manage', + }, + organizationProfile: { + profilePage: { + title: 'Update Profile', + dangerSection: { + title: 'Danger', + leaveOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + deleteOrganization: { + actionDescription: 'Type "{{organizationName}}" below to continue.', + }, + }, + }, + invitePage: { + title: 'Invite new members', + subtitle: 'Enter or paste one or more email addresses, separated by spaces or commas.', + }, + }, + createOrganization: { + title: 'Create organization', + }, + organizationList: { + title: 'Choose an account', + titleWithoutPersonal: 'Choose an organization', + }, + }; + ``` + + diff --git a/packages/upgrade/source/guide-generators/v5/retheme/index.js b/packages/upgrade/source/guide-generators/v5/retheme/index.js new file mode 100644 index 00000000000..815b3199a8b --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/retheme/index.js @@ -0,0 +1,32 @@ +import { accordionForCategory, assembleContent, frontmatter, markdown, writeToFile } from '../../text-generation.js'; + +const cwd = 'v5/retheme'; + +async function generate() { + const data = (await import(`../../../versions/v5/index.js`)).default.nextjs; + + const defaultsChangeItem = { + title: 'Changes to default variables', + content: `\nThe default values of some [appearance variables](/docs/components/customization/variables) have changed which may impact your UI (if you are not already overriding them). + + - The default \`colorPrimary\` value changed from \`#103FEF\` to \`#2F3037\`. As the new color is a dark grey, the \`colorPrimary\` of the dark theme was changed to \`#FFFFFF\`. + - The default \`fontSize\` value changed from \`1rem\` to \`0.8125rem\` + - The default \`fontWeight\` values changed from \`{ normal: 400, medium: 500, bold: 600 }\` to \`{ normal: 400, medium: 500, bold: 700 }\` + - Previously, the default value for \`fontSmoothing\` was \`auto\`. This value is now unset. If you want to pass a custom value to it, you can still do so.\n`, + }; + + return assembleContent({ data: data, cwd }, [ + frontmatter({ + title: 'Redesigned Components in v5', + description: 'Learn how to handle changes as a result of redesigned components in Clerk version 5', + }), + '# Redesigned Components in v5', + markdown('intro'), + '## Appearance Changes', + accordionForCategory('appearance', { additionalItems: defaultsChangeItem }), + '## Localization Changes', + accordionForCategory('localization', {}), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/util/v5-nextjs-guide/retheme-changes.mdx b/packages/upgrade/source/guide-generators/v5/retheme/intro.mdx similarity index 97% rename from packages/upgrade/source/util/v5-nextjs-guide/retheme-changes.mdx rename to packages/upgrade/source/guide-generators/v5/retheme/intro.mdx index 8bca83a7d45..b6b992d6f9c 100644 --- a/packages/upgrade/source/util/v5-nextjs-guide/retheme-changes.mdx +++ b/packages/upgrade/source/guide-generators/v5/retheme/intro.mdx @@ -1,5 +1,3 @@ -## Redesigned components - The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. diff --git a/packages/upgrade/source/util/v5-nextjs-guide/after-sign-x-handling.mdx b/packages/upgrade/source/guide-generators/v5/shared/after-sign-x-handling.mdx similarity index 100% rename from packages/upgrade/source/util/v5-nextjs-guide/after-sign-x-handling.mdx rename to packages/upgrade/source/guide-generators/v5/shared/after-sign-x-handling.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/cli.mdx b/packages/upgrade/source/guide-generators/v5/shared/cli.mdx new file mode 100644 index 00000000000..adf22bcad4c --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/shared/cli.mdx @@ -0,0 +1,22 @@ +## CLI Upgrade Helper + +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. + +To run the CLI tool, navigate to your project and run it in the terminal: + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + + +If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. diff --git a/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx b/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx new file mode 100644 index 00000000000..f1978e8315c --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx @@ -0,0 +1,7 @@ +As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. + + + For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of + changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for + manually. + diff --git a/packages/upgrade/source/guide-generators/v5/shared/image-url.mdx b/packages/upgrade/source/guide-generators/v5/shared/image-url.mdx new file mode 100644 index 00000000000..56a484fe021 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/shared/image-url.mdx @@ -0,0 +1,3 @@ +### Image URL Name Consolidation + +There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: diff --git a/packages/upgrade/source/guide-generators/v5/shared/node-version.mdx b/packages/upgrade/source/guide-generators/v5/shared/node-version.mdx new file mode 100644 index 00000000000..e06214b0329 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/shared/node-version.mdx @@ -0,0 +1,3 @@ +**Updating Node.js** + +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). diff --git a/packages/upgrade/source/guide-generators/v5/shared/orgs-claim.mdx b/packages/upgrade/source/guide-generators/v5/shared/orgs-claim.mdx new file mode 100644 index 00000000000..f1c6011cd5d --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/shared/orgs-claim.mdx @@ -0,0 +1,50 @@ +### Removed: `orgs` claim on JWT + +In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. + +The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. + + + + ```typescript filename="Next.js" + import { getAuth } from "@clerk/nextjs/server" + const claims: JwtPayload = getAuth(request).sessionClaims + + import { getAuth } from "@clerk/ssr.server" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + + ```typescript filename="Fastify" + import { getAuth } from "@clerk/fastify" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + ```typescript filename="@clerk/backend" + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "" }) + const requestState = await clerkClient.authenticateRequest( + request, + { publishableKey: "" } + ) + const claims: JwtPayload = requestState.toAuth().sessionClaims + ``` + + + + ```typescript filename="@clerk/clerk-sdk-node" + import { clerkClient } from "@clerk/clerk-sdk-node" + + router.use((...args) => clerkClient.expressRequireAuth()(...args)) + router.get("/me", async (req, reply: Response) => { + return reply.json({ auth: req.auth }) + }) + ``` + + + + +If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. diff --git a/packages/upgrade/source/guide-generators/v5/shared/path-routing.mdx b/packages/upgrade/source/guide-generators/v5/shared/path-routing.mdx new file mode 100644 index 00000000000..45d6b6754cb --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/shared/path-routing.mdx @@ -0,0 +1,51 @@ +### Path routing is now the default + +On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. + +In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: + +- `` +- `` +- `` +- `` +- `` + +Here's how you'd use the components going forward: + +```jsx + + + + + +``` + +If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. + +```jsx + + +``` + +However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. + + +```env filename=".env.local" +NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in +NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up +``` + +```env filename=".env" +CLERK_SIGN_IN_URL=/sign-in +CLERK_SIGN_UP_URL=/sign-up +``` + + + +**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. + +```jsx +// Only works for Next.js / Remix when environment variables are set + + +``` diff --git a/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx b/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx new file mode 100644 index 00000000000..b1a7f251ae0 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx @@ -0,0 +1,7 @@ +## Preparing to upgrade + +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. + +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. + +Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. diff --git a/packages/upgrade/source/guide-generators/v5/shared/react-version.mdx b/packages/upgrade/source/guide-generators/v5/shared/react-version.mdx new file mode 100644 index 00000000000..5a97275214f --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/shared/react-version.mdx @@ -0,0 +1,20 @@ +**Updating React** + +All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. + + + ```bash filename="terminal" + npm install react@latest react-dom@latest + ``` + + ```bash filename="terminal" + yarn add react@latest react-dom@latest + ``` + + ```bash filename="terminal" + pnpm add react@latest react-dom@latest + ``` + + + +If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. diff --git a/packages/upgrade/source/guide-generators/v5/shared/redesign-preview.mdx b/packages/upgrade/source/guide-generators/v5/shared/redesign-preview.mdx new file mode 100644 index 00000000000..81232ede09a --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/shared/redesign-preview.mdx @@ -0,0 +1,5 @@ +### Component design adjustments + +The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. + +[More detail on these changes »](/components-redesigned) diff --git a/packages/upgrade/source/guide-generators/v5/shared/update-v5.mdx b/packages/upgrade/source/guide-generators/v5/shared/update-v5.mdx new file mode 100644 index 00000000000..127f3464f14 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/shared/update-v5.mdx @@ -0,0 +1,18 @@ +## Updating to v5 + +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: + + + ```bash filename="terminal" + npm install <%= packageName %>@beta + ``` + + ```bash filename="terminal" + yarn add <%= packageName %>@beta + ``` + + ```bash filename="terminal" + pnpm add <%= packageName %>@beta + ``` + + diff --git a/packages/upgrade/source/util/v5-nextjs-guide/deprecation-removals.mdx b/packages/upgrade/source/util/v5-nextjs-guide/deprecation-removals.mdx deleted file mode 100644 index 193278e503b..00000000000 --- a/packages/upgrade/source/util/v5-nextjs-guide/deprecation-removals.mdx +++ /dev/null @@ -1,9 +0,0 @@ -## Deprecation removals & housekeeping - -As part of this major version, we have removed a large number of previously deprecated props, arugments, methods, etc, and made changes to things that are only realistically used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. - - - For this section more than any other one, we recommend using the CLI upgrade tool (`npx @clerk/upgrade`), since there - are a lot of changes, each of which are very unlikely to appear in your codebase, that would take a very long time to - look for manually. - diff --git a/packages/upgrade/source/util/v5-nextjs-guide/generate.js b/packages/upgrade/source/util/v5-nextjs-guide/generate.js deleted file mode 100644 index 3025cce6aae..00000000000 --- a/packages/upgrade/source/util/v5-nextjs-guide/generate.js +++ /dev/null @@ -1,90 +0,0 @@ -import { readFileSync } from 'fs'; -import { parseInline } from 'marked'; -import path from 'path'; -import { fileURLToPath } from 'url'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const VERSION = 'v5'; - -async function generate() { - const data = (await import(`../../versions/${VERSION}/index.js`)).default['nextjs']; - - let output = ''; - output += `--- -title: Upgrading Next.js from v4 to v5 -description: Learn how to upgrade Clerk's Next.js SDK from v4 to v5. ----`; - output += '\n\n'; - output += read('intro'); - output += '\n\n'; - output += read('version-requirements'); - - // This is a guide-specific item, no matcher for this - const defaultsChangeItem = { - title: 'Changes to default variables', - content: `\nThe default values of some [appearance variables](/docs/components/customization/variables) have changed which may impact your UI (if you are not already overriding them). - - - The default \`colorPrimary\` value changed from \`#103FEF\` to \`#2F3037\`. As the new color is a dark grey, the \`colorPrimary\` of the dark theme was changed to \`#FFFFFF\`. - - The default \`fontSize\` value changed from \`1rem\` to \`0.8125rem\` - - The default \`fontWeight\` values changed from \`{ normal: 400, medium: 500, bold: 600 }\` to \`{ normal: 400, medium: 500, bold: 700 }\` - - Previously, the default value for \`fontSmoothing\` was \`auto\`. This value is now unset. If you want to pass a custom value to it, you can still do so.\n`, - }; - - output += '\n\n'; - output += read('retheme-changes'); - - const apperanceChanges = data.filter(i => i.category === 'appearance'); - apperanceChanges.push(defaultsChangeItem); - const localizationChanges = data.filter(i => i.category === 'localization'); - - output += '\n\n'; - output += '#### Appearance changes'; - output += '\n\n'; - output += ` `"${parseInline(i.title)}"`).join(', ')}]}>`; - output += '\n'; - output += apperanceChanges.map(i => `${i.content}`).join('\n'); - output += ''; - output += '\n\n'; - output += '#### Localization changes'; - output += '\n\n'; - output += ` `"${parseInline(i.title)}"`).join(', ')}]}>`; - output += '\n'; - output += localizationChanges.map(i => `${i.content}`).join('\n'); - output += ''; - - output += '\n\n'; - output += read('middleware-changes'); - output += '\n\n'; - output += read('import-changes'); - output += '\n\n'; - output += read('after-sign-x-handling'); - output += '\n\n'; - output += read('deprecation-removals'); - - const deprecationRemovals = data.filter(i => i.category === 'deprecation-removal'); - const otherChanges = data.filter(i => !i.category); - - output += '\n\n'; - output += '#### Deprecation removals'; - output += '\n\n'; - output += ` `"${parseInline(i.title)}"`).join(', ')}]}>`; - output += '\n'; - output += deprecationRemovals.map(i => `${i.content}`).join('\n'); - output += ''; - output += '\n\n'; - output += '#### Other breaking changes'; - output += '\n\n'; - output += ` `"${parseInline(i.title)}"`).join(', ')}]}>`; - output += '\n'; - output += otherChanges.map(i => `${i.content}`).join('\n'); - output += ''; - output += '\n\n'; - - return output; -} - -generate().then(console.log); - -function read(p) { - return readFileSync(path.join(__dirname, p + '.mdx'), 'utf8'); -} diff --git a/packages/upgrade/source/util/v5-nextjs-guide/intro.mdx b/packages/upgrade/source/util/v5-nextjs-guide/intro.mdx deleted file mode 100644 index 261cab231c2..00000000000 --- a/packages/upgrade/source/util/v5-nextjs-guide/intro.mdx +++ /dev/null @@ -1,22 +0,0 @@ -# Upgrading Next.js from v4 to v5 - -By the end of this guide, you’ll have successfully upgraded your Next.js project to use `@clerk/nextjs` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. - -Step-by-step instructions will lead you through the process. If you’re looking for a reference list of changes, check out the general [upgrading from v4 to v5 guide](/docs/upgrade-guides/upgrading-from-v4-to-v5). - -To aid you in this upgrade, Clerk built a CLI called [`@clerk/upgrade`](https://www.npmjs.com/package/@clerk/upgrade). Throughout this guide you'll see prompts to use the CLI which you can invoke directly in your terminal. - - - ```bash filename="terminal" - npx @clerk/upgrade - ``` - -```bash filename="terminal" -yarn dlx @clerk/upgrade -``` - -```bash filename="terminal" -pnpm dlx @clerk/upgrade -``` - - diff --git a/packages/upgrade/source/util/v5-nextjs-guide/version-requirements.mdx b/packages/upgrade/source/util/v5-nextjs-guide/version-requirements.mdx deleted file mode 100644 index 4d2e61c6268..00000000000 --- a/packages/upgrade/source/util/v5-nextjs-guide/version-requirements.mdx +++ /dev/null @@ -1,35 +0,0 @@ -## Minimum version requirements - -We have updated some of our minumum version requirements for Node.js, React, and Next.js such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. Please take a moment to check your dependencies and ensure you are up to date! - -#### Updating Node.js - -You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). - -#### Updating React - -`@clerk/nextjs` now requires you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. - - - ```bash filename="terminal" - npm install react@latest react-dom@latest - ``` - - ```bash filename="terminal" - yarn add react@latest react-dom@latest - ``` - - ```bash filename="terminal" - pnpm add react@latest react-dom@latest - ``` - - - -If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. - -#### Updating Next.js - -`@clerk/nextjs` now requires you to use Next.js version `13.0.4` or later. Check out Next's upgrade guides for more guidance if you have not yet upgraded to Next.js 13: - -- [Upgrading from 12 to 13](https://nextjs.org/docs/pages/building-your-application/upgrading/version-13) -- [Upgrading from 13 to 14](https://nextjs.org/docs/app/building-your-application/upgrading/version-14) diff --git a/packages/upgrade/source/versions/v5/backend/externalaccountjson-avatarurl.md b/packages/upgrade/source/versions/v5/backend/externalaccountjson-avatarurl.md index 7ad3322bf94..8626e22e0b0 100644 --- a/packages/upgrade/source/versions/v5/backend/externalaccountjson-avatarurl.md +++ b/packages/upgrade/source/versions/v5/backend/externalaccountjson-avatarurl.md @@ -1,6 +1,7 @@ --- title: '`ExternalAccountJSON.avatar_url` -> `.imageUrl`' matcher: "\\.avatar_url" +category: 'image-url-backend' --- The `avatarUrl` property of any `ExternalAcccountJSON` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-signature.md b/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-signature.md index 8325fa3b601..a6c095cd86f 100644 --- a/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-signature.md +++ b/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-signature.md @@ -1,6 +1,7 @@ --- title: '`Users.getOrganizationInvitationList` return signature changed' matcher: "\\.users\\.getOrganizationInvitationList\\(" +category: 'pagination-return' warning: true --- diff --git a/packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md b/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-type-change.md similarity index 56% rename from packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md rename to packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-type-change.md index 5dbde6095ca..341e48c1e43 100644 --- a/packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md +++ b/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-type-change.md @@ -1,13 +1,19 @@ --- -title: '`Organization.getOrganizationInvitationList()` return type changed' +title: '`Organizations.getOrganizationInvitationList()` return type changed' matcher: "\\.getOrganizationInvitationList\\(" +category: 'pagination-return' +warning: true --- The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: ```diff - const { organization } = useOrganization() - const inviteList = organization.getOrganizationInvitationList() + const { createClerkClient } = require("@clerk/backend"); + const client = createClerkClient({ secretKey: "..." }); + + const inviteList = await client.organizations.getOrganizationInvitationList({ + organizationId: "...", + }) - inviteList.forEach(() => {}) + inviteList.data.forEach(() => {}) diff --git a/packages/upgrade/source/versions/v5/backend/getorganizationlist-return-signature.md b/packages/upgrade/source/versions/v5/backend/getorganizationlist-return-signature.md index 0bdcdf5513f..a1e3fb3de09 100644 --- a/packages/upgrade/source/versions/v5/backend/getorganizationlist-return-signature.md +++ b/packages/upgrade/source/versions/v5/backend/getorganizationlist-return-signature.md @@ -1,6 +1,7 @@ --- title: '`Users.getOrganizationList` return signature changed' matcher: "\\.users\\.getOrganizationList\\(" +category: 'pagination-return' warning: true --- diff --git a/packages/upgrade/source/versions/v5/backend/getorganizationmembershiplist-return-signature.md b/packages/upgrade/source/versions/v5/backend/getorganizationmembershiplist-return-signature.md index 3a915547214..cf3ac26e1c3 100644 --- a/packages/upgrade/source/versions/v5/backend/getorganizationmembershiplist-return-signature.md +++ b/packages/upgrade/source/versions/v5/backend/getorganizationmembershiplist-return-signature.md @@ -1,6 +1,7 @@ --- title: '`Users.getOrganizationMembershipList` return signature changed' matcher: "\\.users\\.getOrganizationMembershipList\\(" +category: 'pagination-return' warning: true --- diff --git a/packages/upgrade/source/versions/v5/backend/organization-logourl.md b/packages/upgrade/source/versions/v5/backend/organization-logourl.md deleted file mode 100644 index e2e5ed34b0c..00000000000 --- a/packages/upgrade/source/versions/v5/backend/organization-logourl.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: '`Organization.logoUrl` -> `.imageUrl`' -matcher: "\\.logoUrl" ---- - -The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/organizationjson-logourl.md b/packages/upgrade/source/versions/v5/backend/organizationjson-logourl.md index 3015ee230fb..bc2b076a7b3 100644 --- a/packages/upgrade/source/versions/v5/backend/organizationjson-logourl.md +++ b/packages/upgrade/source/versions/v5/backend/organizationjson-logourl.md @@ -1,6 +1,7 @@ --- title: '`OrganizationJSON.logo_url` -> `.imageUrl`' matcher: "\\.logo_url" +category: 'image-url-backend' --- The `logo_url` property of any `OrganizationJSON` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdatajson-profileimageurl.md b/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdatajson-profileimageurl.md index edf45230d25..0661dc8151f 100644 --- a/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdatajson-profileimageurl.md +++ b/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdatajson-profileimageurl.md @@ -1,6 +1,7 @@ --- title: '`OrganizationMembershipPublicUserDataJSON.profile_image_url` -> `.imageUrl`' matcher: "\\.profile_image_url" +category: 'image-url-backend' --- The `profile_image_url` property of any `OrganizationMembershipPublicUserDataJSON` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/userjson-profileimageurl.md b/packages/upgrade/source/versions/v5/backend/userjson-profileimageurl.md index 818a1b3dfcc..10b4b98d75a 100644 --- a/packages/upgrade/source/versions/v5/backend/userjson-profileimageurl.md +++ b/packages/upgrade/source/versions/v5/backend/userjson-profileimageurl.md @@ -1,6 +1,7 @@ --- title: '`UserJSON.profile_image_url` -> `.imageUrl`' matcher: "\\.profile_image_url" +category: 'image-url-backend' --- The `profile_image_url` property of any `UserJSON` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/common/card-changes.md b/packages/upgrade/source/versions/v5/common/card-changes.md index 84d5b998c7a..987de398add 100644 --- a/packages/upgrade/source/versions/v5/common/card-changes.md +++ b/packages/upgrade/source/versions/v5/common/card-changes.md @@ -8,8 +8,8 @@ matcher: - "elements:\\s+{[\\s\\S]*?card:[\\s\\S]*?}" --- -The `card` customization id in the previous major version was the main and only container element for components Outside the `card` element we introduced a new `cardBox` id that allows more fine-grained style customization. +The `card` customization id in the previous major version was the main and only container element for components. Outside the `card` element, a new `cardBox` id was introduced that allows more fine-grained style customization. As a note, if you are changing the background color of `card`, you will also need to also apply the same color on the `footer` id as well. The `footer` now gray by default, and it’s located outside `card`, but inside `cardBox`. -We also added a `footerItem` id for more targeted styling of items inside the `footer`. +A `footerItem` id was also added for more targeted styling of items inside the `footer`. diff --git a/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md index acf569d57a8..7e1541b7699 100644 --- a/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md +++ b/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md @@ -2,6 +2,7 @@ title: '`EmailLinkErrorCode` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'error-imports' replaceWithString: 'clerk-react/errors' --- diff --git a/packages/upgrade/source/versions/v5/backend/externalaccount-picture.md b/packages/upgrade/source/versions/v5/common/externalaccount-picture.md similarity index 91% rename from packages/upgrade/source/versions/v5/backend/externalaccount-picture.md rename to packages/upgrade/source/versions/v5/common/externalaccount-picture.md index 7cfe151fdea..d3e295c7ead 100644 --- a/packages/upgrade/source/versions/v5/backend/externalaccount-picture.md +++ b/packages/upgrade/source/versions/v5/common/externalaccount-picture.md @@ -1,6 +1,7 @@ --- title: '`ExternalAccount.picture` -> `.imageUrl`' matcher: "\\.picture" +category: 'image-url' --- The `picture` property of any [`ExternalAcccount` object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md b/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md index 5b7bb911e2c..36446095c65 100644 --- a/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md +++ b/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md @@ -1,6 +1,7 @@ --- title: '`Organization.getOrganizationList()` return type changed' matcher: "\\.getOrganizationList\\(" +category: 'pagination-return' --- The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: diff --git a/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md b/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md index 03b0037bd08..fc1a458037a 100644 --- a/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md +++ b/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md @@ -1,6 +1,7 @@ --- title: '`User.getOrganizationMembershipList()` return type changed' matcher: "\\.getOrganizationMembershipList\\(" +category: 'pagination-return' --- The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: diff --git a/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md index 9e18ca0f9a0..c5c9df7dce9 100644 --- a/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md +++ b/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md @@ -2,6 +2,7 @@ title: '`isClerkAPIResponseError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'error-imports' replaceWithString: 'clerk-react/errors' --- diff --git a/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md index 0089b4bfac6..62c2daaa0af 100644 --- a/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md +++ b/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md @@ -2,6 +2,7 @@ title: '`isEmailLinkError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'error-imports' replaceWithString: 'clerk-react/errors' --- diff --git a/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md b/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md index 64be448f30f..1e246ac2c2c 100644 --- a/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md +++ b/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md @@ -2,6 +2,7 @@ title: '`isKnownError` import moved under `/errors`' matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" matcherFlags: 'm' +category: 'error-imports' replaceWithString: 'clerk-react/errors' --- diff --git a/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md new file mode 100644 index 00000000000..0bba0740caa --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md @@ -0,0 +1,14 @@ +--- +title: '`isMetamaskError` import moved under `/errors`' +matcher: "import\\s+{[\\s\\S]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(react)[\\s\\S]*?['\"]" +matcherFlags: 'm' +category: 'error-imports' +replaceWithString: 'react/errors' +--- + +The `isMetamaskError` import path has changed from `@clerk/react` to `@clerk/react/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + +```diff +- import { isMetamaskError } from "@clerk/react" ++ import { isMetamaskError } from "@clerk/react/errors" +``` diff --git a/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md b/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md index 9bd8b4313fc..f2896a39ccf 100644 --- a/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md +++ b/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md @@ -1,6 +1,7 @@ --- title: '`navigate` prop to `ClerkProvider` replaced by `routerPush` and `routerReplace`' matcher: "" +category: 'routerpush-replace' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/organization-getdomains-arguments-change.md b/packages/upgrade/source/versions/v5/common/organization-getdomains-arguments-change.md index 177584bd925..339e453debf 100644 --- a/packages/upgrade/source/versions/v5/common/organization-getdomains-arguments-change.md +++ b/packages/upgrade/source/versions/v5/common/organization-getdomains-arguments-change.md @@ -1,6 +1,7 @@ --- title: '`Organization.getDomains` arguments changed' matcher: "\\.getDomains\\(" +category: 'pagination-args' --- There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: diff --git a/packages/upgrade/source/versions/v5/common/organization-getinvitations-arguments-changed.md b/packages/upgrade/source/versions/v5/common/organization-getinvitations-arguments-changed.md index f7830c51c17..b7d0943d7f6 100644 --- a/packages/upgrade/source/versions/v5/common/organization-getinvitations-arguments-changed.md +++ b/packages/upgrade/source/versions/v5/common/organization-getinvitations-arguments-changed.md @@ -1,6 +1,7 @@ --- title: '`Organization.getInvitations` arguments changed' matcher: "\\.getInvitations\\(" +category: 'pagination-args' --- There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: diff --git a/packages/upgrade/source/versions/v5/common/organization-getmembershiprequests-arguments-changed.md b/packages/upgrade/source/versions/v5/common/organization-getmembershiprequests-arguments-changed.md index b90d67ccee9..d24a9656e50 100644 --- a/packages/upgrade/source/versions/v5/common/organization-getmembershiprequests-arguments-changed.md +++ b/packages/upgrade/source/versions/v5/common/organization-getmembershiprequests-arguments-changed.md @@ -1,6 +1,7 @@ --- title: '`Organization.getMembershipRequests` arguments changed' matcher: "\\.getMembershipRequests\\(" +category: 'pagination-args' --- There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: diff --git a/packages/upgrade/source/versions/v5/common/organization-getmemberships-arguments-changed.md b/packages/upgrade/source/versions/v5/common/organization-getmemberships-arguments-changed.md index 6c773b72289..665edb8797f 100644 --- a/packages/upgrade/source/versions/v5/common/organization-getmemberships-arguments-changed.md +++ b/packages/upgrade/source/versions/v5/common/organization-getmemberships-arguments-changed.md @@ -1,6 +1,7 @@ --- title: '`Organization.getMemberships` arguments changed' matcher: "\\.getMemberships\\(" +category: 'pagination-args' --- There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: diff --git a/packages/upgrade/source/versions/v5/common/organization-getroles-arguments-changed.md b/packages/upgrade/source/versions/v5/common/organization-getroles-arguments-changed.md index 49938541b0c..54058f6e7f1 100644 --- a/packages/upgrade/source/versions/v5/common/organization-getroles-arguments-changed.md +++ b/packages/upgrade/source/versions/v5/common/organization-getroles-arguments-changed.md @@ -1,6 +1,7 @@ --- title: '`Organization.getRoles` arguments changed' matcher: "\\.getRoles\\(" +category: 'pagination-args' --- There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: diff --git a/packages/upgrade/source/versions/v5/js/organization-logourl.md b/packages/upgrade/source/versions/v5/common/organization-logourl.md similarity index 92% rename from packages/upgrade/source/versions/v5/js/organization-logourl.md rename to packages/upgrade/source/versions/v5/common/organization-logourl.md index 80e00c13f83..5bda1347d47 100644 --- a/packages/upgrade/source/versions/v5/js/organization-logourl.md +++ b/packages/upgrade/source/versions/v5/common/organization-logourl.md @@ -1,6 +1,7 @@ --- title: '`Organization.logoUrl` -> `Organization.imageUrl`' matcher: "\\.logoUrl" +category: 'image-url' replaceWithString: '.imageUrl' --- diff --git a/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdata-profileimageurl.md b/packages/upgrade/source/versions/v5/common/organizationmembershippublicuserdata-profileimageurl.md similarity index 91% rename from packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdata-profileimageurl.md rename to packages/upgrade/source/versions/v5/common/organizationmembershippublicuserdata-profileimageurl.md index 525d1881a22..3e8fbf5db52 100644 --- a/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdata-profileimageurl.md +++ b/packages/upgrade/source/versions/v5/common/organizationmembershippublicuserdata-profileimageurl.md @@ -1,6 +1,7 @@ --- title: '`OrganizationMembershipPublicUserData.profileImageUrl` -> `.imageUrl`' matcher: "\\.profileImageUrl" +category: 'image-url' --- The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-chanaged.md b/packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-chanaged.md index 99136586768..ff2cbb5b00b 100644 --- a/packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-chanaged.md +++ b/packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-chanaged.md @@ -1,6 +1,7 @@ --- title: '`User.getOrganizationInvitations` arguments changed' matcher: "\\.getOrganizationInvitations\\(" +category: 'pagination-args' --- There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: diff --git a/packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-chanaged.md b/packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-chanaged.md index a6ef63e9a58..bcc111b808b 100644 --- a/packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-chanaged.md +++ b/packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-chanaged.md @@ -1,6 +1,7 @@ --- title: '`User.getOrganizationMemberships` arguments changed' matcher: "\\.getOrganizationMemberships\\(" +category: 'pagination-args' --- There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: diff --git a/packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-chanaged.md b/packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-chanaged.md index 55c9d21f267..55140d68b59 100644 --- a/packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-chanaged.md +++ b/packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-chanaged.md @@ -1,6 +1,7 @@ --- title: '`User.getOrganizationSuggestions` arguments changed' matcher: "\\.getOrganizationSuggestions\\(" +category: 'pagination-args' --- There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: diff --git a/packages/upgrade/source/versions/v5/backend/user-profileimageurl.md b/packages/upgrade/source/versions/v5/common/user-profileimageurl.md similarity index 88% rename from packages/upgrade/source/versions/v5/backend/user-profileimageurl.md rename to packages/upgrade/source/versions/v5/common/user-profileimageurl.md index af842c6032b..ca0d0d719e1 100644 --- a/packages/upgrade/source/versions/v5/backend/user-profileimageurl.md +++ b/packages/upgrade/source/versions/v5/common/user-profileimageurl.md @@ -1,6 +1,7 @@ --- title: '`User.profileImageUrl` -> `.imageUrl`' matcher: "\\.profileImageUrl" +category: 'image-url' --- The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md b/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md index 178321968ab..6d6608957fa 100644 --- a/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md +++ b/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md @@ -10,4 +10,4 @@ matcher: matcherFlags: 'm' --- -We have swapped the parent-child relationship of the two elements `userButtonTrigger` and `userButtonBox`. Previously, `userButtonTrigger` was nested inside of `userButtonBox`, and now `userButtonBox` is nested inside of `userButtonTrigger`. This change resolves [some usability issues](https://github.com/clerk/javascript/issues/1625) in ``. If you are applying style customization to either of these elements, your customizations may need to be adjusted. +The parent-child relationship of the two elements `userButtonTrigger` and `userButtonBox` has been swapped. Previously, `userButtonTrigger` was nested inside of `userButtonBox`, and now `userButtonBox` is nested inside of `userButtonTrigger`. This change resolves [some usability issues](https://github.com/clerk/javascript/issues/1625) in ``. If you are applying style customization to either of these elements, your customizations may need to be adjusted. diff --git a/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md b/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md index 922c07d061e..762382bfedc 100644 --- a/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md +++ b/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md @@ -1,7 +1,7 @@ --- title: '`withClerk` function removed' matcher: "import\\s+{[\\s\\S]*?withClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" -category: 'deprecation-removal' +category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/withclerk-removed.md b/packages/upgrade/source/versions/v5/common/withclerk-removed.md index 808d9e2bca5..5f197fe721b 100644 --- a/packages/upgrade/source/versions/v5/common/withclerk-removed.md +++ b/packages/upgrade/source/versions/v5/common/withclerk-removed.md @@ -1,7 +1,7 @@ --- title: '`WithClerk` component removed' matcher: "import\\s+{[\\s\\S]*?WithClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" -category: 'deprecation-removal' +category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md b/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md index 81b44040025..61ad0ddf788 100644 --- a/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md +++ b/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md @@ -1,7 +1,7 @@ --- title: '`withSession` function removed' matcher: "import\\s+{[\\s\\S]*?withSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" -category: 'deprecation-removal' +category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/withsession-removed.md b/packages/upgrade/source/versions/v5/common/withsession-removed.md index 6c93d5da353..bc4a43677f8 100644 --- a/packages/upgrade/source/versions/v5/common/withsession-removed.md +++ b/packages/upgrade/source/versions/v5/common/withsession-removed.md @@ -1,7 +1,7 @@ --- title: '`WithSession` component removed' matcher: "import\\s+{[\\s\\S]*?WithSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" -category: 'deprecation-removal' +category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md b/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md index ef323cf3a50..4179944a073 100644 --- a/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md +++ b/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md @@ -1,7 +1,7 @@ --- title: '`withUser` function removed' matcher: "import\\s+{[\\s\\S]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" -category: 'deprecation-removal' +category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/common/withuser-removed-2.md b/packages/upgrade/source/versions/v5/common/withuser-removed-2.md index 71a879deab6..4c3f5b40240 100644 --- a/packages/upgrade/source/versions/v5/common/withuser-removed-2.md +++ b/packages/upgrade/source/versions/v5/common/withuser-removed-2.md @@ -1,7 +1,7 @@ --- title: '`WithUser` component removed' matcher: "import\\s+{[\\s\\S]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" -category: 'deprecation-removal' +category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/expo/apikey-to-publishable-key.md b/packages/upgrade/source/versions/v5/expo/apikey-to-publishable-key.md index 58a45510c5f..5ea0615b20c 100644 --- a/packages/upgrade/source/versions/v5/expo/apikey-to-publishable-key.md +++ b/packages/upgrade/source/versions/v5/expo/apikey-to-publishable-key.md @@ -1,5 +1,6 @@ --- title: '`CLERK_FRONTEND_API` replaced by `CLERK_PUBLISHABLE_KEY`' +category: 'deprecation-removal' matcher: 'CLERK_FRONTEND_API' --- diff --git a/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md b/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md index f75409a28a2..525b5dd80b5 100644 --- a/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md +++ b/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md @@ -1,6 +1,7 @@ --- title: '`frontendApi` -> `publishableKey` as prop to `ClerkProvider`' matcher: "" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/fastify/clerkplugin-frontendapi.md b/packages/upgrade/source/versions/v5/fastify/clerkplugin-frontendapi.md index f7b6d2d8530..b8da261380d 100644 --- a/packages/upgrade/source/versions/v5/fastify/clerkplugin-frontendapi.md +++ b/packages/upgrade/source/versions/v5/fastify/clerkplugin-frontendapi.md @@ -1,7 +1,8 @@ --- title: '`frontendApi` -> `publishableKey` as param to clerkPlugin' -matcher: "fastify\\.register\\(clerkPlugin,.*?{.*?frontendApi:.*?}\\)" +matcher: "fastify\\.register\\(clerkPlugin,[\\s\\S]*?{[\\s\\S]*?frontendApi:[\\s\\S]*?}\\)" matcherFlags: 'm' +category: 'deprecation-removal' --- The `frontendApi` argument passed to `clerkPlugin` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. diff --git a/packages/upgrade/source/versions/v5/fastify/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/fastify/createclerkclient-apikey.md index de6cfeaa3a3..da3f40c945a 100644 --- a/packages/upgrade/source/versions/v5/fastify/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/fastify/createclerkclient-apikey.md @@ -2,6 +2,7 @@ title: '`apiKey` -> `secretKey` as param to createClerkClient' matcher: "createClerkClient\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" matcherFlags: 'm' +category: 'deprecation-removal' --- The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. diff --git a/packages/upgrade/source/versions/v5/fastify/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/fastify/createclerkclient-frontendapi.md index 23752d682e4..8ffdc929a60 100644 --- a/packages/upgrade/source/versions/v5/fastify/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/fastify/createclerkclient-frontendapi.md @@ -2,6 +2,7 @@ title: '`frontendApi` -> `publishableKey` as param to createClerkClient' matcher: "createClerkClient\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" matcherFlags: 'm' +category: 'deprecation-removal' --- The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. diff --git a/packages/upgrade/source/versions/v5/gatsby/api-url-value-change.md b/packages/upgrade/source/versions/v5/gatsby/api-url-value-change.md index 17614a4ed09..bdda5fc39ce 100644 --- a/packages/upgrade/source/versions/v5/gatsby/api-url-value-change.md +++ b/packages/upgrade/source/versions/v5/gatsby/api-url-value-change.md @@ -5,4 +5,4 @@ matcherFlags: 'm' warning: true --- -- The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. +The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/gatsby/apikey-to-publishable-key.md b/packages/upgrade/source/versions/v5/gatsby/apikey-to-publishable-key.md index 6f4474c47e8..9efe60bef02 100644 --- a/packages/upgrade/source/versions/v5/gatsby/apikey-to-publishable-key.md +++ b/packages/upgrade/source/versions/v5/gatsby/apikey-to-publishable-key.md @@ -1,5 +1,6 @@ --- title: '`GASTBY_CLERK_FRONTEND_API` replaced by `GATSBY_CLERK_PUBLISHABLE_KEY`' +category: 'deprecation-removal' matcher: 'GATSBY_CLERK_FRONTEND_API' --- diff --git a/packages/upgrade/source/versions/v5/gatsby/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/gatsby/createclerkclient-apikey.md index adef7da7c47..ee7c8662df9 100644 --- a/packages/upgrade/source/versions/v5/gatsby/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/gatsby/createclerkclient-apikey.md @@ -1,6 +1,7 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkClient' matcher: "createClerkClient\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/gatsby/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/gatsby/createclerkclient-frontendapi.md index b2f26af61dd..c157dc2a946 100644 --- a/packages/upgrade/source/versions/v5/gatsby/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/gatsby/createclerkclient-frontendapi.md @@ -1,6 +1,7 @@ --- title: '`frontendApi` -> `publishableKey` as param to createClerkClient' matcher: "createClerkClient\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/gatsby/withserverauth-return-type.md b/packages/upgrade/source/versions/v5/gatsby/withserverauth-return-type.md index 3c5eb2671e2..40dd0888e98 100644 --- a/packages/upgrade/source/versions/v5/gatsby/withserverauth-return-type.md +++ b/packages/upgrade/source/versions/v5/gatsby/withserverauth-return-type.md @@ -3,41 +3,33 @@ title: '`withServerAuth` props.auth return type changed' matcher: "withServerAuth\\(" --- -When utilizing the `withServerAuth` helper in Gatsby, it expects a callback function that is called with props from Clerk internals. The `.auth` property on the returned object from the callback has seen a substantial change in its return type. Note specifically that the property `auth.claims` was changed to `auth.sessionClaims` in addition to the other typing changes. A full example of how this looks and how the types differ can be seen below: +When utilizing the `withServerAuth` helper in Gatsby, it expects a callback function that is called with props from Clerk internals. The `.auth` property on the returned object from the callback has seen a substantial change in its return type. Below is a code example of where the `auth` prop might be found: ```js import { withServerAuth } from 'gatsby-plugin-clerk/ssr'; export const getServerData: GetServerData = withServerAuth(async props => { - return { props: { data: '1', auth: props.auth } }; + return { props: { data: '...', auth: props.auth } }; }); -// props.auth : v4 exported type -/* -{ - sessionId: string | null; - userId: string | null; - actor: ActJWTClaim | null; - getToken: ServerGetToken; - claims: ClerkJWTClaims | null; -}; -*/ +``` + +And here's a diff of the changes in the return type. The breaking change here specifically is that the property `auth.claims` was changed to `auth.sessionClaims`. Additionally, there is more information on the response that can be utilized if helpful. -// props.auth : v5 exported type -/* -{ - sessionClaims: JwtPayload; - sessionId: string | null; - session: Session | undefined | null; - actor: ActClaim | undefined | null; - userId: string | null; - user: User | undefined | null; - orgId: string | undefined | null; - orgRole: string | undefined | null; - orgSlug: string | undefined | null; - organization: Organization | undefined | null; - getToken: ServerGetToken; - experimental__has: experimental__CheckAuthorizationWithoutPermission; - debug: AuthObjectDebug; -}; -*/ +```diff + // return type diff + { + sessionId: string | null; + userId: string | null; + actor: ActJWTClaim | null; + getToken: ServerGetToken; +- claims: ClerkJWTClaims | null; ++ sessionClaims: JwtPayload; ++ session: Session | undefined | null; ++ user: User | undefined | null; ++ orgId: string | undefined | null; ++ orgRole: string | undefined | null; ++ orgSlug: string | undefined | null; ++ organization: Organization | undefined | null; ++ debug: AuthObjectDebug; + }; ``` diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 3b01580a309..7e6dcfacbf8 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -46,7 +46,6 @@ const reactChangesList = [ 'signoutcallback-to-redirecturl', 'min-react-version', 'getorganizationlist-return-type-change', - 'getorganizationinvitationlist-return-type-change', 'getorganizationmembershiplist-return-type-change', 'organization-getroles-arguments-changed', 'organization-getmemberships-arguments-changed', @@ -56,10 +55,14 @@ const reactChangesList = [ 'user-getorganizationinvitations-arguments-chanaged', 'user-getorganizationsuggestions-arguments-chanaged', 'user-getorganizationmemberships-arguments-chanaged', + 'externalaccount-picture', + 'organizationmembershippublicuserdata-profileimageurl', + 'organization-logourl', + 'user-profileimageurl', ]; export default { - nextjs: load('next', [ + nextjs: load('nextjs', [ 'api-key-to-secret-key', 'frontend-api-to-publishable-key', 'with-clerk-middleware-removed', @@ -136,7 +139,6 @@ export default { 'redirecttosignin-import-path', 'redirecttosignup-import-path', 'getorganizationlist-return-type-change', - 'getorganizationinvitationlist-return-type-change', 'getorganizationmembershiplist-return-type-change', 'organization-getroles-arguments-changed', 'organization-getmemberships-arguments-changed', @@ -146,6 +148,10 @@ export default { 'user-getorganizationinvitations-arguments-chanaged', 'user-getorganizationsuggestions-arguments-chanaged', 'user-getorganizationmemberships-arguments-chanaged', + 'externalaccount-picture', + 'organizationmembershippublicuserdata-profileimageurl', + 'organization-logourl', + 'user-profileimageurl', ]), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes @@ -184,7 +190,6 @@ export default { 'signoutcallback-to-redirecturl', 'clerk-import-change', 'getorganizationlist-return-type-change', - 'getorganizationinvitationlist-return-type-change', 'getorganizationmembershiplist-return-type-change', 'organization-getroles-arguments-changed', 'organization-getmemberships-arguments-changed', @@ -194,6 +199,10 @@ export default { 'user-getorganizationinvitations-arguments-chanaged', 'user-getorganizationsuggestions-arguments-chanaged', 'user-getorganizationmemberships-arguments-chanaged', + 'externalaccount-picture', + 'organizationmembershippublicuserdata-profileimageurl', + 'organization-logourl', + 'user-profileimageurl', ]), expo: load('expo', [ 'apikey-to-publishable-key', @@ -218,8 +227,11 @@ export default { 'changed-localization-keys', 'signoutcallback-to-redirecturl', 'getorganizationlist-return-type-change', - 'getorganizationinvitationlist-return-type-change', 'getorganizationmembershiplist-return-type-change', + 'externalaccount-picture', + 'organization-logourl', + 'organizationmembershippublicuserdata-profileimageurl', + 'user-profileimageurl', ]), fastify: load('fastify', [ 'api-key-to-secret-key', @@ -229,6 +241,10 @@ export default { 'createclerkclient-frontendapi', 'clerkplugin-frontendapi', 'clerk-import-change', + 'externalaccount-picture', + 'organization-logourl', + 'organizationmembershippublicuserdata-profileimageurl', + 'user-profileimageurl', ]), node: load('node', [ 'api-key-to-secret-key', @@ -251,6 +267,10 @@ export default { 'cjs-esm-instance', 'legacyauthobject-removed', 'clerk-import-change', + 'externalaccount-picture', + 'organization-logourl', + 'organizationmembershippublicuserdata-profileimageurl', + 'user-profileimageurl', ]), react: load('react', reactChangesList), js: load('js', [ @@ -259,9 +279,9 @@ export default { 'magiclinkerrorcode', 'usemagiclink', 'handlemagiclinkverification', - 'external-account-avatarurl', // shared w/ all - 'organization-logourl', // shared w/ all - 'user-orgpublicdata-profileimageurl', // shared w/ all + 'external-account-avatarurl', + 'organization-logourl', + 'user-orgpublicdata-profileimageurl', 'setsession', 'user-update-password', // shared w/ all 'experimental-canusecaptcha', @@ -301,6 +321,9 @@ export default { 'removed-localization-keys', 'changed-localization-keys', 'signoutcallback-to-redirecturl', + 'externalaccount-picture', + 'organizationmembershippublicuserdata-profileimageurl', + 'user-profileimageurl', ]), shared: load('shared', [ 'magiclinkerror', diff --git a/packages/upgrade/source/versions/v5/js/experimental-canusecaptcha.md b/packages/upgrade/source/versions/v5/js/experimental-canusecaptcha.md index 1984d0af4e4..ae0154b3bde 100644 --- a/packages/upgrade/source/versions/v5/js/experimental-canusecaptcha.md +++ b/packages/upgrade/source/versions/v5/js/experimental-canusecaptcha.md @@ -1,5 +1,6 @@ --- title: '`Clerk.experimental_canUseCaptcha` property removed' +category: 'deprecation-removal' matcher: 'experimental_canUseCaptcha' --- diff --git a/packages/upgrade/source/versions/v5/js/experimental-captchasitekey.md b/packages/upgrade/source/versions/v5/js/experimental-captchasitekey.md index 4de4c459a51..125f50a918d 100644 --- a/packages/upgrade/source/versions/v5/js/experimental-captchasitekey.md +++ b/packages/upgrade/source/versions/v5/js/experimental-captchasitekey.md @@ -1,5 +1,6 @@ --- title: '`Clerk.experimental_captchaSiteKey` property removed' +category: 'deprecation-removal' matcher: 'experimental_captchaSiteKey' --- diff --git a/packages/upgrade/source/versions/v5/js/experimental-captchaurl.md b/packages/upgrade/source/versions/v5/js/experimental-captchaurl.md index ea42f8fca43..6ff3554d046 100644 --- a/packages/upgrade/source/versions/v5/js/experimental-captchaurl.md +++ b/packages/upgrade/source/versions/v5/js/experimental-captchaurl.md @@ -1,5 +1,6 @@ --- title: '`Clerk.experimental_captchaURL` property removed' +category: 'deprecation-removal' matcher: 'experimental_captchaURL' --- diff --git a/packages/upgrade/source/versions/v5/js/getorganizationmemberships.md b/packages/upgrade/source/versions/v5/js/getorganizationmemberships.md index fddd261ec46..e3a5eea7e3b 100644 --- a/packages/upgrade/source/versions/v5/js/getorganizationmemberships.md +++ b/packages/upgrade/source/versions/v5/js/getorganizationmemberships.md @@ -5,10 +5,7 @@ matcher: "Clerk.getOrganizationMemberships\\(" The `getOrganizationMemberships` [method on the `Clerk` class](https://clerk.com/docs/references/javascript/clerk/clerk#organization) has been removed. Instead, use `getOrganizationMemberships` on a user instance. -```js -// before -Clerk.getOrganizationMemberships(); - -// after -user.getOrganizationMemberships(); +```diff +- Clerk.getOrganizationMemberships(); ++ user.getOrganizationMemberships(); ``` diff --git a/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md b/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md index bcd0aab6413..7c3415b9c95 100644 --- a/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md +++ b/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md @@ -1,6 +1,7 @@ --- title: '`generatedSignature` -> `signature` as param of Signup.attemptWeb3WalletVerification()' matcher: "attemptWeb3WalletVerification\\([\\s\\S]*?generatedSignature:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- @@ -9,7 +10,7 @@ The `generatedSignature` param to [`Signup.attemptWeb3WalletVerification()`](htt ```js // before s.attemptWeb3WalletVerification({ - generatedSignature: async () => 'signatureString', + generatedSignature: async () => 'signatureString', }); // after diff --git a/packages/upgrade/source/versions/v5/js/unstable-invitationupdate.md b/packages/upgrade/source/versions/v5/js/unstable-invitationupdate.md index 3f7cb901be2..3b53149e28e 100644 --- a/packages/upgrade/source/versions/v5/js/unstable-invitationupdate.md +++ b/packages/upgrade/source/versions/v5/js/unstable-invitationupdate.md @@ -1,5 +1,6 @@ --- title: '`Clerk.__unstable__invitationUpdate` removed' +category: 'deprecation-removal' matcher: '__unstable__invitationUpdate' --- diff --git a/packages/upgrade/source/versions/v5/js/unstable-membershipupdate.md b/packages/upgrade/source/versions/v5/js/unstable-membershipupdate.md index 7442b7a0541..c013fa6caa3 100644 --- a/packages/upgrade/source/versions/v5/js/unstable-membershipupdate.md +++ b/packages/upgrade/source/versions/v5/js/unstable-membershipupdate.md @@ -1,5 +1,6 @@ --- title: '`Clerk.__unstable__membershipUpdate` removed' +category: 'deprecation-removal' matcher: '__unstable__membershipUpdate' --- diff --git a/packages/upgrade/source/versions/v5/js/user-createexternalaccount-redirecturl.md b/packages/upgrade/source/versions/v5/js/user-createexternalaccount-redirecturl.md index 0d10932b0a6..36e23f8efd4 100644 --- a/packages/upgrade/source/versions/v5/js/user-createexternalaccount-redirecturl.md +++ b/packages/upgrade/source/versions/v5/js/user-createexternalaccount-redirecturl.md @@ -1,6 +1,7 @@ --- title: '`redirect_url` -> `redirectUrl` as param of `User.createExternalAccount`' matcher: "createExternalAccount\\(\\s*{[\\s\\S]*?(redirect_url):[\\s\\S]*?\\)" +category: 'deprecation-removal' replaceWithString: 'redirectUrl' --- diff --git a/packages/upgrade/source/versions/v5/js/user-update-password.md b/packages/upgrade/source/versions/v5/js/user-update-password.md index 98f3327ded3..9d87692f9a9 100644 --- a/packages/upgrade/source/versions/v5/js/user-update-password.md +++ b/packages/upgrade/source/versions/v5/js/user-update-password.md @@ -1,19 +1,18 @@ --- title: "`User.update({ password: 'x' })` -> `User.updatePassword('x')`" matcher: "\\.update\\([\\s\\S]*?password:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- If you are updating a user's password via the [`User.update` method](https://clerk.com/docs/references/javascript/user/user#update), it must be changed to [`User.updatePassword`](https://clerk.com/docs/references/javascript/user/password-management#update-password) instead. This method will require the current password as well as the desired new password. We made this update to improve the security of password changes. Example below: -```js -// before -user.update({ password: 'foo' }); +```diff +- user.update({ password: 'foo' }); -// after -user.updatePassword({ - currentPassword: 'bar', - newPassword: 'foo', - signOutOfOtherSessions: true, -}); ++ user.updatePassword({ ++ currentPassword: 'bar', ++ newPassword: 'foo', ++ signOutOfOtherSessions: true, ++ }); ``` diff --git a/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md deleted file mode 100644 index b6d7d4b72bd..00000000000 --- a/packages/upgrade/source/versions/v5/next/ismetamaskerror-import-change.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: '`isMetamaskError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" -matcherFlags: 'm' -category: 'top-level-imports' -replaceWithString: 'nextjs/errors' ---- - -The `isMetamaskError` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - -```diff -- import { isMetamaskError } from "@clerk/nextjs" -+ import { isMetamaskError } from "@clerk/nextjs/errors" -``` diff --git a/packages/upgrade/source/versions/v5/next/api-url-value-change.md b/packages/upgrade/source/versions/v5/nextjs/api-url-value-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/api-url-value-change.md rename to packages/upgrade/source/versions/v5/nextjs/api-url-value-change.md diff --git a/packages/upgrade/source/versions/v5/next/auth-import-change.md b/packages/upgrade/source/versions/v5/nextjs/auth-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/auth-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/auth-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md b/packages/upgrade/source/versions/v5/nextjs/auth-middleware-deprecated.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/auth-middleware-deprecated.md rename to packages/upgrade/source/versions/v5/nextjs/auth-middleware-deprecated.md diff --git a/packages/upgrade/source/versions/v5/next/authmiddleware-apikey.md b/packages/upgrade/source/versions/v5/nextjs/authmiddleware-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/authmiddleware-apikey.md rename to packages/upgrade/source/versions/v5/nextjs/authmiddleware-apikey.md diff --git a/packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md b/packages/upgrade/source/versions/v5/nextjs/authmiddleware-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/authmiddleware-frontendapi.md rename to packages/upgrade/source/versions/v5/nextjs/authmiddleware-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md b/packages/upgrade/source/versions/v5/nextjs/authmiddleware-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/authmiddleware-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/authmiddleware-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md b/packages/upgrade/source/versions/v5/nextjs/buildclerkprops-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/buildclerkprops-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/buildclerkprops-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/clerk-import-change.md b/packages/upgrade/source/versions/v5/nextjs/clerk-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/clerk-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/clerk-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/clerk-js-version-next-public.md b/packages/upgrade/source/versions/v5/nextjs/clerk-js-version-next-public.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/clerk-js-version-next-public.md rename to packages/upgrade/source/versions/v5/nextjs/clerk-js-version-next-public.md diff --git a/packages/upgrade/source/versions/v5/next/constants-import-change.md b/packages/upgrade/source/versions/v5/nextjs/constants-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/constants-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/constants-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md b/packages/upgrade/source/versions/v5/nextjs/createauthenticaterequest-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/createauthenticaterequest-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/createauthenticaterequest-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/nextjs/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/createclerkclient-apikey.md rename to packages/upgrade/source/versions/v5/nextjs/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/nextjs/createclerkclient-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/createclerkclient-frontendapi.md rename to packages/upgrade/source/versions/v5/nextjs/createclerkclient-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md b/packages/upgrade/source/versions/v5/nextjs/createisomorphicrequest-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/createisomorphicrequest-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/createisomorphicrequest-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/currentuser-import-change.md b/packages/upgrade/source/versions/v5/nextjs/currentuser-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/currentuser-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/currentuser-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/decodejwt-import-change.md b/packages/upgrade/source/versions/v5/nextjs/decodejwt-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/decodejwt-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/decodejwt-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/v5/nextjs/emaillinkerrorcode-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/emaillinkerrorcode-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/emaillinkerrorcode-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/getauth-apikey.md b/packages/upgrade/source/versions/v5/nextjs/getauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/getauth-apikey.md rename to packages/upgrade/source/versions/v5/nextjs/getauth-apikey.md diff --git a/packages/upgrade/source/versions/v5/next/import-api-url.md b/packages/upgrade/source/versions/v5/nextjs/import-api-url.md similarity index 71% rename from packages/upgrade/source/versions/v5/next/import-api-url.md rename to packages/upgrade/source/versions/v5/nextjs/import-api-url.md index 13af568a9e2..9fde625ea10 100644 --- a/packages/upgrade/source/versions/v5/next/import-api-url.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-api-url.md @@ -5,4 +5,4 @@ category: 'deprecation-removal' matcherFlags: 'm' --- -This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `CLERK_API_URL` environment variable and using this instead. +This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `CLERK_API_URL` environment variable. diff --git a/packages/upgrade/source/versions/v5/next/import-api-version.md b/packages/upgrade/source/versions/v5/nextjs/import-api-version.md similarity index 71% rename from packages/upgrade/source/versions/v5/next/import-api-version.md rename to packages/upgrade/source/versions/v5/nextjs/import-api-version.md index 39cd25fdc78..171b8312ccc 100644 --- a/packages/upgrade/source/versions/v5/next/import-api-version.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-api-version.md @@ -5,4 +5,4 @@ category: 'deprecation-removal' matcherFlags: 'm' --- -This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `CLERK_API_VERSION` environment variable and using this instead. +This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `CLERK_API_VERSION` environment variable. diff --git a/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md b/packages/upgrade/source/versions/v5/nextjs/import-clerk-js-url.md similarity index 71% rename from packages/upgrade/source/versions/v5/next/import-clerk-js-url.md rename to packages/upgrade/source/versions/v5/nextjs/import-clerk-js-url.md index 4fa0701413c..2c3cf9a6f15 100644 --- a/packages/upgrade/source/versions/v5/next/import-clerk-js-url.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-clerk-js-url.md @@ -5,4 +5,4 @@ category: 'deprecation-removal' matcherFlags: 'm' --- -This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_JS` environment variable and using this instead. +This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_JS` environment variable. diff --git a/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md b/packages/upgrade/source/versions/v5/nextjs/import-clerk-js-version.md similarity index 70% rename from packages/upgrade/source/versions/v5/next/import-clerk-js-version.md rename to packages/upgrade/source/versions/v5/nextjs/import-clerk-js-version.md index 5c445632ea3..14a4333d126 100644 --- a/packages/upgrade/source/versions/v5/next/import-clerk-js-version.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-clerk-js-version.md @@ -5,4 +5,4 @@ category: 'deprecation-removal' matcherFlags: 'm' --- -This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_JS_VERSION` environment variable and using this instead. +This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_JS_VERSION` environment variable. diff --git a/packages/upgrade/source/versions/v5/next/import-domain.md b/packages/upgrade/source/versions/v5/nextjs/import-domain.md similarity index 69% rename from packages/upgrade/source/versions/v5/next/import-domain.md rename to packages/upgrade/source/versions/v5/nextjs/import-domain.md index d9883a4600f..9b6879d0fce 100644 --- a/packages/upgrade/source/versions/v5/next/import-domain.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-domain.md @@ -5,4 +5,4 @@ category: 'deprecation-removal' matcherFlags: 'm' --- -This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_DOMAIN` environment variable and using this instead. +This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_DOMAIN` environment variable. diff --git a/packages/upgrade/source/versions/v5/next/import-is-satellite.md b/packages/upgrade/source/versions/v5/nextjs/import-is-satellite.md similarity index 69% rename from packages/upgrade/source/versions/v5/next/import-is-satellite.md rename to packages/upgrade/source/versions/v5/nextjs/import-is-satellite.md index 5cf08339085..a165650c9c6 100644 --- a/packages/upgrade/source/versions/v5/next/import-is-satellite.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-is-satellite.md @@ -5,4 +5,4 @@ category: 'deprecation-removal' matcherFlags: 'm' --- -This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_IS_SATELLITE` environment variable and using this instead. +This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_IS_SATELLITE` environment variable. diff --git a/packages/upgrade/source/versions/v5/next/import-nextjs-api.md b/packages/upgrade/source/versions/v5/nextjs/import-nextjs-api.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/import-nextjs-api.md rename to packages/upgrade/source/versions/v5/nextjs/import-nextjs-api.md diff --git a/packages/upgrade/source/versions/v5/next/import-nextjs-app-beta.md b/packages/upgrade/source/versions/v5/nextjs/import-nextjs-app-beta.md similarity index 89% rename from packages/upgrade/source/versions/v5/next/import-nextjs-app-beta.md rename to packages/upgrade/source/versions/v5/nextjs/import-nextjs-app-beta.md index 15f9c68d365..baf331c131f 100644 --- a/packages/upgrade/source/versions/v5/next/import-nextjs-app-beta.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-nextjs-app-beta.md @@ -8,4 +8,4 @@ If you are using the `@clerk/nextjs/app-beta` import anywhere, it should use `@ Make this change carefully as some behavior may have changed between our beta and stable releases. You can refer to [our documentation](https://clerk.com/docs/quickstarts/nextjs) and/or [approuter example](https://github.com/clerk/clerk-nextjs-app-quickstart) for up-to-date usage. -The `@clerk/nextjs` import will work with both app router and pages router. +The `@clerk/nextjs` import will work with both App Router and Pages Router. diff --git a/packages/upgrade/source/versions/v5/next/import-nextjs-edge-middleware.md b/packages/upgrade/source/versions/v5/nextjs/import-nextjs-edge-middleware.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/import-nextjs-edge-middleware.md rename to packages/upgrade/source/versions/v5/nextjs/import-nextjs-edge-middleware.md diff --git a/packages/upgrade/source/versions/v5/next/import-nextjs-edge-middlewarefiles.md b/packages/upgrade/source/versions/v5/nextjs/import-nextjs-edge-middlewarefiles.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/import-nextjs-edge-middlewarefiles.md rename to packages/upgrade/source/versions/v5/nextjs/import-nextjs-edge-middlewarefiles.md diff --git a/packages/upgrade/source/versions/v5/next/import-nextjs-ssr.md b/packages/upgrade/source/versions/v5/nextjs/import-nextjs-ssr.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/import-nextjs-ssr.md rename to packages/upgrade/source/versions/v5/nextjs/import-nextjs-ssr.md diff --git a/packages/upgrade/source/versions/v5/next/import-proxy-url.md b/packages/upgrade/source/versions/v5/nextjs/import-proxy-url.md similarity index 69% rename from packages/upgrade/source/versions/v5/next/import-proxy-url.md rename to packages/upgrade/source/versions/v5/nextjs/import-proxy-url.md index 67c18dbb21c..625c09641ad 100644 --- a/packages/upgrade/source/versions/v5/next/import-proxy-url.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-proxy-url.md @@ -5,4 +5,4 @@ category: 'deprecation-removal' matcherFlags: 'm' --- -This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_PROXY_URL` environment variable and using this instead. +This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_PROXY_URL` environment variable. diff --git a/packages/upgrade/source/versions/v5/next/import-publishable-key.md b/packages/upgrade/source/versions/v5/nextjs/import-publishable-key.md similarity index 69% rename from packages/upgrade/source/versions/v5/next/import-publishable-key.md rename to packages/upgrade/source/versions/v5/nextjs/import-publishable-key.md index 06d7bbd5a28..698e96fd067 100644 --- a/packages/upgrade/source/versions/v5/next/import-publishable-key.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-publishable-key.md @@ -5,4 +5,4 @@ category: 'deprecation-removal' matcherFlags: 'm' --- -This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` environment variable and using this instead. +This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` environment variable. diff --git a/packages/upgrade/source/versions/v5/next/import-secret-key.md b/packages/upgrade/source/versions/v5/nextjs/import-secret-key.md similarity index 71% rename from packages/upgrade/source/versions/v5/next/import-secret-key.md rename to packages/upgrade/source/versions/v5/nextjs/import-secret-key.md index 1ba3f580c3e..7e1f9b5fb77 100644 --- a/packages/upgrade/source/versions/v5/next/import-secret-key.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-secret-key.md @@ -5,4 +5,4 @@ category: 'deprecation-removal' matcherFlags: 'm' --- -This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `CLERK_SECRET_KEY` environment variable and using this instead. +This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `CLERK_SECRET_KEY` environment variable. diff --git a/packages/upgrade/source/versions/v5/next/import-sign-in-url.md b/packages/upgrade/source/versions/v5/nextjs/import-sign-in-url.md similarity index 69% rename from packages/upgrade/source/versions/v5/next/import-sign-in-url.md rename to packages/upgrade/source/versions/v5/nextjs/import-sign-in-url.md index 4d6823e4775..baee6fc24ad 100644 --- a/packages/upgrade/source/versions/v5/next/import-sign-in-url.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-sign-in-url.md @@ -5,4 +5,4 @@ category: 'deprecation-removal' matcherFlags: 'm' --- -This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_SIGN_IN_URL` environment variable and using this instead. +This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_SIGN_IN_URL` environment variable. diff --git a/packages/upgrade/source/versions/v5/next/import-sign-up-url.md b/packages/upgrade/source/versions/v5/nextjs/import-sign-up-url.md similarity index 69% rename from packages/upgrade/source/versions/v5/next/import-sign-up-url.md rename to packages/upgrade/source/versions/v5/nextjs/import-sign-up-url.md index 80d34cffd51..985d08829a8 100644 --- a/packages/upgrade/source/versions/v5/next/import-sign-up-url.md +++ b/packages/upgrade/source/versions/v5/nextjs/import-sign-up-url.md @@ -5,4 +5,4 @@ category: 'deprecation-removal' matcherFlags: 'm' --- -This deprecated constant has been removed as an export from `@clerk/nextjs`. We recommend setting the `NEXT_PUBLIC_CLERK_SIGN_UP_URL` environment variable and using this instead. +This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_SIGN_UP_URL` environment variable. diff --git a/packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/v5/nextjs/isclerkapiresponserror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/isclerkapiresponserror-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/isclerkapiresponserror-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/v5/nextjs/isemaillinkerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/isemaillinkerror-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/isemaillinkerror-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/isknownerror-import-change.md b/packages/upgrade/source/versions/v5/nextjs/isknownerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/isknownerror-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/isknownerror-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/min-nextjs-version.md b/packages/upgrade/source/versions/v5/nextjs/min-nextjs-version.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/min-nextjs-version.md rename to packages/upgrade/source/versions/v5/nextjs/min-nextjs-version.md diff --git a/packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/v5/nextjs/multisessionappsupport-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/multisessionappsupport-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/multisessionappsupport-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/next-public-clerk-js-url.md b/packages/upgrade/source/versions/v5/nextjs/next-public-clerk-js-url.md similarity index 62% rename from packages/upgrade/source/versions/v5/next/next-public-clerk-js-url.md rename to packages/upgrade/source/versions/v5/nextjs/next-public-clerk-js-url.md index 33a98b094ea..775e21a9535 100644 --- a/packages/upgrade/source/versions/v5/next/next-public-clerk-js-url.md +++ b/packages/upgrade/source/versions/v5/nextjs/next-public-clerk-js-url.md @@ -4,4 +4,4 @@ category: 'deprecation-removal' matcher: 'NEXT_PUBLIC_CLERK_JS[^_]*$' --- -If you are using `NEXT_PUBLIC_CLERK_JS` as an environment variable, it should be changed to `NEXT_PUBLIC_CLERK_JS_URL` instead. We renamed this variable for consistency across public APIs. Make sure to also check your production host configuration when changing environment variable values. +If you are using `NEXT_PUBLIC_CLERK_JS` as an environment variable, it should be changed to `NEXT_PUBLIC_CLERK_JS_URL` instead. This variable was renamed for consistency across public APIs. Make sure to also check your production host configuration when changing environment variable values. diff --git a/packages/upgrade/source/versions/v5/next/redirect-import-change.md b/packages/upgrade/source/versions/v5/nextjs/redirect-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/redirect-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/redirect-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/redirecttosignin-import-path.md b/packages/upgrade/source/versions/v5/nextjs/redirecttosignin-import-path.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/redirecttosignin-import-path.md rename to packages/upgrade/source/versions/v5/nextjs/redirecttosignin-import-path.md diff --git a/packages/upgrade/source/versions/v5/next/redirecttosignup-import-path.md b/packages/upgrade/source/versions/v5/nextjs/redirecttosignup-import-path.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/redirecttosignup-import-path.md rename to packages/upgrade/source/versions/v5/nextjs/redirecttosignup-import-path.md diff --git a/packages/upgrade/source/versions/v5/next/signjwt-import-change.md b/packages/upgrade/source/versions/v5/nextjs/signjwt-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/signjwt-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/signjwt-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md b/packages/upgrade/source/versions/v5/nextjs/verifyjwt-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/verifyjwt-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/verifyjwt-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/verifytoken-import-change.md b/packages/upgrade/source/versions/v5/nextjs/verifytoken-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/verifytoken-import-change.md rename to packages/upgrade/source/versions/v5/nextjs/verifytoken-import-change.md diff --git a/packages/upgrade/source/versions/v5/next/with-clerk-middleware-removed.md b/packages/upgrade/source/versions/v5/nextjs/with-clerk-middleware-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/next/with-clerk-middleware-removed.md rename to packages/upgrade/source/versions/v5/nextjs/with-clerk-middleware-removed.md diff --git a/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md b/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md index 34c750541bf..9d793230650 100644 --- a/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md +++ b/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md @@ -1,6 +1,7 @@ --- title: '`cjs/instance` and `esm/instance` imports no longer needed' matcher: "@clerk\\/clerk-sdk-node(\\/(?:cjs|esm)\\/instance)" +category: 'cjs-esm-instance' replaceWithString: '' --- diff --git a/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-apikey.md b/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-apikey.md index 88df6bb6aea..356b099dcb9 100644 --- a/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-apikey.md +++ b/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-apikey.md @@ -1,6 +1,7 @@ --- title: '`apiKey` -> `secretKey` as param to ClerkExpressRequireAuth' matcher: "ClerkExpressRequireAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-frontendapi.md b/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-frontendapi.md index 1a0a27d9078..69d97497c23 100644 --- a/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-frontendapi.md +++ b/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-frontendapi.md @@ -1,6 +1,7 @@ --- title: '`frontendApi` -> `publishableKey` as param to ClerkExpressRequireAuth' matcher: "ClerkExpressRequireAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-apikey.md b/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-apikey.md index 2125bf6419d..2f101fe82d3 100644 --- a/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-apikey.md +++ b/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-apikey.md @@ -1,6 +1,7 @@ --- title: '`apiKey` -> `secretKey` as param to ClerkExpressWithAuth' matcher: "ClerkExpressWithAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-frontendapi.md b/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-frontendapi.md index fad141fa71c..c6fe6cdda11 100644 --- a/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-frontendapi.md +++ b/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-frontendapi.md @@ -1,6 +1,7 @@ --- title: '`frontendApi` -> `publishableKey` as param to ClerkExpressWithAuth' matcher: "ClerkExpressWithAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/node/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/node/createclerkclient-apikey.md index 415a7aba2cc..80b775f188c 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/node/createclerkclient-apikey.md @@ -1,6 +1,7 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkClient' matcher: "createClerkClient\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/node/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/node/createclerkclient-frontendapi.md index 76bee754ae8..7404774138c 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/node/createclerkclient-frontendapi.md @@ -1,6 +1,7 @@ --- title: '`frontendApi` -> `publishableKey` as param to createClerkClient' matcher: "createClerkClient\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-apikey.md b/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-apikey.md index 626bb7781ef..01e9fe2ecc9 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-apikey.md +++ b/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-apikey.md @@ -1,6 +1,7 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkExpressRequireAuth' matcher: "createClerkExpressRequireAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-frontendapi.md b/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-frontendapi.md index b6e6521561e..f9ed98e0660 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-frontendapi.md +++ b/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-frontendapi.md @@ -1,6 +1,7 @@ --- title: '`frontendApi` -> `publishableKey` as param to createClerkExpressRequireAuth' matcher: "createClerkExpressRequireAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-apikey.md b/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-apikey.md index 55155fb6de6..85db74f2d8f 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-apikey.md +++ b/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-apikey.md @@ -1,6 +1,7 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkExpressWithAuth' matcher: "createClerkExpressWithAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-frontendapi.md b/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-frontendapi.md index 1eb81b56ab8..743a5d3dd6b 100644 --- a/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-frontendapi.md +++ b/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-frontendapi.md @@ -1,6 +1,7 @@ --- title: '`frontendApi` -> `publishableKey` as param to createClerkExpressWithAuth' matcher: "createClerkExpressWithAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md b/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md index fdc64dada27..0d6056c7e7c 100644 --- a/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md +++ b/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md @@ -14,7 +14,7 @@ We changed the values that our middleware adds to the `request` object after r getToken: ServerGetToken | null; debug: AuthObjectDebug | null; - claims: JwtPayload | null; -- sessionClaims: JwtPayload | null; ++ sessionClaims: JwtPayload | null; + orgId: string | undefined | null; + orgRole: OrganizationCustomRoleKey | undefined | null; + orgSlug: string | undefined | null; diff --git a/packages/upgrade/source/versions/v5/node/setclerkapikey.md b/packages/upgrade/source/versions/v5/node/setclerkapikey.md index 83771d97835..5f1ff8b921b 100644 --- a/packages/upgrade/source/versions/v5/node/setclerkapikey.md +++ b/packages/upgrade/source/versions/v5/node/setclerkapikey.md @@ -1,6 +1,7 @@ --- title: '`setClerkApiKey` removed, pass `secretKey` to `createClerkClient` instead' matcher: "setClerkApiKey\\(" +category: 'setter-removal' --- Setters that change options on the singleton `clerkClient` instance have been removed. Instead, pass the option directly to `createClerkClient` - see [the documentation](https://clerk.com/docs/references/nodejs/overview#customizing-resources) for more detail. Note that the name `apiKey` should now be `secretKey` as well. diff --git a/packages/upgrade/source/versions/v5/node/setclerkapiversion.md b/packages/upgrade/source/versions/v5/node/setclerkapiversion.md index 1c0ec77a4fe..08b19ea75c0 100644 --- a/packages/upgrade/source/versions/v5/node/setclerkapiversion.md +++ b/packages/upgrade/source/versions/v5/node/setclerkapiversion.md @@ -1,6 +1,7 @@ --- title: '`setClerkApiVersion` removed, pass options to `createClerkClient` instead' matcher: "setClerkApiVersion\\(" +category: 'setter-removal' --- Setters that change options on the singleton `clerkClient` instance have been removed. Instead, pass the option directly to `createClerkClient` - see [the documentation](https://clerk.com/docs/references/nodejs/overview#customizing-resources) for more detail. diff --git a/packages/upgrade/source/versions/v5/node/setclerkhttpoptions.md b/packages/upgrade/source/versions/v5/node/setclerkhttpoptions.md index b6199adef02..9f7cd7ae243 100644 --- a/packages/upgrade/source/versions/v5/node/setclerkhttpoptions.md +++ b/packages/upgrade/source/versions/v5/node/setclerkhttpoptions.md @@ -1,6 +1,7 @@ --- title: '`setClerkHttpOptions` removed, pass options to `createClerkClient` instead' matcher: "setClerkHttpOptions\\(" +category: 'setter-removal' --- Setters that change options on the singleton `clerkClient` instance have been removed. Instead, pass the option directly to `createClerkClient` - see [the documentation](https://clerk.com/docs/references/nodejs/overview#customizing-resources) for more detail. diff --git a/packages/upgrade/source/versions/v5/node/setclerkserverapiurl.md b/packages/upgrade/source/versions/v5/node/setclerkserverapiurl.md index 6ffce520cc0..7d9c3ac6b34 100644 --- a/packages/upgrade/source/versions/v5/node/setclerkserverapiurl.md +++ b/packages/upgrade/source/versions/v5/node/setclerkserverapiurl.md @@ -1,6 +1,7 @@ --- title: '`setClerkServerApiUrl` removed, pass options to `createClerkClient` instead' matcher: "setClerkServerApiUrl\\(" +category: 'setter-removal' --- Setters that change options on the singleton `clerkClient` instance have been removed. Instead, pass the option directly to `createClerkClient` - see [the documentation](https://clerk.com/docs/references/nodejs/overview#customizing-resources) for more detail. diff --git a/packages/upgrade/source/versions/v5/react/api-url-value-change.md b/packages/upgrade/source/versions/v5/react/api-url-value-change.md index 95b8beb227b..ff1f8dea792 100644 --- a/packages/upgrade/source/versions/v5/react/api-url-value-change.md +++ b/packages/upgrade/source/versions/v5/react/api-url-value-change.md @@ -5,4 +5,4 @@ matcherFlags: 'm' warning: true --- -- The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. +The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/versions/v5/remix/clerk-import-change.md b/packages/upgrade/source/versions/v5/remix/clerk-import-change.md index 275f89e74ef..c1a2a5a5226 100644 --- a/packages/upgrade/source/versions/v5/remix/clerk-import-change.md +++ b/packages/upgrade/source/versions/v5/remix/clerk-import-change.md @@ -1,6 +1,7 @@ --- title: '`Clerk` -> `{ createClerkClient }`' matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/remix[\\s\\S]*?['\"]" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md b/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md index cfb9db7aa08..0c426409999 100644 --- a/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md +++ b/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md @@ -1,6 +1,7 @@ --- title: '`ClerkErrorBoundary` removed' matcher: "import\\s+{[\\s\\S]*?ClerkErrorBoundary[\\s\\S]*?from\\s+['\"]@clerk\\/remix[\\s\\S]*?['\"]" +category: 'error-boundary-removed' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/remix/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/remix/createclerkclient-apikey.md index 59eadf567c9..b5283b868aa 100644 --- a/packages/upgrade/source/versions/v5/remix/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/remix/createclerkclient-apikey.md @@ -1,6 +1,7 @@ --- title: '`apiKey` -> `secretKey` as argument to createClerkClient' matcher: "createClerkClient\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/remix/getauth-apikey.md b/packages/upgrade/source/versions/v5/remix/getauth-apikey.md index a6f5130122f..6b2452ed93b 100644 --- a/packages/upgrade/source/versions/v5/remix/getauth-apikey.md +++ b/packages/upgrade/source/versions/v5/remix/getauth-apikey.md @@ -1,6 +1,7 @@ --- title: '`apiKey` -> `secretKey` as argument to getAuth' matcher: "getAuth\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/remix/rootauthloader-apikey.md b/packages/upgrade/source/versions/v5/remix/rootauthloader-apikey.md index 9aa3075277f..27764132975 100644 --- a/packages/upgrade/source/versions/v5/remix/rootauthloader-apikey.md +++ b/packages/upgrade/source/versions/v5/remix/rootauthloader-apikey.md @@ -1,6 +1,7 @@ --- title: '`apiKey` -> `secretKey` as argument to rootAuthLoader' matcher: "rootAuthLoader\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/remix/rootauthloader-frontendapi.md b/packages/upgrade/source/versions/v5/remix/rootauthloader-frontendapi.md index bdba7ecd7f2..22c78f2af0a 100644 --- a/packages/upgrade/source/versions/v5/remix/rootauthloader-frontendapi.md +++ b/packages/upgrade/source/versions/v5/remix/rootauthloader-frontendapi.md @@ -1,6 +1,7 @@ --- title: '`frontendApi` -> `publishableKey` as argument to rootAuthLoader' matcher: "rootAuthLoader\\({[\\s\\S]*?frontendApi:[\\s\\S]*?}\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- From ee61be86c97f202653c084ff2c5dbbc0b6d08121 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 13 Feb 2024 17:03:45 -0500 Subject: [PATCH 098/159] feat(upgrade): Finish guide generation, adjust change item organization a bit --- .../guide-generators/v5/backend/__output.mdx | 588 ++++++++++++++++++ .../v5/backend/import-paths.mdx | 3 + .../guide-generators/v5/backend/index.js | 56 +- .../guide-generators/v5/backend/intro.mdx | 3 + .../v5/chromeExtension/__output.mdx | 245 ++++++++ .../v5/chromeExtension/index.js | 44 ++ .../v5/chromeExtension/intro.mdx | 3 + .../guide-generators/v5/nextjs/index.js | 4 +- .../source/guide-generators/v5/node/index.js | 2 +- .../source/guide-generators/v5/react/index.js | 4 +- .../guide-generators/v5/retheme/index.js | 2 +- .../v5/{js => shared}/pagination-args.mdx | 0 .../v5/{js => shared}/pagination-return.mdx | 0 .../v5/backend/constants-import-path-move.md | 1 + ...ateauthenticaterequest-import-path-move.md | 1 + .../v5/backend/createclerkclient-apikey.md | 1 + .../backend/createclerkclient-frontendapi.md | 1 + ...reateisomorphicrequest-import-path-move.md | 1 + .../createisomorphicrequest-removed.md | 1 + .../v5/backend/decodeJwt-import-path-move.md | 1 + .../externalaccount-picture.md | 0 .../v5/backend/redirect-import-path-move.md | 1 + .../v5/backend/signjwt-import-path-move.md | 1 + .../v5/backend/signjwterror-import-move.md | 1 + .../tokenverificationerror-import-move.md | 1 + ...okenverificationerroraction-import-move.md | 1 + .../tokenverificationerrorcode-import-move.md | 1 + ...okenverificationerrorreason-import-move.md | 1 + .../v5/backend/verifyjwt-import-path-move.md | 1 + .../clerkprovider-tokencache.md | 17 +- .../v5/common/externalaccount-avatarurl.md | 7 + .../externalaccountjson-avatarurl.md | 0 ...nizationinvitationlist-return-signature.md | 0 ...zationinvitationlist-return-type-change.md | 11 +- .../getorganizationlist-return-signature.md | 0 ...anizationinvitations-arguments-changed.md} | 0 ...anizationmemberships-arguments-changed.md} | 0 ...anizationsuggestions-arguments-changed.md} | 0 packages/upgrade/source/versions/v5/index.js | 577 +++++++++-------- 39 files changed, 1254 insertions(+), 327 deletions(-) create mode 100644 packages/upgrade/source/guide-generators/v5/backend/__output.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/backend/import-paths.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/backend/intro.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/chromeExtension/__output.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/chromeExtension/index.js create mode 100644 packages/upgrade/source/guide-generators/v5/chromeExtension/intro.mdx rename packages/upgrade/source/guide-generators/v5/{js => shared}/pagination-args.mdx (100%) rename packages/upgrade/source/guide-generators/v5/{js => shared}/pagination-return.mdx (100%) rename packages/upgrade/source/versions/v5/{common => backend}/externalaccount-picture.md (100%) create mode 100644 packages/upgrade/source/versions/v5/common/externalaccount-avatarurl.md rename packages/upgrade/source/versions/v5/{backend => common}/externalaccountjson-avatarurl.md (100%) rename packages/upgrade/source/versions/v5/{backend => common}/getorganizationinvitationlist-return-signature.md (100%) rename packages/upgrade/source/versions/v5/{backend => common}/getorganizationinvitationlist-return-type-change.md (57%) rename packages/upgrade/source/versions/v5/{backend => common}/getorganizationlist-return-signature.md (100%) rename packages/upgrade/source/versions/v5/common/{user-getorganizationinvitations-arguments-chanaged.md => user-getorganizationinvitations-arguments-changed.md} (100%) rename packages/upgrade/source/versions/v5/common/{user-getorganizationmemberships-arguments-chanaged.md => user-getorganizationmemberships-arguments-changed.md} (100%) rename packages/upgrade/source/versions/v5/common/{user-getorganizationsuggestions-arguments-chanaged.md => user-getorganizationsuggestions-arguments-changed.md} (100%) diff --git a/packages/upgrade/source/guide-generators/v5/backend/__output.mdx b/packages/upgrade/source/guide-generators/v5/backend/__output.mdx new file mode 100644 index 00000000000..dcf0b391c10 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/backend/__output.mdx @@ -0,0 +1,588 @@ +--- +title: 'Upgrading Backend from v4 to v5' +description: "Learn how to upgrade Clerk's Backend SDK from v4 to v5." +--- + +# Upgrading `@clerk/backend` from v4 to v5 + +Version 5 of the Backend SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Backend project to use `@clerk/backend` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. + +## Preparing to upgrade + +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. + +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. + +Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. + +**Updating Node.js** + +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). + +## Updating to v5 + +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: + + + ```bash filename="terminal" + npm install @clerk/backend@beta + ``` + + ```bash filename="terminal" + yarn add @clerk/backend@beta + ``` + + ```bash filename="terminal" + pnpm add @clerk/backend@beta + ``` + + + +## CLI Upgrade Helper + +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. + +To run the CLI tool, navigate to your project and run it in the terminal: + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + + +If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. + +## Breaking Changes + +### `request` separated from `options` as params to `authenticateRequest` + +There has been a change to the way the params of the `authenticateRequest` function are structured. The `request` param, formerly included in an `options` object, has been moved to stand on its own as the first param to the function, while the `options` object remains as the second param. Example below: + +```diff +- clerkClient.authenticateRequest({ ...opts, request }) ++ clerkClient.authenticateRequest(request, { ...opts }) +``` + +### `clockSkewInSeconds` -> `clockSkewInMs` + +The `clockSkewInSeconds` option has been renamed to `clockSkewInMs` in order to accurately reflect that its value is expected to be in milliseconds rather than seconds. The value does not need to change here, only the name. This change affects the following imports: + +- `verifyJwt` +- `verifyToken` +- `Clerk.authenticateRequest` + +### Import paths changes + +Some top level import paths have been changed in order to improve tree-shaking and more clearly categorize sets of functionality. Some methods have been moved under an `/internal` path, indicating that they are only intended for internal use, are exempt from semver, and should be used with great caution. + +verifyJwt import moved to @clerk/backend/tokens', + 'decodeJwt import moved to @clerk/backend/tokens', + 'signJwt import moved to @clerk/backend/tokens', + 'constants import moved to @clerk/backend/internal', + 'redirect import moved to @clerk/backend/internal', + 'createAuthenticateRequest import moved to @clerk/backend/internal', + 'createIsomorphicRequest import moved to @clerk/backend/internal', + 'createIsomorphicRequest import moved to /internal', + 'SignJWTError import moved to @clerk/backend/errors', + 'TokenVerificationError import moved to @clerk/backend/errors', + 'TokenVerificationErrorAction import moved to @clerk/backend/errors', + 'TokenVerificationErrorReason import moved to @clerk/backend/errors', + ]} +> + + The `verifyJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your + import path in order for it to work correctly. Example below of the fix that needs to be made ```diff - import{' '} + {verifyJwt} from "@clerk/backend" + import {verifyJwt} from "@clerk/backend/tokens" ``` + + + The `decodeJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your + import path in order for it to work correctly. Example below of the fix that needs to be made ```diff - import{' '} + {decodeJwt} from "@clerk/backend" + import {decodeJwt} from "@clerk/backend/tokens" ``` + + + The `signJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your import + path in order for it to work correctly. Example below of the fix that needs to be made ```diff - import {signJwt}{' '} + from "@clerk/backend" + import {signJwt} from "@clerk/backend/tokens" ``` + + + The `constants` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your + import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside + the scope of semver. Example below of the fix that needs to be made: ```diff - import {constants} from + "@clerk/backend" + import {constants} from "@clerk/backend/internal" ``` + + + The `redirect` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your + import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside + the scope of semver. Example below of the fix that needs to be made: ```diff - import {redirect} from + "@clerk/backend" + import {redirect} from "@clerk/backend/internal" ``` + + + The `createAuthenticateRequest` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must + update your import path in order for it to work correctly. Note that internal imports are not intended for usage and + are outside the scope of semver. Example below of the fix that needs to be made: ```diff - import{' '} + {createAuthenticateRequest} from "@clerk/backend" + import {createAuthenticateRequest} from + "@clerk/backend/internal" ``` + + + The `createIsomorphicRequest` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must + update your import path in order for it to work correctly. Note that internal imports are not intended for usage and + are outside the scope of semver. Example below of the fix that needs to be made: ```diff - import{' '} + {createIsomorphicRequest} from "@clerk/backend" + import {createIsomorphicRequest} from "@clerk/backend/internal" + ``` + + + The `createIsomorphicRequest` import was intended for those building custom Clerk integrations for frameworks and + has been moved to `@clerk/backend/internal` to reflect this. Please use caution when using internal imports as they + are outside the bounds of semver. ```diff - import {createIsomorphicRequest} from "@clerk/backend" + import{' '} + {createIsomorphicRequest} from "@clerk/backend/internal" ``` + + + The `SignJWTError` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your + import path in order for it to work correctly. Example below of the fix that needs to be made: ```diff - import{' '} + {SignJWTError} from "@clerk/backend" + import {SignJWTError} from "@clerk/backend/errors" ``` + + + The `TokenVerificationError` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must + update your import path in order for it to work correctly. Example below of the fix that needs to be made: ```diff - + import {TokenVerificationError} from "@clerk/backend" + import {TokenVerificationError} from "@clerk/backend/errors" + ``` + + + The `TokenVerificationErrorAction` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You + must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + ```diff - import {TokenVerificationErrorAction} from "@clerk/backend" + import {TokenVerificationErrorAction} from + "@clerk/backend/errors" ``` + + + The `TokenVerificationErrorReason` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You + must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + ```diff - import {TokenVerificationErrorReason} from "@clerk/backend" + import {TokenVerificationErrorReason} from + "@clerk/backend/errors" ``` + + + +### `httpOptions` parameter removed + +The `httpOptions` parameter was removed from the internal `buildRequest` function but it is used by most public facing APIs. Hence you were able to pass `httpOptions` to some functions which is not possible anymore. If you're currently relying on this functionality and wish to update, please reach out to Clerk's support. + +The internal change looks like this: + +```diff +- const r = buildRequest({ httpsOptions: { headers: {} }}) ++ const request = buildRequest() ++ request({ headerParams: {} }) +``` + +### Removed: `orgs` claim on JWT + +In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. + +The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. + + + + ```typescript filename="Next.js" + import { getAuth } from "@clerk/nextjs/server" + const claims: JwtPayload = getAuth(request).sessionClaims + + import { getAuth } from "@clerk/ssr.server" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + + ```typescript filename="Fastify" + import { getAuth } from "@clerk/fastify" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + ```typescript filename="@clerk/backend" + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "" }) + const requestState = await clerkClient.authenticateRequest( + request, + { publishableKey: "" } + ) + const claims: JwtPayload = requestState.toAuth().sessionClaims + ``` + + + + ```typescript filename="@clerk/clerk-sdk-node" + import { clerkClient } from "@clerk/clerk-sdk-node" + + router.use((...args) => clerkClient.expressRequireAuth()(...args)) + router.get("/me", async (req, reply: Response) => { + return reply.json({ auth: req.auth }) + }) + ``` + + + + +If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. + +#### Changes to pagination arguments for some functions + +There were some changes made to pagination-related arguments passed into functions, in order to make it more clear how to control paginated results. See each function impacted by these changes below: + +Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed"]}> + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getRoles({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getDomains({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMembershipRequests({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationSuggestions({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + +#### Changes to some function return signatures + +There have been changes to return signatures for some functions. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. This change also aligns the response shape with what is returned from the Clerk backend API. Each impacted function is listed below, along with code examples: + +Users.getOrganizationInvitationList return signature changed", "Organizations.getOrganizationInvitationList return type changed", "User.getOrganizationMembershipList() return type changed", "Users.getOrganizationList return signature changed", "Organization.getOrganizationList() return type changed", "Users.getOrganizationMembershipList return signature changed"]}> + + The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + + Here's an example of how the response shape would change with this modification: + + ```diff + - const data = await clerkClient.users.getOrganizationInvitationList() + + const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList() + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const data = await clerkClient.organizations.getOrganizationInvitationList({ + organizationId: "...", + }) + + - data.forEach(() => {}) + + data.data.forEach(() => {}) + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { user } = useUser() + const membershipList = user.getOrganizationMembershipList() + + - membershipList.forEach(() => {}) + + membershipList.data.forEach(() => {}) + ``` + + + The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + + Here's an example of how the response shape would change with this modification: + + ```diff + - const data = await clerkClient.users.getOrganizationList() + + const { data, totalCount } = await clerkClient.users.getOrganizationList() + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { organization } = useOrganization() + const orgList = organization.getOrganizationList() + + - orgList.forEach(() => {}) + + orgList.data.forEach(() => {}) + ``` + + + The response payload of `Users.getOrganizationMembershipList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + + Here's an example of how the response shape would change with this modification: + + ```diff + - const data = await clerkClient.users.getOrganizationMembershipList() + + const { data, totalCount } = await clerkClient.users.getOrganizationMembershipList() + ``` + + + +### Image URL Name Consolidation + +There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: + +Organization.logoUrl -> Organization.imageUrl', + 'User.profileImageUrl -> .imageUrl', + 'ExternalAccount.picture -> .imageUrl', + 'ExternalAccountJSON.avatar_url -> .imageUrl', + 'OrganizationJSON.logo_url -> .imageUrl', + 'UserJSON.profile_image_url -> .imageUrl', + 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', + 'OrganizationMembershipPublicUserDataJSON.profile_image_url -> .imageUrl', + ]} +> + + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. + + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. + + The `picture` property of any [`ExternalAcccount` + object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. + + + The `avatarUrl` property of any `ExternalAcccountJSON` object has been changed to `imageUrl`. + + + The `logo_url` property of any `OrganizationJSON` object has been changed to `imageUrl`. + + + The `profile_image_url` property of any `UserJSON` object has been changed to `imageUrl`. + + + The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. + + + The `profile_image_url` property of any `OrganizationMembershipPublicUserDataJSON` object has been changed to + `imageUrl`. + + + +## Deprecation removals & housekeeping + +As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. + + + For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of + changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for + manually. + + +### Deprecation removals + +frontendApi -> publishableKey as param to createClerkClient", "apiKey -> secretKey as param to createClerkClient"]}> + + The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. Also note that the import value has changed for creating a new Clerk client, which will be addressed by a separate line item if relevant to your codebase. + + ```diff + - import { Clerk } from '@clerk/backend'; + + import { createClerkClient } from '@clerk/backend'; + + - const clerkClient = Clerk({ frontendApi: '...' }); + + const clerkClient = createClerkClient({ publishableKey: '...' }); + + - clerkClient.authenticateRequest({ frontendApi: '...' }); + + clerkClient.authenticateRequest({ publishableKey: '...' }); + ``` + + + The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. Also note that the import value has changed for creating a new Clerk client, which will be addressed by a separate line item if relevant to your codebase. + + ```diff + - import { Clerk } from '@clerk/backend'; + + import { createClerkClient } from '@clerk/backend'; + + - const clerkClient = Clerk({ apiKey: '...' }); + + const clerkClient = createClerkClient({ secretKey: '...' }); + + - clerkClient.authenticateRequest({ apiKey: '...' }); + + clerkClient.authenticateRequest({ secretKey: '...' }); + ``` + + + +### Other Breaking Changes + +API_URL value has changed", "request separated from options as params to authenticateRequest", "Clerk -> createClerkClient", "clockSkewInSeconds -> clockSkewInMs", "pkgVersion -> clerkJSVersion", "clerkClient.__unstable_options removed", "httpOptions parameter removed", "createEmail import removed", "MembershipRole type replaced by OrganizationCustomRoleKey type", "buildRequestUrl import removed"]}> + + The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. + + + There has been a change to the way the params of the `authenticateRequest` function are structured. The `request` param, formerly included in an `options` object, has been moved to stand on its own as the first param to the function, while the `options` object remains as the second param. Example below: + + ```diff + - clerkClient.authenticateRequest({ ...opts, request }) + + clerkClient.authenticateRequest(request, { ...opts }) + ``` + + + The top level `Clerk` import was renamed to `createClerkClient`. This is just a name change and can be treated as a text replacement, no changes to the params or return types. + + ```js + // before + import { Clerk } from '@clerk/backend'; + + // after + import { createClerkClient } from '@clerk/backend'; + ``` + + + The `clockSkewInSeconds` option has been renamed to `clockSkewInMs` in order to accurately reflect that its value is expected to be in milliseconds rather than seconds. The value does not need to change here, only the name. This change affects the following imports: + + - `verifyJwt` + - `verifyToken` + - `Clerk.authenticateRequest` + + + The `pkgVersion` parameter was removed from the `loadInterstitialFromLocal`, `loadInterstitialFromBAPI`, and `buildPublicInterstitialUrl` functions. Use `clerkJSVersion` instead. Example: + + ```diff + - loadInterstitialFromLocal({ pkgVersion: "..." }) + + loadInterstitialFromLocal({ clerkJSVersion: "..." }) + ``` + + + The `clerkClient.__unstable_options` property was removed. Previously, you could use it to update the internal options. Instead, create a new ` clerkClient` instance using `createClerkClient` and pass the options in this way. For example: + + ```diff + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "old" }) + + - clerkClient.__unstable_options.secretKey = "new" + + const newClerkClient = createClerkClient({ secretKey: "new" }) + ``` + + + The `httpOptions` parameter was removed from the internal `buildRequest` function but it is used by most public facing APIs. Hence you were able to pass `httpOptions` to some functions which is not possible anymore. If you're currently relying on this functionality and wish to update, please reach out to Clerk's support. + + The internal change looks like this: + + ```diff + - const r = buildRequest({ httpsOptions: { headers: {} }}) + + const request = buildRequest() + + request({ headerParams: {} }) + ``` + + + The `createEmail` import has been removed. There is no replacement at this time because we need to rethink how `createEmail` behaves and align it with the newer `sendSms` method. If this is an issue for your implementation, please contact [Clerk support](https://clerk.com/contact). + + + The `MembershipRole` type was replaced with `OrganizationCustomRoleKey` (related to [roles and permissions](https://clerk.com/docs/organizations/roles-permissions)). An example of where this type might be found: + + ```js + import { useAuth } from '@clerk/clerk-react'; + + const { orgRole } = useAuth(); + ``` + + To support the existing roles `admin`, `basic_member`, and `guest_member` apply interface merging using the following snippet: + + ```js + interface ClerkAuthorization { + permission: '' + role: 'admin' | 'basic_member' | 'guest_member' + } + ``` + + + The `buildRequestUrl` import was intended for those building custom Clerk integrations for frameworks and has been removed in favor of other methods internally. If you were relying on this function and this is an issue, please [reach out to Clerk support](https://clerk.com/support). + + diff --git a/packages/upgrade/source/guide-generators/v5/backend/import-paths.mdx b/packages/upgrade/source/guide-generators/v5/backend/import-paths.mdx new file mode 100644 index 00000000000..58dcb04463c --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/backend/import-paths.mdx @@ -0,0 +1,3 @@ +### Import paths changes + +Some top level import paths have been changed in order to improve tree-shaking and more clearly categorize sets of functionality. Some methods have been moved under an `/internal` path, indicating that they are only intended for internal use, are exempt from semver, and should be used with great caution. diff --git a/packages/upgrade/source/guide-generators/v5/backend/index.js b/packages/upgrade/source/guide-generators/v5/backend/index.js index d0d51d65cf1..aef608ccf2e 100644 --- a/packages/upgrade/source/guide-generators/v5/backend/index.js +++ b/packages/upgrade/source/guide-generators/v5/backend/index.js @@ -1,6 +1,50 @@ -// buildrequesturl, createisomorphicrequest, createEmail removed -// clockskewinms -// error api import move -// membershiprole -> organizationcustomrolekey -// orgs claim dropped -// Deprecation removals & housekeeping +import { + accordionForCategory, + assembleContent, + deprecationRemovalsAndHousekeeping, + frontmatter, + loadVersionChangeData, + markdown, + markdownTemplate, + singleItem, + writeToFile, +} from '../../text-generation.js'; + +const version = 'v5'; +const name = 'backend'; +const properName = 'Backend'; +const packageName = '@clerk/backend'; +const cwd = `${version}/${name}`; + +async function generate() { + const data = await loadVersionChangeData(version, name); + + return assembleContent({ data, cwd }, [ + frontmatter({ + title: `Upgrading ${properName} from v4 to v5`, + description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + }), + `# Upgrading \`${packageName}\` from v4 to v5`, + markdown('intro'), + markdown('prepare'), + markdown('node-version'), + markdownTemplate('update-v5', { packageName }), + markdown('cli'), + '## Breaking Changes', + singleItem('authenticaterequest-params-change'), + singleItem('clockskewinseconds'), + markdown('import-paths'), + accordionForCategory('import-paths'), + singleItem('httpoptions-removed'), + markdown('orgs-claim'), + markdown('pagination-args'), + accordionForCategory('pagination-args'), + markdown('pagination-return'), + accordionForCategory('pagination-return'), + markdown('image-url'), + accordionForCategory(['image-url', 'image-url-backend']), + deprecationRemovalsAndHousekeeping(), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/guide-generators/v5/backend/intro.mdx b/packages/upgrade/source/guide-generators/v5/backend/intro.mdx new file mode 100644 index 00000000000..d9be302acaa --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/backend/intro.mdx @@ -0,0 +1,3 @@ +Version 5 of the Backend SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Backend project to use `@clerk/backend` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/chromeExtension/__output.mdx b/packages/upgrade/source/guide-generators/v5/chromeExtension/__output.mdx new file mode 100644 index 00000000000..d02c1f9e6fc --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/chromeExtension/__output.mdx @@ -0,0 +1,245 @@ +--- +title: 'Upgrading Chrome Extension SDK from v4 to v5' +description: "Learn how to upgrade Clerk's Chrome Extension SDK from v4 to v5." +--- + +# Upgrading `@clerk/chrome-extension` from v4 to v5 + +Version 5 of the Chrome Extension SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your project to use `@clerk/chrome-extension` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. + +## Preparing to upgrade + +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. + +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. + +Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. + +**Updating Node.js** + +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). + +**Updating React** + +All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. + + + ```bash filename="terminal" + npm install react@latest react-dom@latest + ``` + + ```bash filename="terminal" + yarn add react@latest react-dom@latest + ``` + + ```bash filename="terminal" + pnpm add react@latest react-dom@latest + ``` + + + +If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. + +## Updating to v5 + +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: + + + ```bash filename="terminal" + npm install @clerk/chrome-extension@beta + ``` + + ```bash filename="terminal" + yarn add @clerk/chrome-extension@beta + ``` + + ```bash filename="terminal" + pnpm add @clerk/chrome-extension@beta + ``` + + + +## CLI Upgrade Helper + +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. + +To run the CLI tool, navigate to your project and run it in the terminal: + + + ```bash filename="terminal" + npx @clerk/upgrade + ``` + +```bash filename="terminal" +yarn dlx @clerk/upgrade +``` + +```bash filename="terminal" +pnpm dlx @clerk/upgrade +``` + + + +If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. + +## Breaking Changes + +### `tokenCache` -> `storageCache` as `` props + +The `tokenCache` prop has been renamed to `storageCache` in order to accomodate the new [WebSSO feature](https://github.com/clerk/javascript/pull/2277). With the prop change from `tokenCache` to `storageCache`, the interface has been expanded to allow for more flexibility. The new interface is as follows: + +```ts +type StorageCache = { + createKey: (...keys: string[]) => string; + get: (key: string) => Promise; + remove: (key: string) => Promise; + set: (key: string, value: string) => Promise; +}; +``` + +And here's a full before/after example: + +```diff +- ++ +``` + +### Component design adjustments + +The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. + +[More detail on these changes »](/components-redesigned) + +## After sign up/in/out URL handling + +Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. + +As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. + +```diff +- ++ +``` + +### Removed: `orgs` claim on JWT + +In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. + +The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. + + + + ```typescript filename="Next.js" + import { getAuth } from "@clerk/nextjs/server" + const claims: JwtPayload = getAuth(request).sessionClaims + + import { getAuth } from "@clerk/ssr.server" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + + ```typescript filename="Fastify" + import { getAuth } from "@clerk/fastify" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + ```typescript filename="@clerk/backend" + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "" }) + const requestState = await clerkClient.authenticateRequest( + request, + { publishableKey: "" } + ) + const claims: JwtPayload = requestState.toAuth().sessionClaims + ``` + + + + ```typescript filename="@clerk/clerk-sdk-node" + import { clerkClient } from "@clerk/clerk-sdk-node" + + router.use((...args) => clerkClient.expressRequireAuth()(...args)) + router.get("/me", async (req, reply: Response) => { + return reply.json({ auth: req.auth }) + }) + ``` + + + + +If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. + +### Path routing is now the default + +On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. + +In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: + +- `` +- `` +- `` +- `` +- `` + +Here's how you'd use the components going forward: + +```jsx + + + + + +``` + +If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. + +```jsx + + +``` + +However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. + + +```env filename=".env.local" +NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in +NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up +``` + +```env filename=".env" +CLERK_SIGN_IN_URL=/sign-in +CLERK_SIGN_UP_URL=/sign-up +``` + + + +**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. + +```jsx +// Only works for Next.js / Remix when environment variables are set + + +``` + +### Image URL Name Consolidation + +There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: + +Organization.logoUrl -> Organization.imageUrl', + 'User.profileImageUrl -> .imageUrl', + ]} +> + + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. + + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. + diff --git a/packages/upgrade/source/guide-generators/v5/chromeExtension/index.js b/packages/upgrade/source/guide-generators/v5/chromeExtension/index.js new file mode 100644 index 00000000000..a6efe0ac2e9 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/chromeExtension/index.js @@ -0,0 +1,44 @@ +import { + accordionForCategory, + assembleContent, + frontmatter, + loadVersionChangeData, + markdown, + markdownTemplate, + singleItem, + writeToFile, +} from '../../text-generation.js'; + +const version = 'v5'; +const name = 'chromeExtension'; +const properName = 'Chrome Extension'; +const packageName = '@clerk/chrome-extension'; +const cwd = `${version}/chromeExtension`; + +async function generate() { + const data = await loadVersionChangeData(version, name); + + return assembleContent({ data, cwd }, [ + frontmatter({ + title: `Upgrading ${properName} SDK from v4 to v5`, + description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + }), + `# Upgrading \`${packageName}\` from v4 to v5`, + markdown('intro'), + markdown('prepare'), + markdown('node-version'), + markdown('react-version'), + markdownTemplate('update-v5', { packageName }), + markdown('cli'), + '## Breaking Changes', + singleItem('clerkprovider-tokencache'), + markdown('redesign-preview'), + markdown('after-sign-x-handling'), + markdown('orgs-claim'), + markdown('path-routing'), + markdown('image-url'), + accordionForCategory('image-url'), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/guide-generators/v5/chromeExtension/intro.mdx b/packages/upgrade/source/guide-generators/v5/chromeExtension/intro.mdx new file mode 100644 index 00000000000..acfcfff9d7a --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/chromeExtension/intro.mdx @@ -0,0 +1,3 @@ +Version 5 of the Chrome Extension SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your project to use `@clerk/chrome-extension` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/index.js b/packages/upgrade/source/guide-generators/v5/nextjs/index.js index 40905668bc8..547b045e218 100644 --- a/packages/upgrade/source/guide-generators/v5/nextjs/index.js +++ b/packages/upgrade/source/guide-generators/v5/nextjs/index.js @@ -16,7 +16,7 @@ const packageName = '@clerk/nextjs'; const cwd = 'v5/nextjs'; async function generate() { - const data = loadVersionChangeData(version, name); + const data = await loadVersionChangeData(version, name); return assembleContent({ data, cwd }, [ frontmatter({ @@ -39,7 +39,7 @@ async function generate() { markdown('orgs-claim'), markdown('path-routing'), markdown('image-url'), - accordionForCategory('image-url', {}), + accordionForCategory('image-url'), deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']), ]); } diff --git a/packages/upgrade/source/guide-generators/v5/node/index.js b/packages/upgrade/source/guide-generators/v5/node/index.js index 4cd826fa7b8..e33b0afa20f 100644 --- a/packages/upgrade/source/guide-generators/v5/node/index.js +++ b/packages/upgrade/source/guide-generators/v5/node/index.js @@ -17,7 +17,7 @@ const packageName = '@clerk/clerk-sdk-node'; const cwd = `${version}/${name}`; async function generate() { - const data = loadVersionChangeData(version, name); + const data = await loadVersionChangeData(version, name); return assembleContent({ data, cwd }, [ frontmatter({ diff --git a/packages/upgrade/source/guide-generators/v5/react/index.js b/packages/upgrade/source/guide-generators/v5/react/index.js index 8647c4d20a2..18ec5c74b2c 100644 --- a/packages/upgrade/source/guide-generators/v5/react/index.js +++ b/packages/upgrade/source/guide-generators/v5/react/index.js @@ -17,7 +17,7 @@ const packageName = '@clerk/clerk-react'; const cwd = `${version}/${name}`; async function generate() { - const data = loadVersionChangeData(version, name); + const data = await loadVersionChangeData(version, name); return assembleContent({ data, cwd }, [ frontmatter({ @@ -38,7 +38,7 @@ async function generate() { markdown('orgs-claim'), markdown('path-routing'), markdown('image-url'), - accordionForCategory('image-url', {}), + accordionForCategory('image-url'), deprecationRemovalsAndHousekeeping(), ]); } diff --git a/packages/upgrade/source/guide-generators/v5/retheme/index.js b/packages/upgrade/source/guide-generators/v5/retheme/index.js index 815b3199a8b..b91e5caff11 100644 --- a/packages/upgrade/source/guide-generators/v5/retheme/index.js +++ b/packages/upgrade/source/guide-generators/v5/retheme/index.js @@ -25,7 +25,7 @@ async function generate() { '## Appearance Changes', accordionForCategory('appearance', { additionalItems: defaultsChangeItem }), '## Localization Changes', - accordionForCategory('localization', {}), + accordionForCategory('localization'), ]); } diff --git a/packages/upgrade/source/guide-generators/v5/js/pagination-args.mdx b/packages/upgrade/source/guide-generators/v5/shared/pagination-args.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/js/pagination-args.mdx rename to packages/upgrade/source/guide-generators/v5/shared/pagination-args.mdx diff --git a/packages/upgrade/source/guide-generators/v5/js/pagination-return.mdx b/packages/upgrade/source/guide-generators/v5/shared/pagination-return.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/js/pagination-return.mdx rename to packages/upgrade/source/guide-generators/v5/shared/pagination-return.mdx diff --git a/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md b/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md index 03732f92235..7ad6ef625a4 100644 --- a/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md @@ -3,6 +3,7 @@ title: '`constants` import moved to `@clerk/backend/internal`' matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/internal' +category: 'import-paths' --- The `constants` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside the scope of semver. Example below of the fix that needs to be made: diff --git a/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md b/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md index 6880e45a2bb..22621410af2 100644 --- a/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md @@ -3,6 +3,7 @@ title: '`createAuthenticateRequest` import moved to `@clerk/backend/internal`' matcher: "import\\s+{[\\s\\S]*?createAuthenticateRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/internal' +category: 'import-paths' --- The `createAuthenticateRequest` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside the scope of semver. Example below of the fix that needs to be made: diff --git a/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md b/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md index 9a70dfdeca6..49493d5f63e 100644 --- a/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md +++ b/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md @@ -1,6 +1,7 @@ --- title: '`apiKey` -> `secretKey` as param to createClerkClient' matcher: "(?:createClerkClient|Clerk)\\(\\s*{[\\s\\S]*?frontendApi:[\\s\\S]*?\\)" +category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md index fff88ec4494..18c6704faca 100644 --- a/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md +++ b/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md @@ -2,6 +2,7 @@ title: '`frontendApi` -> `publishableKey` as param to createClerkClient' matcher: "(?:createClerkClient|Clerk)\\(\\s*{[\\s\\S]*?frontendApi:[\\s\\S]*?\\)" matcherFlags: 'm' +category: 'deprecation-removal' --- The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. Also note that the import value has changed for creating a new Clerk client, which will be addressed by a separate line item if relevant to your codebase. diff --git a/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md b/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md index b9cdc79c534..baaf8e27ca0 100644 --- a/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md @@ -3,6 +3,7 @@ title: '`createIsomorphicRequest` import moved to `@clerk/backend/internal`' matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/internal' +category: 'import-paths' --- The `createIsomorphicRequest` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside the scope of semver. Example below of the fix that needs to be made: diff --git a/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-removed.md b/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-removed.md index df591f0ad4e..34b06032d7a 100644 --- a/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-removed.md +++ b/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-removed.md @@ -3,6 +3,7 @@ title: '`createIsomorphicRequest` import moved to `/internal`' matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/(backend)['\"]" replaceWithString: 'backend/internal' matcherFlags: 'm' +category: 'import-paths' --- The `createIsomorphicRequest` import was intended for those building custom Clerk integrations for frameworks and has been moved to `@clerk/backend/internal` to reflect this. Please use caution when using internal imports as they are outside the bounds of semver. diff --git a/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md b/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md index 3c752a60939..d1e0483f3f6 100644 --- a/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md @@ -3,6 +3,7 @@ title: '`decodeJwt` import moved to `@clerk/backend/tokens`' matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/tokens' +category: 'import-paths' --- The `decodeJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made diff --git a/packages/upgrade/source/versions/v5/common/externalaccount-picture.md b/packages/upgrade/source/versions/v5/backend/externalaccount-picture.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/externalaccount-picture.md rename to packages/upgrade/source/versions/v5/backend/externalaccount-picture.md diff --git a/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md b/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md index 275c9a63e3a..8424d5a2f89 100644 --- a/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md @@ -3,6 +3,7 @@ title: '`redirect` import moved to `@clerk/backend/internal`' matcher: "import\\s+{[\\s\\S]*?redirect[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/internal' +category: 'import-paths' --- The `redirect` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside the scope of semver. Example below of the fix that needs to be made: diff --git a/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md b/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md index d6599891107..1ed521f288d 100644 --- a/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md @@ -3,6 +3,7 @@ title: '`signJwt` import moved to `@clerk/backend/tokens`' matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/tokens' +category: 'import-paths' --- The `signJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made diff --git a/packages/upgrade/source/versions/v5/backend/signjwterror-import-move.md b/packages/upgrade/source/versions/v5/backend/signjwterror-import-move.md index 5798afc16ce..2a0bc89e009 100644 --- a/packages/upgrade/source/versions/v5/backend/signjwterror-import-move.md +++ b/packages/upgrade/source/versions/v5/backend/signjwterror-import-move.md @@ -3,6 +3,7 @@ title: '`SignJWTError` import moved to `@clerk/backend/errors`' matcher: "import\\s+{[\\s\\S]*?SignJWTError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' +category: 'import-paths' --- The `SignJWTError` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerror-import-move.md b/packages/upgrade/source/versions/v5/backend/tokenverificationerror-import-move.md index 30127e06e39..baf9b1f9c1d 100644 --- a/packages/upgrade/source/versions/v5/backend/tokenverificationerror-import-move.md +++ b/packages/upgrade/source/versions/v5/backend/tokenverificationerror-import-move.md @@ -3,6 +3,7 @@ title: '`TokenVerificationError` import moved to `@clerk/backend/errors`' matcher: "import\\s+{[\\s\\S]*?TokenVerificationError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' +category: 'import-paths' --- The `TokenVerificationError` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerroraction-import-move.md b/packages/upgrade/source/versions/v5/backend/tokenverificationerroraction-import-move.md index 747d6489d00..46d9ba05ccb 100644 --- a/packages/upgrade/source/versions/v5/backend/tokenverificationerroraction-import-move.md +++ b/packages/upgrade/source/versions/v5/backend/tokenverificationerroraction-import-move.md @@ -3,6 +3,7 @@ title: '`TokenVerificationErrorAction` import moved to `@clerk/backend/errors`' matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorAction[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' +category: 'import-paths' --- The `TokenVerificationErrorAction` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerrorcode-import-move.md b/packages/upgrade/source/versions/v5/backend/tokenverificationerrorcode-import-move.md index a0e096c4b61..f1b36632bdd 100644 --- a/packages/upgrade/source/versions/v5/backend/tokenverificationerrorcode-import-move.md +++ b/packages/upgrade/source/versions/v5/backend/tokenverificationerrorcode-import-move.md @@ -3,6 +3,7 @@ title: '`TokenVerificationErrorCode` import moved to `@clerk/backend/errors`' matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorCode[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' +category: 'import-paths' --- The `TokenVerificationErrorCode` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerrorreason-import-move.md b/packages/upgrade/source/versions/v5/backend/tokenverificationerrorreason-import-move.md index 23e46f5baa8..78f0b60a88f 100644 --- a/packages/upgrade/source/versions/v5/backend/tokenverificationerrorreason-import-move.md +++ b/packages/upgrade/source/versions/v5/backend/tokenverificationerrorreason-import-move.md @@ -3,6 +3,7 @@ title: '`TokenVerificationErrorReason` import moved to `@clerk/backend/errors`' matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorReason[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' +category: 'import-paths' --- The `TokenVerificationErrorReason` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: diff --git a/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md b/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md index 6cbeeb65579..74eef45a4ac 100644 --- a/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md +++ b/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md @@ -3,6 +3,7 @@ title: '`verifyJwt` import moved to `@clerk/backend/tokens`' matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/tokens' +category: 'import-paths' --- The `verifyJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made diff --git a/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md b/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md index 956a9ab3555..fd8d0984a91 100644 --- a/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md +++ b/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md @@ -8,19 +8,16 @@ The `tokenCache` prop has been renamed to `storageCache` in order to accomodate ```ts type StorageCache = { - createKey: (...keys: string[]) => string; - get: (key: string) => Promise; - remove: (key: string) => Promise; - set: (key: string, value: string) => Promise; + createKey: (...keys: string[]) => string; + get: (key: string) => Promise; + remove: (key: string) => Promise; + set: (key: string, value: string) => Promise; }; ``` And here's a full before/after example: -```jsx -// before - - -// after - +```diff +- ++ ``` diff --git a/packages/upgrade/source/versions/v5/common/externalaccount-avatarurl.md b/packages/upgrade/source/versions/v5/common/externalaccount-avatarurl.md new file mode 100644 index 00000000000..1b6dc981355 --- /dev/null +++ b/packages/upgrade/source/versions/v5/common/externalaccount-avatarurl.md @@ -0,0 +1,7 @@ +--- +title: '`ExternalAccount.avatarUrl` -> `.imageUrl`' +matcher: "\\.avatarUrl" +category: 'image-url' +--- + +The `avatarUrl` property of any [`ExternalAcccount` object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/backend/externalaccountjson-avatarurl.md b/packages/upgrade/source/versions/v5/common/externalaccountjson-avatarurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/externalaccountjson-avatarurl.md rename to packages/upgrade/source/versions/v5/common/externalaccountjson-avatarurl.md diff --git a/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-signature.md b/packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-signature.md rename to packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-signature.md diff --git a/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-type-change.md b/packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md similarity index 57% rename from packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-type-change.md rename to packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md index 341e48c1e43..b3023397793 100644 --- a/packages/upgrade/source/versions/v5/backend/getorganizationinvitationlist-return-type-change.md +++ b/packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md @@ -1,5 +1,5 @@ --- -title: '`Organizations.getOrganizationInvitationList()` return type changed' +title: '`Organizations.getOrganizationInvitationList` return type changed' matcher: "\\.getOrganizationInvitationList\\(" category: 'pagination-return' warning: true @@ -8,13 +8,10 @@ warning: true The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: ```diff - const { createClerkClient } = require("@clerk/backend"); - const client = createClerkClient({ secretKey: "..." }); - - const inviteList = await client.organizations.getOrganizationInvitationList({ + const data = await clerkClient.organizations.getOrganizationInvitationList({ organizationId: "...", }) -- inviteList.forEach(() => {}) -+ inviteList.data.forEach(() => {}) +- data.forEach(() => {}) ++ data.data.forEach(() => {}) ``` diff --git a/packages/upgrade/source/versions/v5/backend/getorganizationlist-return-signature.md b/packages/upgrade/source/versions/v5/common/getorganizationlist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/getorganizationlist-return-signature.md rename to packages/upgrade/source/versions/v5/common/getorganizationlist-return-signature.md diff --git a/packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-chanaged.md b/packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-chanaged.md rename to packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-changed.md diff --git a/packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-chanaged.md b/packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-chanaged.md rename to packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-changed.md diff --git a/packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-chanaged.md b/packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-chanaged.md rename to packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-changed.md diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 7e6dcfacbf8..b6c1807cdd1 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -5,6 +5,24 @@ const load = createLoader({ baseUrl: 'https://clerk.com/docs/upgrade-guides/v5', }); +const changesAffectingAll = [ + 'organization-getroles-arguments-changed', + 'organization-getmemberships-arguments-changed', + 'organization-getdomains-arguments-change', + 'organization-getinvitations-arguments-changed', + 'organization-getmembershiprequests-arguments-changed', + 'user-getorganizationinvitations-arguments-changed', + 'user-getorganizationsuggestions-arguments-changed', + 'user-getorganizationmemberships-arguments-changed', + 'getorganizationinvitationlist-return-signature', + 'getorganizationinvitationlist-return-type-change', + 'getorganizationmembershiplist-return-type-change', + 'getorganizationlist-return-signature', + 'getorganizationlist-return-type-change', + 'organization-logourl', + 'user-profileimageurl', +]; + const reactChangesList = [ 'magiclinkerrorcode', 'usemagiclink', @@ -45,119 +63,98 @@ const reactChangesList = [ 'changed-localization-keys', 'signoutcallback-to-redirecturl', 'min-react-version', - 'getorganizationlist-return-type-change', - 'getorganizationmembershiplist-return-type-change', - 'organization-getroles-arguments-changed', - 'organization-getmemberships-arguments-changed', - 'organization-getdomains-arguments-change', - 'organization-getinvitations-arguments-changed', - 'organization-getmembershiprequests-arguments-changed', - 'user-getorganizationinvitations-arguments-chanaged', - 'user-getorganizationsuggestions-arguments-chanaged', - 'user-getorganizationmemberships-arguments-chanaged', - 'externalaccount-picture', + 'externalaccount-avatarurl', 'organizationmembershippublicuserdata-profileimageurl', - 'organization-logourl', - 'user-profileimageurl', ]; export default { - nextjs: load('nextjs', [ - 'api-key-to-secret-key', - 'frontend-api-to-publishable-key', - 'with-clerk-middleware-removed', - 'auth-middleware-deprecated', - 'clerk-js-version-next-public', - 'authmiddleware-apikey', - 'authmiddleware-frontendapi', - 'createclerkclient-apikey', - 'createclerkclient-frontendapi', - 'getauth-apikey', - 'clerkprovider-frontendapi-2', - 'import-nextjs-app-beta', - 'import-nextjs-ssr', - 'import-nextjs-edge-middleware', - 'import-nextjs-edge-middlewarefiles', - 'import-api-url', - 'import-api-version', - 'import-clerk-js-url', - 'import-clerk-js-version', - 'import-domain', - 'import-is-satellite', - 'import-proxy-url', - 'import-publishable-key', - 'import-secret-key', - 'import-sign-in-url', - 'import-sign-up-url', - 'import-nextjs-api', - 'api-url-value-change', - 'ismagiclinkerror', - 'usemagiclink', - 'magiclinkerrorcode', - 'setsession', - 'organizationprofile-settings', - 'userprofile-security', - 'mfa-dropdown', - 'connected-accounts-dropdown', - 'userbuttonpopoveractionbuttontext-removed', - 'userbuttontrigger-userbuttonbox-invert', - 'organizationswitcherpopoveractionbuttontext-removed', - 'card-changes', - 'alternativemethods-backlink', - 'button-to-organizationlistcreateorganizationactionbutton', - 'remove-socialbuttonsblockbuttonarrow', - 'remove-identitypreview-avatar', - 'multisessionappsupport-import-change', - 'auth-import-change', - 'currentuser-import-change', - 'authmiddleware-import-change', - 'buildclerkprops-import-change', - 'verifytoken-import-change', - 'verifyjwt-import-change', - 'decodejwt-import-change', - 'signjwt-import-change', - 'constants-import-change', - 'createauthenticaterequest-import-change', - 'createisomorphicrequest-import-change', - 'clerk-import-change', - 'isclerkapiresponserror-import-change', - 'isemaillinkerror-import-change', - 'isknownerror-import-change', - 'ismetamaskerror-import-change', - 'withsession-removed', - 'withclerk-removed', - 'withuser-removed-2', - 'withclerk-hof-removed', - 'withsession-hof-removed', - 'withuser-hof-removed', - 'next-public-clerk-js-url', - 'new-localization-keys', - 'removed-localization-keys', - 'changed-localization-keys', - 'signoutcallback-to-redirecturl', - 'min-nextjs-version', - 'redirecttosignin-import-path', - 'redirecttosignup-import-path', - 'getorganizationlist-return-type-change', - 'getorganizationmembershiplist-return-type-change', - 'organization-getroles-arguments-changed', - 'organization-getmemberships-arguments-changed', - 'organization-getdomains-arguments-change', - 'organization-getinvitations-arguments-changed', - 'organization-getmembershiprequests-arguments-changed', - 'user-getorganizationinvitations-arguments-chanaged', - 'user-getorganizationsuggestions-arguments-chanaged', - 'user-getorganizationmemberships-arguments-chanaged', - 'externalaccount-picture', - 'organizationmembershippublicuserdata-profileimageurl', - 'organization-logourl', - 'user-profileimageurl', - ]), + nextjs: load( + 'nextjs', + dedupeMerge(changesAffectingAll, [ + 'api-key-to-secret-key', + 'frontend-api-to-publishable-key', + 'with-clerk-middleware-removed', + 'auth-middleware-deprecated', + 'clerk-js-version-next-public', + 'authmiddleware-apikey', + 'authmiddleware-frontendapi', + 'createclerkclient-apikey', + 'createclerkclient-frontendapi', + 'getauth-apikey', + 'clerkprovider-frontendapi-2', + 'import-nextjs-app-beta', + 'import-nextjs-ssr', + 'import-nextjs-edge-middleware', + 'import-nextjs-edge-middlewarefiles', + 'import-api-url', + 'import-api-version', + 'import-clerk-js-url', + 'import-clerk-js-version', + 'import-domain', + 'import-is-satellite', + 'import-proxy-url', + 'import-publishable-key', + 'import-secret-key', + 'import-sign-in-url', + 'import-sign-up-url', + 'import-nextjs-api', + 'api-url-value-change', + 'ismagiclinkerror', + 'usemagiclink', + 'magiclinkerrorcode', + 'setsession', + 'organizationprofile-settings', + 'userprofile-security', + 'mfa-dropdown', + 'connected-accounts-dropdown', + 'userbuttonpopoveractionbuttontext-removed', + 'userbuttontrigger-userbuttonbox-invert', + 'organizationswitcherpopoveractionbuttontext-removed', + 'card-changes', + 'alternativemethods-backlink', + 'button-to-organizationlistcreateorganizationactionbutton', + 'remove-socialbuttonsblockbuttonarrow', + 'remove-identitypreview-avatar', + 'multisessionappsupport-import-change', + 'auth-import-change', + 'currentuser-import-change', + 'authmiddleware-import-change', + 'buildclerkprops-import-change', + 'verifytoken-import-change', + 'verifyjwt-import-change', + 'decodejwt-import-change', + 'signjwt-import-change', + 'constants-import-change', + 'createauthenticaterequest-import-change', + 'createisomorphicrequest-import-change', + 'clerk-import-change', + 'isclerkapiresponserror-import-change', + 'isemaillinkerror-import-change', + 'isknownerror-import-change', + 'ismetamaskerror-import-change', + 'withsession-removed', + 'withclerk-removed', + 'withuser-removed-2', + 'withclerk-hof-removed', + 'withsession-hof-removed', + 'withuser-hof-removed', + 'next-public-clerk-js-url', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', + 'signoutcallback-to-redirecturl', + 'min-nextjs-version', + 'redirecttosignin-import-path', + 'redirecttosignup-import-path', + 'externalaccount-avatarurl', + 'organizationmembershippublicuserdata-profileimageurl', + ]), + ), // since we export clerk-react at the top level from the gatsby plugin // if you're using gatsby, we also need to scan for the react changes gatsby: load( 'gatsby', - dedupeMerge(reactChangesList, [ + dedupeMerge(changesAffectingAll, reactChangesList, [ 'api-key-to-secret-key', 'createclerkclient-apikey', 'apikey-to-publishable-key', @@ -171,160 +168,144 @@ export default { 'clerk-import-change', ]), ), - remix: load('remix', [ - 'clerkerrorboundary-removed', - 'createclerkclient-apikey', - 'rootauthloader-apikey', - 'getauth-apikey', - 'clerkprovider-frontendapi-2', - 'rootauthloader-frontendapi', - 'frontend-api-to-publishable-key', - 'api-key-to-secret-key', - 'ismagiclinkerror', - 'magiclinkerrorcode', - 'usemagiclink', - 'setsession', - 'new-localization-keys', - 'removed-localization-keys', - 'changed-localization-keys', - 'signoutcallback-to-redirecturl', - 'clerk-import-change', - 'getorganizationlist-return-type-change', - 'getorganizationmembershiplist-return-type-change', - 'organization-getroles-arguments-changed', - 'organization-getmemberships-arguments-changed', - 'organization-getdomains-arguments-change', - 'organization-getinvitations-arguments-changed', - 'organization-getmembershiprequests-arguments-changed', - 'user-getorganizationinvitations-arguments-chanaged', - 'user-getorganizationsuggestions-arguments-chanaged', - 'user-getorganizationmemberships-arguments-chanaged', - 'externalaccount-picture', - 'organizationmembershippublicuserdata-profileimageurl', - 'organization-logourl', - 'user-profileimageurl', - ]), - expo: load('expo', [ - 'apikey-to-publishable-key', - 'ismagiclinkerror', - 'usemagiclink', - 'magiclinkerrorcode', - 'setsession', - 'organizationprofile-settings', - 'userprofile-security', - 'mfa-dropdown', - 'connected-accounts-dropdown', - 'userbuttonpopoveractionbuttontext-removed', - 'userbuttontrigger-userbuttonbox-invert', - 'organizationswitcherpopoveractionbuttontext-removed', - 'card-changes', - 'alternativemethods-backlink', - 'button-to-organizationlistcreateorganizationactionbutton', - 'remove-socialbuttonsblockbuttonarrow', - 'remove-identitypreview-avatar', - 'new-localization-keys', - 'removed-localization-keys', - 'changed-localization-keys', - 'signoutcallback-to-redirecturl', - 'getorganizationlist-return-type-change', - 'getorganizationmembershiplist-return-type-change', - 'externalaccount-picture', - 'organization-logourl', - 'organizationmembershippublicuserdata-profileimageurl', - 'user-profileimageurl', - ]), - fastify: load('fastify', [ - 'api-key-to-secret-key', - 'api-url-value-change', - 'frontend-api-to-publishable-key', - 'createclerkclient-apikey', - 'createclerkclient-frontendapi', - 'clerkplugin-frontendapi', - 'clerk-import-change', - 'externalaccount-picture', - 'organization-logourl', - 'organizationmembershippublicuserdata-profileimageurl', - 'user-profileimageurl', - ]), - node: load('node', [ - 'api-key-to-secret-key', - 'api-url-value-change', - 'frontend-api-to-publishable-key', - 'clerkexpressrequireauth-apikey', - 'clerkexpresswithauth-apikey', - 'createclerkclient-apikey', - 'createclerkexpressrequireauth-apikey', - 'createclerkexpresswithauth-apikey', - 'createclerkclient-frontendapi', - 'createclerkexpressrequireauth-frontendapi', - 'clerkexpressrequireauth-frontendapi', - 'createclerkexpresswithauth-frontendapi', - 'clerkexpresswithauth-frontendapi', - 'setclerkapikey', - 'setclerkapiversion', - 'setclerkhttpoptions', - 'setclerkserverapiurl', - 'cjs-esm-instance', - 'legacyauthobject-removed', - 'clerk-import-change', - 'externalaccount-picture', - 'organization-logourl', - 'organizationmembershippublicuserdata-profileimageurl', - 'user-profileimageurl', - ]), - react: load('react', reactChangesList), - js: load('js', [ - 'magiclinkerror', - 'ismagiclinkerror', - 'magiclinkerrorcode', - 'usemagiclink', - 'handlemagiclinkverification', - 'external-account-avatarurl', - 'organization-logourl', - 'user-orgpublicdata-profileimageurl', - 'setsession', - 'user-update-password', // shared w/ all - 'experimental-canusecaptcha', - 'experimental-captchaurl', - 'experimental-captchasitekey', - 'getorganizationmemberships', - 'lastorganizationinvitation-member', - 'unstable-invitationupdate', - 'unstable-membershipupdate', - 'organization-create-string', // maybe shared with all? - 'organization-getpendinginvitations', // maybe shared with all? - 'user-createexternalaccount-redirecturl', // maybe shared with all? - 'signup-attemptweb3walletverification-generatedsignature', - 'redirecttohome', - 'organizationprofile-settings', - 'userprofile-security', - 'mfa-dropdown', - 'connected-accounts-dropdown', - 'userbuttonpopoveractionbuttontext-removed', - 'userbuttontrigger-userbuttonbox-invert', - 'organizationswitcherpopoveractionbuttontext-removed', - 'card-changes', - 'alternativemethods-backlink', - 'button-to-organizationlistcreateorganizationactionbutton', - 'remove-socialbuttonsblockbuttonarrow', - 'remove-identitypreview-avatar', - 'organization-getroles-arguments-changed', - 'organization-getdomains-arguments-change', - 'organization-getmembershiprequests-arguments-changed', - 'organization-getmemberships-arguments-changed', - 'organization-getinvitations-arguments-changed', - 'user-getorganizationinvitations-arguments-chanaged', - 'user-getorganizationsuggestions-arguments-chanaged', - 'user-getorganizationmemberships-arguments-chanaged', - 'clerk-isready-removed', - 'new-localization-keys', - 'removed-localization-keys', - 'changed-localization-keys', - 'signoutcallback-to-redirecturl', - 'externalaccount-picture', - 'organizationmembershippublicuserdata-profileimageurl', - 'user-profileimageurl', - ]), + remix: load( + 'remix', + dedupeMerge(changesAffectingAll, [ + 'clerkerrorboundary-removed', + 'createclerkclient-apikey', + 'rootauthloader-apikey', + 'getauth-apikey', + 'clerkprovider-frontendapi-2', + 'rootauthloader-frontendapi', + 'frontend-api-to-publishable-key', + 'api-key-to-secret-key', + 'ismagiclinkerror', + 'magiclinkerrorcode', + 'usemagiclink', + 'setsession', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', + 'signoutcallback-to-redirecturl', + 'clerk-import-change', + 'externalaccount-avatarurl', + 'organizationmembershippublicuserdata-profileimageurl', + ]), + ), + expo: load( + 'expo', + dedupeMerge(changesAffectingAll, [ + 'apikey-to-publishable-key', + 'ismagiclinkerror', + 'usemagiclink', + 'magiclinkerrorcode', + 'setsession', + 'organizationprofile-settings', + 'userprofile-security', + 'mfa-dropdown', + 'connected-accounts-dropdown', + 'userbuttonpopoveractionbuttontext-removed', + 'userbuttontrigger-userbuttonbox-invert', + 'organizationswitcherpopoveractionbuttontext-removed', + 'card-changes', + 'alternativemethods-backlink', + 'button-to-organizationlistcreateorganizationactionbutton', + 'remove-socialbuttonsblockbuttonarrow', + 'remove-identitypreview-avatar', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', + 'signoutcallback-to-redirecturl', + 'externalaccount-avatarurl', + 'organizationmembershippublicuserdata-profileimageurl', + ]), + ), + fastify: load( + 'fastify', + dedupeMerge(changesAffectingAll, [ + 'api-key-to-secret-key', + 'api-url-value-change', + 'frontend-api-to-publishable-key', + 'createclerkclient-apikey', + 'createclerkclient-frontendapi', + 'clerkplugin-frontendapi', + 'clerk-import-change', + 'externalaccount-avatarurl', + 'organizationmembershippublicuserdata-profileimageurl', + ]), + ), + node: load( + 'node', + dedupeMerge(changesAffectingAll, [ + 'api-key-to-secret-key', + 'api-url-value-change', + 'frontend-api-to-publishable-key', + 'clerkexpressrequireauth-apikey', + 'clerkexpresswithauth-apikey', + 'createclerkclient-apikey', + 'createclerkexpressrequireauth-apikey', + 'createclerkexpresswithauth-apikey', + 'createclerkclient-frontendapi', + 'createclerkexpressrequireauth-frontendapi', + 'clerkexpressrequireauth-frontendapi', + 'createclerkexpresswithauth-frontendapi', + 'clerkexpresswithauth-frontendapi', + 'setclerkapikey', + 'setclerkapiversion', + 'setclerkhttpoptions', + 'setclerkserverapiurl', + 'cjs-esm-instance', + 'legacyauthobject-removed', + 'clerk-import-change', + 'organizationmembershippublicuserdata-profileimageurl', + ]), + ), + react: load('react', dedupeMerge(changesAffectingAll, reactChangesList)), + js: load( + 'js', + dedupeMerge(changesAffectingAll, [ + 'magiclinkerror', + 'ismagiclinkerror', + 'magiclinkerrorcode', + 'usemagiclink', + 'handlemagiclinkverification', + 'external-account-avatarurl', + 'user-orgpublicdata-profileimageurl', + 'setsession', // shared with all? + 'user-update-password', // shared w/ all + 'experimental-canusecaptcha', + 'experimental-captchaurl', + 'experimental-captchasitekey', + 'getorganizationmemberships', + 'lastorganizationinvitation-member', + 'unstable-invitationupdate', + 'unstable-membershipupdate', + 'organization-create-string', // maybe shared with all? + 'organization-getpendinginvitations', // maybe shared with all? + 'user-createexternalaccount-redirecturl', // maybe shared with all? + 'signup-attemptweb3walletverification-generatedsignature', + 'redirecttohome', + 'organizationprofile-settings', + 'userprofile-security', + 'mfa-dropdown', + 'connected-accounts-dropdown', + 'userbuttonpopoveractionbuttontext-removed', + 'userbuttontrigger-userbuttonbox-invert', + 'organizationswitcherpopoveractionbuttontext-removed', + 'card-changes', + 'alternativemethods-backlink', + 'button-to-organizationlistcreateorganizationactionbutton', + 'remove-socialbuttonsblockbuttonarrow', + 'remove-identitypreview-avatar', + 'clerk-isready-removed', + 'new-localization-keys', + 'removed-localization-keys', + 'changed-localization-keys', + 'signoutcallback-to-redirecturl', + 'externalaccount-avatarurl', + 'organizationmembershippublicuserdata-profileimageurl', + ]), + ), shared: load('shared', [ 'magiclinkerror', 'ismagiclinkerror', @@ -334,53 +315,53 @@ export default { 'organizationcontext', 'useorganizationlist-organizationlist', // shared outside this pkg? ]), - chromeExtension: load('chromeExtension', ['clerkprovider-tokencache']), + chromeExtension: load('chromeExtension', dedupeMerge(changesAffectingAll, ['clerkprovider-tokencache'])), localizations: load('localization', [ 'new-localization-keys', 'removed-localization-keys', 'changed-localization-keys', ]), - backend: load('backend', [ - 'api-url-value-changed', - 'verifyjwt-import-path-move', - 'decodejwt-import-path-move', - 'signjwt-import-path-move', - 'constants-import-path-move', - 'redirect-import-path-move', - 'createauthenticaterequest-import-path-move', - 'createisomorphicrequest-import-path-move', - 'createclerkclient-frontendapi', - 'authenticaterequest-params-change', - 'clerk-import', - 'externalaccount-picture', - 'externalaccountjson-avatarurl', - 'organization-logourl', - 'organizationjson-logourl', - 'user-profileimageurl', - 'userjson-profileimageurl', - 'organizationmembershippublicuserdata-profileimageurl', - 'organizationmembershippublicuserdatajson-profileimageurl', - 'clockskewinseconds', - 'pkgversion', - 'client-unstableoptions-removed', - 'httpoptions-removed', - 'createisomorphicrequest-removed', - 'createemail-removed', - 'signjwterror-import-move', - 'tokenverificationerror-import-move', - 'tokenverificationerroraction-import-move', - 'tokenverificationerrorreason-import-move', - 'membershiprole', - 'getorganizationmembershiplist-return-signature', - 'getorganizationlist-return-signature', - 'getorganizationinvitationlist-return-type-change', - 'buildrequesturl-removed', - ]), + backend: load( + 'backend', + dedupeMerge(changesAffectingAll, [ + 'api-url-value-changed', + 'verifyjwt-import-path-move', + 'decodejwt-import-path-move', + 'signjwt-import-path-move', + 'constants-import-path-move', + 'redirect-import-path-move', + 'createauthenticaterequest-import-path-move', + 'createisomorphicrequest-import-path-move', + 'createclerkclient-frontendapi', + 'authenticaterequest-params-change', + 'clerk-import', + 'externalaccount-picture', + 'externalaccountjson-avatarurl', + 'organizationjson-logourl', + 'userjson-profileimageurl', + 'organizationmembershippublicuserdata-profileimageurl', + 'organizationmembershippublicuserdatajson-profileimageurl', + 'clockskewinseconds', + 'pkgversion', + 'client-unstableoptions-removed', + 'httpoptions-removed', + 'createisomorphicrequest-removed', + 'createemail-removed', + 'signjwterror-import-move', + 'tokenverificationerror-import-move', + 'tokenverificationerroraction-import-move', + 'tokenverificationerrorreason-import-move', + 'membershiprole', + 'getorganizationmembershiplist-return-signature', + 'buildrequesturl-removed', + 'createclerkclient-apikey', + ]), + ), types: [], redwood: [], express: [], }; -function dedupeMerge(arr1, arr2) { - return [...new Set(arr1.concat(arr2))]; +function dedupeMerge(...arrays) { + return [...new Set(arrays.flat())]; } From e7e05e26462596f52bd3556100a2e8ab264e442a Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 13 Feb 2024 17:31:38 -0500 Subject: [PATCH 099/159] feat(upgrade): Generate all guides, add a script to make this process faster --- .../guide-generators/v5/expo/__output.mdx | 256 +++++++++------- .../guide-generators/v5/fastify/__output.mdx | 249 ++++++++++++--- .../guide-generators/v5/gatsby/__output.mdx | 245 +-------------- .../guide-generators/v5/generate-all.sh | 15 + .../guide-generators/v5/js/__output.mdx | 75 ++++- .../guide-generators/v5/nextjs/__output.mdx | 287 ++++++++++-------- .../guide-generators/v5/node/__output.mdx | 13 +- .../guide-generators/v5/react/__output.mdx | 247 +-------------- .../guide-generators/v5/remix/__output.mdx | 263 ++++++++-------- .../source/guide-generators/v5/remix/index.js | 2 +- .../v5/shared/deprecation-removals.mdx | 5 +- .../v5/shared/pagination-args.mdx | 2 +- .../v5/shared/pagination-return.mdx | 2 +- 13 files changed, 773 insertions(+), 888 deletions(-) create mode 100755 packages/upgrade/source/guide-generators/v5/generate-all.sh diff --git a/packages/upgrade/source/guide-generators/v5/expo/__output.mdx b/packages/upgrade/source/guide-generators/v5/expo/__output.mdx index c668dd8cef5..d7154f9468d 100644 --- a/packages/upgrade/source/guide-generators/v5/expo/__output.mdx +++ b/packages/upgrade/source/guide-generators/v5/expo/__output.mdx @@ -210,66 +210,26 @@ CLERK_SIGN_UP_URL=/sign-up There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: -isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.logoUrl -> Organization.imageUrl"]}> - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: - - ```diff - - await setSession('sessionID', () => void) - + await setActive({ session: 'sessionID', beforeEmit: () => void }) - - - await setSession(sessionObj) - + await setActive({ session: sessionObj }) - - - await setSession(sessionObj, () => void) - + await setActive({ session: sessionObj, beforeEmit: () => void }) - ``` - - `setActive` also supports setting an active organization: - - ```js - await setActive({ - session: 'sessionID', - organization: 'orgID', - beforeEmit: () => void - }) - - await setActive({ - session: sessionObj, - organization: orgObj, - beforeEmit: () => void - }) - ``` +Organization.logoUrl -> Organization.imageUrl', + 'User.profileImageUrl -> .imageUrl', + 'ExternalAccount.avatarUrl -> .imageUrl', + 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', + ]} +> + + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. - - The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: - - ```diff - import { SignOutButton } from "@clerk/clerk-react"; - - export const Signout = () => { - return ( - { window.location.href = "/your-path" }} - + redirectUrl="/your-path" - > - - - ) - } - ``` + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. + + The `avatarUrl` property of any [`ExternalAcccount` + object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - - The `logoUrl` property of any [`Organization` object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to `imageUrl`. + + The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. @@ -285,72 +245,167 @@ As part of this major version, a number of previously deprecated props, arugment ### Deprecation removals -isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.logoUrl -> Organization.imageUrl"]}> +CLERK_FRONTEND_API replaced by CLERK_PUBLISHABLE_KEY']}> + + If you are using a `CLERK_FRONTEND_API` environment variable, the name must be changed to `CLERK_PUBLISHABLE_KEY` + instead. Note that the values are different as well, so this is not just a key replacement. You can find the + publishable key in your Clerk dashboard. Make sure you do this in both your dev and production environments. + + + +### Other Breaking Changes + +Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed", "Users.getOrganizationInvitationList return signature changed", "Organizations.getOrganizationInvitationList return type changed", "User.getOrganizationMembershipList() return type changed", "Users.getOrganizationList return signature changed", "Organization.getOrganizationList() return type changed", "isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl"]}> - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getRoles({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getDomains({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` - `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - - await setSession('sessionID', () => void) - + await setActive({ session: 'sessionID', beforeEmit: () => void }) + const { data } = await organization.getInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - await setSession(sessionObj) - + await setActive({ session: sessionObj }) + ```diff + const { data } = await organization.getMembershipRequests({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - await setSession(sessionObj, () => void) - + await setActive({ session: sessionObj, beforeEmit: () => void }) + ```diff + const { data } = await user.getOrganizationInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - `setActive` also supports setting an active organization: + ```diff + const { data } = await user.getOrganizationSuggestions({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - ```js - await setActive({ - session: 'sessionID', - organization: 'orgID', - beforeEmit: () => void - }) + ```diff + const { data } = await user.getOrganizationMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - await setActive({ - session: sessionObj, - organization: orgObj, - beforeEmit: () => void - }) + Here's an example of how the response shape would change with this modification: + + ```diff + - const data = await clerkClient.users.getOrganizationInvitationList() + + const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList() ``` - The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: ```diff - import { SignOutButton } from "@clerk/clerk-react"; + const data = await clerkClient.organizations.getOrganizationInvitationList({ + organizationId: "...", + }) - export const Signout = () => { - return ( - { window.location.href = "/your-path" }} - + redirectUrl="/your-path" - > - - - ) - } + - data.forEach(() => {}) + + data.data.forEach(() => {}) ``` - The `logoUrl` property of any [`Organization` object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to `imageUrl`. + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { user } = useUser() + const membershipList = user.getOrganizationMembershipList() + + - membershipList.forEach(() => {}) + + membershipList.data.forEach(() => {}) + ``` + + + The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + + Here's an example of how the response shape would change with this modification: + + ```diff + - const data = await clerkClient.users.getOrganizationList() + + const { data, totalCount } = await clerkClient.users.getOrganizationList() + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { organization } = useOrganization() + const orgList = organization.getOrganizationList() + + - orgList.forEach(() => {}) + + orgList.data.forEach(() => {}) + ``` - - -### Other Breaking Changes - -isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.logoUrl -> Organization.imageUrl"]}> Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. @@ -408,7 +463,4 @@ As part of this major version, a number of previously deprecated props, arugment } ``` - - The `logoUrl` property of any [`Organization` object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to `imageUrl`. - diff --git a/packages/upgrade/source/guide-generators/v5/fastify/__output.mdx b/packages/upgrade/source/guide-generators/v5/fastify/__output.mdx index afba6c5a470..901d2a81caa 100644 --- a/packages/upgrade/source/guide-generators/v5/fastify/__output.mdx +++ b/packages/upgrade/source/guide-generators/v5/fastify/__output.mdx @@ -122,24 +122,24 @@ There are a number of Clerk primitives that contain images, and previously they API_URL value has changed', - 'Clerk -> { createClerkClient }', 'Organization.logoUrl -> Organization.imageUrl', + 'User.profileImageUrl -> .imageUrl', + 'ExternalAccount.avatarUrl -> .imageUrl', + 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', ]} > - The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on - the text content of this value not changing, you may need to make adjustments. + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. - You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - ```diff - import Clerk from "@clerk/fastify" + import {createClerkClient} from "@clerk/fastify" ``` + The `avatarUrl` property of any [`ExternalAcccount` + object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. + The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. @@ -155,50 +155,207 @@ As part of this major version, a number of previously deprecated props, arugment ### Deprecation removals -API_URL value has changed', - 'Clerk -> { createClerkClient }', - 'Organization.logoUrl -> Organization.imageUrl', - ]} -> - - The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on - the text content of this value not changing, you may need to make adjustments. +CLERK_API_KEY replaced by CLERK_SECRET_KEY", "CLERK_FRONTEND_API replaced by CLERK_PUBLISHABLE_KEY", "apiKey -> secretKey as param to createClerkClient", "frontendApi -> publishableKey as param to createClerkClient", "frontendApi -> publishableKey as param to clerkPlugin"]}> + + The `CLERK_API_KEY` environment variable was renamed to `CLERK_SECRET_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). - - The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. - You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - ```diff - import Clerk from "@clerk/fastify" + import {createClerkClient} from "@clerk/fastify" ``` + + The `CLERK_FRONTEND_API` environment variable was renamed to `CLERK_PUBLISHABLE_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). **Note:** The values are different, so this is not just a key replacement. [More information](/docs/deployments/overview#api-keys-and-environment-variables). - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. + + The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. + + ```diff + import { createClerkClient } from '@clerk/fastify'; + + - createClerkClient({ apiKey: '...' }); + + createClerkClient({ secretKey: '...' }); + ``` + + + The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. + + ```diff + import { createClerkClient } from '@clerk/fastify'; + + - createClerkClient({ frontendApi: '...' }); + + createClerkClient({ publishableKey: '...' }); + ``` + + + The `frontendApi` argument passed to `clerkPlugin` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. + + ```diff + import { clerkPlugin } from '@clerk/fastify'; + + - fastify.register(clerkPlugin, { frontendApi: '...' }); + + fastify.register(clerkPlugin, { publishableKey: '...' }); + ``` ### Other Breaking Changes -API_URL value has changed', - 'Clerk -> { createClerkClient }', - 'Organization.logoUrl -> Organization.imageUrl', - ]} -> - - The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on - the text content of this value not changing, you may need to make adjustments. +Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed", "Users.getOrganizationInvitationList return signature changed", "Organizations.getOrganizationInvitationList return type changed", "User.getOrganizationMembershipList() return type changed", "Users.getOrganizationList return signature changed", "Organization.getOrganizationList() return type changed", "API_URL value has changed", "Clerk -> { createClerkClient }"]}> + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getRoles({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` - - The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. - You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - ```diff - import Clerk from "@clerk/fastify" + import {createClerkClient} from "@clerk/fastify" ``` + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getDomains({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMembershipRequests({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationSuggestions({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + + Here's an example of how the response shape would change with this modification: + + ```diff + - const data = await clerkClient.users.getOrganizationInvitationList() + + const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList() + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const data = await clerkClient.organizations.getOrganizationInvitationList({ + organizationId: "...", + }) + + - data.forEach(() => {}) + + data.data.forEach(() => {}) + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { user } = useUser() + const membershipList = user.getOrganizationMembershipList() + + - membershipList.forEach(() => {}) + + membershipList.data.forEach(() => {}) + ``` + + + The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + + Here's an example of how the response shape would change with this modification: + + ```diff + - const data = await clerkClient.users.getOrganizationList() + + const { data, totalCount } = await clerkClient.users.getOrganizationList() + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { organization } = useOrganization() + const orgList = organization.getOrganizationList() + + - orgList.forEach(() => {}) + + orgList.data.forEach(() => {}) + ``` + + + The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. + + + The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: + + ```diff + - import Clerk from "@clerk/fastify" + + import { createClerkClient } from "@clerk/fastify" + ``` diff --git a/packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx b/packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx index 840a080a790..3fdf3ba7134 100644 --- a/packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx +++ b/packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx @@ -212,16 +212,22 @@ There are a number of Clerk primitives that contain images, and previously they ExternalAccount.picture -> .imageUrl', - 'Organization.logoUrl -> .imageUrl', + 'Organization.logoUrl -> Organization.imageUrl', + 'User.profileImageUrl -> .imageUrl', + 'ExternalAccount.avatarUrl -> .imageUrl', 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', ]} > - The `picture` property of any [`ExternalAcccount` + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. + + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. + + The `avatarUrl` property of any [`ExternalAcccount` object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. @@ -284,7 +290,7 @@ As part of this major version, a number of previously deprecated props, arugment ### Other Breaking Changes -MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "isMagicLinkError -> isEmailLinkError", "MagicLinkError -> EmailLinkError", "handleMagicLinkVerification -> handleEmailLinkVerification", "setSession -> setActive", "invitationList -> invitations as param to useOrganizations", "membershipList -> members as param to useOrganization", "useOrganizations -> useOrganizationList", "userProfile -> userProfileProps for UserButton", "WithSession component removed", "WithClerk component removed", "WithUser component removed", "withClerk function removed", "withSession function removed", "withUser function removed", "MultisessionAppSupport import moved to /internal", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.getOrganizationList() return type changed", "User.getOrganizationMembershipList() return type changed", "Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed", "API_URL value has changed", "withServerAuth props.auth return type changed", "Clerk -> { createClerkClient }"]}> +MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "isMagicLinkError -> isEmailLinkError", "MagicLinkError -> EmailLinkError", "handleMagicLinkVerification -> handleEmailLinkVerification", "setSession -> setActive", "invitationList -> invitations as param to useOrganizations", "membershipList -> members as param to useOrganization", "useOrganizations -> useOrganizationList", "userProfile -> userProfileProps for UserButton", "MultisessionAppSupport import moved to /internal", "Replace signOutCallback prop on SignOutButton with redirectUrl", "API_URL value has changed", "withServerAuth props.auth return type changed", "Clerk -> { createClerkClient }"]}> Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. @@ -403,117 +409,6 @@ As part of this major version, a number of previously deprecated props, arugment + ``` - - The `WithSession` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - export const WithSession = ({ children }) => { - const session = useSession(); - if (typeof children !== 'function') throw new Error(); - - return {children(session)}; - }; - ``` - - - The `WithClerk` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - export const WithClerk = ({ children }) => { - const clerk = useClerk(); - if (typeof children !== 'function') throw new Error(); - - return {children(clerk)}; - }; - ``` - - - The `WithUser` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - export const WithUser = ({ children }) => { - const user = useUser(); - if (typeof children !== 'function') throw new Error(); - - return {children(user)}; - }; - ``` - - - The `withClerk` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - function withClerk(Component, displayName) { - displayName = displayName || Component.displayName || Component.name || 'Component'; - Component.displayName = displayName; - const HOC = props => { - const clerk = useIsomorphicClerkContext(); - - if (!clerk.loaded) return null; - - return ( - - ); - }; - - HOC.displayName = `withClerk(${displayName})`; - return HOC; - } - ``` - - - The `withSession` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - function withSession(Component, displayName) { - displayName = displayName || Component.displayName || Component.name || 'Component'; - Component.displayName = displayName; - const HOC = props => { - const session = useSessionContext(); - - if (!session) return null; - - return ( - - ); - }; - - HOC.displayName = `withSession(${displayName})`; - return HOC; - } - ``` - - - The `withUser` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - function withUser(Component, displayName) { - displayName = displayName || Component.displayName || Component.name || 'Component'; - Component.displayName = displayName; - const HOC = props => { - const clerk = useUserContext(); - - if (!user) return null; - - return ( - - ); - }; - - HOC.displayName = `withUser(${displayName})`; - return HOC; - } - ``` - `MultiSessionAppSupport` is a component that handles the intermediate “undefined” state for multisession apps by unmounting and remounting the components during the session switch (` setActive`` call) in order to solve theoretical edge-cases that can arise while switching sessions. It is undocumented and intended only for internal use, so it has been moved to an `/internal` import path. Please note that internal imports are not intended for public use, and are outside the scope of semver. @@ -540,124 +435,6 @@ As part of this major version, a number of previously deprecated props, arugment } ``` - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { organization } = useOrganization() - const orgList = organization.getOrganizationList() - - - orgList.forEach(() => {}) - + orgList.data.forEach(() => {}) - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { user } = useUser() - const membershipList = user.getOrganizationMembershipList() - - - membershipList.forEach(() => {}) - + membershipList.data.forEach(() => {}) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getRoles({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getDomains({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMembershipRequests({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationSuggestions({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. diff --git a/packages/upgrade/source/guide-generators/v5/generate-all.sh b/packages/upgrade/source/guide-generators/v5/generate-all.sh new file mode 100755 index 00000000000..d07a579ca8d --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/generate-all.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +node $SCRIPT_DIR/backend/index.js +node $SCRIPT_DIR/chromeExtension/index.js +node $SCRIPT_DIR/expo/index.js +node $SCRIPT_DIR/fastify/index.js +node $SCRIPT_DIR/gatsby/index.js +node $SCRIPT_DIR/js/index.js +node $SCRIPT_DIR/nextjs/index.js +node $SCRIPT_DIR/node/index.js +node $SCRIPT_DIR/react/index.js +node $SCRIPT_DIR/remix/index.js +node $SCRIPT_DIR/retheme/index.js diff --git a/packages/upgrade/source/guide-generators/v5/js/__output.mdx b/packages/upgrade/source/guide-generators/v5/js/__output.mdx index 35c3a815d82..44a1de9a6f1 100644 --- a/packages/upgrade/source/guide-generators/v5/js/__output.mdx +++ b/packages/upgrade/source/guide-generators/v5/js/__output.mdx @@ -188,9 +188,9 @@ There are a number of Clerk primitives that contain images, and previously they Organization.logoUrl -> Organization.imageUrl', - 'ExternalAccount.picture -> .imageUrl', - 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', 'User.profileImageUrl -> .imageUrl', + 'ExternalAccount.avatarUrl -> .imageUrl', + 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', ]} > @@ -198,21 +198,21 @@ There are a number of Clerk primitives that contain images, and previously they object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to `imageUrl`. + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - The `picture` property of any [`ExternalAcccount` + The `avatarUrl` property of any [`ExternalAcccount` object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. #### Changes to pagination arguments for some functions There were some changes made to pagination-related arguments passed into functions, in order to make it more clear how to control paginated results. See each function impacted by these changes below: -Organization.getRoles arguments changed", "Organization.getDomains arguments changed", "Organization.getMembershipRequests arguments changed", "Organization.getMemberships arguments changed", "Organization.getInvitations arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed"]}> +Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed"]}> There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: @@ -229,7 +229,7 @@ There were some changes made to pagination-related arguments passed into functio There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - const { data } = await organization.getDomains({ + const { data } = await organization.getMemberships({ - limit: 10, + pageSize: 10, - offset: 10, @@ -241,7 +241,7 @@ There were some changes made to pagination-related arguments passed into functio There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - const { data } = await organization.getMembershipRequests({ + const { data } = await organization.getDomains({ - limit: 10, + pageSize: 10, - offset: 10, @@ -253,7 +253,7 @@ There were some changes made to pagination-related arguments passed into functio There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - const { data } = await organization.getMemberships({ + const { data } = await organization.getInvitations({ - limit: 10, + pageSize: 10, - offset: 10, @@ -265,7 +265,7 @@ There were some changes made to pagination-related arguments passed into functio There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: ```diff - const { data } = await organization.getInvitations({ + const { data } = await organization.getMembershipRequests({ - limit: 10, + pageSize: 10, - offset: 10, @@ -315,8 +315,61 @@ There were some changes made to pagination-related arguments passed into functio There have been changes to return signatures for some functions. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. This change also aligns the response shape with what is returned from the Clerk backend API. Each impacted function is listed below, along with code examples: - - +Users.getOrganizationInvitationList return signature changed", "Organizations.getOrganizationInvitationList return type changed", "User.getOrganizationMembershipList() return type changed", "Users.getOrganizationList return signature changed", "Organization.getOrganizationList() return type changed"]}> + + The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + + Here's an example of how the response shape would change with this modification: + + ```diff + - const data = await clerkClient.users.getOrganizationInvitationList() + + const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList() + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const data = await clerkClient.organizations.getOrganizationInvitationList({ + organizationId: "...", + }) + + - data.forEach(() => {}) + + data.data.forEach(() => {}) + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { user } = useUser() + const membershipList = user.getOrganizationMembershipList() + + - membershipList.forEach(() => {}) + + membershipList.data.forEach(() => {}) + ``` + + + The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + + Here's an example of how the response shape would change with this modification: + + ```diff + - const data = await clerkClient.users.getOrganizationList() + + const { data, totalCount } = await clerkClient.users.getOrganizationList() + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { organization } = useOrganization() + const orgList = organization.getOrganizationList() + + - orgList.forEach(() => {}) + + orgList.data.forEach(() => {}) + ``` + ## Deprecation removals & housekeeping diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx b/packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx index 2b0c9f05026..2cf6552b6b1 100644 --- a/packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx +++ b/packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx @@ -568,19 +568,25 @@ There are a number of Clerk primitives that contain images, and previously they ExternalAccount.picture -> .imageUrl', - 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', + 'Organization.logoUrl -> Organization.imageUrl', 'User.profileImageUrl -> .imageUrl', + 'ExternalAccount.avatarUrl -> .imageUrl', + 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', ]} > - The `picture` property of any [`ExternalAcccount` + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. + + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. + + The `avatarUrl` property of any [`ExternalAcccount` object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. ## Deprecation removals & housekeeping @@ -739,7 +745,157 @@ As part of this major version, a number of previously deprecated props, arugment ### Other Breaking Changes -API_URL value has changed", "isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "isMetamaskError import moved under /errors", "WithSession component removed", "WithClerk component removed", "WithUser component removed", "withClerk function removed", "withSession function removed", "withUser function removed", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.getOrganizationList() return type changed", "User.getOrganizationMembershipList() return type changed", "Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed", "Organization.logoUrl -> Organization.imageUrl"]}> +Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed", "Users.getOrganizationInvitationList return signature changed", "Organizations.getOrganizationInvitationList return type changed", "User.getOrganizationMembershipList() return type changed", "Users.getOrganizationList return signature changed", "Organization.getOrganizationList() return type changed", "API_URL value has changed", "isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "isMetamaskError import moved under /errors", "WithSession component removed", "WithClerk component removed", "WithUser component removed", "withClerk function removed", "withSession function removed", "withUser function removed", "Replace signOutCallback prop on SignOutButton with redirectUrl"]}> + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getRoles({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getDomains({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await organization.getMembershipRequests({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationInvitations({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationSuggestions({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + + ```diff + const { data } = await user.getOrganizationMemberships({ + - limit: 10, + + pageSize: 10, + - offset: 10, + + initialPage: 2, + }) + ``` + + + The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + + Here's an example of how the response shape would change with this modification: + + ```diff + - const data = await clerkClient.users.getOrganizationInvitationList() + + const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList() + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const data = await clerkClient.organizations.getOrganizationInvitationList({ + organizationId: "...", + }) + + - data.forEach(() => {}) + + data.data.forEach(() => {}) + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { user } = useUser() + const membershipList = user.getOrganizationMembershipList() + + - membershipList.forEach(() => {}) + + membershipList.data.forEach(() => {}) + ``` + + + The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + + Here's an example of how the response shape would change with this modification: + + ```diff + - const data = await clerkClient.users.getOrganizationList() + + const { data, totalCount } = await clerkClient.users.getOrganizationList() + ``` + + + The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: + + ```diff + const { organization } = useOrganization() + const orgList = organization.getOrganizationList() + + - orgList.forEach(() => {}) + + orgList.data.forEach(() => {}) + ``` + The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. @@ -919,125 +1075,4 @@ As part of this major version, a number of previously deprecated props, arugment } ``` - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { organization } = useOrganization() - const orgList = organization.getOrganizationList() - - - orgList.forEach(() => {}) - + orgList.data.forEach(() => {}) - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { user } = useUser() - const membershipList = user.getOrganizationMembershipList() - - - membershipList.forEach(() => {}) - + membershipList.data.forEach(() => {}) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getRoles({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getDomains({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMembershipRequests({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationSuggestions({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - The `logoUrl` property of any [`Organization` object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to `imageUrl`. - diff --git a/packages/upgrade/source/guide-generators/v5/node/__output.mdx b/packages/upgrade/source/guide-generators/v5/node/__output.mdx index d7a54b41303..c162eff80e6 100644 --- a/packages/upgrade/source/guide-generators/v5/node/__output.mdx +++ b/packages/upgrade/source/guide-generators/v5/node/__output.mdx @@ -167,21 +167,20 @@ There are a number of Clerk primitives that contain images, and previously they ExternalAccount.picture -> .imageUrl', - 'Organization.logoUrl -> .imageUrl', + 'Organization.logoUrl -> Organization.imageUrl', + 'User.profileImageUrl -> .imageUrl', 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', - 'Organization.logoUrl -> .imageUrl', ]} > - The `picture` property of any [`ExternalAcccount` - object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. - The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. ## Deprecation removals & housekeeping diff --git a/packages/upgrade/source/guide-generators/v5/react/__output.mdx b/packages/upgrade/source/guide-generators/v5/react/__output.mdx index 330530a38e2..e21c0fefb81 100644 --- a/packages/upgrade/source/guide-generators/v5/react/__output.mdx +++ b/packages/upgrade/source/guide-generators/v5/react/__output.mdx @@ -227,21 +227,25 @@ There are a number of Clerk primitives that contain images, and previously they ExternalAccount.picture -> .imageUrl', - 'Organization.logoUrl -> .imageUrl', + 'Organization.logoUrl -> Organization.imageUrl', + 'User.profileImageUrl -> .imageUrl', + 'ExternalAccount.avatarUrl -> .imageUrl', 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', - 'Organization.logoUrl -> .imageUrl', ]} > - The `picture` property of any [`ExternalAcccount` + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. + + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. + + The `avatarUrl` property of any [`ExternalAcccount` object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - The `logoUrl` property of any `Organization` object has been changed to `imageUrl`. ## Deprecation removals & housekeeping @@ -275,7 +279,7 @@ As part of this major version, a number of previously deprecated props, arugment ### Other Breaking Changes -MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "isMagicLinkError -> isEmailLinkError", "MagicLinkError -> EmailLinkError", "handleMagicLinkVerification -> handleEmailLinkVerification", "setSession -> setActive", "invitationList -> invitations as param to useOrganizations", "membershipList -> members as param to useOrganization", "useOrganizations -> useOrganizationList", "userProfile -> userProfileProps for UserButton", "WithSession component removed", "WithClerk component removed", "WithUser component removed", "withClerk function removed", "withSession function removed", "withUser function removed", "MultisessionAppSupport import moved to /internal", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.getOrganizationList() return type changed", "User.getOrganizationMembershipList() return type changed", "Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed"]}> +MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "isMagicLinkError -> isEmailLinkError", "MagicLinkError -> EmailLinkError", "handleMagicLinkVerification -> handleEmailLinkVerification", "setSession -> setActive", "invitationList -> invitations as param to useOrganizations", "membershipList -> members as param to useOrganization", "useOrganizations -> useOrganizationList", "userProfile -> userProfileProps for UserButton", "MultisessionAppSupport import moved to /internal", "Replace signOutCallback prop on SignOutButton with redirectUrl"]}> Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. @@ -394,117 +398,6 @@ As part of this major version, a number of previously deprecated props, arugment + ``` - - The `WithSession` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - export const WithSession = ({ children }) => { - const session = useSession(); - if (typeof children !== 'function') throw new Error(); - - return {children(session)}; - }; - ``` - - - The `WithClerk` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - export const WithClerk = ({ children }) => { - const clerk = useClerk(); - if (typeof children !== 'function') throw new Error(); - - return {children(clerk)}; - }; - ``` - - - The `WithUser` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - export const WithUser = ({ children }) => { - const user = useUser(); - if (typeof children !== 'function') throw new Error(); - - return {children(user)}; - }; - ``` - - - The `withClerk` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - function withClerk(Component, displayName) { - displayName = displayName || Component.displayName || Component.name || 'Component'; - Component.displayName = displayName; - const HOC = props => { - const clerk = useIsomorphicClerkContext(); - - if (!clerk.loaded) return null; - - return ( - - ); - }; - - HOC.displayName = `withClerk(${displayName})`; - return HOC; - } - ``` - - - The `withSession` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - function withSession(Component, displayName) { - displayName = displayName || Component.displayName || Component.name || 'Component'; - Component.displayName = displayName; - const HOC = props => { - const session = useSessionContext(); - - if (!session) return null; - - return ( - - ); - }; - - HOC.displayName = `withSession(${displayName})`; - return HOC; - } - ``` - - - The `withUser` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - function withUser(Component, displayName) { - displayName = displayName || Component.displayName || Component.name || 'Component'; - Component.displayName = displayName; - const HOC = props => { - const clerk = useUserContext(); - - if (!user) return null; - - return ( - - ); - }; - - HOC.displayName = `withUser(${displayName})`; - return HOC; - } - ``` - `MultiSessionAppSupport` is a component that handles the intermediate “undefined” state for multisession apps by unmounting and remounting the components during the session switch (` setActive`` call) in order to solve theoretical edge-cases that can arise while switching sessions. It is undocumented and intended only for internal use, so it has been moved to an `/internal` import path. Please note that internal imports are not intended for public use, and are outside the scope of semver. @@ -531,122 +424,4 @@ As part of this major version, a number of previously deprecated props, arugment } ``` - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { organization } = useOrganization() - const orgList = organization.getOrganizationList() - - - orgList.forEach(() => {}) - + orgList.data.forEach(() => {}) - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { user } = useUser() - const membershipList = user.getOrganizationMembershipList() - - - membershipList.forEach(() => {}) - + membershipList.data.forEach(() => {}) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getRoles({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getDomains({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMembershipRequests({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationSuggestions({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - diff --git a/packages/upgrade/source/guide-generators/v5/remix/__output.mdx b/packages/upgrade/source/guide-generators/v5/remix/__output.mdx index da7b6d031ef..e6e7f4e0da5 100644 --- a/packages/upgrade/source/guide-generators/v5/remix/__output.mdx +++ b/packages/upgrade/source/guide-generators/v5/remix/__output.mdx @@ -110,7 +110,148 @@ If you are having trouble with `npx`, it's also possible to install directly wit The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. -[More detail on these changes »](#redesigned-components) +[More detail on these changes »](/components-redesigned) + +## After sign up/in/out URL handling + +Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. + +As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. + +```diff +- ++ +``` + +### Removed: `orgs` claim on JWT + +In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. + +The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. + + + + ```typescript filename="Next.js" + import { getAuth } from "@clerk/nextjs/server" + const claims: JwtPayload = getAuth(request).sessionClaims + + import { getAuth } from "@clerk/ssr.server" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + + ```typescript filename="Fastify" + import { getAuth } from "@clerk/fastify" + const claims: JwtPayload = (await getAuth(request)).sessionClaims + ``` + + + ```typescript filename="@clerk/backend" + import { createClerkClient } from "@clerk/backend" + + const clerkClient = createClerkClient({ secretKey: "" }) + const requestState = await clerkClient.authenticateRequest( + request, + { publishableKey: "" } + ) + const claims: JwtPayload = requestState.toAuth().sessionClaims + ``` + + + + ```typescript filename="@clerk/clerk-sdk-node" + import { clerkClient } from "@clerk/clerk-sdk-node" + + router.use((...args) => clerkClient.expressRequireAuth()(...args)) + router.get("/me", async (req, reply: Response) => { + return reply.json({ auth: req.auth }) + }) + ``` + + + + +If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. + +### Path routing is now the default + +On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. + +In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: + +- `` +- `` +- `` +- `` +- `` + +Here's how you'd use the components going forward: + +```jsx + + + + + +``` + +If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. + +```jsx + + +``` + +However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. + + +```env filename=".env.local" +NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in +NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up +``` + +```env filename=".env" +CLERK_SIGN_IN_URL=/sign-in +CLERK_SIGN_UP_URL=/sign-up +``` + + + +**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. + +```jsx +// Only works for Next.js / Remix when environment variables are set + + +``` + +### Image URL Name Consolidation + +There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: + +Organization.logoUrl -> Organization.imageUrl', + 'User.profileImageUrl -> .imageUrl', + 'ExternalAccount.avatarUrl -> .imageUrl', + 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', + ]} +> + + The `logoUrl` property of any [`Organization` + object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to + `imageUrl`. + + The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. + + The `avatarUrl` property of any [`ExternalAcccount` + object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. + + + The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. + + ## Deprecation removals & housekeeping @@ -188,7 +329,7 @@ As part of this major version, a number of previously deprecated props, arugment ### Other Breaking Changes -isMagicLinkError -> isEmailLinkError", "MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl", "Organization.getOrganizationList() return type changed", "User.getOrganizationMembershipList() return type changed", "Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed"]}> +isMagicLinkError -> isEmailLinkError", "MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl"]}> Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. @@ -246,122 +387,4 @@ As part of this major version, a number of previously deprecated props, arugment } ``` - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { organization } = useOrganization() - const orgList = organization.getOrganizationList() - - - orgList.forEach(() => {}) - + orgList.data.forEach(() => {}) - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { user } = useUser() - const membershipList = user.getOrganizationMembershipList() - - - membershipList.forEach(() => {}) - + membershipList.data.forEach(() => {}) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getRoles({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getDomains({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMembershipRequests({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationSuggestions({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - diff --git a/packages/upgrade/source/guide-generators/v5/remix/index.js b/packages/upgrade/source/guide-generators/v5/remix/index.js index f8430b8b5ac..570d861056e 100644 --- a/packages/upgrade/source/guide-generators/v5/remix/index.js +++ b/packages/upgrade/source/guide-generators/v5/remix/index.js @@ -17,7 +17,7 @@ const packageName = '@clerk/remix'; const cwd = `${version}/${name}`; async function generate() { - const data = loadVersionChangeData(version, name); + const data = await loadVersionChangeData(version, name); return assembleContent({ data: data, cwd }, [ frontmatter({ diff --git a/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx b/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx index f1978e8315c..cabaf3a0345 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx @@ -1,7 +1,6 @@ As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. - For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of - changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for - manually. + For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). Changes in this + section are very unlikely to appear in your codebase, the tool will save time looking for them. diff --git a/packages/upgrade/source/guide-generators/v5/shared/pagination-args.mdx b/packages/upgrade/source/guide-generators/v5/shared/pagination-args.mdx index 9f33b5f2173..3d8468f3884 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/pagination-args.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/pagination-args.mdx @@ -1,3 +1,3 @@ -#### Changes to pagination arguments for some functions +### Changes to pagination arguments for some functions There were some changes made to pagination-related arguments passed into functions, in order to make it more clear how to control paginated results. See each function impacted by these changes below: diff --git a/packages/upgrade/source/guide-generators/v5/shared/pagination-return.mdx b/packages/upgrade/source/guide-generators/v5/shared/pagination-return.mdx index c5c54233c14..4867faf3dbf 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/pagination-return.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/pagination-return.mdx @@ -1,3 +1,3 @@ -#### Changes to some function return signatures +### Changes to some function return signatures There have been changes to return signatures for some functions. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. This change also aligns the response shape with what is returned from the Clerk backend API. Each impacted function is listed below, along with code examples: From 05b49b043944b51a13553fc2b0d4b6af5f265e01 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 16 Feb 2024 16:41:23 -0500 Subject: [PATCH 100/159] chore(upgrade): Polish polish polish --- packages/upgrade/.gitignore | 3 +- .../guide-generators/text-generation.js | 28 +- .../guide-generators/v5/backend/__output.mdx | 588 --------- .../guide-generators/v5/backend/index.js | 10 +- .../guide-generators/v5/backend/intro.mdx | 4 +- .../v5/chromeExtension/__output.mdx | 245 ---- .../v5/chromeExtension/index.js | 14 +- .../v5/chromeExtension/intro.mdx | 4 +- .../guide-generators/v5/expo/__output.mdx | 466 ------- .../source/guide-generators/v5/expo/index.js | 13 +- .../source/guide-generators/v5/expo/intro.mdx | 4 +- .../guide-generators/v5/fastify/__output.mdx | 361 ------ .../guide-generators/v5/fastify/index.js | 10 +- .../guide-generators/v5/fastify/intro.mdx | 2 +- .../guide-generators/v5/gatsby/__output.mdx | 481 -------- .../guide-generators/v5/gatsby/index.js | 2 +- .../guide-generators/v5/generate-all.sh | 1 + .../guide-generators/v5/js/__output.mdx | 550 --------- .../source/guide-generators/v5/js/index.js | 12 +- .../source/guide-generators/v5/js/intro.mdx | 4 +- .../guide-generators/v5/nextjs/__output.mdx | 1078 ----------------- .../v5/nextjs/import-changes.mdx | 4 +- .../guide-generators/v5/nextjs/index.js | 12 +- .../guide-generators/v5/nextjs/intro.mdx | 2 +- .../guide-generators/v5/node/__output.mdx | 344 ------ .../source/guide-generators/v5/node/index.js | 14 +- .../source/guide-generators/v5/node/intro.mdx | 2 +- .../guide-generators/v5/overview/index.js | 15 + .../guide-generators/v5/overview/intro.mdx | 33 +- .../guide-generators/v5/overview/per-sdk.mdx | 16 - .../guide-generators/v5/react/__output.mdx | 427 ------- .../source/guide-generators/v5/react/index.js | 14 +- .../guide-generators/v5/react/intro.mdx | 2 +- .../guide-generators/v5/remix/__output.mdx | 390 ------ .../source/guide-generators/v5/remix/index.js | 12 +- .../guide-generators/v5/remix/intro.mdx | 4 +- .../guide-generators/v5/retheme/__output.mdx | 436 ------- .../v5/shared/after-sign-x-handling.mdx | 4 +- .../source/guide-generators/v5/shared/cli.mdx | 2 +- .../v5/shared/node-version.mdx | 2 +- .../guide-generators/v5/shared/orgs-claim.mdx | 2 +- .../v5/shared/path-routing.mdx | 16 +- .../guide-generators/v5/shared/prepare.mdx | 9 +- .../{update-v5.mdx => update-version.mdx} | 4 +- .../authenticaterequest-params-change.md | 1 + .../versions/v5/backend/clockskewinseconds.md | 1 + .../v5/backend/httpoptions-removed.md | 3 +- .../clerkprovider-tokencache.md | 1 + .../externalaccount-picture.md | 0 .../getorganizationlist-return-type-change.md | 2 +- ...zationmembershiplist-return-type-change.md | 2 +- .../multisessionappsupport-import-change.md | 2 +- .../v5/{js => common}/user-update-password.md | 0 packages/upgrade/source/versions/v5/index.js | 3 +- ...b3walletverification-generatedsignature.md | 2 +- .../nextjs/with-clerk-middleware-removed.md | 49 +- .../v5/node/legacyauthobject-removed.md | 4 +- 57 files changed, 220 insertions(+), 5496 deletions(-) delete mode 100644 packages/upgrade/source/guide-generators/v5/backend/__output.mdx delete mode 100644 packages/upgrade/source/guide-generators/v5/chromeExtension/__output.mdx delete mode 100644 packages/upgrade/source/guide-generators/v5/expo/__output.mdx delete mode 100644 packages/upgrade/source/guide-generators/v5/fastify/__output.mdx delete mode 100644 packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx delete mode 100644 packages/upgrade/source/guide-generators/v5/js/__output.mdx delete mode 100644 packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx delete mode 100644 packages/upgrade/source/guide-generators/v5/node/__output.mdx create mode 100644 packages/upgrade/source/guide-generators/v5/overview/index.js delete mode 100644 packages/upgrade/source/guide-generators/v5/overview/per-sdk.mdx delete mode 100644 packages/upgrade/source/guide-generators/v5/react/__output.mdx delete mode 100644 packages/upgrade/source/guide-generators/v5/remix/__output.mdx delete mode 100644 packages/upgrade/source/guide-generators/v5/retheme/__output.mdx rename packages/upgrade/source/guide-generators/v5/shared/{update-v5.mdx => update-version.mdx} (82%) rename packages/upgrade/source/versions/v5/{backend => common}/externalaccount-picture.md (100%) rename packages/upgrade/source/versions/v5/{js => common}/user-update-password.md (100%) diff --git a/packages/upgrade/.gitignore b/packages/upgrade/.gitignore index 76add878f8d..19c7b136f34 100644 --- a/packages/upgrade/.gitignore +++ b/packages/upgrade/.gitignore @@ -1,2 +1,3 @@ node_modules -dist \ No newline at end of file +dist +__output.mdx \ No newline at end of file diff --git a/packages/upgrade/source/guide-generators/text-generation.js b/packages/upgrade/source/guide-generators/text-generation.js index 6071bb30425..93397fe0211 100644 --- a/packages/upgrade/source/guide-generators/text-generation.js +++ b/packages/upgrade/source/guide-generators/text-generation.js @@ -59,7 +59,7 @@ ${item.content.trim()}`; // Typically used to present a set of related changes or a longer list of changes // that are de-emphasized as they are unlikely to be present for most users. export const accordionForCategory = partial((categories, options, { data }) => { - const items = data.filter(i => [].concat(categories).includes(i.category)); + const items = filterCategories(data, categories); options ||= {}; if (options.additionalItems) items.push(...[].concat(options.additionalItems)); @@ -76,16 +76,22 @@ ${items.map(i => ` ${indent('\n' + i.content.trim(), 4)}\n
{ includeCategories ||= []; - return assembleContent(opts, [ - '## Deprecation removals & housekeeping', - markdown('deprecation-removals'), + const hasDeprecations = filterCategories(opts.data, 'deprecation-removal').length; + const hasOtherChanges = filterCategories(opts.data, [undefined, ...includeCategories]).length; - '### Deprecation removals', - accordionForCategory('deprecation-removal'), + const content = ['### Deprecation removals & housekeeping', markdown('deprecation-removals')]; - '### Other Breaking Changes', - accordionForCategory([undefined, ...includeCategories]), - ]); + if (hasDeprecations) { + content.push('#### Deprecation removals'); + content.push(accordionForCategory('deprecation-removal')); + } + + if (hasOtherChanges) { + content.push('#### Other Breaking Changes'); + content.push(accordionForCategory([undefined, ...includeCategories])); + } + + return assembleContent(opts, content); }); // writes output to an mdx file @@ -93,6 +99,10 @@ export const writeToFile = partial((cwd, content) => { writeFileSync(path.join(__dirname, cwd, '__output.mdx'), content); }); +function filterCategories(data, categories) { + return data.filter(i => [].concat(categories).includes(i.category)); +} + // Small internal utility to ensure proper indentation within the resulting markup. function indent(str, numSpaces) { return str diff --git a/packages/upgrade/source/guide-generators/v5/backend/__output.mdx b/packages/upgrade/source/guide-generators/v5/backend/__output.mdx deleted file mode 100644 index dcf0b391c10..00000000000 --- a/packages/upgrade/source/guide-generators/v5/backend/__output.mdx +++ /dev/null @@ -1,588 +0,0 @@ ---- -title: 'Upgrading Backend from v4 to v5' -description: "Learn how to upgrade Clerk's Backend SDK from v4 to v5." ---- - -# Upgrading `@clerk/backend` from v4 to v5 - -Version 5 of the Backend SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. - -By the end of this guide, you’ll have successfully upgraded your Backend project to use `@clerk/backend` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. - -## Preparing to upgrade - -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. - -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. - -Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. - -**Updating Node.js** - -You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). - -## Updating to v5 - -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: - - - ```bash filename="terminal" - npm install @clerk/backend@beta - ``` - - ```bash filename="terminal" - yarn add @clerk/backend@beta - ``` - - ```bash filename="terminal" - pnpm add @clerk/backend@beta - ``` - - - -## CLI Upgrade Helper - -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. - -To run the CLI tool, navigate to your project and run it in the terminal: - - - ```bash filename="terminal" - npx @clerk/upgrade - ``` - -```bash filename="terminal" -yarn dlx @clerk/upgrade -``` - -```bash filename="terminal" -pnpm dlx @clerk/upgrade -``` - - - -If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. - -## Breaking Changes - -### `request` separated from `options` as params to `authenticateRequest` - -There has been a change to the way the params of the `authenticateRequest` function are structured. The `request` param, formerly included in an `options` object, has been moved to stand on its own as the first param to the function, while the `options` object remains as the second param. Example below: - -```diff -- clerkClient.authenticateRequest({ ...opts, request }) -+ clerkClient.authenticateRequest(request, { ...opts }) -``` - -### `clockSkewInSeconds` -> `clockSkewInMs` - -The `clockSkewInSeconds` option has been renamed to `clockSkewInMs` in order to accurately reflect that its value is expected to be in milliseconds rather than seconds. The value does not need to change here, only the name. This change affects the following imports: - -- `verifyJwt` -- `verifyToken` -- `Clerk.authenticateRequest` - -### Import paths changes - -Some top level import paths have been changed in order to improve tree-shaking and more clearly categorize sets of functionality. Some methods have been moved under an `/internal` path, indicating that they are only intended for internal use, are exempt from semver, and should be used with great caution. - -verifyJwt import moved to @clerk/backend/tokens', - 'decodeJwt import moved to @clerk/backend/tokens', - 'signJwt import moved to @clerk/backend/tokens', - 'constants import moved to @clerk/backend/internal', - 'redirect import moved to @clerk/backend/internal', - 'createAuthenticateRequest import moved to @clerk/backend/internal', - 'createIsomorphicRequest import moved to @clerk/backend/internal', - 'createIsomorphicRequest import moved to /internal', - 'SignJWTError import moved to @clerk/backend/errors', - 'TokenVerificationError import moved to @clerk/backend/errors', - 'TokenVerificationErrorAction import moved to @clerk/backend/errors', - 'TokenVerificationErrorReason import moved to @clerk/backend/errors', - ]} -> - - The `verifyJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your - import path in order for it to work correctly. Example below of the fix that needs to be made ```diff - import{' '} - {verifyJwt} from "@clerk/backend" + import {verifyJwt} from "@clerk/backend/tokens" ``` - - - The `decodeJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your - import path in order for it to work correctly. Example below of the fix that needs to be made ```diff - import{' '} - {decodeJwt} from "@clerk/backend" + import {decodeJwt} from "@clerk/backend/tokens" ``` - - - The `signJwt` import path has changed from `@clerk/backend` to `@clerk/backend/tokens`. You must update your import - path in order for it to work correctly. Example below of the fix that needs to be made ```diff - import {signJwt}{' '} - from "@clerk/backend" + import {signJwt} from "@clerk/backend/tokens" ``` - - - The `constants` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your - import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside - the scope of semver. Example below of the fix that needs to be made: ```diff - import {constants} from - "@clerk/backend" + import {constants} from "@clerk/backend/internal" ``` - - - The `redirect` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must update your - import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside - the scope of semver. Example below of the fix that needs to be made: ```diff - import {redirect} from - "@clerk/backend" + import {redirect} from "@clerk/backend/internal" ``` - - - The `createAuthenticateRequest` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must - update your import path in order for it to work correctly. Note that internal imports are not intended for usage and - are outside the scope of semver. Example below of the fix that needs to be made: ```diff - import{' '} - {createAuthenticateRequest} from "@clerk/backend" + import {createAuthenticateRequest} from - "@clerk/backend/internal" ``` - - - The `createIsomorphicRequest` import path has changed from `@clerk/backend` to `@clerk/backend/internal`. You must - update your import path in order for it to work correctly. Note that internal imports are not intended for usage and - are outside the scope of semver. Example below of the fix that needs to be made: ```diff - import{' '} - {createIsomorphicRequest} from "@clerk/backend" + import {createIsomorphicRequest} from "@clerk/backend/internal" - ``` - - - The `createIsomorphicRequest` import was intended for those building custom Clerk integrations for frameworks and - has been moved to `@clerk/backend/internal` to reflect this. Please use caution when using internal imports as they - are outside the bounds of semver. ```diff - import {createIsomorphicRequest} from "@clerk/backend" + import{' '} - {createIsomorphicRequest} from "@clerk/backend/internal" ``` - - - The `SignJWTError` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must update your - import path in order for it to work correctly. Example below of the fix that needs to be made: ```diff - import{' '} - {SignJWTError} from "@clerk/backend" + import {SignJWTError} from "@clerk/backend/errors" ``` - - - The `TokenVerificationError` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You must - update your import path in order for it to work correctly. Example below of the fix that needs to be made: ```diff - - import {TokenVerificationError} from "@clerk/backend" + import {TokenVerificationError} from "@clerk/backend/errors" - ``` - - - The `TokenVerificationErrorAction` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You - must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - ```diff - import {TokenVerificationErrorAction} from "@clerk/backend" + import {TokenVerificationErrorAction} from - "@clerk/backend/errors" ``` - - - The `TokenVerificationErrorReason` import path has changed from `@clerk/backend` to `@clerk/backend/errors`. You - must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - ```diff - import {TokenVerificationErrorReason} from "@clerk/backend" + import {TokenVerificationErrorReason} from - "@clerk/backend/errors" ``` - - - -### `httpOptions` parameter removed - -The `httpOptions` parameter was removed from the internal `buildRequest` function but it is used by most public facing APIs. Hence you were able to pass `httpOptions` to some functions which is not possible anymore. If you're currently relying on this functionality and wish to update, please reach out to Clerk's support. - -The internal change looks like this: - -```diff -- const r = buildRequest({ httpsOptions: { headers: {} }}) -+ const request = buildRequest() -+ request({ headerParams: {} }) -``` - -### Removed: `orgs` claim on JWT - -In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. - -The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. - - - - ```typescript filename="Next.js" - import { getAuth } from "@clerk/nextjs/server" - const claims: JwtPayload = getAuth(request).sessionClaims - - import { getAuth } from "@clerk/ssr.server" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - - ```typescript filename="Fastify" - import { getAuth } from "@clerk/fastify" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - ```typescript filename="@clerk/backend" - import { createClerkClient } from "@clerk/backend" - - const clerkClient = createClerkClient({ secretKey: "" }) - const requestState = await clerkClient.authenticateRequest( - request, - { publishableKey: "" } - ) - const claims: JwtPayload = requestState.toAuth().sessionClaims - ``` - - - - ```typescript filename="@clerk/clerk-sdk-node" - import { clerkClient } from "@clerk/clerk-sdk-node" - - router.use((...args) => clerkClient.expressRequireAuth()(...args)) - router.get("/me", async (req, reply: Response) => { - return reply.json({ auth: req.auth }) - }) - ``` - - - - -If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. - -#### Changes to pagination arguments for some functions - -There were some changes made to pagination-related arguments passed into functions, in order to make it more clear how to control paginated results. See each function impacted by these changes below: - -Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed"]}> - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getRoles({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getDomains({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMembershipRequests({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationSuggestions({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - -#### Changes to some function return signatures - -There have been changes to return signatures for some functions. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. This change also aligns the response shape with what is returned from the Clerk backend API. Each impacted function is listed below, along with code examples: - -Users.getOrganizationInvitationList return signature changed", "Organizations.getOrganizationInvitationList return type changed", "User.getOrganizationMembershipList() return type changed", "Users.getOrganizationList return signature changed", "Organization.getOrganizationList() return type changed", "Users.getOrganizationMembershipList return signature changed"]}> - - The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - - Here's an example of how the response shape would change with this modification: - - ```diff - - const data = await clerkClient.users.getOrganizationInvitationList() - + const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList() - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const data = await clerkClient.organizations.getOrganizationInvitationList({ - organizationId: "...", - }) - - - data.forEach(() => {}) - + data.data.forEach(() => {}) - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { user } = useUser() - const membershipList = user.getOrganizationMembershipList() - - - membershipList.forEach(() => {}) - + membershipList.data.forEach(() => {}) - ``` - - - The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - - Here's an example of how the response shape would change with this modification: - - ```diff - - const data = await clerkClient.users.getOrganizationList() - + const { data, totalCount } = await clerkClient.users.getOrganizationList() - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { organization } = useOrganization() - const orgList = organization.getOrganizationList() - - - orgList.forEach(() => {}) - + orgList.data.forEach(() => {}) - ``` - - - The response payload of `Users.getOrganizationMembershipList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - - Here's an example of how the response shape would change with this modification: - - ```diff - - const data = await clerkClient.users.getOrganizationMembershipList() - + const { data, totalCount } = await clerkClient.users.getOrganizationMembershipList() - ``` - - - -### Image URL Name Consolidation - -There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: - -Organization.logoUrl -> Organization.imageUrl', - 'User.profileImageUrl -> .imageUrl', - 'ExternalAccount.picture -> .imageUrl', - 'ExternalAccountJSON.avatar_url -> .imageUrl', - 'OrganizationJSON.logo_url -> .imageUrl', - 'UserJSON.profile_image_url -> .imageUrl', - 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', - 'OrganizationMembershipPublicUserDataJSON.profile_image_url -> .imageUrl', - ]} -> - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. - - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - - The `picture` property of any [`ExternalAcccount` - object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - - - The `avatarUrl` property of any `ExternalAcccountJSON` object has been changed to `imageUrl`. - - - The `logo_url` property of any `OrganizationJSON` object has been changed to `imageUrl`. - - - The `profile_image_url` property of any `UserJSON` object has been changed to `imageUrl`. - - - The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - - - The `profile_image_url` property of any `OrganizationMembershipPublicUserDataJSON` object has been changed to - `imageUrl`. - - - -## Deprecation removals & housekeeping - -As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. - - - For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of - changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for - manually. - - -### Deprecation removals - -frontendApi -> publishableKey as param to createClerkClient", "apiKey -> secretKey as param to createClerkClient"]}> - - The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. Also note that the import value has changed for creating a new Clerk client, which will be addressed by a separate line item if relevant to your codebase. - - ```diff - - import { Clerk } from '@clerk/backend'; - + import { createClerkClient } from '@clerk/backend'; - - - const clerkClient = Clerk({ frontendApi: '...' }); - + const clerkClient = createClerkClient({ publishableKey: '...' }); - - - clerkClient.authenticateRequest({ frontendApi: '...' }); - + clerkClient.authenticateRequest({ publishableKey: '...' }); - ``` - - - The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. Also note that the import value has changed for creating a new Clerk client, which will be addressed by a separate line item if relevant to your codebase. - - ```diff - - import { Clerk } from '@clerk/backend'; - + import { createClerkClient } from '@clerk/backend'; - - - const clerkClient = Clerk({ apiKey: '...' }); - + const clerkClient = createClerkClient({ secretKey: '...' }); - - - clerkClient.authenticateRequest({ apiKey: '...' }); - + clerkClient.authenticateRequest({ secretKey: '...' }); - ``` - - - -### Other Breaking Changes - -API_URL value has changed", "request separated from options as params to authenticateRequest", "Clerk -> createClerkClient", "clockSkewInSeconds -> clockSkewInMs", "pkgVersion -> clerkJSVersion", "clerkClient.__unstable_options removed", "httpOptions parameter removed", "createEmail import removed", "MembershipRole type replaced by OrganizationCustomRoleKey type", "buildRequestUrl import removed"]}> - - The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. - - - There has been a change to the way the params of the `authenticateRequest` function are structured. The `request` param, formerly included in an `options` object, has been moved to stand on its own as the first param to the function, while the `options` object remains as the second param. Example below: - - ```diff - - clerkClient.authenticateRequest({ ...opts, request }) - + clerkClient.authenticateRequest(request, { ...opts }) - ``` - - - The top level `Clerk` import was renamed to `createClerkClient`. This is just a name change and can be treated as a text replacement, no changes to the params or return types. - - ```js - // before - import { Clerk } from '@clerk/backend'; - - // after - import { createClerkClient } from '@clerk/backend'; - ``` - - - The `clockSkewInSeconds` option has been renamed to `clockSkewInMs` in order to accurately reflect that its value is expected to be in milliseconds rather than seconds. The value does not need to change here, only the name. This change affects the following imports: - - - `verifyJwt` - - `verifyToken` - - `Clerk.authenticateRequest` - - - The `pkgVersion` parameter was removed from the `loadInterstitialFromLocal`, `loadInterstitialFromBAPI`, and `buildPublicInterstitialUrl` functions. Use `clerkJSVersion` instead. Example: - - ```diff - - loadInterstitialFromLocal({ pkgVersion: "..." }) - + loadInterstitialFromLocal({ clerkJSVersion: "..." }) - ``` - - - The `clerkClient.__unstable_options` property was removed. Previously, you could use it to update the internal options. Instead, create a new ` clerkClient` instance using `createClerkClient` and pass the options in this way. For example: - - ```diff - import { createClerkClient } from "@clerk/backend" - - const clerkClient = createClerkClient({ secretKey: "old" }) - - - clerkClient.__unstable_options.secretKey = "new" - + const newClerkClient = createClerkClient({ secretKey: "new" }) - ``` - - - The `httpOptions` parameter was removed from the internal `buildRequest` function but it is used by most public facing APIs. Hence you were able to pass `httpOptions` to some functions which is not possible anymore. If you're currently relying on this functionality and wish to update, please reach out to Clerk's support. - - The internal change looks like this: - - ```diff - - const r = buildRequest({ httpsOptions: { headers: {} }}) - + const request = buildRequest() - + request({ headerParams: {} }) - ``` - - - The `createEmail` import has been removed. There is no replacement at this time because we need to rethink how `createEmail` behaves and align it with the newer `sendSms` method. If this is an issue for your implementation, please contact [Clerk support](https://clerk.com/contact). - - - The `MembershipRole` type was replaced with `OrganizationCustomRoleKey` (related to [roles and permissions](https://clerk.com/docs/organizations/roles-permissions)). An example of where this type might be found: - - ```js - import { useAuth } from '@clerk/clerk-react'; - - const { orgRole } = useAuth(); - ``` - - To support the existing roles `admin`, `basic_member`, and `guest_member` apply interface merging using the following snippet: - - ```js - interface ClerkAuthorization { - permission: '' - role: 'admin' | 'basic_member' | 'guest_member' - } - ``` - - - The `buildRequestUrl` import was intended for those building custom Clerk integrations for frameworks and has been removed in favor of other methods internally. If you were relying on this function and this is an issue, please [reach out to Clerk support](https://clerk.com/support). - - diff --git a/packages/upgrade/source/guide-generators/v5/backend/index.js b/packages/upgrade/source/guide-generators/v5/backend/index.js index aef608ccf2e..9758595f0b3 100644 --- a/packages/upgrade/source/guide-generators/v5/backend/index.js +++ b/packages/upgrade/source/guide-generators/v5/backend/index.js @@ -21,14 +21,14 @@ async function generate() { return assembleContent({ data, cwd }, [ frontmatter({ - title: `Upgrading ${properName} from v4 to v5`, - description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + title: `Upgrading ${properName} to Core 2`, + description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`, }), - `# Upgrading \`${packageName}\` from v4 to v5`, + `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdown('prepare'), + markdownTemplate('prepare', { version: 'v1', packageName }), markdown('node-version'), - markdownTemplate('update-v5', { packageName }), + markdownTemplate('update-version', { packageName }), markdown('cli'), '## Breaking Changes', singleItem('authenticaterequest-params-change'), diff --git a/packages/upgrade/source/guide-generators/v5/backend/intro.mdx b/packages/upgrade/source/guide-generators/v5/backend/intro.mdx index d9be302acaa..00df1d24493 100644 --- a/packages/upgrade/source/guide-generators/v5/backend/intro.mdx +++ b/packages/upgrade/source/guide-generators/v5/backend/intro.mdx @@ -1,3 +1,3 @@ -Version 5 of the Backend SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Clerk's Core 2 release includes a new major version of the Backend SDK, v1. This new version ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. -By the end of this guide, you’ll have successfully upgraded your Backend project to use `@clerk/backend` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. +By the end of this guide, you’ll have successfully upgraded your Backend project to use `@clerk/backend` v1. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/chromeExtension/__output.mdx b/packages/upgrade/source/guide-generators/v5/chromeExtension/__output.mdx deleted file mode 100644 index d02c1f9e6fc..00000000000 --- a/packages/upgrade/source/guide-generators/v5/chromeExtension/__output.mdx +++ /dev/null @@ -1,245 +0,0 @@ ---- -title: 'Upgrading Chrome Extension SDK from v4 to v5' -description: "Learn how to upgrade Clerk's Chrome Extension SDK from v4 to v5." ---- - -# Upgrading `@clerk/chrome-extension` from v4 to v5 - -Version 5 of the Chrome Extension SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. - -By the end of this guide, you’ll have successfully upgraded your project to use `@clerk/chrome-extension` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. - -## Preparing to upgrade - -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. - -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. - -Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. - -**Updating Node.js** - -You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). - -**Updating React** - -All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. - - - ```bash filename="terminal" - npm install react@latest react-dom@latest - ``` - - ```bash filename="terminal" - yarn add react@latest react-dom@latest - ``` - - ```bash filename="terminal" - pnpm add react@latest react-dom@latest - ``` - - - -If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. - -## Updating to v5 - -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: - - - ```bash filename="terminal" - npm install @clerk/chrome-extension@beta - ``` - - ```bash filename="terminal" - yarn add @clerk/chrome-extension@beta - ``` - - ```bash filename="terminal" - pnpm add @clerk/chrome-extension@beta - ``` - - - -## CLI Upgrade Helper - -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. - -To run the CLI tool, navigate to your project and run it in the terminal: - - - ```bash filename="terminal" - npx @clerk/upgrade - ``` - -```bash filename="terminal" -yarn dlx @clerk/upgrade -``` - -```bash filename="terminal" -pnpm dlx @clerk/upgrade -``` - - - -If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. - -## Breaking Changes - -### `tokenCache` -> `storageCache` as `` props - -The `tokenCache` prop has been renamed to `storageCache` in order to accomodate the new [WebSSO feature](https://github.com/clerk/javascript/pull/2277). With the prop change from `tokenCache` to `storageCache`, the interface has been expanded to allow for more flexibility. The new interface is as follows: - -```ts -type StorageCache = { - createKey: (...keys: string[]) => string; - get: (key: string) => Promise; - remove: (key: string) => Promise; - set: (key: string, value: string) => Promise; -}; -``` - -And here's a full before/after example: - -```diff -- -+ -``` - -### Component design adjustments - -The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. - -[More detail on these changes »](/components-redesigned) - -## After sign up/in/out URL handling - -Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. - -As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. - -```diff -- -+ -``` - -### Removed: `orgs` claim on JWT - -In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. - -The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. - - - - ```typescript filename="Next.js" - import { getAuth } from "@clerk/nextjs/server" - const claims: JwtPayload = getAuth(request).sessionClaims - - import { getAuth } from "@clerk/ssr.server" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - - ```typescript filename="Fastify" - import { getAuth } from "@clerk/fastify" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - ```typescript filename="@clerk/backend" - import { createClerkClient } from "@clerk/backend" - - const clerkClient = createClerkClient({ secretKey: "" }) - const requestState = await clerkClient.authenticateRequest( - request, - { publishableKey: "" } - ) - const claims: JwtPayload = requestState.toAuth().sessionClaims - ``` - - - - ```typescript filename="@clerk/clerk-sdk-node" - import { clerkClient } from "@clerk/clerk-sdk-node" - - router.use((...args) => clerkClient.expressRequireAuth()(...args)) - router.get("/me", async (req, reply: Response) => { - return reply.json({ auth: req.auth }) - }) - ``` - - - - -If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. - -### Path routing is now the default - -On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. - -In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: - -- `` -- `` -- `` -- `` -- `` - -Here's how you'd use the components going forward: - -```jsx - - - - - -``` - -If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. - -```jsx - - -``` - -However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. - - -```env filename=".env.local" -NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in -NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up -``` - -```env filename=".env" -CLERK_SIGN_IN_URL=/sign-in -CLERK_SIGN_UP_URL=/sign-up -``` - - - -**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. - -```jsx -// Only works for Next.js / Remix when environment variables are set - - -``` - -### Image URL Name Consolidation - -There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: - -Organization.logoUrl -> Organization.imageUrl', - 'User.profileImageUrl -> .imageUrl', - ]} -> - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. - - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - diff --git a/packages/upgrade/source/guide-generators/v5/chromeExtension/index.js b/packages/upgrade/source/guide-generators/v5/chromeExtension/index.js index a6efe0ac2e9..47e0f6e39e6 100644 --- a/packages/upgrade/source/guide-generators/v5/chromeExtension/index.js +++ b/packages/upgrade/source/guide-generators/v5/chromeExtension/index.js @@ -1,6 +1,7 @@ import { accordionForCategory, assembleContent, + deprecationRemovalsAndHousekeeping, frontmatter, loadVersionChangeData, markdown, @@ -20,24 +21,25 @@ async function generate() { return assembleContent({ data, cwd }, [ frontmatter({ - title: `Upgrading ${properName} SDK from v4 to v5`, - description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + title: `Upgrading ${properName} SDK to Core 2`, + description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`, }), - `# Upgrading \`${packageName}\` from v4 to v5`, + `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdown('prepare'), + markdownTemplate('prepare', { version: 'v1', packageName }), markdown('node-version'), markdown('react-version'), - markdownTemplate('update-v5', { packageName }), + markdownTemplate('update-version', { packageName }), markdown('cli'), '## Breaking Changes', singleItem('clerkprovider-tokencache'), markdown('redesign-preview'), markdown('after-sign-x-handling'), markdown('orgs-claim'), - markdown('path-routing'), + markdownTemplate('path-routing', { packageName }), markdown('image-url'), accordionForCategory('image-url'), + deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']), ]); } diff --git a/packages/upgrade/source/guide-generators/v5/chromeExtension/intro.mdx b/packages/upgrade/source/guide-generators/v5/chromeExtension/intro.mdx index acfcfff9d7a..664610b427c 100644 --- a/packages/upgrade/source/guide-generators/v5/chromeExtension/intro.mdx +++ b/packages/upgrade/source/guide-generators/v5/chromeExtension/intro.mdx @@ -1,3 +1,3 @@ -Version 5 of the Chrome Extension SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Clerk's Core 2 release includes a new major version of the Chrome Extension SDK, v1. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. -By the end of this guide, you’ll have successfully upgraded your project to use `@clerk/chrome-extension` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. +By the end of this guide, you’ll have successfully upgraded your project to use `@clerk/chrome-extension` v1. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/expo/__output.mdx b/packages/upgrade/source/guide-generators/v5/expo/__output.mdx deleted file mode 100644 index d7154f9468d..00000000000 --- a/packages/upgrade/source/guide-generators/v5/expo/__output.mdx +++ /dev/null @@ -1,466 +0,0 @@ ---- -title: 'Upgrading Expo from v4 to v5' -description: "Learn how to upgrade Clerk's Expo SDK from v4 to v5." ---- - -# Upgrading `@clerk/expo` from v4 to v5 - -Version 5 of the Expo SDK ships with an improved design and UX for its built-in components and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. - -By the end of this guide, you’ll have successfully upgraded your Expo project to use `@clerk/expo` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. - -## Preparing to upgrade - -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. - -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. - -Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. - -**Updating Node.js** - -You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). - -**Updating React** - -All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. - - - ```bash filename="terminal" - npm install react@latest react-dom@latest - ``` - - ```bash filename="terminal" - yarn add react@latest react-dom@latest - ``` - - ```bash filename="terminal" - pnpm add react@latest react-dom@latest - ``` - - - -If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. - -## Updating to v5 - -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: - - - ```bash filename="terminal" - npm install @clerk/expo@beta - ``` - - ```bash filename="terminal" - yarn add @clerk/expo@beta - ``` - - ```bash filename="terminal" - pnpm add @clerk/expo@beta - ``` - - - -## CLI Upgrade Helper - -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. - -To run the CLI tool, navigate to your project and run it in the terminal: - - - ```bash filename="terminal" - npx @clerk/upgrade - ``` - -```bash filename="terminal" -yarn dlx @clerk/upgrade -``` - -```bash filename="terminal" -pnpm dlx @clerk/upgrade -``` - - - -If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. - -## Breaking Changes - -### Component design adjustments - -The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. - -[More detail on these changes »](/components-redesigned) - -## After sign up/in/out URL handling - -Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. - -As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. - -```diff -- -+ -``` - -### Removed: `orgs` claim on JWT - -In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. - -The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. - - - - ```typescript filename="Next.js" - import { getAuth } from "@clerk/nextjs/server" - const claims: JwtPayload = getAuth(request).sessionClaims - - import { getAuth } from "@clerk/ssr.server" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - - ```typescript filename="Fastify" - import { getAuth } from "@clerk/fastify" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - ```typescript filename="@clerk/backend" - import { createClerkClient } from "@clerk/backend" - - const clerkClient = createClerkClient({ secretKey: "" }) - const requestState = await clerkClient.authenticateRequest( - request, - { publishableKey: "" } - ) - const claims: JwtPayload = requestState.toAuth().sessionClaims - ``` - - - - ```typescript filename="@clerk/clerk-sdk-node" - import { clerkClient } from "@clerk/clerk-sdk-node" - - router.use((...args) => clerkClient.expressRequireAuth()(...args)) - router.get("/me", async (req, reply: Response) => { - return reply.json({ auth: req.auth }) - }) - ``` - - - - -If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. - -### Path routing is now the default - -On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. - -In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: - -- `` -- `` -- `` -- `` -- `` - -Here's how you'd use the components going forward: - -```jsx - - - - - -``` - -If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. - -```jsx - - -``` - -However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. - - -```env filename=".env.local" -NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in -NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up -``` - -```env filename=".env" -CLERK_SIGN_IN_URL=/sign-in -CLERK_SIGN_UP_URL=/sign-up -``` - - - -**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. - -```jsx -// Only works for Next.js / Remix when environment variables are set - - -``` - -### Image URL Name Consolidation - -There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: - -Organization.logoUrl -> Organization.imageUrl', - 'User.profileImageUrl -> .imageUrl', - 'ExternalAccount.avatarUrl -> .imageUrl', - 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', - ]} -> - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. - - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - - The `avatarUrl` property of any [`ExternalAcccount` - object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - - - The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - - - -## Deprecation removals & housekeeping - -As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. - - - For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of - changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for - manually. - - -### Deprecation removals - -CLERK_FRONTEND_API replaced by CLERK_PUBLISHABLE_KEY']}> - - If you are using a `CLERK_FRONTEND_API` environment variable, the name must be changed to `CLERK_PUBLISHABLE_KEY` - instead. Note that the values are different as well, so this is not just a key replacement. You can find the - publishable key in your Clerk dashboard. Make sure you do this in both your dev and production environments. - - - -### Other Breaking Changes - -Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed", "Users.getOrganizationInvitationList return signature changed", "Organizations.getOrganizationInvitationList return type changed", "User.getOrganizationMembershipList() return type changed", "Users.getOrganizationList return signature changed", "Organization.getOrganizationList() return type changed", "isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl"]}> - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getRoles({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getDomains({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMembershipRequests({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationSuggestions({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - - Here's an example of how the response shape would change with this modification: - - ```diff - - const data = await clerkClient.users.getOrganizationInvitationList() - + const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList() - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const data = await clerkClient.organizations.getOrganizationInvitationList({ - organizationId: "...", - }) - - - data.forEach(() => {}) - + data.data.forEach(() => {}) - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { user } = useUser() - const membershipList = user.getOrganizationMembershipList() - - - membershipList.forEach(() => {}) - + membershipList.data.forEach(() => {}) - ``` - - - The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - - Here's an example of how the response shape would change with this modification: - - ```diff - - const data = await clerkClient.users.getOrganizationList() - + const { data, totalCount } = await clerkClient.users.getOrganizationList() - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { organization } = useOrganization() - const orgList = organization.getOrganizationList() - - - orgList.forEach(() => {}) - + orgList.data.forEach(() => {}) - ``` - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: - - ```diff - - await setSession('sessionID', () => void) - + await setActive({ session: 'sessionID', beforeEmit: () => void }) - - - await setSession(sessionObj) - + await setActive({ session: sessionObj }) - - - await setSession(sessionObj, () => void) - + await setActive({ session: sessionObj, beforeEmit: () => void }) - ``` - - `setActive` also supports setting an active organization: - - ```js - await setActive({ - session: 'sessionID', - organization: 'orgID', - beforeEmit: () => void - }) - - await setActive({ - session: sessionObj, - organization: orgObj, - beforeEmit: () => void - }) - ``` - - - The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: - - ```diff - import { SignOutButton } from "@clerk/clerk-react"; - - export const Signout = () => { - return ( - { window.location.href = "/your-path" }} - + redirectUrl="/your-path" - > - - - ) - } - ``` - - diff --git a/packages/upgrade/source/guide-generators/v5/expo/index.js b/packages/upgrade/source/guide-generators/v5/expo/index.js index 5f4b94adaba..ba5fe19ba79 100644 --- a/packages/upgrade/source/guide-generators/v5/expo/index.js +++ b/packages/upgrade/source/guide-generators/v5/expo/index.js @@ -12,6 +12,7 @@ import { const version = 'v5'; const name = 'expo'; const properName = 'Expo'; +const packageName = '@clerk/clerk-expo'; const cwd = `${version}/${name}`; async function generate() { @@ -19,21 +20,21 @@ async function generate() { return assembleContent({ data, cwd }, [ frontmatter({ - title: `Upgrading ${properName} from v4 to v5`, - description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + title: `Upgrading ${properName} to Core 2`, + description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`, }), - `# Upgrading \`@clerk/${name}\` from v4 to v5`, + `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdown('prepare'), + markdownTemplate('prepare', { version: 'v1', packageName }), markdown('node-version'), markdown('react-version'), - markdownTemplate('update-v5', { packageName: '@clerk/expo' }), + markdownTemplate('update-version', { packageName }), markdown('cli'), '## Breaking Changes', markdown('redesign-preview'), markdown('after-sign-x-handling'), markdown('orgs-claim'), - markdown('path-routing'), + markdown('path-routing', { packageName }), markdown('image-url'), accordionForCategory('image-url'), deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']), diff --git a/packages/upgrade/source/guide-generators/v5/expo/intro.mdx b/packages/upgrade/source/guide-generators/v5/expo/intro.mdx index 18f14b8f45b..e98638fd365 100644 --- a/packages/upgrade/source/guide-generators/v5/expo/intro.mdx +++ b/packages/upgrade/source/guide-generators/v5/expo/intro.mdx @@ -1,3 +1,3 @@ -Version 5 of the Expo SDK ships with an improved design and UX for its built-in components and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Clerk's Core 2 release includes a new major version of the Expo SDK, v1. This release ships with an improved design and UX for its built-in components and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. -By the end of this guide, you’ll have successfully upgraded your Expo project to use `@clerk/expo` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. +By the end of this guide, you’ll have successfully upgraded your Expo project to use `@clerk/clerk-expo` v1. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/fastify/__output.mdx b/packages/upgrade/source/guide-generators/v5/fastify/__output.mdx deleted file mode 100644 index 901d2a81caa..00000000000 --- a/packages/upgrade/source/guide-generators/v5/fastify/__output.mdx +++ /dev/null @@ -1,361 +0,0 @@ ---- -title: 'Upgrading Fastify from v4 to v5' -description: "Learn how to upgrade Clerk's Fastify SDK from v4 to v5." ---- - -# Upgrading `@clerk/fastify` from v4 to v5 - -Version 5 of the Fastify SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. - -By the end of this guide, you’ll have successfully upgraded your Fastify project to use `@clerk/fastify` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. - -## Preparing to upgrade - -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. - -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. - -Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. - -**Updating Node.js** - -You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). - -## Updating to v5 - -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: - - - ```bash filename="terminal" - npm install @clerk/fastify@beta - ``` - - ```bash filename="terminal" - yarn add @clerk/fastify@beta - ``` - - ```bash filename="terminal" - pnpm add @clerk/fastify@beta - ``` - - - -## CLI Upgrade Helper - -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. - -To run the CLI tool, navigate to your project and run it in the terminal: - - - ```bash filename="terminal" - npx @clerk/upgrade - ``` - -```bash filename="terminal" -yarn dlx @clerk/upgrade -``` - -```bash filename="terminal" -pnpm dlx @clerk/upgrade -``` - - - -If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. - -## Breaking Changes - -### Removed: `orgs` claim on JWT - -In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. - -The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. - - - - ```typescript filename="Next.js" - import { getAuth } from "@clerk/nextjs/server" - const claims: JwtPayload = getAuth(request).sessionClaims - - import { getAuth } from "@clerk/ssr.server" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - - ```typescript filename="Fastify" - import { getAuth } from "@clerk/fastify" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - ```typescript filename="@clerk/backend" - import { createClerkClient } from "@clerk/backend" - - const clerkClient = createClerkClient({ secretKey: "" }) - const requestState = await clerkClient.authenticateRequest( - request, - { publishableKey: "" } - ) - const claims: JwtPayload = requestState.toAuth().sessionClaims - ``` - - - - ```typescript filename="@clerk/clerk-sdk-node" - import { clerkClient } from "@clerk/clerk-sdk-node" - - router.use((...args) => clerkClient.expressRequireAuth()(...args)) - router.get("/me", async (req, reply: Response) => { - return reply.json({ auth: req.auth }) - }) - ``` - - - - -If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. - -### Image URL Name Consolidation - -There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: - -Organization.logoUrl -> Organization.imageUrl', - 'User.profileImageUrl -> .imageUrl', - 'ExternalAccount.avatarUrl -> .imageUrl', - 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', - ]} -> - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. - - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - - The `avatarUrl` property of any [`ExternalAcccount` - object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - - - The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - - - -## Deprecation removals & housekeeping - -As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. - - - For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of - changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for - manually. - - -### Deprecation removals - -CLERK_API_KEY replaced by CLERK_SECRET_KEY", "CLERK_FRONTEND_API replaced by CLERK_PUBLISHABLE_KEY", "apiKey -> secretKey as param to createClerkClient", "frontendApi -> publishableKey as param to createClerkClient", "frontendApi -> publishableKey as param to clerkPlugin"]}> - - The `CLERK_API_KEY` environment variable was renamed to `CLERK_SECRET_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). - - - The `CLERK_FRONTEND_API` environment variable was renamed to `CLERK_PUBLISHABLE_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). **Note:** The values are different, so this is not just a key replacement. [More information](/docs/deployments/overview#api-keys-and-environment-variables). - - - The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. - - ```diff - import { createClerkClient } from '@clerk/fastify'; - - - createClerkClient({ apiKey: '...' }); - + createClerkClient({ secretKey: '...' }); - ``` - - - The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. - - ```diff - import { createClerkClient } from '@clerk/fastify'; - - - createClerkClient({ frontendApi: '...' }); - + createClerkClient({ publishableKey: '...' }); - ``` - - - The `frontendApi` argument passed to `clerkPlugin` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. - - ```diff - import { clerkPlugin } from '@clerk/fastify'; - - - fastify.register(clerkPlugin, { frontendApi: '...' }); - + fastify.register(clerkPlugin, { publishableKey: '...' }); - ``` - - - -### Other Breaking Changes - -Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed", "Users.getOrganizationInvitationList return signature changed", "Organizations.getOrganizationInvitationList return type changed", "User.getOrganizationMembershipList() return type changed", "Users.getOrganizationList return signature changed", "Organization.getOrganizationList() return type changed", "API_URL value has changed", "Clerk -> { createClerkClient }"]}> - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getRoles({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getDomains({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMembershipRequests({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationSuggestions({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - - Here's an example of how the response shape would change with this modification: - - ```diff - - const data = await clerkClient.users.getOrganizationInvitationList() - + const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList() - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const data = await clerkClient.organizations.getOrganizationInvitationList({ - organizationId: "...", - }) - - - data.forEach(() => {}) - + data.data.forEach(() => {}) - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { user } = useUser() - const membershipList = user.getOrganizationMembershipList() - - - membershipList.forEach(() => {}) - + membershipList.data.forEach(() => {}) - ``` - - - The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - - Here's an example of how the response shape would change with this modification: - - ```diff - - const data = await clerkClient.users.getOrganizationList() - + const { data, totalCount } = await clerkClient.users.getOrganizationList() - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { organization } = useOrganization() - const orgList = organization.getOrganizationList() - - - orgList.forEach(() => {}) - + orgList.data.forEach(() => {}) - ``` - - - The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. - - - The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - - ```diff - - import Clerk from "@clerk/fastify" - + import { createClerkClient } from "@clerk/fastify" - ``` - - diff --git a/packages/upgrade/source/guide-generators/v5/fastify/index.js b/packages/upgrade/source/guide-generators/v5/fastify/index.js index f30d0bb7f7d..9a793b642f0 100644 --- a/packages/upgrade/source/guide-generators/v5/fastify/index.js +++ b/packages/upgrade/source/guide-generators/v5/fastify/index.js @@ -20,14 +20,14 @@ async function generate() { return assembleContent({ data, cwd }, [ frontmatter({ - title: `Upgrading ${properName} from v4 to v5`, - description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + title: `Upgrading ${properName} to Core 2`, + description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`, }), - `# Upgrading \`${packageName}\` from v4 to v5`, + `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdown('prepare'), + markdownTemplate('prepare', { version: 'v1', packageName }), markdown('node-version'), - markdownTemplate('update-v5', { packageName }), + markdownTemplate('update-version', { packageName }), markdown('cli'), '## Breaking Changes', markdown('orgs-claim'), diff --git a/packages/upgrade/source/guide-generators/v5/fastify/intro.mdx b/packages/upgrade/source/guide-generators/v5/fastify/intro.mdx index 4345583d4d0..7ce3905a0d1 100644 --- a/packages/upgrade/source/guide-generators/v5/fastify/intro.mdx +++ b/packages/upgrade/source/guide-generators/v5/fastify/intro.mdx @@ -1,3 +1,3 @@ -Version 5 of the Fastify SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Clerk's Core 2 release includes a new major version of the Fastify SDK, v1. This release ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your Fastify project to use `@clerk/fastify` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx b/packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx deleted file mode 100644 index 3fdf3ba7134..00000000000 --- a/packages/upgrade/source/guide-generators/v5/gatsby/__output.mdx +++ /dev/null @@ -1,481 +0,0 @@ ---- -title: 'Upgrading Gatsby from v4 to v5' -description: "Learn how to upgrade Clerk's Gatsby SDK from v4 to v5." ---- - -# Upgrading `gatsby-plugin-clerk` from v4 to v5 - -Version 5 of the Gatsby SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. - -By the end of this guide, you’ll have successfully upgraded your Expo project to use `gatsby-plugin-clerk` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. - -## Preparing to upgrade - -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. - -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. - -Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. - -**Updating Node.js** - -You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). - -**Updating React** - -All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. - - - ```bash filename="terminal" - npm install react@latest react-dom@latest - ``` - - ```bash filename="terminal" - yarn add react@latest react-dom@latest - ``` - - ```bash filename="terminal" - pnpm add react@latest react-dom@latest - ``` - - - -If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. - -## Updating to v5 - -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: - - - ```bash filename="terminal" - npm install gatsby-plugin-clerk@beta - ``` - - ```bash filename="terminal" - yarn add gatsby-plugin-clerk@beta - ``` - - ```bash filename="terminal" - pnpm add gatsby-plugin-clerk@beta - ``` - - - -## CLI Upgrade Helper - -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. - -To run the CLI tool, navigate to your project and run it in the terminal: - - - ```bash filename="terminal" - npx @clerk/upgrade - ``` - -```bash filename="terminal" -yarn dlx @clerk/upgrade -``` - -```bash filename="terminal" -pnpm dlx @clerk/upgrade -``` - - - -If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. - -## Breaking Changes - -### Component design adjustments - -The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. - -[More detail on these changes »](/components-redesigned) - -## After sign up/in/out URL handling - -Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. - -As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. - -```diff -- -+ -``` - -### Removed: `orgs` claim on JWT - -In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. - -The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. - - - - ```typescript filename="Next.js" - import { getAuth } from "@clerk/nextjs/server" - const claims: JwtPayload = getAuth(request).sessionClaims - - import { getAuth } from "@clerk/ssr.server" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - - ```typescript filename="Fastify" - import { getAuth } from "@clerk/fastify" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - ```typescript filename="@clerk/backend" - import { createClerkClient } from "@clerk/backend" - - const clerkClient = createClerkClient({ secretKey: "" }) - const requestState = await clerkClient.authenticateRequest( - request, - { publishableKey: "" } - ) - const claims: JwtPayload = requestState.toAuth().sessionClaims - ``` - - - - ```typescript filename="@clerk/clerk-sdk-node" - import { clerkClient } from "@clerk/clerk-sdk-node" - - router.use((...args) => clerkClient.expressRequireAuth()(...args)) - router.get("/me", async (req, reply: Response) => { - return reply.json({ auth: req.auth }) - }) - ``` - - - - -If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. - -### Path routing is now the default - -On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. - -In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: - -- `` -- `` -- `` -- `` -- `` - -Here's how you'd use the components going forward: - -```jsx - - - - - -``` - -If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. - -```jsx - - -``` - -However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. - - -```env filename=".env.local" -NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in -NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up -``` - -```env filename=".env" -CLERK_SIGN_IN_URL=/sign-in -CLERK_SIGN_UP_URL=/sign-up -``` - - - -**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. - -```jsx -// Only works for Next.js / Remix when environment variables are set - - -``` - -### Image URL Name Consolidation - -There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: - -Organization.logoUrl -> Organization.imageUrl', - 'User.profileImageUrl -> .imageUrl', - 'ExternalAccount.avatarUrl -> .imageUrl', - 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', - ]} -> - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. - - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - - The `avatarUrl` property of any [`ExternalAcccount` - object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - - - The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - - - -## Deprecation removals & housekeeping - -As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. - - - For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of - changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for - manually. - - -### Deprecation removals - -frontendApi -> publishableKey as prop to ClerkProvider", "afterSwitchOrganizationUrl -> afterSelectOrganizationUrl in OrganizationSwitcher", "ClerkProviderOptionsWrapper type removed", "CLERK_API_KEY replaced by CLERK_SECRET_KEY", "apiKey -> secretKey as param to createClerkClient", "GASTBY_CLERK_FRONTEND_API replaced by GATSBY_CLERK_PUBLISHABLE_KEY", "frontendApi -> publishableKey as param to createClerkClient"]}> - - The `frontendApi` prop passed to `` was renamed to `publishableKey`. **Note:** The values are different, so this is not just a key replacement. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). [More information](/docs/deployments/overview#api-keys-and-environment-variables). - - - The `afterSwitchOrganizationUrl` prop on the `` component has been renamed to `afterSelectOrganizationUrl`. This is a quick and simple rename. - - ```diff - - - + - ``` - - - This type was extending `ClerkProviderProps` with but was not necessary. This type is typically used internally and is not required to be imported and used directly. If needed, import and use `ClerkProviderProps` instead. - - - The `CLERK_API_KEY` environment variable was renamed to `CLERK_SECRET_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). - - - The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. - - ```diff - import { createClerkClient } from 'gatsby-plugin-clerk/api'; - - - createClerkClient({ apiKey: '...' }); - + createClerkClient({ secretKey: '...' }); - ``` - - - If you are using a `GATSBY_CLERK_FRONTEND_API` environment variable, the name must be changed to `GATSBY_CLERK_PUBLISHABLE_KEY` instead. Note that the values are different as well, so this is not just a key replacement. You can find the publishable key in your Clerk dashboard. Make sure you do this in both your dev and production environments. - - - The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. - - ```diff - import { createClerkClient } from 'gatsby-plugin-clerk/api'; - - - createClerkClient({ frontendApi: '...' }); - + createClerkClient({ publishableKey: '...' }); - ``` - - - -### Other Breaking Changes - -MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "isMagicLinkError -> isEmailLinkError", "MagicLinkError -> EmailLinkError", "handleMagicLinkVerification -> handleEmailLinkVerification", "setSession -> setActive", "invitationList -> invitations as param to useOrganizations", "membershipList -> members as param to useOrganization", "useOrganizations -> useOrganizationList", "userProfile -> userProfileProps for UserButton", "MultisessionAppSupport import moved to /internal", "Replace signOutCallback prop on SignOutButton with redirectUrl", "API_URL value has changed", "withServerAuth props.auth return type changed", "Clerk -> { createClerkClient }"]}> - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. - - - `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: - - ```diff - - await setSession('sessionID', () => void) - + await setActive({ session: 'sessionID', beforeEmit: () => void }) - - - await setSession(sessionObj) - + await setActive({ session: sessionObj }) - - - await setSession(sessionObj, () => void) - + await setActive({ session: sessionObj, beforeEmit: () => void }) - ``` - - `setActive` also supports setting an active organization: - - ```js - await setActive({ - session: 'sessionID', - organization: 'orgID', - beforeEmit: () => void - }) - - await setActive({ - session: sessionObj, - organization: orgObj, - beforeEmit: () => void - }) - ``` - - - The `invitationList` param to the `useOrganizations` hook has been replaced by `invitations`. This param also has a slightly different way of working, examples included below. Note also that `useOrganizations` is deprecated and should be updated to `useOrganization` instead. - - ```js - // before - const { invitationList } = useOrganization({ - invitationList: { limit: 10, offset: 1 }, - }); - - // after - const { invitations } = useOrganization({ - invitations: { - initialPage: 1, - pageSize: 10, - }, - }); - - // you can also simply return all invitations - const { invitations } = useOrganization({ invitations: true }); - ``` - - - The `membershipList` param from the `useOrganization` hook has been removed. Instead, [use the `memberships` param](https://clerk.com/docs/references/react/use-organization#parameters). Examples of each can be seen here: - - ```js - // before - const { membershipList } = useOrganization({ - membershipList: { limit: 10, offset: 1 }, - }); - - // after - const { memberships } = useOrganization({ - memberships: { - initialPage: 1, - pageSize: 10, - }, - }); - - // you can also simply return all memberships - const { memberships } = useOrganization({ memberships: true }); - ``` - - - Any place where `useOrganizations` is used should be switched to [`useOrganizationList`](https://clerk.com/docs/references/react/use-organization-list) or [`useOrganization`](https://clerk.com/docs/references/react/use-organization) instead. The return signature has also changed, so take note of this when making the upgrade. - - ```js - // before: useOrganizations return values - { - isLoaded: boolean, - createOrganization: clerk.createOrganization, - getOrganizationMemberships: clerk.getOrganizationMemberships, - getOrganization: clerk.getOrganization, - } - - // after: useOrganizationList return values - { - isLoaded: boolean, - createOrganization: clerk.createOrganization, - userMemberships: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, - userInvitations: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, - userSuggestions: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, - setActive: clerk.setActive, - } - ``` - - - The `userProfile` prop on [the `UserButton` component](https://clerk.com/docs/references/javascript/clerk/user-button#user-button-component) has been changed to `userProfileProps`. This is purely a name change, none of the values need to be updated. - - ```diff - - - + - ``` - - - `MultiSessionAppSupport` is a component that handles the intermediate “undefined” state for multisession apps by unmounting and remounting the components during the session switch (` setActive`` call) in order to solve theoretical edge-cases that can arise while switching sessions. It is undocumented and intended only for internal use, so it has been moved to an `/internal` import path. Please note that internal imports are not intended for public use, and are outside the scope of semver. - - ```diff - - import { MultiSessionAppSupport } from '@clerk/clerk-react' - + import { MultiSessionAppSupport } from '@clerk/clerk-react/internal' - ``` - - - The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: - - ```diff - import { SignOutButton } from "@clerk/clerk-react"; - - export const Signout = () => { - return ( - { window.location.href = "/your-path" }} - + redirectUrl="/your-path" - > - - - ) - } - ``` - - - The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. - - - When utilizing the `withServerAuth` helper in Gatsby, it expects a callback function that is called with props from Clerk internals. The `.auth` property on the returned object from the callback has seen a substantial change in its return type. Below is a code example of where the `auth` prop might be found: - - ```js - import { withServerAuth } from 'gatsby-plugin-clerk/ssr'; - - export const getServerData: GetServerData = withServerAuth(async props => { - return { props: { data: '...', auth: props.auth } }; - }); - ``` - - And here's a diff of the changes in the return type. The breaking change here specifically is that the property `auth.claims` was changed to `auth.sessionClaims`. Additionally, there is more information on the response that can be utilized if helpful. - - ```diff - // return type diff - { - sessionId: string | null; - userId: string | null; - actor: ActJWTClaim | null; - getToken: ServerGetToken; - - claims: ClerkJWTClaims | null; - + sessionClaims: JwtPayload; - + session: Session | undefined | null; - + user: User | undefined | null; - + orgId: string | undefined | null; - + orgRole: string | undefined | null; - + orgSlug: string | undefined | null; - + organization: Organization | undefined | null; - + debug: AuthObjectDebug; - }; - ``` - - - The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - - ```diff - - import Clerk from "gatsby-plugin-clerk" - + import { createClerkClient } from "gatsby-plugin-clerk" - ``` - - diff --git a/packages/upgrade/source/guide-generators/v5/gatsby/index.js b/packages/upgrade/source/guide-generators/v5/gatsby/index.js index 0b72ad0783b..76971d0bc9a 100644 --- a/packages/upgrade/source/guide-generators/v5/gatsby/index.js +++ b/packages/upgrade/source/guide-generators/v5/gatsby/index.js @@ -27,7 +27,7 @@ async function generate() { markdown('prepare'), markdown('node-version'), markdown('react-version'), - markdownTemplate('update-v5', { packageName: 'gatsby-plugin-clerk' }), + markdownTemplate('update-version', { packageName: 'gatsby-plugin-clerk' }), markdown('cli'), '## Breaking Changes', markdown('redesign-preview'), diff --git a/packages/upgrade/source/guide-generators/v5/generate-all.sh b/packages/upgrade/source/guide-generators/v5/generate-all.sh index d07a579ca8d..e4a78f21b42 100755 --- a/packages/upgrade/source/guide-generators/v5/generate-all.sh +++ b/packages/upgrade/source/guide-generators/v5/generate-all.sh @@ -2,6 +2,7 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +node $SCRIPT_DIR/overview/index.js node $SCRIPT_DIR/backend/index.js node $SCRIPT_DIR/chromeExtension/index.js node $SCRIPT_DIR/expo/index.js diff --git a/packages/upgrade/source/guide-generators/v5/js/__output.mdx b/packages/upgrade/source/guide-generators/v5/js/__output.mdx deleted file mode 100644 index 44a1de9a6f1..00000000000 --- a/packages/upgrade/source/guide-generators/v5/js/__output.mdx +++ /dev/null @@ -1,550 +0,0 @@ ---- -title: 'Upgrading Javascript from v4 to v5' -description: "Learn how to upgrade Clerk's Javascript SDK from v4 to v5." ---- - -# Upgrading `@clerk/clerk-js` from v4 to v5 - -Version 5 of the Javascript SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. - -By the end of this guide, you’ll have successfully upgraded your JS project to use `@clerk/clerk-js` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. - -## Preparing to upgrade - -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. - -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. - -Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. - -## Updating to v5 - -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: - - - ```bash filename="terminal" - npm install @clerk/clerk-js@beta - ``` - - ```bash filename="terminal" - yarn add @clerk/clerk-js@beta - ``` - - ```bash filename="terminal" - pnpm add @clerk/clerk-js@beta - ``` - - - -## CLI Upgrade Helper - -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. - -To run the CLI tool, navigate to your project and run it in the terminal: - - - ```bash filename="terminal" - npx @clerk/upgrade - ``` - -```bash filename="terminal" -yarn dlx @clerk/upgrade -``` - -```bash filename="terminal" -pnpm dlx @clerk/upgrade -``` - - - -If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. - -## Breaking Changes - -### Component design adjustments - -The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. - -[More detail on these changes »](/components-redesigned) - -## After sign up/in/out URL handling - -Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. - -As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. - -```diff -- -+ -``` - -### Removed: `orgs` claim on JWT - -In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. - -The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. - - - - ```typescript filename="Next.js" - import { getAuth } from "@clerk/nextjs/server" - const claims: JwtPayload = getAuth(request).sessionClaims - - import { getAuth } from "@clerk/ssr.server" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - - ```typescript filename="Fastify" - import { getAuth } from "@clerk/fastify" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - ```typescript filename="@clerk/backend" - import { createClerkClient } from "@clerk/backend" - - const clerkClient = createClerkClient({ secretKey: "" }) - const requestState = await clerkClient.authenticateRequest( - request, - { publishableKey: "" } - ) - const claims: JwtPayload = requestState.toAuth().sessionClaims - ``` - - - - ```typescript filename="@clerk/clerk-sdk-node" - import { clerkClient } from "@clerk/clerk-sdk-node" - - router.use((...args) => clerkClient.expressRequireAuth()(...args)) - router.get("/me", async (req, reply: Response) => { - return reply.json({ auth: req.auth }) - }) - ``` - - - - -If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. - -### Path routing is now the default - -On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. - -In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: - -- `` -- `` -- `` -- `` -- `` - -Here's how you'd use the components going forward: - -```jsx - - - - - -``` - -If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. - -```jsx - - -``` - -However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. - - -```env filename=".env.local" -NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in -NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up -``` - -```env filename=".env" -CLERK_SIGN_IN_URL=/sign-in -CLERK_SIGN_UP_URL=/sign-up -``` - - - -**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. - -```jsx -// Only works for Next.js / Remix when environment variables are set - - -``` - -### Image URL Name Consolidation - -There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: - -Organization.logoUrl -> Organization.imageUrl', - 'User.profileImageUrl -> .imageUrl', - 'ExternalAccount.avatarUrl -> .imageUrl', - 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', - ]} -> - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. - - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - - The `avatarUrl` property of any [`ExternalAcccount` - object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - - - The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - - - -#### Changes to pagination arguments for some functions - -There were some changes made to pagination-related arguments passed into functions, in order to make it more clear how to control paginated results. See each function impacted by these changes below: - -Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed"]}> - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getRoles({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getDomains({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMembershipRequests({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationSuggestions({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - -#### Changes to some function return signatures - -There have been changes to return signatures for some functions. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. This change also aligns the response shape with what is returned from the Clerk backend API. Each impacted function is listed below, along with code examples: - -Users.getOrganizationInvitationList return signature changed", "Organizations.getOrganizationInvitationList return type changed", "User.getOrganizationMembershipList() return type changed", "Users.getOrganizationList return signature changed", "Organization.getOrganizationList() return type changed"]}> - - The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - - Here's an example of how the response shape would change with this modification: - - ```diff - - const data = await clerkClient.users.getOrganizationInvitationList() - + const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList() - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const data = await clerkClient.organizations.getOrganizationInvitationList({ - organizationId: "...", - }) - - - data.forEach(() => {}) - + data.data.forEach(() => {}) - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { user } = useUser() - const membershipList = user.getOrganizationMembershipList() - - - membershipList.forEach(() => {}) - + membershipList.data.forEach(() => {}) - ``` - - - The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - - Here's an example of how the response shape would change with this modification: - - ```diff - - const data = await clerkClient.users.getOrganizationList() - + const { data, totalCount } = await clerkClient.users.getOrganizationList() - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { organization } = useOrganization() - const orgList = organization.getOrganizationList() - - - orgList.forEach(() => {}) - + orgList.data.forEach(() => {}) - ``` - - - -## Deprecation removals & housekeeping - -As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. - - - For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of - changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for - manually. - - -### Deprecation removals - -User.update({ password: 'x' }) -> User.updatePassword('x')", "Clerk.experimental_canUseCaptcha property removed", "Clerk.experimental_captchaURL property removed", "Clerk.experimental_captchaSiteKey property removed", "Clerk.__unstable__invitationUpdate removed", "Clerk.__unstable__membershipUpdate removed", "redirect_url -> redirectUrl as param of User.createExternalAccount", "generatedSignature -> signature as param of Signup.attemptWeb3WalletVerification()"]}> - - If you are updating a user's password via the [`User.update` method](https://clerk.com/docs/references/javascript/user/user#update), it must be changed to [`User.updatePassword`](https://clerk.com/docs/references/javascript/user/password-management#update-password) instead. This method will require the current password as well as the desired new password. We made this update to improve the security of password changes. Example below: - - ```diff - - user.update({ password: 'foo' }); - - + user.updatePassword({ - + currentPassword: 'bar', - + newPassword: 'foo', - + signOutOfOtherSessions: true, - + }); - ``` - - - The experimental property `Clerk.experimental_canUseCaptcha` has been removed. There is no replacement for this functionality currently. If this is problematic for your application, please [reach out to our support team](https://clerk.com/support)! - - - The experimental property `Clerk.experimental_captchaURL` has been removed. There is no replacement for this functionality currently. If this is problematic for your application, please [reach out to our support team](https://clerk.com/support)! - - - The experimental property `Clerk.experimental_captchaSiteKey` has been removed. There is no replacement for this functionality currently. If this is problematic for your application, please [reach out to our support team](https://clerk.com/support)! - - - The `Clerk.__unstable__invitationUpdate` experimental property has been removed, and has no current replacement. If this is an issue in your codebase, please [reach out to Clerk support](https://clerk.com/support)! - - - The `Clerk.__unstable__membershipUpdate` experimental property has been removed, and has no current replacement. If this is an issue in your codebase, please [reach out to Clerk support](https://clerk.com/support)! - - - The param `redirect_url` of [`User.createExternalAccount`](https://clerk.com/docs/references/javascript/user/create-metadata#create-external-account) has been updated to `redirectUrl`. This is a simple text replacement without any signature changes. - - - The `generatedSignature` param to [`Signup.attemptWeb3WalletVerification()`](https://clerk.com/docs/references/javascript/sign-up/web3-verification#attempt-web3-wallet-verification) has been removed. Instead, use the `signature` param. Note that this param takes a string, where the `generatedSignature` param took a function, so both key and value will need to change. - - ```js - // before - s.attemptWeb3WalletVerification({ - generatedSignature: async () => 'signatureString', - }); - - // after - s.attemptWeb3WalletVerification({ signature: 'signatureString' }); - - // or, if you still need to fetch the signature async - const signatureString = await (async () => 'signatureString'); - s.attemptWeb3WalletVerification({ signature: signatureString }); - ``` - - - -### Other Breaking Changes - -MagicLinkError -> EmailLinkError", "isMagicLinkError -> isEmailLinkError", "MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "handleMagicLinkVerification -> handleEmailLinkVerification", "ExternalAccount.avatarUrl -> ExternalAccount.imageUrl", "[User|OrganizationMembershipPublicData].profileImageUrl -> [User|OrganizationMembershipPublicData].imageUrl", "setSession -> setActive", "Clerk.getOrganizationMemberships() -> user.getOrganizationMemberships()", "lastOrganizationInvitation and lastOrganizationMember dropped from event emitter", "Organization.create('x') -> Organization.create({ name: 'x' })", "Organization.getPendingInvitations() -> Organization.getInvitations({ status: 'pending' })", "Clerk.redirectToHome() removed", "Clerk.isReady() removed", "Replace signOutCallback prop on SignOutButton with redirectUrl"]}> - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. - - - The `avatarUrl` property of any [`ExternalAcccount` object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - - - The `profileImageUrl` property of any [`User` object](https://clerk.com/docs/references/javascript/user/user#user) or [`OrganizationMembershipPublicData` object](https://github.com/clerk/javascript/blob/37f36e538d8879981f76f4a433066e057afb06de/packages/backend/src/api/resources/OrganizationMembership.ts#L31) has been changed to `imageUrl`. - - - `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: - - ```diff - - await setSession('sessionID', () => void) - + await setActive({ session: 'sessionID', beforeEmit: () => void }) - - - await setSession(sessionObj) - + await setActive({ session: sessionObj }) - - - await setSession(sessionObj, () => void) - + await setActive({ session: sessionObj, beforeEmit: () => void }) - ``` - - `setActive` also supports setting an active organization: - - ```js - await setActive({ - session: 'sessionID', - organization: 'orgID', - beforeEmit: () => void - }) - - await setActive({ - session: sessionObj, - organization: orgObj, - beforeEmit: () => void - }) - ``` - - - The `getOrganizationMemberships` [method on the `Clerk` class](https://clerk.com/docs/references/javascript/clerk/clerk#organization) has been removed. Instead, use `getOrganizationMemberships` on a user instance. - - ```diff - - Clerk.getOrganizationMemberships(); - + user.getOrganizationMemberships(); - ``` - - - If you are using [`Clerk.addListener`](https://clerk.com/docs/references/javascript/clerk/clerk#add-listener) or `OrganizationContext` and utilizing either the `lastOrganizationInvitation` and/or `lastOrganizationMember` emitted events, these properties have been removed, as they were only relevant for internal use. We are not providing a way to backfill this functionality at the moment. If you are using it and this is an issue for you, please [reach out to Clerk support](https://clerk.com/support) and we can find a way to resolve the issue! - - - Passing a string as an argument to `Organization.create` is no longer possible - instead, pass an object with the `name` property. - - ```diff - - Organization.create('...'); - + Organization.create({ name: '...' }); - ``` - - - The `Organization.getPendingInvitations()` method has been removed. You can use `Organization.getInvitations` instead. - - ```diff - - Organization.getPendingInvitations(); - + Organization.getInvitations({ status: 'pending' }); - ``` - - - The `Clerk.redirectToHome` method has been removed. If you are looking for a generic replacement for this method, you can instead use `window.Clerk.redirectToAfterSignUp()` or `window.Clerk.redirectAfterSignIn()`. - - To set the `afterSignUpUrl` or `afterSignInUrl`, you can: - - - [pass the desired values into ClerkProvider](https://clerk.com/docs/components/clerk-provider#properties) - - if using nextjs SDK, set with `NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL` or `NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL` - - if using remix SDK, set with `CLERK_AFTER_SIGN_IN_URL` or `CLERK_AFTER_SIGN_UP_URL` - - If not using a react-based SDK, they can be passed into `Clerk.load` as such: `Clerk.load({ afterSignUpUrl: 'x', afterSignInUrl: 'y' })` - - - We have removed the `Clerk.isReady()` function - instead, please use the `Clerk.loaded` property to check whether Clerk has completed loading. - - - The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: - - ```diff - import { SignOutButton } from "@clerk/clerk-react"; - - export const Signout = () => { - return ( - { window.location.href = "/your-path" }} - + redirectUrl="/your-path" - > - - - ) - } - ``` - - diff --git a/packages/upgrade/source/guide-generators/v5/js/index.js b/packages/upgrade/source/guide-generators/v5/js/index.js index 94f420d72df..339420d2397 100644 --- a/packages/upgrade/source/guide-generators/v5/js/index.js +++ b/packages/upgrade/source/guide-generators/v5/js/index.js @@ -20,19 +20,19 @@ async function generate() { return assembleContent({ data, cwd }, [ frontmatter({ - title: `Upgrading ${properName} from v4 to v5`, - description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + title: `Upgrading ${properName} to Core 2`, + description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`, }), - `# Upgrading \`${packageName}\` from v4 to v5`, + `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdown('prepare'), - markdownTemplate('update-v5', { packageName }), + markdownTemplate('prepare', { version, packageName }), + markdownTemplate('update-version', { packageName }), markdown('cli'), '## Breaking Changes', markdown('redesign-preview'), markdown('after-sign-x-handling'), markdown('orgs-claim'), - markdown('path-routing'), + markdownTemplate('path-routing', { packageName }), markdown('image-url'), accordionForCategory('image-url'), markdown('pagination-args'), diff --git a/packages/upgrade/source/guide-generators/v5/js/intro.mdx b/packages/upgrade/source/guide-generators/v5/js/intro.mdx index 32f63d0487d..fbe7aa655ef 100644 --- a/packages/upgrade/source/guide-generators/v5/js/intro.mdx +++ b/packages/upgrade/source/guide-generators/v5/js/intro.mdx @@ -1,3 +1,3 @@ -Version 5 of the Javascript SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Clerk's Core 2 release includes a new major version of the Javascript SDK, v5. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. -By the end of this guide, you’ll have successfully upgraded your JS project to use `@clerk/clerk-js` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. +By the end of this guide, you'll have successfully upgraded your JS project to use `@clerk/clerk-js` v5. You'll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx b/packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx deleted file mode 100644 index 2cf6552b6b1..00000000000 --- a/packages/upgrade/source/guide-generators/v5/nextjs/__output.mdx +++ /dev/null @@ -1,1078 +0,0 @@ ---- -title: 'Upgrading Next.js from v4 to v5' -description: "Learn how to upgrade Clerk's Next.js SDK from v4 to v5." ---- - -# Upgrading `@clerk/nextjs` from v4 to v5 - -Version 5 of the Next.js SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, a substantially improved middleware import, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. - -By the end of this guide, you’ll have successfully upgraded your Next.js project to use `@clerk/nextjs` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. - -## Preparing to upgrade - -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. - -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. - -Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. - -**Updating Node.js** - -You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). - -**Updating React** - -All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. - - - ```bash filename="terminal" - npm install react@latest react-dom@latest - ``` - - ```bash filename="terminal" - yarn add react@latest react-dom@latest - ``` - - ```bash filename="terminal" - pnpm add react@latest react-dom@latest - ``` - - - -If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. - -**Updating Next.js** - -`@clerk/nextjs` now requires you to use Next.js version `13.0.4` or later. Check out Next's upgrade guides for more guidance if you have not yet upgraded to Next.js 13: - -- [Upgrading from 12 to 13](https://nextjs.org/docs/pages/building-your-application/upgrading/version-13) -- [Upgrading from 13 to 14](https://nextjs.org/docs/app/building-your-application/upgrading/version-14) - -## Updating to v5 - -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: - - - ```bash filename="terminal" - npm install @clerk/nextjs@beta - ``` - - ```bash filename="terminal" - yarn add @clerk/nextjs@beta - ``` - - ```bash filename="terminal" - pnpm add @clerk/nextjs@beta - ``` - - - -## CLI Upgrade Helper - -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. - -To run the CLI tool, navigate to your project and run it in the terminal: - - - ```bash filename="terminal" - npx @clerk/upgrade - ``` - -```bash filename="terminal" -yarn dlx @clerk/upgrade -``` - -```bash filename="terminal" -pnpm dlx @clerk/upgrade -``` - - - -If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. - -## Breaking Changes - -### Component design adjustments - -The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. - -[More detail on these changes »](/components-redesigned) - -## New Middleware architecture - -User and customer feedback about `authMiddleware()` has been clear in that Middleware logic was a often friction point. As such, in v5 you will find a completely new Middleware helper called [`clerkMiddleware()`](/docs/references/nextjs/clerk-middleware) that will hopefully alleviate all of the issues folks had with `authMiddleware()`. - -Additionally, there are now new helpers that enable controlling auth on a _per-page and/or per-layout basis_ when using App Router. While you can still configure which routes are protected via Middleware, the page-based protection strategy is what is now recommended, as the co-location of auth protection configuration with the code for the pages themselves results in a superior developer experience that adds clarity as you navigate your codebase. - -### Per-route auth config - -Sometimes, code speaks louder than words. Let's get right into an example: - - - -```ts filename="app/src/dashboard/layout.tsx" -import { auth } from '@clerk/nextjs/server' - -export default async function DashboardLayout({ children }) { - auth().protect(); - // 👆 This one line is all it takes - the layout and all its children - // will now redirect to your sign in page for un-authenticated users. - - return <>{children} - -} - -```` - - -```ts filename="app/src/dashboard/page.tsx" -import { auth } from '@clerk/nextjs/server' - -export default async function DashboardPage() { - auth().protect(); - // 👆 This one line is all it takes - the layout and all its children - // will now redirect to your sign in page for un-authenticated users. - - return

This page is now protected!

-} -```` - -
-
- -In this example, we add `auth().protect()` to a layout, and like magic, that layout and all of it's children will be gated by auth. The same logic can be applied for pages. - -Want to get more specific with permission gating? Add the role you are gating as a param: - -```ts filename="app/src/admin/layout.tsx" -import { auth } from '@clerk/nextjs/server'; - -export default async function AdminLayout({ children }) { - auth().protect({ role: 'org:admin' }); - - return <>{children}; -} -``` - -Note that in order for this to work, you will still need Middleware to be present, but it only requires the most minimal configuration: - -```ts filename="middleware.ts" -import { clerkMiddleware } from '@clerk/nextjs/server'; - -export default clerkMiddleware(); - -export const config = { - matcher: ['/((?!.*\\..*|_next).*)', '/', '/(api|trpc)(.*)'], -}; -``` - -If you are using the pages router, per-route gating won't work. Instead, configure your auth gating via Middleware as described in the next section. - -### Middleware auth config - -If you prefer to define your auth logic within the Middleware, you can still do this using the new `clerkMiddleware`. The primary change from the previous `authMiddleware()` is that `clerkMiddleware()` does not protect any routes by default, instead requiring the developer to add routes they would like to be protected by auth. This is a substantial contrast to the previous `authMiddleware()`, which protected all routes by default, requiring the developer to add exceptions. The API was also substantially simplified, and it has become easier to combine with other Middleware helpers smoothly as well. - -Here's an example that replicates the auth protection scheme above, but entirely inside the Middleware: - -```ts filename="middleware.ts" -import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'; - -const isDashboardRoute = createRouteMatcher(['/dashboard(.*)']); -const isAdminRoute = createRouteMatcher(['/admin']); - -export default clerkMiddleware((auth, req) => { - // Restrict admin route to users with specific role - if (isAdminRoute(req)) auth().protect({ role: 'org:admin' }); - - // Restrict dashboard routes to logged in users - if (isDashboardRoute(req)) auth().protect(); -}); - -export const config = { - matcher: ['/((?!.*\\..*|_next).*)', '/', '/(api|trpc)(.*)'], -}; -``` - -A couple things to note here: - -- The `createRouteMatcher` helper makes it easy to define route groups that you can leverage inside the Middleware function and check in whichever order you'd like. Note that it can take an array of routes as well. -- With `clerkMiddleware`, you're defining the routes you want **to be protected**, rather than the routes you don't want to be protected. -- You are able to use the same `auth().protect()` helpers that you can use within layouts/pages here in the Middleware. - -### Migrating to `clerkMiddleware()` - -Clerk strongly recommends migrating to the new `clerkMiddleware()` for an improved DX and access to all present and upcoming features, but also want to note that `authMiddleware()`, while deprecated, will continue to work in v5 and will not be removed until the next major version, so you do not _need_ to make any changes to your Middleware setup this version. - -The most basic migration will be updating the import and changing out the default export. - -```diff -- import { authMiddleware } from "@clerk/nextjs" -+ import { clerkMiddleware } from '@clerk/nextjs/server' - -- export default authMiddleware() -+ export default clerkMiddleware() - - export const config = { - matcher: ["/((?!.*\\..*|_next).*)", "/", "/(api|trpc)(.*)"], - } -``` - -Of course, in most cases you'll have a more complicated setup than this. You can find some examples below for how to migrate a few common use cases. Be sure to review the [`clerkMiddleware()` documentation](/docs/references/nextjs/clerk-middleware) and [route protection guide](/docs/references/nextjs/route-protection) if your specific use case is not mentioned. - - - - By default, `clerkMiddleware()` treats all pages as public, so you no longer need to explcitly set `/` as public. - - Before: - - ```ts filename="middleware.ts" - import { authMiddleware } from "@clerk/nextjs" - - export default authMiddleware({ - publicRoutes: ["/"], - }) - - export const config = { - matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], - } - ``` - - After: - - ```ts filename="middleware.ts" - import { - clerkMiddleware, - createRouteMatcher - } from "@clerk/nextjs/server" - - export default clerkMiddleware() - - export const config = { - matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], - } - ``` - - - - Having all routes public except everything under `/dashboard`. - - Before: - - ```ts filename="middleware.ts" - import { authMiddleware } from "@clerk/nextjs" - - export default authMiddleware({ - publicRoutes: (req) => !req.url.includes("/dashboard"), - }) - - export const config = { - matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], - } - ``` - - After: - - ```ts filename="middleware.ts" - import { - clerkMiddleware, - createRouteMatcher - } from "@clerk/nextjs/server" - - const isDashboardRoute = createRouteMatcher(["/dashboard(.*)"]) - - export default clerkMiddleware((auth, request) => { - if (isDashboardRoute(request)) { - auth().protect() - } - }) - - export const config = { - matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], - } - ``` - - - - You can call other Middlewares inside `clerkMiddleware()`, giving you more direct control over what is called where. An example would be [next-intl](https://next-intl-docs.vercel.app/) to add internationalization to your app. - - Before: - - ```ts filename="middleware.ts" - import { authMiddleware } from "@clerk/nextjs" - import createMiddleware from "next-intl/middleware" - - const intlMiddleware = createMiddleware({ - locales: ["en", "de"], - defaultLocale: "en", - }) - - export default authMiddleware({ - beforeAuth: (req) => { - return intlMiddleware(req); - }, - publicRoutes: ["((?!^/dashboard/).*)"], - }) - - export const config = { - matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], - } - ``` - - After: - - ```ts filename="middleware.ts" - import { - clerkMiddleware, - createRouteMatcher - } from "@clerk/nextjs/server" - import createMiddleware from "next-intl/middleware" - - const intlMiddleware = createMiddleware({ - locales: ["en", "de"], - defaultLocale: "en", - }) - - const isDashboardRoute = createRouteMatcher(["/dashboard(.*)"]) - - export default clerkMiddleware((auth, request) => { - if (isDashboardRoute(request)) { - auth().protect() - } - - return intlMiddleware(request) - }) - - export const config = { - matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], - } - ``` - - - - -## Changes to top-level exports - -As part of this release, some of the top-level exports of `@clerk/nextjs` have been changed in order to improve bundle size and tree-shaking efficiency. These changes have resulted in a ~75% reduction in build size for middleware bundles. However, you will likely need to make some changes to import paths as a result. - -Use the CLI tool, `npx @clerk/upgrade`, to automatically find occurences of old imports. - - - - Previously these exports have been exported both from `@clerk/nextjs` and `@clerk/nextjs/server`. As of v5 they are only exported from the latter. - - ```diff - import { - auth, - currentUser, - authMiddleware, - buildClerkProps, - verifyToken, - verifyJwt, - decodeJwt, - signJwt, - constants, - redirect, - createAuthenticateRequest, - createIsomorphicRequest, - - } from "@clerk/nextjs" - + } from "@clerk/nextjs/server" - ``` - - - - Exports related to errors are now under `@clerk/nextjs/errors`. - - ```diff - import { - isClerkAPIResponseError, - isEmailLinkError, - isKnownError, - isMetamaskError, - EmailLinkErrorCode, - - } from "@clerk/nextjs" - + } from "@clerk/nextjs/errors" - ``` - - - - The `@clerk/nextjs` import will work with both the app and pages router. - - ```diff - - import { } from "@clerk/nextjs/app-beta" - + import { } from "@clerk/nextjs" - ``` - - Some behavior may have changed between Clerk's beta and the stable release. Please check on your end if behavior stayed the same. - - - - The top-level exports support SSR by default now. - - ```diff - - import { } from "@clerk/nextjs/ssr" - + import { } from "@clerk/nextjs" - ``` - - - - ```diff - - import { } from "@clerk/nextjs/edge-middleware" - + import { } from "@clerk/nextjs" - ``` - - - ```diff - - import { } from "@clerk/nextjs/edge-middlewarefiles" - + import { } from "@clerk/nextjs" - ``` - - - The `@clerk/nextjs/api` subpath was removed completely. It re-exported helpers from `@clerk/clerk-sdk-node` and its types. If you relied on these, import from `@clerk/clerk-sdk-node` directly instead. - - ```diff - import type { - ClerkMiddleware, - ClerkMiddlewareOptions, - LooseAuthProp, - RequireAuthProp, - StrictAuthProp, - WithAuthProp - - } from "@clerk/nextjs/api" - + } from "@clerk/clerk-sdk-node" - - - import { requireAuth, withAuth } from "@clerk/nextjs/api" - + import { requireAuth, withAuth } from "@clerk/clerk-sdk-node" - ``` - - - - -## After sign up/in/out URL handling - -Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. - -As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. - -```diff -- -+ -``` - -### Removed: `orgs` claim on JWT - -In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. - -The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. - - - - ```typescript filename="Next.js" - import { getAuth } from "@clerk/nextjs/server" - const claims: JwtPayload = getAuth(request).sessionClaims - - import { getAuth } from "@clerk/ssr.server" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - - ```typescript filename="Fastify" - import { getAuth } from "@clerk/fastify" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - ```typescript filename="@clerk/backend" - import { createClerkClient } from "@clerk/backend" - - const clerkClient = createClerkClient({ secretKey: "" }) - const requestState = await clerkClient.authenticateRequest( - request, - { publishableKey: "" } - ) - const claims: JwtPayload = requestState.toAuth().sessionClaims - ``` - - - - ```typescript filename="@clerk/clerk-sdk-node" - import { clerkClient } from "@clerk/clerk-sdk-node" - - router.use((...args) => clerkClient.expressRequireAuth()(...args)) - router.get("/me", async (req, reply: Response) => { - return reply.json({ auth: req.auth }) - }) - ``` - - - - -If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. - -### Path routing is now the default - -On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. - -In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: - -- `` -- `` -- `` -- `` -- `` - -Here's how you'd use the components going forward: - -```jsx - - - - - -``` - -If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. - -```jsx - - -``` - -However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. - - -```env filename=".env.local" -NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in -NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up -``` - -```env filename=".env" -CLERK_SIGN_IN_URL=/sign-in -CLERK_SIGN_UP_URL=/sign-up -``` - - - -**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. - -```jsx -// Only works for Next.js / Remix when environment variables are set - - -``` - -### Image URL Name Consolidation - -There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: - -Organization.logoUrl -> Organization.imageUrl', - 'User.profileImageUrl -> .imageUrl', - 'ExternalAccount.avatarUrl -> .imageUrl', - 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', - ]} -> - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. - - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - - The `avatarUrl` property of any [`ExternalAcccount` - object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - - - The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - - - -## Deprecation removals & housekeeping - -As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. - - - For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of - changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for - manually. - - -### Deprecation removals - -CLERK_API_KEY replaced by CLERK_SECRET_KEY", "CLERK_FRONTEND_API replaced by CLERK_PUBLISHABLE_KEY", "CLERK_JS_VERSION should be NEXT_PUBLIC_CLERK_JS_VERSION", "apiKey -> secretKey as param to authMiddleware", "frontendApi -> publishableKey as param to authMiddleware", "apiKey -> secretKey as param to createClerkClient", "frontendApi -> publishableKey as param to createClerkClient", "apiKey -> secretKey as param to getAuth", "frontendApi -> publishableKey as prop to ClerkProvider", "@clerk/nextjs/app-beta import removed", "@clerk/nextjs/ssr import removed", "@clerk/nextjs/edge-middleware import removed", "@clerk/nextjs/edge-middlewarefiles import removed", "API_URL constant removed", "API_VERSION constant removed", "CLERK_JS_URL constant removed", "CLERK_JS_VERSION constant removed", "DOMAIN constant removed", "IS_SATELLITE constant removed", "PROXY_URL constant removed", "PUBLISHABLE_KEY constant removed", "SECRET_KEY constant removed", "SIGN_IN_URL constant removed", "SIGN_UP_URL constant removed", "@clerk/nextjs/api import removed", "MultiSessionAppSupport import moved under /internal", "NEXT_PUBLIC_CLERK_JS should be NEXT_PUBLIC_CLERK_JS_URL"]}> - - The `CLERK_API_KEY` environment variable was renamed to `CLERK_SECRET_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). - - - The `CLERK_FRONTEND_API` environment variable was renamed to `CLERK_PUBLISHABLE_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). **Note:** The values are different, so this is not just a key replacement. [More information](/docs/deployments/overview#api-keys-and-environment-variables). - - - If you are using `CLERK_JS_VERSION` as an environment variable, it should be changed to `NEXT_PUBLIC_CLERK_JS_VERSION` instead. - - This change brings our SDK up to date with the latest standards for next.js - that public environment variables should have the `NEXT_PUBLIC_` prefix. This env variable is not private, so it should get the public prefix. - - - The `apiKey` argument passed to `authMiddleware` must be changed to `secretKey`. - - ```diff - import { authMiddleware } from '@clerk/nextjs'; - - - authMiddleware({ apiKey: '...' }); - + authMiddleware({ secretKey: '...' }); - ``` - - - The `frontendApi` argument passed to `authMiddleware` must be changed to `publishableKey` - - ```diff - import { authMiddleware } from "@clerk/nextjs/server" - - - authMiddleware({ frontendApi: '...' }) - + authMiddleware({ publishableKey: '...' }) - ``` - - - The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. - - ```diff - import { createClerkClient } from '@clerk/nextjs/server'; - - - createClerkClient({ apiKey: '...' }); - + createClerkClient({ secretKey: '...' }); - ``` - - - The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. - - ```diff - import { createClerkClient } from '@clerk/nextjs/server'; - - - createClerkClient({ frontendApi: '...' }); - + createClerkClient({ publishableKey: '...' }); - ``` - - - The `apiKey` argument passed to `getAuth` must be changed to `secretKey`. - - ```diff - - getAuth({ apiKey: '...' }) - + getAuth({ secretKey: '...' }) - ``` - - - The `frontendApi` prop passed to `` was renamed to `publishableKey`. **Note:** The values are different, so this is not just a key replacement. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). [More information](/docs/deployments/overview#api-keys-and-environment-variables). - - - If you are using the `@clerk/nextjs/app-beta` import anywhere, it should use `@clerk/nextjs` instead. The `app-beta` import has been removed as our approuter support is stable, if there are any places you’re using it you can remove. - - Make this change carefully as some behavior may have changed between our beta and stable releases. You can refer to [our documentation](https://clerk.com/docs/quickstarts/nextjs) and/or [approuter example](https://github.com/clerk/clerk-nextjs-app-quickstart) for up-to-date usage. - - The `@clerk/nextjs` import will work with both App Router and Pages Router. - - - If you are importing from `@clerk/nextjs/ssr`, you can use `@clerk/nextjs` instead. Our top-level import supports SSR functionality by default now, so the subpath on the import is no longer needed. This import can be directly replaced without any other considerations. - - - This deprecated import has been replaced by `@clerk/nextjs`. Usage should now look as such: `import { authMiddleware } from @clerk/nextjs`. There may be changes in functionality between the two exports depending on how old the version used is, so upgrade with caution. - - - This deprecated import has been replaced by `@clerk/nextjs`. Usage should now look as such: `import { authMiddleware } from @clerk/nextjs`. There may be changes in functionality between the two exports depending on how old the version used is, so upgrade with caution. - - - This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `CLERK_API_URL` environment variable. - - - This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `CLERK_API_VERSION` environment variable. - - - This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_JS` environment variable. - - - This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_JS_VERSION` environment variable. - - - This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_DOMAIN` environment variable. - - - This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_IS_SATELLITE` environment variable. - - - This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_PROXY_URL` environment variable. - - - This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` environment variable. - - - This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `CLERK_SECRET_KEY` environment variable. - - - This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_SIGN_IN_URL` environment variable. - - - This deprecated constant has been removed as an export from `@clerk/nextjs`. Instead, set and use the `NEXT_PUBLIC_CLERK_SIGN_UP_URL` environment variable. - - - The import subpath `@clerk/nextjs/api` has been removed. This includes the following imports: - - ```js - // These have been removed - import { - ClerkMiddleware, - ClerkMiddlewareOptions, - LooseAuthProp, - RequireAuthProp, - StrictAuthProp, - WithAuthProp, - } from '@clerk/nextjs/api'; - ``` - - If you still need to use any of these functions, they can be instead imported from `@clerk/clerk-sdk-node`. - - - The `MultiSessionAppSupport` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/internal`. You must update your import path in order for it to work correctly. Note that internal imports are not intended for usage and are outside the scope of semver. Example below of the fix that needs to be made: - - ```diff - - import { MultiSessionAppSupport } from "@clerk/nextjs" - + import { MultiSessionAppSupport } from "@clerk/nextjs/internal" - ``` - - - If you are using `NEXT_PUBLIC_CLERK_JS` as an environment variable, it should be changed to `NEXT_PUBLIC_CLERK_JS_URL` instead. This variable was renamed for consistency across public APIs. Make sure to also check your production host configuration when changing environment variable values. - - - -### Other Breaking Changes - -Organization.getRoles arguments changed", "Organization.getMemberships arguments changed", "Organization.getDomains arguments changed", "Organization.getInvitations arguments changed", "Organization.getMembershipRequests arguments changed", "User.getOrganizationInvitations arguments changed", "User.getOrganizationSuggestions arguments changed", "User.getOrganizationMemberships arguments changed", "Users.getOrganizationInvitationList return signature changed", "Organizations.getOrganizationInvitationList return type changed", "User.getOrganizationMembershipList() return type changed", "Users.getOrganizationList return signature changed", "Organization.getOrganizationList() return type changed", "API_URL value has changed", "isMagicLinkError -> isEmailLinkError", "useMagicLink -> useEmailLink", "MagicLinkErrorCode -> EmailLinkErrorCode", "setSession -> setActive", "isMetamaskError import moved under /errors", "WithSession component removed", "WithClerk component removed", "WithUser component removed", "withClerk function removed", "withSession function removed", "withUser function removed", "Replace signOutCallback prop on SignOutButton with redirectUrl"]}> - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getRoles({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getDomains({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await organization.getMembershipRequests({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationInvitations({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationSuggestions({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: - - ```diff - const { data } = await user.getOrganizationMemberships({ - - limit: 10, - + pageSize: 10, - - offset: 10, - + initialPage: 2, - }) - ``` - - - The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - - Here's an example of how the response shape would change with this modification: - - ```diff - - const data = await clerkClient.users.getOrganizationInvitationList() - + const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList() - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const data = await clerkClient.organizations.getOrganizationInvitationList({ - organizationId: "...", - }) - - - data.forEach(() => {}) - + data.data.forEach(() => {}) - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { user } = useUser() - const membershipList = user.getOrganizationMembershipList() - - - membershipList.forEach(() => {}) - + membershipList.data.forEach(() => {}) - ``` - - - The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. - - Here's an example of how the response shape would change with this modification: - - ```diff - - const data = await clerkClient.users.getOrganizationList() - + const { data, totalCount } = await clerkClient.users.getOrganizationList() - ``` - - - The return type for this function was previously `[Items]` but has now been updated to `{ data: [Items], totalCount: number }`. Since Clerk's API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily. A before/after code example can be seen below: - - ```diff - const { organization } = useOrganization() - const orgList = organization.getOrganizationList() - - - orgList.forEach(() => {}) - + orgList.data.forEach(() => {}) - ``` - - - The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: - - ```diff - - await setSession('sessionID', () => void) - + await setActive({ session: 'sessionID', beforeEmit: () => void }) - - - await setSession(sessionObj) - + await setActive({ session: sessionObj }) - - - await setSession(sessionObj, () => void) - + await setActive({ session: sessionObj, beforeEmit: () => void }) - ``` - - `setActive` also supports setting an active organization: - - ```js - await setActive({ - session: 'sessionID', - organization: 'orgID', - beforeEmit: () => void - }) - - await setActive({ - session: sessionObj, - organization: orgObj, - beforeEmit: () => void - }) - ``` - - - The `isMetamaskError` import path has changed from `@clerk/react` to `@clerk/react/errors`. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - - ```diff - - import { isMetamaskError } from "@clerk/react" - + import { isMetamaskError } from "@clerk/react/errors" - ``` - - - The `WithSession` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - export const WithSession = ({ children }) => { - const session = useSession(); - if (typeof children !== 'function') throw new Error(); - - return {children(session)}; - }; - ``` - - - The `WithClerk` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - export const WithClerk = ({ children }) => { - const clerk = useClerk(); - if (typeof children !== 'function') throw new Error(); - - return {children(clerk)}; - }; - ``` - - - The `WithUser` higher order component has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - export const WithUser = ({ children }) => { - const user = useUser(); - if (typeof children !== 'function') throw new Error(); - - return {children(user)}; - }; - ``` - - - The `withClerk` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - function withClerk(Component, displayName) { - displayName = displayName || Component.displayName || Component.name || 'Component'; - Component.displayName = displayName; - const HOC = props => { - const clerk = useIsomorphicClerkContext(); - - if (!clerk.loaded) return null; - - return ( - - ); - }; - - HOC.displayName = `withClerk(${displayName})`; - return HOC; - } - ``` - - - The `withSession` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - function withSession(Component, displayName) { - displayName = displayName || Component.displayName || Component.name || 'Component'; - Component.displayName = displayName; - const HOC = props => { - const session = useSessionContext(); - - if (!session) return null; - - return ( - - ); - }; - - HOC.displayName = `withSession(${displayName})`; - return HOC; - } - ``` - - - The `withUser` higher order function has been removed. If you would still like to use this function in the way its implemented, it can be created quickly using Clerk's [custom hooks](https://clerk.com/docs/references/react/overview). An example of how to do so is below: - - ```js - function withUser(Component, displayName) { - displayName = displayName || Component.displayName || Component.name || 'Component'; - Component.displayName = displayName; - const HOC = props => { - const clerk = useUserContext(); - - if (!user) return null; - - return ( - - ); - }; - - HOC.displayName = `withUser(${displayName})`; - return HOC; - } - ``` - - - The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: - - ```diff - import { SignOutButton } from "@clerk/clerk-react"; - - export const Signout = () => { - return ( - { window.location.href = "/your-path" }} - + redirectUrl="/your-path" - > - - - ) - } - ``` - - diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx b/packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx index a5f496e68c6..b3688e80e70 100644 --- a/packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx +++ b/packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx @@ -2,7 +2,9 @@ As part of this release, some of the top-level exports of `@clerk/nextjs` have been changed in order to improve bundle size and tree-shaking efficiency. These changes have resulted in a ~75% reduction in build size for middleware bundles. However, you will likely need to make some changes to import paths as a result. -Use the CLI tool, `npx @clerk/upgrade`, to automatically find occurences of old imports. + + Use [the CLI tool](#cli-upgrade-helper) to automatically find occurences of imports that need to be changed. + diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/index.js b/packages/upgrade/source/guide-generators/v5/nextjs/index.js index 547b045e218..2d39ead3d24 100644 --- a/packages/upgrade/source/guide-generators/v5/nextjs/index.js +++ b/packages/upgrade/source/guide-generators/v5/nextjs/index.js @@ -20,16 +20,16 @@ async function generate() { return assembleContent({ data, cwd }, [ frontmatter({ - title: `Upgrading ${properName} from v4 to v5`, - description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + title: `Upgrading ${properName} to Core 2`, + description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`, }), - `# Upgrading \`${packageName}\` from v4 to v5`, + `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdown('prepare'), + markdownTemplate('prepare', { version, packageName }), markdown('node-version'), markdown('react-version'), markdown('nextjs-version'), - markdownTemplate('update-v5', { packageName }), + markdownTemplate('update-version', { packageName }), markdown('cli'), '## Breaking Changes', markdown('redesign-preview'), @@ -37,7 +37,7 @@ async function generate() { markdown('import-changes'), markdown('after-sign-x-handling'), markdown('orgs-claim'), - markdown('path-routing'), + markdownTemplate('path-routing', { packageName }), markdown('image-url'), accordionForCategory('image-url'), deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']), diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/intro.mdx b/packages/upgrade/source/guide-generators/v5/nextjs/intro.mdx index 5f837394976..e3326c4eff2 100644 --- a/packages/upgrade/source/guide-generators/v5/nextjs/intro.mdx +++ b/packages/upgrade/source/guide-generators/v5/nextjs/intro.mdx @@ -1,3 +1,3 @@ -Version 5 of the Next.js SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, a substantially improved middleware import, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Clerk's Core 2 release includes a new major version of the Next.js SDK, v5. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, a substantially improved middleware import, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your Next.js project to use `@clerk/nextjs` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/node/__output.mdx b/packages/upgrade/source/guide-generators/v5/node/__output.mdx deleted file mode 100644 index c162eff80e6..00000000000 --- a/packages/upgrade/source/guide-generators/v5/node/__output.mdx +++ /dev/null @@ -1,344 +0,0 @@ ---- -title: 'Upgrading Node from v4 to v5' -description: "Learn how to upgrade Clerk's Node SDK from v4 to v5." ---- - -# Upgrading `@clerk/clerk-sdk-node` from v4 to v5 - -Version 5 of the Node SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. - -By the end of this guide, you’ll have successfully upgraded your Node project to use `@clerk/clerk-sdk-node` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. - -## Preparing to upgrade - -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. - -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. - -Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. - -**Updating Node.js** - -You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). - -## Updating to v5 - -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: - - - ```bash filename="terminal" - npm install @clerk/clerk-sdk-node@beta - ``` - - ```bash filename="terminal" - yarn add @clerk/clerk-sdk-node@beta - ``` - - ```bash filename="terminal" - pnpm add @clerk/clerk-sdk-node@beta - ``` - - - -## CLI Upgrade Helper - -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. - -To run the CLI tool, navigate to your project and run it in the terminal: - - - ```bash filename="terminal" - npx @clerk/upgrade - ``` - -```bash filename="terminal" -yarn dlx @clerk/upgrade -``` - -```bash filename="terminal" -pnpm dlx @clerk/upgrade -``` - - - -If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. - -## Breaking Changes - -### `cjs/instance` and `esm/instance` imports no longer needed - -If you are using either of these import paths, they are no longer necessary and you can import directly from the top level `@clerk/express` path. - -```diff -- import { ... } from "@clerk/clerk-sdk-node/esm/instance"; -- import { ... } from "@clerk/clerk-sdk-node/cjs/instance"; -+ import { ... } from "@clerk/clerk-sdk-node"; -``` - -### Clerk client setters removed in favor of `createClerkClient` options - -The following setter methods have been removed in the lastest version. If you were using any of these functions, their functionality can be replaced by instead passing the correponding option to `createClerkClient`. - -- `setClerkApiVersion` -- `setClerkHttpOptions` -- `setClerkServerApiUrl` -- `setClerkApiKey` - -Code example: - -```diff - import { - clerkClient, -- setClerkApiKey, -- setClerkApiVersion, -- setClerkHttpOptions, -- setClerkServerApiUrl -} from "@clerk/clerk-sdk-node" - -- setClerkApiKey("...") -- setClerkApiVersion("...") -- setClerkHttpOptions("...") -- setClerkServerApiUrl("...") - - const clerkClient = createClerkClient({ -+ secretKey: "..." -+ apiVersion: "..." -+ httpOptions: "..." -+ serverApiUrl: "..." - }) - - await clerkClient.users.getUser(userId); -``` - -### Removed: `orgs` claim on JWT - -In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. - -The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. - - - - ```typescript filename="Next.js" - import { getAuth } from "@clerk/nextjs/server" - const claims: JwtPayload = getAuth(request).sessionClaims - - import { getAuth } from "@clerk/ssr.server" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - - ```typescript filename="Fastify" - import { getAuth } from "@clerk/fastify" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - ```typescript filename="@clerk/backend" - import { createClerkClient } from "@clerk/backend" - - const clerkClient = createClerkClient({ secretKey: "" }) - const requestState = await clerkClient.authenticateRequest( - request, - { publishableKey: "" } - ) - const claims: JwtPayload = requestState.toAuth().sessionClaims - ``` - - - - ```typescript filename="@clerk/clerk-sdk-node" - import { clerkClient } from "@clerk/clerk-sdk-node" - - router.use((...args) => clerkClient.expressRequireAuth()(...args)) - router.get("/me", async (req, reply: Response) => { - return reply.json({ auth: req.auth }) - }) - ``` - - - - -If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. - -### Image URL Name Consolidation - -There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: - -Organization.logoUrl -> Organization.imageUrl', - 'User.profileImageUrl -> .imageUrl', - 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', - ]} -> - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. - - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - - The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - - - -## Deprecation removals & housekeeping - -As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. - - - For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of - changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for - manually. - - -### Deprecation removals - -CLERK_API_KEY replaced by CLERK_SECRET_KEY", "CLERK_FRONTEND_API replaced by CLERK_PUBLISHABLE_KEY", "apiKey -> secretKey as param to ClerkExpressRequireAuth", "apiKey -> secretKey as param to ClerkExpressWithAuth", "apiKey -> secretKey as param to createClerkClient", "apiKey -> secretKey as param to createClerkExpressRequireAuth", "apiKey -> secretKey as param to createClerkExpressWithAuth", "frontendApi -> publishableKey as param to createClerkClient", "frontendApi -> publishableKey as param to createClerkExpressRequireAuth", "frontendApi -> publishableKey as param to ClerkExpressRequireAuth", "frontendApi -> publishableKey as param to createClerkExpressWithAuth", "frontendApi -> publishableKey as param to ClerkExpressWithAuth"]}> - - The `CLERK_API_KEY` environment variable was renamed to `CLERK_SECRET_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). - - - The `CLERK_FRONTEND_API` environment variable was renamed to `CLERK_PUBLISHABLE_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). **Note:** The values are different, so this is not just a key replacement. [More information](/docs/deployments/overview#api-keys-and-environment-variables). - - - The `apiKey` argument passed to `ClerkExpressRequireAuth` must be changed to `secretKey`. - - ```diff - import { ClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; - - - ClerkExpressRequireAuth({ apiKey: '...' }); - + ClerkExpressRequireAuth({ secretKey: '...' }); - ``` - - - The `apiKey` argument passed to `ClerkExpressWithAuth` must be changed to `secretKey`. - - ```diff - import { ClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; - - - ClerkExpressWithAuth({ apiKey: '...' }); - + ClerkExpressWithAuth({ secretKey: '...' }); - ``` - - - The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. - - ```diff - import { createClerkClient } from '@clerk/clerk-sdk-node'; - - - createClerkClient({ apiKey: '...' }); - + createClerkClient({ secretKey: '...' }); - ``` - - - The `apiKey` argument passed to `createClerkExpressRequireAuth` must be changed to `secretKey`. - - ```diff - import { createClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; - - - createClerkExpressRequireAuth({ apiKey: '...' }); - + createClerkExpressRequireAuth({ secretKey: '...' }); - ``` - - - The `apiKey` argument passed to `createClerkExpressWithAuth` must be changed to `secretKey`. - - ```diff - import { createClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; - - - createClerkExpressWithAuth({ apiKey: '...' }); - + createClerkExpressWithAuth({ secretKey: '...' }); - ``` - - - The `frontendApi` argument passed to `createClerkClient` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. - - ```diff - import { createClerkClient } from '@clerk/clerk-sdk-node'; - - - createClerkClient({ frontendApi: '...' }); - + createClerkClient({ publishableKey: '...' }); - ``` - - - The `frontendApi` argument passed to `createClerkExpressRequireAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. - - ```diff - import { createClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; - - - createClerkExpressRequireAuth({ frontendApi: '...' }); - + createClerkExpressRequireAuth({ publishableKey: '...' }); - ``` - - - The `frontendApi` argument passed to `ClerkExpressRequireAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. - - ```diff - import { ClerkExpressRequireAuth } from '@clerk/clerk-sdk-node'; - - - ClerkExpressRequireAuth({ frontendApi: '...' }); - + ClerkExpressRequireAuth({ publishableKey: '...' }); - ``` - - - The `frontendApi` argument passed to `createClerkExpressWithAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. - - ```diff - import { createClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; - - - createClerkExpressWithAuth({ frontendApi: '...' }); - + createClerkExpressWithAuth({ publishableKey: '...' }); - ``` - - - The `frontendApi` argument passed to `ClerkExpressWithAuth` must be changed to `publishableKey`. Note that the values of the two keys are different, so both keys and values need to be changed. You can find your application's publishable key in the Clerk dashboard. - - ```diff - import { ClerkExpressWithAuth } from '@clerk/clerk-sdk-node'; - - - ClerkExpressWithAuth({ frontendApi: '...' }); - + ClerkExpressWithAuth({ publishableKey: '...' }); - ``` - - - -### Other Breaking Changes - -API_URL value has changed", "LegacyAuthObject type -> AuthObject", "Clerk -> { createClerkClient }"]}> - - The value of this export has changed from `https://api.clerk.dev` to `https://api.clerk.com`. If you were relying on the text content of this value not changing, you may need to make adjustments. - - - We changed the values that our middleware adds to the `request` object after running. Previously it returned a `LegacyAuthObject` type, and now it returns an `AuthObject` type, the difference between the two types is as such: - - ```diff - - type LegacyAuthObject = { - + type AuthObject = { - sessionId: string | null; - actor: ActClaim | undefined | null; - userId: string | null; - getToken: ServerGetToken | null; - debug: AuthObjectDebug | null; - - claims: JwtPayload | null; - + sessionClaims: JwtPayload | null; - + orgId: string | undefined | null; - + orgRole: OrganizationCustomRoleKey | undefined | null; - + orgSlug: string | undefined | null; - + orgPermissions: OrganizationCustomPermissionKey[] | undefined | null; - + has: CheckAuthorizationWithCustomPermissions | null; - } - ``` - - If you were using the `claims` key on the request after running middleware, you will need to instead use `sessionClaims`. Additionally, if you were using the `LooseAuthProp` or `StrictAuthProp` exported types anywhere, note that these have been adjusted to fit the shape of the new middleware response typing. - - - The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - - ```diff - - import Clerk from "@clerk/clerk-sdk-node" - + import { createClerkClient } from "@clerk/clerk-sdk-node" - ``` - - diff --git a/packages/upgrade/source/guide-generators/v5/node/index.js b/packages/upgrade/source/guide-generators/v5/node/index.js index e33b0afa20f..93fe8a3ebc8 100644 --- a/packages/upgrade/source/guide-generators/v5/node/index.js +++ b/packages/upgrade/source/guide-generators/v5/node/index.js @@ -21,22 +21,22 @@ async function generate() { return assembleContent({ data, cwd }, [ frontmatter({ - title: `Upgrading ${properName} from v4 to v5`, - description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + title: `Upgrading ${properName} to Core 2`, + description: `Learn how to upgrade Clerk's ${properName} SDK to the lastest version.`, }), - `# Upgrading \`${packageName}\` from v4 to v5`, + `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdown('prepare'), + markdownTemplate('prepare', { version, packageName }), markdown('node-version'), - markdownTemplate('update-v5', { packageName }), + markdownTemplate('update-version', { packageName }), markdown('cli'), '## Breaking Changes', singleItem('cjs-esm-instance'), markdown('node-setters-removals'), markdown('orgs-claim'), markdown('image-url'), - accordionForCategory('image-url', {}), - deprecationRemovalsAndHousekeeping(), + accordionForCategory('image-url'), + deprecationRemovalsAndHousekeeping(['pagination-return', 'pagination-args', 'error-imports']), ]); } diff --git a/packages/upgrade/source/guide-generators/v5/node/intro.mdx b/packages/upgrade/source/guide-generators/v5/node/intro.mdx index 25261a140a9..689d23b4470 100644 --- a/packages/upgrade/source/guide-generators/v5/node/intro.mdx +++ b/packages/upgrade/source/guide-generators/v5/node/intro.mdx @@ -1,3 +1,3 @@ -Version 5 of the Node SDK ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Clerk's Core 2 release includes a new major version of the Node SDK, v5. This new version ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your Node project to use `@clerk/clerk-sdk-node` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/overview/index.js b/packages/upgrade/source/guide-generators/v5/overview/index.js new file mode 100644 index 00000000000..4955acc3f15 --- /dev/null +++ b/packages/upgrade/source/guide-generators/v5/overview/index.js @@ -0,0 +1,15 @@ +import { assembleContent, frontmatter, markdown, writeToFile } from '../../text-generation.js'; + +const cwd = 'v5/overview'; + +async function generate() { + return assembleContent({ data: {}, cwd }, [ + frontmatter({ + title: `Upgrading from v4 to v5 core`, + description: `Learn how to upgrade from v4 to v5 core for Clerk's SDKs`, + }), + markdown('intro'), + ]); +} + +generate().then(writeToFile(cwd)); diff --git a/packages/upgrade/source/guide-generators/v5/overview/intro.mdx b/packages/upgrade/source/guide-generators/v5/overview/intro.mdx index e8c0910f37f..506e0f691b0 100644 --- a/packages/upgrade/source/guide-generators/v5/overview/intro.mdx +++ b/packages/upgrade/source/guide-generators/v5/overview/intro.mdx @@ -1,18 +1,31 @@ -# Upgrading from v4 to v5 +# Upgrading from v4 to v5 core -Clerk's SDKs include React, Next.js, Remix, Expo, Redwood, and others. This guide helps you with uprading to the next major version of your SDK. +On TODO:DATE, Core 2 for all Clerk SDKs [was released](https://clerk.com/changelog/2024-01-16), broadly featuring the following upgrades: -Version 5 ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a new middleware for Next.js which defaults to not protecting any routes. Along with these highly requested features some smaller DX improvements and housekeeping items made its way into the release. If you want to know everything that's new, read the [v5 announcement post](https://clerk.com/changelog/2024-01-16). +- 💅 Redesigned and improved component UIs. +- 🔪 The 401 & "flash of white page" that was visible sometimes when syncing auth state was eliminated. +- 🔒 New middleware for next.js SDK with improved DX. +- 📉 ~75% build size reduction for next.js SDK due to deprecation removals and top level import changes. +- 🤖 A new CLI tool that will scan codebases and detect breaking changes to aid with migration. +- 🧹 A large number of smaller housekeeping changes, bugfixes, and improvements. - Version 5/v5 refers to the [`@clerk/clerk-js`](https://www.npmjs.com/package/@clerk/clerk-js) package version. - However, other SDKs like `@clerk/backend` or `@clerk/clerk-expo` are versioned independently (and would upgrade from - v1 to v2). To make this page easier to read for instances of general advice only v5 is mentioned. You can think of v4 - as the previous major of your SDK and v5 as the current in those cases. + The term "Core 2" refers to the current release cycle across all SDK libraries, rather than a specific version of any + individual SDK. See [how Clerk SDKs are versioned](sdk-versioning) for more details! -If you're curious about Clerk's approach to versioning and support, head to the [long term support](/docs/upgrade-guides/long-term-support) document. Version 5 includes [potentially breaking changes](#breaking-changes), as well as the removal of [previously deprecated features](#previously-deprecated-features). +If you're curious about Clerk's approach to long term version support, head to the [long term support](/docs/upgrade-guides/long-term-support) document. Core 2 includes potentially breaking changes as well as the removal of previously deprecated features. It's very likely that all Clerk apps will need to make some code changes in order to upgrade successfully, however, in the majority of cases, the changes needed should be quick to implement. -For most users we expect a smooth upgrade path as only a couple of changes will be required: [Update dependencies](#update-dependencies), run the `@clerk/upgrade` CLI, [update Clerk](#update-clerk), and handle any [breaking changes](#breaking-changes). +## SDK Guides -If you're using **Next.js**, you can read a more streamlined [Upgrading Next.js from v4 to v5](/docs/upgrade-guides/upgrading-nextjs-from-v4-to-v5) guide. +Select the SDK(s) you are using for your project from the list below to get started with the upgrade process: + +- [Next.js](/nextjs) +- [Remix](/remix) +- [Expo](/expo) +- [Node](/node) +- [Fastify](/fastify) +- [React](/react) +- [Backend](/backend) +- [JS](/js) +- [Chrome Extension](/chrome-extension) diff --git a/packages/upgrade/source/guide-generators/v5/overview/per-sdk.mdx b/packages/upgrade/source/guide-generators/v5/overview/per-sdk.mdx deleted file mode 100644 index b9975ffae04..00000000000 --- a/packages/upgrade/source/guide-generators/v5/overview/per-sdk.mdx +++ /dev/null @@ -1,16 +0,0 @@ -## SDK Guides - -Select the SDK(s) you are using for your project from the list below to read through a summary of all the breaking changes: - -> Note: I want a prettier selection component here, in it's absence for now there's a list - -- [Next.js](upgrading-nextjs-from-v4-to-v5) -- [Remix](#remix) -- [Expo](#expo) -- [Gatsby](#gatsby) -- [Backend](#backend) -- [Node](#node) -- [Fastify](#fastify) -- [React](#react) -- [JS](#js) -- [Chrome Extension](#chrome-extension) diff --git a/packages/upgrade/source/guide-generators/v5/react/__output.mdx b/packages/upgrade/source/guide-generators/v5/react/__output.mdx deleted file mode 100644 index e21c0fefb81..00000000000 --- a/packages/upgrade/source/guide-generators/v5/react/__output.mdx +++ /dev/null @@ -1,427 +0,0 @@ ---- -title: 'Upgrading React from v4 to v5' -description: "Learn how to upgrade Clerk's React SDK from v4 to v5." ---- - -# Upgrading `@clerk/clerk-react` from v4 to v5 - -Version 5 of the React SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. - -By the end of this guide, you’ll have successfully upgraded your React project to use `@clerk/clerk-react` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. - -## Preparing to upgrade - -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. - -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. - -Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. - -**Updating Node.js** - -You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). - -**Updating React** - -All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. - - - ```bash filename="terminal" - npm install react@latest react-dom@latest - ``` - - ```bash filename="terminal" - yarn add react@latest react-dom@latest - ``` - - ```bash filename="terminal" - pnpm add react@latest react-dom@latest - ``` - - - -If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. - -## Updating to v5 - -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: - - - ```bash filename="terminal" - npm install @clerk/clerk-react@beta - ``` - - ```bash filename="terminal" - yarn add @clerk/clerk-react@beta - ``` - - ```bash filename="terminal" - pnpm add @clerk/clerk-react@beta - ``` - - - -## CLI Upgrade Helper - -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. - -To run the CLI tool, navigate to your project and run it in the terminal: - - - ```bash filename="terminal" - npx @clerk/upgrade - ``` - -```bash filename="terminal" -yarn dlx @clerk/upgrade -``` - -```bash filename="terminal" -pnpm dlx @clerk/upgrade -``` - - - -If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. - -## Breaking Changes - -### Component design adjustments - -The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. - -[More detail on these changes »](/components-redesigned) - -## After sign up/in/out URL handling - -Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. - -As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. - -```diff -- -+ -``` - -### `navigate` prop to `ClerkProvider` replaced by `routerPush` and `routerReplace` - -The `navigate` prop on ClerkProvider allowed developers to override the default navigation behavior with a custom function. However, navigate was only able to push, not replace routes. We have now added the capability for the router to push or replace, and as such, upgraded the provider prop so that it can handle either depending on the circumstance. - -Two new props have been added to `ClerkProvider` that replace the single `navigate` prop, and can be used to override the default navigation behavior for either a push or replace navigation. For more information on what push and replace mean in relation to the browser history api, [check out these wonderful MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/History_API/Working_with_the_History_API). - -If you’d like to keep the same behavior as you had with the single `navigate` prop, pass the exact same function to both `routerPush` and `routerReplace` and the behavior will be identical. For example: - -```diff -- x } /> -+ x } routerReplace={ x => x } /> -``` - -However, you now have the option to differentiate behavior based on whether the navigation will be a push or replace. - -### Removed: `orgs` claim on JWT - -In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. - -The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. - - - - ```typescript filename="Next.js" - import { getAuth } from "@clerk/nextjs/server" - const claims: JwtPayload = getAuth(request).sessionClaims - - import { getAuth } from "@clerk/ssr.server" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - - ```typescript filename="Fastify" - import { getAuth } from "@clerk/fastify" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - ```typescript filename="@clerk/backend" - import { createClerkClient } from "@clerk/backend" - - const clerkClient = createClerkClient({ secretKey: "" }) - const requestState = await clerkClient.authenticateRequest( - request, - { publishableKey: "" } - ) - const claims: JwtPayload = requestState.toAuth().sessionClaims - ``` - - - - ```typescript filename="@clerk/clerk-sdk-node" - import { clerkClient } from "@clerk/clerk-sdk-node" - - router.use((...args) => clerkClient.expressRequireAuth()(...args)) - router.get("/me", async (req, reply: Response) => { - return reply.json({ auth: req.auth }) - }) - ``` - - - - -If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. - -### Path routing is now the default - -On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. - -In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: - -- `` -- `` -- `` -- `` -- `` - -Here's how you'd use the components going forward: - -```jsx - - - - - -``` - -If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. - -```jsx - - -``` - -However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. - - -```env filename=".env.local" -NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in -NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up -``` - -```env filename=".env" -CLERK_SIGN_IN_URL=/sign-in -CLERK_SIGN_UP_URL=/sign-up -``` - - - -**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. - -```jsx -// Only works for Next.js / Remix when environment variables are set - - -``` - -### Image URL Name Consolidation - -There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: - -Organization.logoUrl -> Organization.imageUrl', - 'User.profileImageUrl -> .imageUrl', - 'ExternalAccount.avatarUrl -> .imageUrl', - 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', - ]} -> - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. - - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - - The `avatarUrl` property of any [`ExternalAcccount` - object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - - - The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - - - -## Deprecation removals & housekeeping - -As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. - - - For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of - changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for - manually. - - -### Deprecation removals - -frontendApi -> publishableKey as prop to ClerkProvider", "afterSwitchOrganizationUrl -> afterSelectOrganizationUrl in OrganizationSwitcher", "ClerkProviderOptionsWrapper type removed"]}> - - The `frontendApi` prop passed to `` was renamed to `publishableKey`. **Note:** The values are different, so this is not just a key replacement. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). [More information](/docs/deployments/overview#api-keys-and-environment-variables). - - - The `afterSwitchOrganizationUrl` prop on the `` component has been renamed to `afterSelectOrganizationUrl`. This is a quick and simple rename. - - ```diff - - - + - ``` - - - This type was extending `ClerkProviderProps` with but was not necessary. This type is typically used internally and is not required to be imported and used directly. If needed, import and use `ClerkProviderProps` instead. - - - -### Other Breaking Changes - -MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "isMagicLinkError -> isEmailLinkError", "MagicLinkError -> EmailLinkError", "handleMagicLinkVerification -> handleEmailLinkVerification", "setSession -> setActive", "invitationList -> invitations as param to useOrganizations", "membershipList -> members as param to useOrganization", "useOrganizations -> useOrganizationList", "userProfile -> userProfileProps for UserButton", "MultisessionAppSupport import moved to /internal", "Replace signOutCallback prop on SignOutButton with redirectUrl"]}> - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. - - - `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: - - ```diff - - await setSession('sessionID', () => void) - + await setActive({ session: 'sessionID', beforeEmit: () => void }) - - - await setSession(sessionObj) - + await setActive({ session: sessionObj }) - - - await setSession(sessionObj, () => void) - + await setActive({ session: sessionObj, beforeEmit: () => void }) - ``` - - `setActive` also supports setting an active organization: - - ```js - await setActive({ - session: 'sessionID', - organization: 'orgID', - beforeEmit: () => void - }) - - await setActive({ - session: sessionObj, - organization: orgObj, - beforeEmit: () => void - }) - ``` - - - The `invitationList` param to the `useOrganizations` hook has been replaced by `invitations`. This param also has a slightly different way of working, examples included below. Note also that `useOrganizations` is deprecated and should be updated to `useOrganization` instead. - - ```js - // before - const { invitationList } = useOrganization({ - invitationList: { limit: 10, offset: 1 }, - }); - - // after - const { invitations } = useOrganization({ - invitations: { - initialPage: 1, - pageSize: 10, - }, - }); - - // you can also simply return all invitations - const { invitations } = useOrganization({ invitations: true }); - ``` - - - The `membershipList` param from the `useOrganization` hook has been removed. Instead, [use the `memberships` param](https://clerk.com/docs/references/react/use-organization#parameters). Examples of each can be seen here: - - ```js - // before - const { membershipList } = useOrganization({ - membershipList: { limit: 10, offset: 1 }, - }); - - // after - const { memberships } = useOrganization({ - memberships: { - initialPage: 1, - pageSize: 10, - }, - }); - - // you can also simply return all memberships - const { memberships } = useOrganization({ memberships: true }); - ``` - - - Any place where `useOrganizations` is used should be switched to [`useOrganizationList`](https://clerk.com/docs/references/react/use-organization-list) or [`useOrganization`](https://clerk.com/docs/references/react/use-organization) instead. The return signature has also changed, so take note of this when making the upgrade. - - ```js - // before: useOrganizations return values - { - isLoaded: boolean, - createOrganization: clerk.createOrganization, - getOrganizationMemberships: clerk.getOrganizationMemberships, - getOrganization: clerk.getOrganization, - } - - // after: useOrganizationList return values - { - isLoaded: boolean, - createOrganization: clerk.createOrganization, - userMemberships: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, - userInvitations: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, - userSuggestions: PaginatedResourcesWithDefault<...> | PaginatedResources<...>, - setActive: clerk.setActive, - } - ``` - - - The `userProfile` prop on [the `UserButton` component](https://clerk.com/docs/references/javascript/clerk/user-button#user-button-component) has been changed to `userProfileProps`. This is purely a name change, none of the values need to be updated. - - ```diff - - - + - ``` - - - `MultiSessionAppSupport` is a component that handles the intermediate “undefined” state for multisession apps by unmounting and remounting the components during the session switch (` setActive`` call) in order to solve theoretical edge-cases that can arise while switching sessions. It is undocumented and intended only for internal use, so it has been moved to an `/internal` import path. Please note that internal imports are not intended for public use, and are outside the scope of semver. - - ```diff - - import { MultiSessionAppSupport } from '@clerk/clerk-react' - + import { MultiSessionAppSupport } from '@clerk/clerk-react/internal' - ``` - - - The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: - - ```diff - import { SignOutButton } from "@clerk/clerk-react"; - - export const Signout = () => { - return ( - { window.location.href = "/your-path" }} - + redirectUrl="/your-path" - > - - - ) - } - ``` - - diff --git a/packages/upgrade/source/guide-generators/v5/react/index.js b/packages/upgrade/source/guide-generators/v5/react/index.js index 18ec5c74b2c..4f1574b757e 100644 --- a/packages/upgrade/source/guide-generators/v5/react/index.js +++ b/packages/upgrade/source/guide-generators/v5/react/index.js @@ -21,25 +21,25 @@ async function generate() { return assembleContent({ data, cwd }, [ frontmatter({ - title: `Upgrading ${properName} from v4 to v5`, - description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + title: `Upgrading ${properName} to Core 2`, + description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`, }), - `# Upgrading \`${packageName}\` from v4 to v5`, + `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdown('prepare'), + markdownTemplate('prepare', { packageName, version }), markdown('node-version'), markdown('react-version'), - markdownTemplate('update-v5', { packageName }), + markdownTemplate('update-version', { packageName }), markdown('cli'), '## Breaking Changes', markdown('redesign-preview'), markdown('after-sign-x-handling'), singleItem('navigate-to-routerpush-routerreplace'), markdown('orgs-claim'), - markdown('path-routing'), + markdownTemplate('path-routing', { packageName }), markdown('image-url'), accordionForCategory('image-url'), - deprecationRemovalsAndHousekeeping(), + deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']), ]); } diff --git a/packages/upgrade/source/guide-generators/v5/react/intro.mdx b/packages/upgrade/source/guide-generators/v5/react/intro.mdx index 618e7277420..58fd9c33c05 100644 --- a/packages/upgrade/source/guide-generators/v5/react/intro.mdx +++ b/packages/upgrade/source/guide-generators/v5/react/intro.mdx @@ -1,3 +1,3 @@ -Version 5 of the React SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Clerk's Core 2 release includes a new major version of the React SDK, v5. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your React project to use `@clerk/clerk-react` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/remix/__output.mdx b/packages/upgrade/source/guide-generators/v5/remix/__output.mdx deleted file mode 100644 index e6e7f4e0da5..00000000000 --- a/packages/upgrade/source/guide-generators/v5/remix/__output.mdx +++ /dev/null @@ -1,390 +0,0 @@ ---- -title: 'Upgrading Remix from v4 to v5' -description: 'Learn how to upgrade from version 4 to version 5 of the Clerk Remix SDK.' ---- - -# Upgrading `@clerk/remix` from v4 to v5 - -Version 5 of the Remix SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, no more need to add a custom error boundary, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. - -By the end of this guide, you’ll have successfully upgraded your Next.js project to use `@clerk/remix` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. - -## Preparing to upgrade - -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. - -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. - -Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. - -**Updating Node.js** - -You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). - -**Updating React** - -All react-dependent Clerk SDKs now require you to use React 18 or higher. You can update your project by installing the latest version of `react` and `react-dom`. - - - ```bash filename="terminal" - npm install react@latest react-dom@latest - ``` - - ```bash filename="terminal" - yarn add react@latest react-dom@latest - ``` - - ```bash filename="terminal" - pnpm add react@latest react-dom@latest - ``` - - - -If you are upgrading from React 17 or lower, make sure to [learn about how to upgrade your React version to 18](https://react.dev/blog/2022/03/08/react-18-upgrade-guide) as well. - -## Updating to v5 - -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: - - - ```bash filename="terminal" - npm install @clerk/remix@beta - ``` - - ```bash filename="terminal" - yarn add @clerk/remix@beta - ``` - - ```bash filename="terminal" - pnpm add @clerk/remix@beta - ``` - - - -## CLI Upgrade Helper - -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. - -To run the CLI tool, navigate to your project and run it in the terminal: - - - ```bash filename="terminal" - npx @clerk/upgrade - ``` - -```bash filename="terminal" -yarn dlx @clerk/upgrade -``` - -```bash filename="terminal" -pnpm dlx @clerk/upgrade -``` - - - -If you are having trouble with `npx`, it's also possible to install directly with `npm i @clerk/upgrade -g`, and can then be run with the `clerk-upgrade` command. - -## Breaking Changes - -### `ClerkErrorBoundary` removed - -`ClerkErrorBoundary` is no longer needed for correct error handling in remix, so we have removed this function from the remix SDK, and it can be removed from your code as well. Example below: - -```diff - import { rootAuthLoader } from '@clerk/remix/ssr.server'; - import { - ClerkApp, -- ClerkErrorBoundary - } from '@clerk/remix'; - - export const loader = (args: DataFunctionArgs) => { - return rootAuthLoader(args); - }; - - export default ClerkApp(App); - -- export const ErrorBoundary = ClerkErrorBoundary(); -``` - -### Component design adjustments - -The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. - -[More detail on these changes »](/components-redesigned) - -## After sign up/in/out URL handling - -Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. - -As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. - -```diff -- -+ -``` - -### Removed: `orgs` claim on JWT - -In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. - -The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. - - - - ```typescript filename="Next.js" - import { getAuth } from "@clerk/nextjs/server" - const claims: JwtPayload = getAuth(request).sessionClaims - - import { getAuth } from "@clerk/ssr.server" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - - ```typescript filename="Fastify" - import { getAuth } from "@clerk/fastify" - const claims: JwtPayload = (await getAuth(request)).sessionClaims - ``` - - - ```typescript filename="@clerk/backend" - import { createClerkClient } from "@clerk/backend" - - const clerkClient = createClerkClient({ secretKey: "" }) - const requestState = await clerkClient.authenticateRequest( - request, - { publishableKey: "" } - ) - const claims: JwtPayload = requestState.toAuth().sessionClaims - ``` - - - - ```typescript filename="@clerk/clerk-sdk-node" - import { clerkClient } from "@clerk/clerk-sdk-node" - - router.use((...args) => clerkClient.expressRequireAuth()(...args)) - router.get("/me", async (req, reply: Response) => { - return reply.json({ auth: req.auth }) - }) - ``` - - - - -If you would like to have your JWT return all of the user's organizations, you can create a [custom JWT template](/docs/backend-requests/making/jwt-templates) in your dashboard. Add `{ "orgs": "user.organizations" }` to it. - -### Path routing is now the default - -On components like [``](/docs/components/authentication/sign-in) you can define the props `routing` and `path`. `routing` can be set to `'hash' | 'path' | 'virtual'` and describes the routing strategy that should be used. `path` defines where the component is mounted when `routing="path"` is used. - -In the latest version, the **default** `routing` strategy has become `'path'`. Unless you change the `routing` prop, you'll need to define the `path` prop. The affected components are: - -- `` -- `` -- `` -- `` -- `` - -Here's how you'd use the components going forward: - -```jsx - - - - - -``` - -If you don't define the `path` prop an error will be thrown. Of course, you can still use `routing="hash"` or `routing="virtual"`. - -```jsx - - -``` - -However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. - - -```env filename=".env.local" -NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in -NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up -``` - -```env filename=".env" -CLERK_SIGN_IN_URL=/sign-in -CLERK_SIGN_UP_URL=/sign-up -``` - - - -**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. - -```jsx -// Only works for Next.js / Remix when environment variables are set - - -``` - -### Image URL Name Consolidation - -There are a number of Clerk primitives that contain images, and previously they each had different property names, like `avatarUrl`, `logoUrl`, `profileImageUrl`, etc. In order to promote consistency and make it simpler for developers to know where to find associated images, all image properties are now named `imageUrl`. See the list below for all affected classes: - -Organization.logoUrl -> Organization.imageUrl', - 'User.profileImageUrl -> .imageUrl', - 'ExternalAccount.avatarUrl -> .imageUrl', - 'OrganizationMembershipPublicUserData.profileImageUrl -> .imageUrl', - ]} -> - - The `logoUrl` property of any [`Organization` - object](https://clerk.com/docs/references/javascript/organization/organization#organization) has been changed to - `imageUrl`. - - The `profileImageUrl` property of any `User` object has been changed to `imageUrl`. - - The `avatarUrl` property of any [`ExternalAcccount` - object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. - - - The `profileImageUrl` property of any `OrganizationMembershipPublicUserData` object has been changed to `imageUrl`. - - - -## Deprecation removals & housekeeping - -As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. - - - For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). There are a lot of - changes, each of which are very unlikely to appear in your codebase, that would take a very long time to look for - manually. - - -### Deprecation removals - -apiKey -> secretKey as argument to createClerkClient", "apiKey -> secretKey as argument to rootAuthLoader", "apiKey -> secretKey as argument to getAuth", "frontendApi -> publishableKey as prop to ClerkProvider", "frontendApi -> publishableKey as argument to rootAuthLoader", "CLERK_FRONTEND_API replaced by CLERK_PUBLISHABLE_KEY", "CLERK_API_KEY replaced by CLERK_SECRET_KEY", "Clerk -> { createClerkClient }"]}> - - The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`. - - ```diff - import { createClerkClient } from '@clerk/remix/api.server'; - - - createClerkClient({ apiKey: '...' }); - + createClerkClient({ secretKey: '...' }); - ``` - - - The `apiKey` argument passed to `rootAuthLoader` must be changed to `secretKey`. - - ```diff - import { rootAuthLoader } from '@clerk/remix/ssr.server'; - - - export const loader = args => rootAuthLoader(args, { apiKey: '...' }); - + export const loader = args => rootAuthLoader(args, { secretKey: '...' }); - ``` - - - The `apiKey` argument passed to `getAuth` must be changed to `secretKey`. - - ```diff - import { getAuth } from '@clerk/remix/ssr.server'; - - export const loader: LoaderFunction = async args => { - - return getAuth(args, { apiKey: '...' }); - + return getAuth(args, { secretKey: '...' }); - }; - ``` - - - The `frontendApi` prop passed to `` was renamed to `publishableKey`. **Note:** The values are different, so this is not just a key replacement. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). [More information](/docs/deployments/overview#api-keys-and-environment-variables). - - - The `frontendApi` argument passed to `rootAuthLoader` must be changed to `publishableKey`. - - ```diff - import { rootAuthLoader } from '@clerk/remix/ssr.server'; - - - export const loader = args => rootAuthLoader(args, { frontendApi: '...' }); - + export const loader = args => rootAuthLoader(args, { publishableKey: '...' }); - ``` - - - The `CLERK_FRONTEND_API` environment variable was renamed to `CLERK_PUBLISHABLE_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). **Note:** The values are different, so this is not just a key replacement. [More information](/docs/deployments/overview#api-keys-and-environment-variables). - - - The `CLERK_API_KEY` environment variable was renamed to `CLERK_SECRET_KEY`. You can visit your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) to copy/paste the new keys after choosing your framework. Make sure to update this in all environments (e.g. dev, staging, production). - - - The `Clerk` default import has changed to `createClerkClient` and been moved to a named import rather than default. You must update your import path in order for it to work correctly. Example below of the fix that needs to be made: - - ```diff - - import Clerk from "@clerk/remix" - + import { createClerkClient } from "@clerk/remix" - ``` - - - -### Other Breaking Changes - -isMagicLinkError -> isEmailLinkError", "MagicLinkErrorCode -> EmailLinkErrorCode", "useMagicLink -> useEmailLink", "setSession -> setActive", "Replace signOutCallback prop on SignOutButton with redirectUrl"]}> - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality. - - - Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects functionality. - - - `setSession` should be replaced with `setActive`. The format of the parameters has changed slightly - `setActive` takes an object where `setSession` took params directly. The `setActive` function also can accept an `organization` param that is used to set the currently active organization. The return signature did not change. Read the [API documentation](/docs/references/javascript/clerk/session-methods#set-active) for more detail. This function should be expected to be returned from one of the following Clerk hooks: `useSessionList`, `useSignUp`, or `useSignIn`. Some migration examples: - - ```diff - - await setSession('sessionID', () => void) - + await setActive({ session: 'sessionID', beforeEmit: () => void }) - - - await setSession(sessionObj) - + await setActive({ session: sessionObj }) - - - await setSession(sessionObj, () => void) - + await setActive({ session: sessionObj, beforeEmit: () => void }) - ``` - - `setActive` also supports setting an active organization: - - ```js - await setActive({ - session: 'sessionID', - organization: 'orgID', - beforeEmit: () => void - }) - - await setActive({ - session: sessionObj, - organization: orgObj, - beforeEmit: () => void - }) - ``` - - - The `signOutCallback` prop on the [`` component](https://clerk.com/docs/components/unstyled/sign-out-button) has been removed. Instead, you can use the `redirectUrl` prop. Example below: - - ```diff - import { SignOutButton } from "@clerk/clerk-react"; - - export const Signout = () => { - return ( - { window.location.href = "/your-path" }} - + redirectUrl="/your-path" - > - - - ) - } - ``` - - diff --git a/packages/upgrade/source/guide-generators/v5/remix/index.js b/packages/upgrade/source/guide-generators/v5/remix/index.js index 570d861056e..3d36373b1a1 100644 --- a/packages/upgrade/source/guide-generators/v5/remix/index.js +++ b/packages/upgrade/source/guide-generators/v5/remix/index.js @@ -21,22 +21,22 @@ async function generate() { return assembleContent({ data: data, cwd }, [ frontmatter({ - title: `Upgrading ${properName} from v4 to v5`, - description: `Learn how to upgrade from version 4 to version 5 of the Clerk ${properName} SDK.`, + title: `Upgrading ${properName} to Core 2`, + description: `Learn how to upgrade from the Clerk ${properName} SDK to the latest version.`, }), - `# Upgrading \`${packageName}\` from v4 to v5`, + `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdown('prepare'), + markdownTemplate('prepare', { version: 'v4', packageName }), markdown('node-version'), markdown('react-version'), - markdownTemplate('update-v5', { packageName }), + markdownTemplate('update-version', { packageName }), markdown('cli'), '## Breaking Changes', singleItem('clerkerrorboundary-removed'), markdown('redesign-preview'), markdown('after-sign-x-handling'), markdown('orgs-claim'), - markdown('path-routing'), + markdownTemplate('path-routing', { packageName }), markdown('image-url'), accordionForCategory('image-url'), deprecationRemovalsAndHousekeeping(), diff --git a/packages/upgrade/source/guide-generators/v5/remix/intro.mdx b/packages/upgrade/source/guide-generators/v5/remix/intro.mdx index 348599a4d35..e41e8d071c8 100644 --- a/packages/upgrade/source/guide-generators/v5/remix/intro.mdx +++ b/packages/upgrade/source/guide-generators/v5/remix/intro.mdx @@ -1,3 +1,3 @@ -Version 5 of the Remix SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, no more need to add a custom error boundary, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Clerk's Core 2 release includes a new major version of the Remix SDK, v4. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, no more need to add a custom error boundary, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. -By the end of this guide, you’ll have successfully upgraded your Next.js project to use `@clerk/remix` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. +By the end of this guide, you’ll have successfully upgraded your Remix project to use `@clerk/remix` v4. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/retheme/__output.mdx b/packages/upgrade/source/guide-generators/v5/retheme/__output.mdx deleted file mode 100644 index 4816ece6ed0..00000000000 --- a/packages/upgrade/source/guide-generators/v5/retheme/__output.mdx +++ /dev/null @@ -1,436 +0,0 @@ ---- -title: 'Redesigned Components in v5' -description: 'Learn how to handle changes as a result of redesigned components in Clerk version 5' ---- - -# Redesigned Components in v5 - -The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. - - - If you are not customizing the appearance of your components, or using `localization`, you can skip this section. If - you are, we recommend using our CLI (`npx @clerk/upgrade`) to scan for changes required as part of the component - redesign more quickly. - - -The sections below contain more info on each change made to the customization ids and localization keys for reference. Regardless of how thoroughly you have reviewed the following information, we still recommend that you ensure that you have taken some time to manually look through each of your views to ensure that everything looks good still. - -## Appearance Changes - -Settings -> General tab in OrganizationProfile", "Within <UserProfile />, Account and Security Pages Separated", "Within <UserProfile />, Multi-Factor Auth is Added via Dropdown", "Within <UserProfile />, Connected Accounts Added via Dropdown", "userButtonPopoverActionButtonText customization id removed", "userButtonBox is now a child of userButtonTrigger", "organizationSwitcherPopoverActionButtonText customization id removed", "Changes to the card customization id", "Back button customization ids change on alternative 2fa methods page", "button -> organizationListCreateOrganizationActionButton customization id", "socialButtonsBlockButtonArrow customization id removed", "Identity preview avatar customization ids removed", "Changes to default variables"]}> - - The "Settings" tab within the `` component has been renamed to "General". If you are linking directly to `/organization-settings` from anywhere, the link will need to be updated to `/organization-general`. - - If you are [customizing the component](https://clerk.com/docs/components/customization/organization-profile) by re-ordering the pages, the label used to target this page must be changed from `settings` to `general` as well. - - If you are using the [appearance prop](https://clerk.com/docs/components/customization/overview) to customize the appearance of the `` component, please note that the `cl-profilePage__organizationSettings` key has also been changed to `cl-profilePage__organizationGeneral` to be consistent with the naming change. - - - Within the `` component (which is also rendered by ``), the "Account" and "Security" pages now live within their own tabs. Previously, "Security" was a section within the "Account" tab. The "Security" page can now be directly linked to under the `/security` path if desired. - - - Within the `` component (which is also rendered by ``), adding a multi-factor auth (MFA) method is now rendered as a dropdown instead of a modal. If you were relying on the modal for any sort of customizations, these customizations will need to be adjusted to the new form factor. - - Two new appearance prop keys were added to aid with this process: `cl-menuList__mfa` for styling the list of MFA factors, and `cl-menuItem__mfa` for styling individual items. - - - Within the `` component (which is also rendered by ``), adding a connected account is now rendered as a dropdown instead of a modal. If you were relying on the modal for any sort of customizations, these customizations will need to be adjusted to the new form factor. - - New appearance prop keys were added to aid with customization, if desired: - - - `cl-menuList__connectedAccounts` for styling the list of connected account addition options - - `cl-menuItem__connectedAccounts` for styling individual items in the connected account options list - - `cl-menuList__web3Wallets` for styling the list of web3 wallet addition options - - `cl-menuItem__web3Wallets` for styling individual items in the web3 wallets options list - - - The `userButtonPopoverActionButtonText` customization id has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. The nested ids `userButtonPopoverActionButtonText__signOut` and `userButtonPopoverActionButtonText__manageAccount` have also been removed. Any styling that needs to apply to the text can be applied to its direct parent `cl-userButtonPopoverActionButton`. - - - The parent-child relationship of the two elements `userButtonTrigger` and `userButtonBox` has been swapped. Previously, `userButtonTrigger` was nested inside of `userButtonBox`, and now `userButtonBox` is nested inside of `userButtonTrigger`. This change resolves [some usability issues](https://github.com/clerk/javascript/issues/1625) in ``. If you are applying style customization to either of these elements, your customizations may need to be adjusted. - - - The `organizationSwitcherPopoverActionButtonText` customization id has been removed, as the text for this button is now directly rendered inside the button rather than an extra wrapping element. The nested ids `organizationSwitcherPopoverActionButtonText__manageOrganization` and `organizationSwitcherPopoverActionButtonText__createOrganization` have also been removed. Any styling that needs to apply to the text can be applied to its direct parent `cl-organizationSwitcherPopoverActionButton`. - - - The `card` customization id in the previous major version was the main and only container element for components. Outside the `card` element, a new `cardBox` id was introduced that allows more fine-grained style customization. - - As a note, if you are changing the background color of `card`, you will also need to also apply the same color on the `footer` id as well. The `footer` now gray by default, and it’s located outside `card`, but inside `cardBox`. - - A `footerItem` id was also added for more targeted styling of items inside the `footer`. - - - The "back" button on the panel within `` that lists out alternative two factor auth methods has changed location, and there have been some changes to the ids as a result of this: - - - `headerBackIcon` has been removed, as there is no longer an associated icon - - `headerBackRow` has been renamed to `backRow` as it's no longer in the header - - `headerBackLink` has been renamed to `backLink` as it's no longer in the header - - - The `button` customization id was used only in one place, for a button to create a new organization in the `` component. This id has been removed and replaced by the more appropriately named `organizationListCreateOrganizationActionButton` customization id instead. - - - Social sign-in buttons in the new component designs no longer include arrows, so the `socialButtonsBlockButtonArrow` customization id has been removed. You can use the `socialButtonsIconButton` to apply custom styling to the social buttons if desired. - - - When signing in with Clerk's `` component, after entering a username or email the user is brought to a second pane where they can enter a second factor such as a password. On this pane, there is an area called "identity preview" that shows the username/email that they are entering a password/etc for. Previously, this area included the user's avatar, but this is no longer the case in updated designs. As such, the customization ids related to the user's avatar have been removed. - - - The default values of some [appearance variables](/docs/components/customization/variables) have changed which may impact your UI (if you are not already overriding them). - - - The default `colorPrimary` value changed from `#103FEF` to `#2F3037`. As the new color is a dark grey, the `colorPrimary` of the dark theme was changed to `#FFFFFF`. - - The default `fontSize` value changed from `1rem` to `0.8125rem` - - The default `fontWeight` values changed from `{ normal: 400, medium: 500, bold: 600 }` to `{ normal: 400, medium: 500, bold: 700 }` - - Previously, the default value for `fontSmoothing` was `auto`. This value is now unset. If you want to pass a custom value to it, you can still do so. - - - -## Localization Changes - - - - As part of the redesign of Clerk's components, a number of new localization keys have been added and can be seen along with their default english values in the code block below. If you do not supply translated values for these keys in your custom localization, they will fall back to the default english values specified below. - - ```js - const newValues = { - formFieldLabel__organizationName: 'Name', - formFieldLabel__organizationSlug: 'Slug', - formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', - formFieldInputPlaceholder__organizationSlug: 'my-org', - signUp: { - start: { - subtitle: 'Welcome! Please fill in the details to get started.', - actionText: 'Already have an account?', - }, - emailCode: { - subtitle: 'Enter the verification code sent to your email', - }, - phoneCode: { - subtitle: 'Enter the verification code sent to your phone', - }, - continue: { - subtitle: 'Please fill in the remaining details to continue.', - actionText: 'Already have an account?', - }, - }, - signIn: { - start: { - title: 'Sign in to {{applicationName}}', - subtitle: 'Welcome back! Please sign in to continue', - actionText: 'Don’t have an account?', - }, - password: { - subtitle: 'Enter the password associated with your account', - }, - forgotPasswordAlternativeMethods: { - label__alternativeMethods: 'Or, sign in with another method', - }, - resetPassword: { - title: 'Set new password', - }, - phoneCodeMfa: { - subtitle: 'To continue, please enter the verification code sent to your phone', - }, - totpMfa: { - subtitle: 'To continue, please enter the verification code generated by your authenticator app', - }, - backupCodeMfa: { - subtitle: 'Your backup code is the one you got when setting up two-step authentication.', - }, - }, - userProfile: { - formButtonPrimary__continue: 'Save', - start: { - headerTitle__account: 'Profile details', - profileSection: { - primaryButton: 'Edit profile', - }, - emailAddressesSection: { - detailsAction__unverified: 'Verify', - destructiveAction: 'Remove email', - }, - mfaSection: { - phoneCode: { - destructiveActionLabel: 'Remove', - }, - backupCodes: { - actionLabel__regenerate: 'Regenerate', - }, - }, - dangerSection: { - title: 'Account termination', - deleteAccountButton: 'Delete account', - }, - }, - profilePage: { - imageFormSubtitle: 'Upload', - imageFormDestructiveActionSubtitle: 'Remove', - }, - phoneNumberPage: { - title: 'Add a phone number', - infoText: - 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', - }, - connectedAccountPage: { - socialButtonsBlockButton: '{{provider|titleize}}', - }, - mfaPhoneCodePage: { - subtitle__availablePhoneNumbers: - 'Select an existing phone number to register for SMS code two-step verification or add a new one.', - subtitle__unavailablePhoneNumbers: - 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', - }, - deletePage: { - actionDescription: 'Type "Delete account" below to continue.', - }, - }, - organizationSwitcher: { - action__createOrganization: 'Create organization', - action__manageOrganization: 'Manage', - }, - organizationProfile: { - profilePage: { - title: 'Update Profile', - dangerSection: { - title: 'Danger', - leaveOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', - }, - deleteOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', - }, - }, - }, - invitePage: { - title: 'Invite new members', - subtitle: 'Enter or paste one or more email addresses, separated by spaces or commas.', - }, - }, - createOrganization: { - title: 'Create organization', - }, - organizationList: { - title: 'Choose an account', - titleWithoutPersonal: 'Choose an organization', - }, - }; - ``` - - - As part of the redesign of Clerk's components, a number of localization keys have been removed as they were no longer present in the new designs. You should remove any of these keys that are present in your localization object as they are no longer needed. - - ```js - const deletedKeys = [ - 'signIn.forgotPassword.title_email', - 'signIn.forgotPassword.title_phone', - 'signIn.forgotPassword.formSubtitle_email', - 'signIn.forgotPassword.formSubtitle_phone', - 'signIn.emailCode.formSubtitle', - 'signIn.phoneCode.formSubtitle', - 'signIn.phoneCodeMfa.formSubtitle', - 'signIn.totpMfa.formSubtitle', - 'signIn.backupCodeMfa.formTitle', - 'signIn.backupCodeMfa.formSubtitle', - 'userProfile.start.emailAddressesSection.detailsTitle__primary', - 'userProfile.start.emailAddressesSection.detailsSubtitle__primary', - 'userProfile.start.emailAddressesSection.detailsTitle__nonPrimary', - 'userProfile.start.emailAddressesSection.detailsSubtitle__nonPrimary', - 'userProfile.start.emailAddressesSection.detailsTitle__unverified', - 'userProfile.start.emailAddressesSection.detailsSubtitle__unverified', - 'userProfile.start.emailAddressesSection.destructiveActionTitle', - 'userProfile.start.emailAddressesSection.destructiveActionSubtitle', - 'userProfile.start.phoneNumbersSection.detailsTitle__primary', - 'userProfile.start.phoneNumbersSection.detailsSubtitle__primary', - 'userProfile.start.phoneNumbersSection.detailsTitle__nonPrimary', - 'userProfile.start.phoneNumbersSection.detailsSubtitle__nonPrimary', - 'userProfile.start.phoneNumbersSection.detailsTitle__unverified', - 'userProfile.start.phoneNumbersSection.detailsSubtitle__unverified', - 'userProfile.start.phoneNumbersSection.destructiveActionTitle', - 'userProfile.start.phoneNumbersSection.destructiveActionSubtitle', - 'userProfile.start.connectedAccountsSection.title__conectionFailed', - 'userProfile.start.connectedAccountsSection.title__connectionFailed', - 'userProfile.start.connectedAccountsSection.title__reauthorize', - 'userProfile.start.connectedAccountsSection.subtitle__reauthorize', - 'userProfile.start.connectedAccountsSection.actionLabel__conectionFailed', - 'userProfile.start.connectedAccountsSection.destructiveActionSubtitle', - 'userProfile.start.connectedAccountsSection.destructiveActionAccordionSubtitle', - 'userProfile.start.mfaSection.phoneCode.destructiveActionTitle', - 'userProfile.start.mfaSection.phoneCode.destructiveActionSubtitle', - 'userProfile.start.mfaSection.phoneCode.title__default', - 'userProfile.start.mfaSection.phoneCode.title__setDefault', - 'userProfile.start.mfaSection.phoneCode.subtitle__default', - 'userProfile.start.mfaSection.phoneCode.subtitle__setDefault', - 'userProfile.start.mfaSection.totp.title', - 'userProfile.start.mfaSection.totp.subtitle', - 'userProfile.start.mfaSection.totp.destructiveActionSubtitle', - 'userProfile.start.mfaSection.totp.destructiveActionLabel', - 'userProfile.start.activeDevicesSection.primaryButton', - 'userProfile.start.activeDevicesSection.detailsTitle', - 'userProfile.start.activeDevicesSection.detailsSubtitle', - 'userProfile.start.activeDevicesSection.destructiveActionTitle', - 'userProfile.start.activeDevicesSection.destructiveActionSubtitle', - 'userProfile.start.web3WalletsSection.destructiveActionTitle', - 'userProfile.start.web3WalletsSection.destructiveActionSubtitle', - 'userProfile.start.dangerSection.deleteAccountTitle', - 'userProfile.start.dangerSection.deleteAccountDescription', - 'userProfile.start.headerSubtitle__account', - 'userProfile.start.headerSubtitle__security', - 'organizationProfile.start.headerTitle__settings', - 'organizationProfile.start.headerSubtitle__members', - 'organizationProfile.start.headerSubtitle__settings', - 'organizationProfile.profilePage.domainSection.unverifiedDomain_menuAction__verify', - 'organizationProfile.profilePage.domainSection.unverifiedDomain_menuAction__remove', - 'organizationProfile.profilePage.subtitle', - 'organizationProfile.membersPage.start.headerTitle__active', - 'organizationProfile.membersPage.start.headerTitle__invited', - 'createOrganization.subtitle', - 'formFieldLabel__emailAddress_phoneNumber', - 'formFieldLabel__phoneNumber_username', - 'formFieldLabel__emailAddress_phoneNumber_username', - 'formFieldInputPlaceholder__emailAddress_phoneNumber', - 'formFieldInputPlaceholder__phoneNumber_username', - 'formFieldInputPlaceholder__emailAddress_phoneNumber_username', - 'userProfile.phoneNumberPage.infoText__secondary', - 'userProfile.mfaPhoneCodePage.successMessage', - 'userProfile.profilePage.fileDropAreaTitle', - 'userProfile.profilePage.fileDropAreaAction', - ]; - ``` - - If you'd like to automate this, you can use the [lodash omit function](https://lodash.com/docs/#omit) as such: - - ```js - import { omit } from 'lodash-es'; - - const localization = omit(yourOldOject, deletedKeys); - ``` - - - The values of some keys have been changed on the default [en-US localization object](https://github.com/clerk/javascript/blob/main/packages/localizations/src/en-US.ts). The list below shows you the new defaults (as of writing this guide) which you can either use or overwrite. If you have overridden these values, make sure to double check so you can be sure that your modifications are appropriate. - - ```js - const changedValues = { - formFieldLabel__organizationName: 'Name', - formFieldLabel__organizationSlug: 'Slug', - formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', - formFieldInputPlaceholder__organizationSlug: 'my-org', - signUp: { - start: { - subtitle: 'Welcome! Please fill in the details to get started.', - actionText: 'Already have an account?', - }, - emailCode: { - subtitle: 'Enter the verification code sent to your email', - }, - phoneCode: { - subtitle: 'Enter the verification code sent to your phone', - }, - continue: { - subtitle: 'Please fill in the remaining details to continue.', - actionText: 'Already have an account?', - }, - }, - signIn: { - start: { - title: 'Sign in to {{applicationName}}', - subtitle: 'Welcome back! Please sign in to continue', - actionText: 'Don’t have an account?', - }, - password: { - subtitle: 'Enter the password associated with your account', - }, - forgotPasswordAlternativeMethods: { - label__alternativeMethods: 'Or, sign in with another method', - }, - resetPassword: { - title: 'Set new password', - }, - phoneCodeMfa: { - subtitle: 'To continue, please enter the verification code sent to your phone', - }, - totpMfa: { - subtitle: 'To continue, please enter the verification code generated by your authenticator app', - }, - backupCodeMfa: { - subtitle: 'Your backup code is the one you got when setting up two-step authentication.', - }, - }, - userProfile: { - formButtonPrimary__continue: 'Save', - start: { - headerTitle__account: 'Profile details', - profileSection: { - primaryButton: 'Edit profile', - }, - emailAddressesSection: { - detailsAction__unverified: 'Verify', - destructiveAction: 'Remove email', - }, - mfaSection: { - phoneCode: { - destructiveActionLabel: 'Remove', - }, - backupCodes: { - actionLabel__regenerate: 'Regenerate', - }, - }, - dangerSection: { - title: 'Account termination', - deleteAccountButton: 'Delete account', - }, - }, - profilePage: { - imageFormSubtitle: 'Upload', - imageFormDestructiveActionSubtitle: 'Remove', - }, - phoneNumberPage: { - title: 'Add a phone number', - infoText: - 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', - }, - connectedAccountPage: { - socialButtonsBlockButton: '{{provider|titleize}}', - }, - mfaPhoneCodePage: { - subtitle__availablePhoneNumbers: - 'Select an existing phone number to register for SMS code two-step verification or add a new one.', - subtitle__unavailablePhoneNumbers: - 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', - }, - deletePage: { - actionDescription: 'Type "Delete account" below to continue.', - }, - }, - organizationSwitcher: { - action__createOrganization: 'Create organization', - action__manageOrganization: 'Manage', - }, - organizationProfile: { - profilePage: { - title: 'Update Profile', - dangerSection: { - title: 'Danger', - leaveOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', - }, - deleteOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', - }, - }, - }, - invitePage: { - title: 'Invite new members', - subtitle: 'Enter or paste one or more email addresses, separated by spaces or commas.', - }, - }, - createOrganization: { - title: 'Create organization', - }, - organizationList: { - title: 'Choose an account', - titleWithoutPersonal: 'Choose an organization', - }, - }; - ``` - - diff --git a/packages/upgrade/source/guide-generators/v5/shared/after-sign-x-handling.mdx b/packages/upgrade/source/guide-generators/v5/shared/after-sign-x-handling.mdx index 4fbbbad8548..fe4b81cd2f0 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/after-sign-x-handling.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/after-sign-x-handling.mdx @@ -1,6 +1,6 @@ -## After sign up/in/out URL handling +### After sign up/in/out URL handling -Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in v5. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In v5, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. +Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in Core 2. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In Core 2, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. As part of this change, the default URL for each of these props has been set to `/`, so if you are passing `/` explicitly to any one of the above props, that line is no longer necessary and can be removed. diff --git a/packages/upgrade/source/guide-generators/v5/shared/cli.mdx b/packages/upgrade/source/guide-generators/v5/shared/cli.mdx index adf22bcad4c..28ee6cf1599 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/cli.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/cli.mdx @@ -1,6 +1,6 @@ ## CLI Upgrade Helper -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade to v5, and can save a lot of time reading through changes to things that aren't actually in your project. +As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade, and can save a lot of time reading through changes to things that aren't actually in your project. To run the CLI tool, navigate to your project and run it in the terminal: diff --git a/packages/upgrade/source/guide-generators/v5/shared/node-version.mdx b/packages/upgrade/source/guide-generators/v5/shared/node-version.mdx index e06214b0329..54815ce7100 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/node-version.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/node-version.mdx @@ -1,3 +1,3 @@ **Updating Node.js** -You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status so it's time to bump the required version for `@clerk/nextjs`, too. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). +You need to have Node.js `18.17.0` or later installed. Last year, Node.js 16 entered EOL (End of life) status, so support for this version has been removed across Clerk SDKs. You can check your Node.js version by running `node -v` in your terminal. Learn more about how to [update and install Node.js](https://nodejs.org/en/learn/getting-started/how-to-install-nodejs). diff --git a/packages/upgrade/source/guide-generators/v5/shared/orgs-claim.mdx b/packages/upgrade/source/guide-generators/v5/shared/orgs-claim.mdx index f1c6011cd5d..a2bfc9590dc 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/orgs-claim.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/orgs-claim.mdx @@ -1,6 +1,6 @@ ### Removed: `orgs` claim on JWT -In v4 of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. In v5 Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. +In the previous version of Clerk's SDKs, if you decode the session token that Clerk returns from the server, you'll currently find an `orgs` claim on it. It lists all the orgs associated with the given user. Now, Clerk returns the `org_id`, `org_slug`, and `org_role` of the **active** organization. The `orgs` claim was part of the `JwtPayload`. Here are a few examples of where the `JwtPayload` could be found. diff --git a/packages/upgrade/source/guide-generators/v5/shared/path-routing.mdx b/packages/upgrade/source/guide-generators/v5/shared/path-routing.mdx index 45d6b6754cb..e36dee9c0b3 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/path-routing.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/path-routing.mdx @@ -27,25 +27,31 @@ If you don't define the `path` prop an error will be thrown. Of course, you can ``` -However, there are two exceptions to this behavior. If you're using `@clerk/nextjs` or `@clerk/remix`, you can set environment variables for `` and ``. +<% if (['@clerk/nextjs', '@clerk/remix'].includes(packageName)) { %> +For the <%= packageName %> SDK, you can set environment variables for the sign up/in URLs and avoid needing to explicitly pass the path to the `` and `` components. + +<% if (packageName === '@clerk/nextjs') { %> - ```env filename=".env.local" NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up ``` +<% } %> +<% if (packageName === '@clerk/remix') { %> + ```env filename=".env" CLERK_SIGN_IN_URL=/sign-in CLERK_SIGN_UP_URL=/sign-up ``` - +<% } %> -**Only** if you're using one of these two frameworks and defined both environment variables, you're able to use the `` and `` components without any props. +If you have defined both environment variables, you're able to use the `` and `` components without any props, as such: ```jsx -// Only works for Next.js / Remix when environment variables are set ``` + +<% } %> diff --git a/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx b/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx index b1a7f251ae0..23740ad4ecd 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx @@ -1,7 +1,12 @@ ## Preparing to upgrade -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest v4 version. Some changes required for v5 can be applied incrementally to the latest v4, which should contribute to a smoother upgrading experience. +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest Core 1 version (`npm i <%= packageName %>@core-1`). Some changes required for Core 2 can be applied incrementally to the latest <%= version %> release, which should contribute to a smoother upgrading experience. -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes for v5. +After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes from Core 2. + + + Note that Core 2 is currently in beta, while we field feedback and ensure stability. Deploying beta versions to + production is not recommended and should be done at your own risk. + Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. diff --git a/packages/upgrade/source/guide-generators/v5/shared/update-v5.mdx b/packages/upgrade/source/guide-generators/v5/shared/update-version.mdx similarity index 82% rename from packages/upgrade/source/guide-generators/v5/shared/update-v5.mdx rename to packages/upgrade/source/guide-generators/v5/shared/update-version.mdx index 127f3464f14..38597779ec5 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/update-v5.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/update-version.mdx @@ -1,6 +1,6 @@ -## Updating to v5 +## Updating to Core 2 Beta -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. Some examples for how to unstall commonly used SDKs are below: +Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. The commands below demonstrate how to install the latest beta. ```bash filename="terminal" diff --git a/packages/upgrade/source/versions/v5/backend/authenticaterequest-params-change.md b/packages/upgrade/source/versions/v5/backend/authenticaterequest-params-change.md index 94b5d53edd0..dcd97698a4b 100644 --- a/packages/upgrade/source/versions/v5/backend/authenticaterequest-params-change.md +++ b/packages/upgrade/source/versions/v5/backend/authenticaterequest-params-change.md @@ -1,6 +1,7 @@ --- title: '`request` separated from `options` as params to `authenticateRequest`' warning: true +category: 'skip' matcher: "authenticateRequest\\(" --- diff --git a/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md b/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md index c4de869a87e..92343ef2330 100644 --- a/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md +++ b/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md @@ -5,6 +5,7 @@ matcher: - "verifyToken\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?\\)" - "authenticateRequest\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?\\)" matcherFlags: 'm' +category: 'skip' replaceWithString: 'clockSkewInMs' --- diff --git a/packages/upgrade/source/versions/v5/backend/httpoptions-removed.md b/packages/upgrade/source/versions/v5/backend/httpoptions-removed.md index d2713546a03..933f048e861 100644 --- a/packages/upgrade/source/versions/v5/backend/httpoptions-removed.md +++ b/packages/upgrade/source/versions/v5/backend/httpoptions-removed.md @@ -2,6 +2,7 @@ title: '`httpOptions` parameter removed' matcher: "\\([\\s\\S]*?httpOptions:\\s\\S]*?\\)" matcherFlags: 'm' +category: 'skip' --- The `httpOptions` parameter was removed from the internal `buildRequest` function but it is used by most public facing APIs. Hence you were able to pass `httpOptions` to some functions which is not possible anymore. If you're currently relying on this functionality and wish to update, please reach out to Clerk's support. @@ -9,7 +10,7 @@ The `httpOptions` parameter was removed from the internal `buildRequest` functio The internal change looks like this: ```diff -- const r = buildRequest({ httpsOptions: { headers: {} }}) +- const r = buildRequest({ httpOptions: { headers: {} }}) + const request = buildRequest() + request({ headerParams: {} }) ``` diff --git a/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md b/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md index fd8d0984a91..035f2e10fa0 100644 --- a/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md +++ b/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md @@ -2,6 +2,7 @@ title: '`tokenCache` -> `storageCache` as `` props' matcher: "" matcherFlags: 'm' +category: 'skip' --- The `tokenCache` prop has been renamed to `storageCache` in order to accomodate the new [WebSSO feature](https://github.com/clerk/javascript/pull/2277). With the prop change from `tokenCache` to `storageCache`, the interface has been expanded to allow for more flexibility. The new interface is as follows: diff --git a/packages/upgrade/source/versions/v5/backend/externalaccount-picture.md b/packages/upgrade/source/versions/v5/common/externalaccount-picture.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/externalaccount-picture.md rename to packages/upgrade/source/versions/v5/common/externalaccount-picture.md diff --git a/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md b/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md index 36446095c65..ba83a4c30d5 100644 --- a/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md +++ b/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md @@ -1,5 +1,5 @@ --- -title: '`Organization.getOrganizationList()` return type changed' +title: '`Organization.getOrganizationList` return type changed' matcher: "\\.getOrganizationList\\(" category: 'pagination-return' --- diff --git a/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md b/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md index fc1a458037a..8682037cbf7 100644 --- a/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md +++ b/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md @@ -1,5 +1,5 @@ --- -title: '`User.getOrganizationMembershipList()` return type changed' +title: '`User.getOrganizationMembershipList` return type changed' matcher: "\\.getOrganizationMembershipList\\(" category: 'pagination-return' --- diff --git a/packages/upgrade/source/versions/v5/common/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/v5/common/multisessionappsupport-import-change.md index 59283667962..eb730fc50da 100644 --- a/packages/upgrade/source/versions/v5/common/multisessionappsupport-import-change.md +++ b/packages/upgrade/source/versions/v5/common/multisessionappsupport-import-change.md @@ -4,7 +4,7 @@ matcher: "import\\s+{[\\s\\S]*?MutliSessionAppSupport[\\s\\S]*?from\\s+['\"]@cle matcherFlags: 'm' --- -`MultiSessionAppSupport` is a component that handles the intermediate “undefined” state for multisession apps by unmounting and remounting the components during the session switch (` setActive`` call) in order to solve theoretical edge-cases that can arise while switching sessions. It is undocumented and intended only for internal use, so it has been moved to an `/internal` import path. Please note that internal imports are not intended for public use, and are outside the scope of semver. +`MultiSessionAppSupport` is a component that handles the intermediate “undefined” state for multisession apps by unmounting and remounting the components during the session switch (`setActive` call) in order to solve theoretical edge-cases that can arise while switching sessions. It is undocumented and intended only for internal use, so it has been moved to an `/internal` import path. Please note that internal imports are not intended for public use, and are outside the scope of semver. ```diff - import { MultiSessionAppSupport } from '@clerk/clerk-react' diff --git a/packages/upgrade/source/versions/v5/js/user-update-password.md b/packages/upgrade/source/versions/v5/common/user-update-password.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/user-update-password.md rename to packages/upgrade/source/versions/v5/common/user-update-password.md diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index b6c1807cdd1..579fdd54375 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -21,6 +21,7 @@ const changesAffectingAll = [ 'getorganizationlist-return-type-change', 'organization-logourl', 'user-profileimageurl', + 'user-update-password', ]; const reactChangesList = [ @@ -258,6 +259,7 @@ export default { 'legacyauthobject-removed', 'clerk-import-change', 'organizationmembershippublicuserdata-profileimageurl', + 'externalaccount-picture', ]), ), react: load('react', dedupeMerge(changesAffectingAll, reactChangesList)), @@ -272,7 +274,6 @@ export default { 'external-account-avatarurl', 'user-orgpublicdata-profileimageurl', 'setsession', // shared with all? - 'user-update-password', // shared w/ all 'experimental-canusecaptcha', 'experimental-captchaurl', 'experimental-captchasitekey', diff --git a/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md b/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md index 7c3415b9c95..51cde252f38 100644 --- a/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md +++ b/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md @@ -1,5 +1,5 @@ --- -title: '`generatedSignature` -> `signature` as param of Signup.attemptWeb3WalletVerification()' +title: '`generatedSignature` -> `signature` as param of `Signup.attemptWeb3WalletVerification`' matcher: "attemptWeb3WalletVerification\\([\\s\\S]*?generatedSignature:[\\s\\S]*?\\)" category: 'deprecation-removal' matcherFlags: 'm' diff --git a/packages/upgrade/source/versions/v5/nextjs/with-clerk-middleware-removed.md b/packages/upgrade/source/versions/v5/nextjs/with-clerk-middleware-removed.md index e83b8e2e52f..eef3727f0e0 100644 --- a/packages/upgrade/source/versions/v5/nextjs/with-clerk-middleware-removed.md +++ b/packages/upgrade/source/versions/v5/nextjs/with-clerk-middleware-removed.md @@ -4,8 +4,53 @@ category: 'middleware' matcher: "withClerkMiddleware\\(" --- -`withClerkMiddleware` has been deprecated and is now removed in v5. We recommend moving to `clerkMiddleware` instead. Here’s an example of how the code would look before and after: +`withClerkMiddleware` has been deprecated and is now removed in v5. We recommend moving to `clerkMiddleware` instead. Please read the [clerkMiddleware guide](https://clerk.com/docs/references/nextjs/clerk-middleware) for more details. Here’s an example of how a simple middleware setup might look before and after. ```js -// TODO +// Before: using withClerkMiddleware +import { withClerkMiddleware } from '@clerk/nextjs/server'; +import { NextResponse } from 'next/server'; +import type { NextRequest } from 'next/server'; + +const publicPaths = ['/', '/sign-in', '/sign-up']; + +const isPublic = (path: string) => { + return publicPaths.find(x => path.match(new RegExp(`^${x}$`.replace('*$', '($|/)')))); + + if (isPublic(request.nextUrl.pathname)) { + return NextResponse.next(); + } + const { userId } = getAuth(request); + + if (!userId) { + const signInUrl = new URL('/sign-in', request.url); + signInUrl.searchParams.set('redirect_url', request.url); + return NextResponse.redirect(signInUrl); + } +}; + +export default withClerkMiddleware((req: NextRequest) => { + return NextResponse.next(); +}); + +export const config = { + matcher: ['/((?!static|.*\\..*|_next|favicon.ico).*)', '/'], +}; +``` + +```js +// After: using clerkMiddleware +import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs'; + +const isPublicRoute = createRouteMatcher(['/', '/sign-in', '/sign-up']); + +export default clerkMiddleware((auth, req) => { + if (isPublicRoute(req)) return; + + auth().protect(); +}); + +export const config = { + matcher: ['/((?!.+\\.[\\w]+$|_next).*)', '/', '/(api|trpc)(.*)'], +}; ``` diff --git a/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md b/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md index 0d6056c7e7c..e391c17a82e 100644 --- a/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md +++ b/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md @@ -3,7 +3,7 @@ title: '`LegacyAuthObject` type -> `AuthObject`' matcher: '(?:LegacyAuthObject|LooseAuthProp|StrictAuthProp)' --- -We changed the values that our middleware adds to the `request` object after running. Previously it returned a `LegacyAuthObject` type, and now it returns an `AuthObject` type, the difference between the two types is as such: +We changed the values that our middleware adds to the `request` object after running. Previously it returned a `LegacyAuthObject` type, and now it returns an `AuthObject` type, the difference between the two types is as such: ```diff - type LegacyAuthObject = { @@ -23,4 +23,4 @@ We changed the values that our middleware adds to the `request` object after r } ``` -If you were using the `claims` key on the request after running middleware, you will need to instead use `sessionClaims`. Additionally, if you were using the `LooseAuthProp` or `StrictAuthProp` exported types anywhere, note that these have been adjusted to fit the shape of the new middleware response typing. +If you were using the `claims` key on the request after running middleware, you will need to instead use `sessionClaims`. Additionally, if you were using the `LooseAuthProp` or `StrictAuthProp` exported types anywhere, note that these have been adjusted to fit the shape of the new middleware response typing. From 71cd6c38fcb1e8ecfb5a14de572ec1ab185aea3e Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 16 Feb 2024 17:44:34 -0500 Subject: [PATCH 101/159] chore(upgrade): Apply feedback from Lennart, thank you --- .../source/guide-generators/text-generation.js | 2 +- .../upgrade/source/guide-generators/v5/expo/index.js | 2 +- .../source/guide-generators/v5/gatsby/index.js | 7 ++++--- .../guide-generators/v5/nextjs/import-changes.mdx | 2 +- .../guide-generators/v5/nextjs/middleware-changes.mdx | 2 +- .../source/guide-generators/v5/overview/intro.mdx | 2 +- .../source/guide-generators/v5/retheme/index.js | 11 +++++++++-- .../upgrade/source/guide-generators/v5/shared/cli.mdx | 4 ++-- .../v5/shared/deprecation-removals.mdx | 2 +- .../source/guide-generators/v5/shared/prepare.mdx | 4 +--- 10 files changed, 22 insertions(+), 16 deletions(-) diff --git a/packages/upgrade/source/guide-generators/text-generation.js b/packages/upgrade/source/guide-generators/text-generation.js index 93397fe0211..09a116b6549 100644 --- a/packages/upgrade/source/guide-generators/text-generation.js +++ b/packages/upgrade/source/guide-generators/text-generation.js @@ -87,7 +87,7 @@ export const deprecationRemovalsAndHousekeeping = partial((includeCategories, op } if (hasOtherChanges) { - content.push('#### Other Breaking Changes'); + content.push('#### Other Breaking changes'); content.push(accordionForCategory([undefined, ...includeCategories])); } diff --git a/packages/upgrade/source/guide-generators/v5/expo/index.js b/packages/upgrade/source/guide-generators/v5/expo/index.js index ba5fe19ba79..56dc48ea22e 100644 --- a/packages/upgrade/source/guide-generators/v5/expo/index.js +++ b/packages/upgrade/source/guide-generators/v5/expo/index.js @@ -34,7 +34,7 @@ async function generate() { markdown('redesign-preview'), markdown('after-sign-x-handling'), markdown('orgs-claim'), - markdown('path-routing', { packageName }), + markdownTemplate('path-routing', { packageName }), markdown('image-url'), accordionForCategory('image-url'), deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']), diff --git a/packages/upgrade/source/guide-generators/v5/gatsby/index.js b/packages/upgrade/source/guide-generators/v5/gatsby/index.js index 76971d0bc9a..c9f02cbf93c 100644 --- a/packages/upgrade/source/guide-generators/v5/gatsby/index.js +++ b/packages/upgrade/source/guide-generators/v5/gatsby/index.js @@ -12,6 +12,7 @@ import { const version = 'v5'; const name = 'gatsby'; const properName = 'Gatsby'; +const packageName = 'gatsby-plugin-clerk'; const cwd = `${version}/${name}`; async function generate() { @@ -22,9 +23,9 @@ async function generate() { title: `Upgrading ${properName} from v4 to v5`, description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, }), - '# Upgrading `gatsby-plugin-clerk` from v4 to v5', + `# Upgrading \`${packageName}\` from v4 to v5`, markdown('intro'), - markdown('prepare'), + markdownTemplate('prepare', { version, packageName }), markdown('node-version'), markdown('react-version'), markdownTemplate('update-version', { packageName: 'gatsby-plugin-clerk' }), @@ -33,7 +34,7 @@ async function generate() { markdown('redesign-preview'), markdown('after-sign-x-handling'), markdown('orgs-claim'), - markdown('path-routing'), + markdownTemplate('path-routing', { packageName }), markdown('image-url'), accordionForCategory('image-url'), deprecationRemovalsAndHousekeeping(), diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx b/packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx index b3688e80e70..665ac825307 100644 --- a/packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx +++ b/packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx @@ -6,7 +6,7 @@ As part of this release, some of the top-level exports of `@clerk/nextjs` have b Use [the CLI tool](#cli-upgrade-helper) to automatically find occurences of imports that need to be changed. - + Previously these exports have been exported both from `@clerk/nextjs` and `@clerk/nextjs/server`. As of v5 they are only exported from the latter. diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/middleware-changes.mdx b/packages/upgrade/source/guide-generators/v5/nextjs/middleware-changes.mdx index e4457a30a21..efa58d74283 100644 --- a/packages/upgrade/source/guide-generators/v5/nextjs/middleware-changes.mdx +++ b/packages/upgrade/source/guide-generators/v5/nextjs/middleware-changes.mdx @@ -40,7 +40,7 @@ export default async function DashboardPage() { -In this example, we add `auth().protect()` to a layout, and like magic, that layout and all of it's children will be gated by auth. The same logic can be applied for pages. +In this example, you add `auth().protect()` to a layout, and like magic, that layout and all of it's children will be gated by auth. The same logic can be applied for pages. Want to get more specific with permission gating? Add the role you are gating as a param: diff --git a/packages/upgrade/source/guide-generators/v5/overview/intro.mdx b/packages/upgrade/source/guide-generators/v5/overview/intro.mdx index 506e0f691b0..c038d479174 100644 --- a/packages/upgrade/source/guide-generators/v5/overview/intro.mdx +++ b/packages/upgrade/source/guide-generators/v5/overview/intro.mdx @@ -1,4 +1,4 @@ -# Upgrading from v4 to v5 core +# Upgrading to Clerk Core 2 On TODO:DATE, Core 2 for all Clerk SDKs [was released](https://clerk.com/changelog/2024-01-16), broadly featuring the following upgrades: diff --git a/packages/upgrade/source/guide-generators/v5/retheme/index.js b/packages/upgrade/source/guide-generators/v5/retheme/index.js index b91e5caff11..fa357e1a023 100644 --- a/packages/upgrade/source/guide-generators/v5/retheme/index.js +++ b/packages/upgrade/source/guide-generators/v5/retheme/index.js @@ -1,9 +1,16 @@ -import { accordionForCategory, assembleContent, frontmatter, markdown, writeToFile } from '../../text-generation.js'; +import { + accordionForCategory, + assembleContent, + frontmatter, + loadVersionChangeData, + markdown, + writeToFile, +} from '../../text-generation.js'; const cwd = 'v5/retheme'; async function generate() { - const data = (await import(`../../../versions/v5/index.js`)).default.nextjs; + const data = await loadVersionChangeData('v5', 'nextjs'); const defaultsChangeItem = { title: 'Changes to default variables', diff --git a/packages/upgrade/source/guide-generators/v5/shared/cli.mdx b/packages/upgrade/source/guide-generators/v5/shared/cli.mdx index 28ee6cf1599..de3ba43683f 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/cli.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/cli.mdx @@ -1,6 +1,6 @@ -## CLI Upgrade Helper +## CLI upgrade helper -As of this major version Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. A CLI prompt will ask you a couple of questions, it will scan your codebase, and afterwards you'll get a list of changes you'll need to apply to your project, as well as the locations where they need to be applied. This should catch the vast majority of the changes needed for a successful upgrade, and can save a lot of time reading through changes to things that aren't actually in your project. +As of this release cycle, Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. The tool will scan your codebase and produce a list of changes you'll need to apply to your project. It should catch the vast majority of the changes needed for a successful upgrade to Core 2. This can save you a lot of time reading through changes that don't apply to your project. To run the CLI tool, navigate to your project and run it in the terminal: diff --git a/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx b/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx index cabaf3a0345..c42d92131a9 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx @@ -1,4 +1,4 @@ -As part of this major version, a number of previously deprecated props, arugments, methods, etc have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. +As part of this major version, a number of previously deprecated props, arugments, methods, etc. have been removed. Additionally there have been some changes to things that are only used internally, or only used very rarely. It's highly unlikely that any given app will encounter any of these items, but they are all breaking changes, so they have all been documented below. For this section more than any other one, please use the CLI upgrade tool (`npx @clerk/upgrade`). Changes in this diff --git a/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx b/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx index 23740ad4ecd..ff46d47be9d 100644 --- a/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx +++ b/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx @@ -1,8 +1,6 @@ ## Preparing to upgrade -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest Core 1 version (`npm i <%= packageName %>@core-1`). Some changes required for Core 2 can be applied incrementally to the latest <%= version %> release, which should contribute to a smoother upgrading experience. - -After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes from Core 2. +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest Core 1 version (`npm i <%= packageName %>@core-1`). Some changes required for Core 2 can be applied incrementally to the latest <%= version %> release, which should contribute to a smoother upgrading experience. After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes from Core 2. Note that Core 2 is currently in beta, while we field feedback and ensure stability. Deploying beta versions to From d469ca640ac48ffd3fdebb978ed7bbfb8a9fa1b7 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Sun, 18 Feb 2024 11:34:02 -0500 Subject: [PATCH 102/159] chore(upgrade): Adjust inheitance for some changes --- .../organization-create-string.md | 0 .../organization-getpendinginvitations.md | 0 packages/upgrade/source/versions/v5/index.js | 30 +++++++------------ .../v5/js/external-account-avatarurl.md | 7 ----- .../source/versions/v5/js/redirecttohome.md | 8 ++--- .../v5/js/router-navigate-push-replace.md | 18 ----------- 6 files changed, 14 insertions(+), 49 deletions(-) rename packages/upgrade/source/versions/v5/{js => common}/organization-create-string.md (100%) rename packages/upgrade/source/versions/v5/{js => common}/organization-getpendinginvitations.md (100%) delete mode 100644 packages/upgrade/source/versions/v5/js/external-account-avatarurl.md delete mode 100644 packages/upgrade/source/versions/v5/js/router-navigate-push-replace.md diff --git a/packages/upgrade/source/versions/v5/js/organization-create-string.md b/packages/upgrade/source/versions/v5/common/organization-create-string.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/organization-create-string.md rename to packages/upgrade/source/versions/v5/common/organization-create-string.md diff --git a/packages/upgrade/source/versions/v5/js/organization-getpendinginvitations.md b/packages/upgrade/source/versions/v5/common/organization-getpendinginvitations.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/organization-getpendinginvitations.md rename to packages/upgrade/source/versions/v5/common/organization-getpendinginvitations.md diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/v5/index.js index 579fdd54375..0302665521a 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/v5/index.js @@ -24,14 +24,15 @@ const changesAffectingAll = [ 'user-update-password', ]; -const reactChangesList = [ +const jsChanges = ['setsession', 'organization-create-string', 'organization-getpendinginvitations', 'mfa-dropdown']; + +const reactChanges = [ 'magiclinkerrorcode', 'usemagiclink', 'ismagiclinkerror', 'magiclinkerror', 'handlemagiclinkverification', 'clerkprovider-frontendapi-2', - 'setsession', 'navigate-to-routerpush-routerreplace', 'afterswitchorganizationurl', 'appearance-organizationpreview-organizationswitcher', @@ -41,7 +42,6 @@ const reactChangesList = [ 'userprofile-prop', 'organizationprofile-settings', 'userprofile-security', - 'mfa-dropdown', 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', @@ -71,7 +71,7 @@ const reactChangesList = [ export default { nextjs: load( 'nextjs', - dedupeMerge(changesAffectingAll, [ + dedupeMerge(changesAffectingAll, jsChanges, [ 'api-key-to-secret-key', 'frontend-api-to-publishable-key', 'with-clerk-middleware-removed', @@ -103,10 +103,8 @@ export default { 'ismagiclinkerror', 'usemagiclink', 'magiclinkerrorcode', - 'setsession', 'organizationprofile-settings', 'userprofile-security', - 'mfa-dropdown', 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', @@ -155,7 +153,7 @@ export default { // if you're using gatsby, we also need to scan for the react changes gatsby: load( 'gatsby', - dedupeMerge(changesAffectingAll, reactChangesList, [ + dedupeMerge(changesAffectingAll, reactChanges, jsChanges, [ 'api-key-to-secret-key', 'createclerkclient-apikey', 'apikey-to-publishable-key', @@ -163,7 +161,6 @@ export default { 'ismagiclinkerror', 'usemagiclink', 'magiclinkerrorcode', - 'setsession', 'api-url-value-change', 'withserverauth-return-type', 'clerk-import-change', @@ -171,7 +168,7 @@ export default { ), remix: load( 'remix', - dedupeMerge(changesAffectingAll, [ + dedupeMerge(changesAffectingAll, jsChanges, [ 'clerkerrorboundary-removed', 'createclerkclient-apikey', 'rootauthloader-apikey', @@ -183,7 +180,6 @@ export default { 'ismagiclinkerror', 'magiclinkerrorcode', 'usemagiclink', - 'setsession', 'new-localization-keys', 'removed-localization-keys', 'changed-localization-keys', @@ -195,15 +191,13 @@ export default { ), expo: load( 'expo', - dedupeMerge(changesAffectingAll, [ + dedupeMerge(changesAffectingAll, jsChanges, [ 'apikey-to-publishable-key', 'ismagiclinkerror', 'usemagiclink', 'magiclinkerrorcode', - 'setsession', 'organizationprofile-settings', 'userprofile-security', - 'mfa-dropdown', 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', @@ -262,10 +256,10 @@ export default { 'externalaccount-picture', ]), ), - react: load('react', dedupeMerge(changesAffectingAll, reactChangesList)), + react: load('react', dedupeMerge(changesAffectingAll, reactChanges, jsChanges)), js: load( 'js', - dedupeMerge(changesAffectingAll, [ + dedupeMerge(changesAffectingAll, jsChanges, [ 'magiclinkerror', 'ismagiclinkerror', 'magiclinkerrorcode', @@ -273,7 +267,6 @@ export default { 'handlemagiclinkverification', 'external-account-avatarurl', 'user-orgpublicdata-profileimageurl', - 'setsession', // shared with all? 'experimental-canusecaptcha', 'experimental-captchaurl', 'experimental-captchasitekey', @@ -281,14 +274,11 @@ export default { 'lastorganizationinvitation-member', 'unstable-invitationupdate', 'unstable-membershipupdate', - 'organization-create-string', // maybe shared with all? - 'organization-getpendinginvitations', // maybe shared with all? 'user-createexternalaccount-redirecturl', // maybe shared with all? 'signup-attemptweb3walletverification-generatedsignature', 'redirecttohome', 'organizationprofile-settings', 'userprofile-security', - 'mfa-dropdown', 'connected-accounts-dropdown', 'userbuttonpopoveractionbuttontext-removed', 'userbuttontrigger-userbuttonbox-invert', @@ -316,7 +306,7 @@ export default { 'organizationcontext', 'useorganizationlist-organizationlist', // shared outside this pkg? ]), - chromeExtension: load('chromeExtension', dedupeMerge(changesAffectingAll, ['clerkprovider-tokencache'])), + chromeExtension: load('chromeExtension', dedupeMerge(changesAffectingAll, jsChanges, ['clerkprovider-tokencache'])), localizations: load('localization', [ 'new-localization-keys', 'removed-localization-keys', diff --git a/packages/upgrade/source/versions/v5/js/external-account-avatarurl.md b/packages/upgrade/source/versions/v5/js/external-account-avatarurl.md deleted file mode 100644 index b2030debccf..00000000000 --- a/packages/upgrade/source/versions/v5/js/external-account-avatarurl.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: '`ExternalAccount.avatarUrl` -> `ExternalAccount.imageUrl`' -matcher: "\\.avatarUrl" -replaceWithString: '.imageUrl' ---- - -The `avatarUrl` property of any [`ExternalAcccount` object](https://clerk.com/docs/references/javascript/external-account) has been changed to `imageUrl`. diff --git a/packages/upgrade/source/versions/v5/js/redirecttohome.md b/packages/upgrade/source/versions/v5/js/redirecttohome.md index f853cd3f2d2..1f6f04ce283 100644 --- a/packages/upgrade/source/versions/v5/js/redirecttohome.md +++ b/packages/upgrade/source/versions/v5/js/redirecttohome.md @@ -7,7 +7,7 @@ The `Clerk.redirectToHome` method has been removed. If you are looking for a gen To set the `afterSignUpUrl` or `afterSignInUrl`, you can: - - [pass the desired values into ClerkProvider](https://clerk.com/docs/components/clerk-provider#properties) - - if using nextjs SDK, set with `NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL` or `NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL` - - if using remix SDK, set with `CLERK_AFTER_SIGN_IN_URL` or `CLERK_AFTER_SIGN_UP_URL` - - If not using a react-based SDK, they can be passed into `Clerk.load` as such: `Clerk.load({ afterSignUpUrl: 'x', afterSignInUrl: 'y' })` +- If not using a react-based SDK, pass the values into `Clerk.load` as such: `Clerk.load({ afterSignUpUrl: 'x', afterSignInUrl: 'y' })` +- If using a react-based SDK, [pass the desired values into ClerkProvider](https://clerk.com/docs/components/clerk-provider#properties) +- If using the Next.js SDK, set with `NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL` or `NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL` +- If using remix SDK, set with `CLERK_AFTER_SIGN_IN_URL` or `CLERK_AFTER_SIGN_UP_URL` diff --git a/packages/upgrade/source/versions/v5/js/router-navigate-push-replace.md b/packages/upgrade/source/versions/v5/js/router-navigate-push-replace.md deleted file mode 100644 index aa6a6c44c6d..00000000000 --- a/packages/upgrade/source/versions/v5/js/router-navigate-push-replace.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: '`navigate` argument to `Clerk.load` replaced by `routerPush` and `routerReplace`' -matcher: "Clerk\\.load\\([\\s\\S]*?navigate:[\\s\\S]*?\\)" -matcherFlags: 'm' ---- - -The `navigate` option allowed developers to override the default navigation behavior with a custom function. However, navigate was only able to push, not replace routes. We have now added the capability for the router to push or replace, and as such, updated `Clerk.load` so that it can handle either depending on the circumstance. - -Two new arguments have been added to options that can be passed to `Clerk.load` that replace the single `navigate` argument, and can be used to override the default navigation behavior for either a push or replace navigation. For more information on what push and replace mean in relation to the browser history api, [check out these wonderful MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/History_API/Working_with_the_History_API). - -If you’d like to keep the same behavior as you had with the single `navigate` argument, pass the exact same function to as both the `routerPush` and `routerReplace` arguments and the behavior will be identical. For example: - -```diff -- Clerk.load({ navigate: x => x }) -+ Clerk.load({ routerPush: x => x, routerReplace: x => x }) -``` - -However, you now have the option to differentiate behavior based on whether the navigation will be a push or replace. From 19d25995edc3ca36c6c6a2d75de317a2e97e28e5 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Sun, 18 Feb 2024 11:43:00 -0500 Subject: [PATCH 103/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 2fae73ca271..5fb1e3fa90a 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.2.1", + "version": "0.3.0", "license": "MIT", "type": "module", "main": "dist/cli.js", From 455e404053d5a4b790acf1119d6634f4d362f543 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Sun, 18 Feb 2024 21:09:24 -0500 Subject: [PATCH 104/159] fix(upgrade): Remove gatsby from CLI options, major not going out yet --- packages/upgrade/source/constants/sdks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/source/constants/sdks.js b/packages/upgrade/source/constants/sdks.js index 3468bb3de9a..8e69f3fb644 100644 --- a/packages/upgrade/source/constants/sdks.js +++ b/packages/upgrade/source/constants/sdks.js @@ -1,7 +1,7 @@ export default [ { label: '@clerk/nextjs', value: 'nextjs' }, { label: '@clerk/remix', value: 'remix' }, - { label: 'gatsby-plugin-clerk', value: 'gatsby' }, + // { label: 'gatsby-plugin-clerk', value: 'gatsby' }, { label: '@clerk/redwood', value: 'redwood' }, { label: '@clerk/react', value: 'react' }, { label: '@clerk/expo', value: 'expo' }, From 6b2e5cebb5ac4d95932af50113a71cd403677a06 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Sun, 18 Feb 2024 21:27:54 -0500 Subject: [PATCH 105/159] chore(upgrade): Release rename directory cleanup --- packages/upgrade/source/constants/sdks.js | 2 +- .../{v5 => core-2}/backend/import-paths.mdx | 0 .../guide-generators/{v5 => core-2}/backend/index.js | 2 +- .../guide-generators/{v5 => core-2}/backend/intro.mdx | 0 .../chrome-extension}/index.js | 6 +++--- .../chrome-extension}/intro.mdx | 0 .../guide-generators/{v5 => core-2}/expo/index.js | 5 +++-- .../guide-generators/{v5 => core-2}/expo/intro.mdx | 0 .../guide-generators/{v5 => core-2}/fastify/index.js | 5 +++-- .../guide-generators/{v5 => core-2}/fastify/intro.mdx | 0 .../guide-generators/{v5 => core-2}/gatsby/index.js | 11 ++++++----- .../source/guide-generators/core-2/gatsby/intro.mdx | 3 +++ .../guide-generators/{v5 => core-2}/generate-all.sh | 2 +- .../guide-generators/{v5 => core-2}/js/index.js | 0 .../guide-generators/{v5 => core-2}/js/intro.mdx | 0 .../{v5 => core-2}/nextjs/import-changes.mdx | 0 .../guide-generators/{v5 => core-2}/nextjs/index.js | 7 ++++--- .../guide-generators/{v5 => core-2}/nextjs/intro.mdx | 0 .../{v5 => core-2}/nextjs/middleware-changes.mdx | 0 .../{v5 => core-2}/nextjs/nextjs-version.mdx | 0 .../guide-generators/{v5 => core-2}/node/index.js | 5 +++-- .../guide-generators/{v5 => core-2}/node/intro.mdx | 0 .../{v5 => core-2}/node/node-setters-removals.mdx | 0 .../guide-generators/{v5 => core-2}/overview/index.js | 6 +++--- .../{v5 => core-2}/overview/intro.mdx | 2 +- .../{v5 => core-2}/react/hof-removals.mdx | 0 .../guide-generators/{v5 => core-2}/react/index.js | 5 +++-- .../guide-generators/{v5 => core-2}/react/intro.mdx | 0 .../guide-generators/{v5 => core-2}/remix/index.js | 5 +++-- .../guide-generators/{v5 => core-2}/remix/intro.mdx | 0 .../guide-generators/{v5 => core-2}/retheme/index.js | 4 ++-- .../guide-generators/{v5 => core-2}/retheme/intro.mdx | 0 .../{v5 => core-2}/shared/after-sign-x-handling.mdx | 0 .../guide-generators/{v5 => core-2}/shared/cli.mdx | 0 .../{v5 => core-2}/shared/deprecation-removals.mdx | 0 .../{v5 => core-2}/shared/image-url.mdx | 0 .../{v5 => core-2}/shared/node-version.mdx | 0 .../{v5 => core-2}/shared/orgs-claim.mdx | 0 .../{v5 => core-2}/shared/pagination-args.mdx | 0 .../{v5 => core-2}/shared/pagination-return.mdx | 0 .../{v5 => core-2}/shared/path-routing.mdx | 0 .../{v5 => core-2}/shared/prepare.mdx | 0 .../{v5 => core-2}/shared/react-version.mdx | 0 .../{v5 => core-2}/shared/redesign-preview.mdx | 0 .../{v5 => core-2}/shared/update-version.mdx | 0 .../source/guide-generators/v5/gatsby/intro.mdx | 3 --- packages/upgrade/source/util/load-change.js | 4 ++-- .../{v5 => core-2}/backend/api-url-value-changed.md | 0 .../backend/authenticaterequest-params-change.md | 0 .../{v5 => core-2}/backend/buildrequesturl-removed.md | 0 .../versions/{v5 => core-2}/backend/clerk-import.md | 0 .../backend/client-unstableoptions-removed.md | 0 .../{v5 => core-2}/backend/clockskewinseconds.md | 0 .../backend/constants-import-path-move.md | 0 .../createauthenticaterequest-import-path-move.md | 0 .../backend/createclerkclient-apikey.md | 0 .../backend/createclerkclient-frontendapi.md | 0 .../{v5 => core-2}/backend/createemail-removed.md | 0 .../createisomorphicrequest-import-path-move.md | 0 .../backend/createisomorphicrequest-removed.md | 0 .../backend/decodejwt-import-path-move.md} | 0 .../getorganizationmembershiplist-return-signature.md | 0 .../backend/getpendingorganizationinvitationlist.md | 0 .../{v5 => core-2}/backend/httpoptions-removed.md | 0 .../versions/{v5 => core-2}/backend/membershiprole.md | 0 .../backend/organizationjson-logourl.md | 0 ...ionmembershippublicuserdatajson-profileimageurl.md | 0 .../versions/{v5 => core-2}/backend/pkgversion.md | 0 .../backend/redirect-import-path-move.md | 0 .../backend/signjwt-import-path-move.md | 0 .../backend/signjwterror-import-move.md | 0 .../backend/tokenverificationerror-import-move.md | 0 .../tokenverificationerroraction-import-move.md | 0 .../backend/tokenverificationerrorcode-import-move.md | 0 .../tokenverificationerrorreason-import-move.md | 0 .../backend/userjson-profileimageurl.md | 0 .../backend/verifyjwt-import-path-move.md | 0 .../chrome-extension}/clerkprovider-tokencache.md | 0 .../common/afterswitchorganizationurl.md | 0 .../common/alternativemethods-backlink.md | 0 .../{v5 => core-2}/common/api-key-to-secret-key.md | 0 ...arance-organizationpreview-organizationswitcher.md | 0 ...-organizationlistcreateorganizationactionbutton.md | 0 .../versions/{v5 => core-2}/common/card-changes.md | 0 .../common/changed-localization-keys.md | 0 .../common/clerkprovider-frontendapi-2.md | 0 .../common/clerkprovideroptionswrapper-dropped.md | 0 .../common/connected-accounts-dropdown.md | 0 .../common/emaillinkerrorcode-import-change.md | 0 .../common/externalaccount-avatarurl.md | 0 .../{v5 => core-2}/common/externalaccount-picture.md | 0 .../common/externalaccountjson-avatarurl.md | 0 .../common/frontend-api-to-publishable-key.md | 0 .../getorganizationinvitationlist-return-signature.md | 0 ...etorganizationinvitationlist-return-type-change.md | 0 .../common/getorganizationlist-return-signature.md | 0 .../common/getorganizationlist-return-type-change.md | 0 ...etorganizationmembershiplist-return-type-change.md | 0 .../common/handlemagiclinkverification.md | 0 .../common/isclerkapiresponserror-import-change.md | 0 .../common/isemaillinkerror-import-change.md | 0 .../common/isknownerror-import-change.md | 0 .../{v5 => core-2}/common/ismagiclinkerror.md | 0 .../common/ismetamaskerror-import-change.md | 0 .../versions/{v5 => core-2}/common/magiclinkerror.md | 0 .../{v5 => core-2}/common/magiclinkerrorcode.md | 0 .../versions/{v5 => core-2}/common/mfa-dropdown.md | 0 .../{v5 => core-2}/common/min-react-version.md | 0 .../common/multisessionappsupport-import-change.md | 0 .../common/navigate-to-routerpush-routerreplace.md | 0 .../{v5 => core-2}/common/new-localization-keys.md | 0 .../common/organization-create-string.md | 0 .../organization-getdomains-arguments-change.md | 0 .../organization-getinvitations-arguments-changed.md | 0 ...ization-getmembershiprequests-arguments-changed.md | 0 .../organization-getmemberships-arguments-changed.md | 0 .../common/organization-getpendinginvitations.md | 0 .../common/organization-getroles-arguments-changed.md | 0 .../{v5 => core-2}/common/organization-logourl.md | 0 ...izationmembershippublicuserdata-profileimageurl.md | 0 .../common/organizationprofile-settings.md | 0 ...nizationswitcherpopoveractionbuttontext-removed.md | 0 .../common/remove-identitypreview-avatar.md | 0 .../common/remove-socialbuttonsblockbuttonarrow.md | 0 .../common/removed-localization-keys.md | 0 .../versions/{v5 => core-2}/common/setsession.md | 0 .../common/signoutcallback-to-redirecturl.md | 0 .../versions/{v5 => core-2}/common/usemagiclink.md | 0 .../common/useorganization-invitationlist.md | 10 +++++----- .../common/useorganization-membershiplist.md | 10 +++++----- .../{v5 => core-2}/common/useorganizations.md | 0 ...er-getorganizationinvitations-arguments-changed.md | 0 ...er-getorganizationmemberships-arguments-changed.md | 0 ...er-getorganizationsuggestions-arguments-changed.md | 0 .../{v5 => core-2}/common/user-profileimageurl.md | 0 .../{v5 => core-2}/common/user-update-password.md | 0 .../userbuttonpopoveractionbuttontext-removed.md | 0 .../common/userbuttontrigger-userbuttonbox-invert.md | 0 .../{v5 => core-2}/common/userprofile-prop.md | 0 .../{v5 => core-2}/common/userprofile-security.md | 0 .../{v5 => core-2}/common/withclerk-hof-removed.md | 0 .../{v5 => core-2}/common/withclerk-removed.md | 0 .../{v5 => core-2}/common/withsession-hof-removed.md | 0 .../{v5 => core-2}/common/withsession-removed.md | 0 .../{v5 => core-2}/common/withuser-hof-removed.md | 0 .../{v5 => core-2}/common/withuser-removed-2.md | 0 .../{v5 => core-2}/expo/apikey-to-publishable-key.md | 0 .../{v5 => core-2}/expo/clerkprovider-frontendapi.md | 0 .../{v5 => core-2}/fastify/api-url-value-change.md | 0 .../{v5 => core-2}/fastify/clerk-import-change.md | 0 .../{v5 => core-2}/fastify/clerkplugin-frontendapi.md | 0 .../fastify/createclerkclient-apikey.md | 0 .../fastify/createclerkclient-frontendapi.md | 0 .../{v5 => core-2}/gatsby/api-url-value-change.md | 0 .../gatsby/apikey-to-publishable-key.md | 0 .../{v5 => core-2}/gatsby/clerk-import-change.md | 0 .../{v5 => core-2}/gatsby/createclerkclient-apikey.md | 0 .../gatsby/createclerkclient-frontendapi.md | 0 .../gatsby/withserverauth-return-type.md | 0 .../upgrade/source/versions/{v5 => core-2}/index.js | 10 ++++++---- .../{v5 => core-2}/js/clerk-isready-removed.md | 0 .../{v5 => core-2}/js/experimental-canusecaptcha.md | 0 .../{v5 => core-2}/js/experimental-captchasitekey.md | 0 .../{v5 => core-2}/js/experimental-captchaurl.md | 0 .../{v5 => core-2}/js/getorganizationmemberships.md | 0 .../js/lastorganizationinvitation-member.md | 0 .../versions/{v5 => core-2}/js/redirecttohome.md | 0 ...ttemptweb3walletverification-generatedsignature.md | 0 .../{v5 => core-2}/js/unstable-invitationupdate.md | 0 .../{v5 => core-2}/js/unstable-membershipupdate.md | 0 .../js/user-createexternalaccount-redirecturl.md | 0 .../js/user-orgpublicdata-profileimageurl.md | 0 .../{v5 => core-2}/nextjs/api-url-value-change.md | 0 .../{v5 => core-2}/nextjs/auth-import-change.md | 0 .../nextjs/auth-middleware-deprecated.md | 0 .../{v5 => core-2}/nextjs/authmiddleware-apikey.md | 0 .../nextjs/authmiddleware-frontendapi.md | 0 .../nextjs/authmiddleware-import-change.md | 0 .../nextjs/buildclerkprops-import-change.md | 0 .../{v5 => core-2}/nextjs/clerk-import-change.md | 0 .../nextjs/clerk-js-version-next-public.md | 0 .../{v5 => core-2}/nextjs/constants-import-change.md | 0 .../nextjs/createauthenticaterequest-import-change.md | 0 .../{v5 => core-2}/nextjs/createclerkclient-apikey.md | 0 .../nextjs/createclerkclient-frontendapi.md | 0 .../nextjs/createisomorphicrequest-import-change.md | 0 .../nextjs/currentuser-import-change.md | 0 .../{v5 => core-2}/nextjs/decodejwt-import-change.md | 0 .../nextjs/emaillinkerrorcode-import-change.md | 0 .../versions/{v5 => core-2}/nextjs/getauth-apikey.md | 0 .../versions/{v5 => core-2}/nextjs/import-api-url.md | 0 .../{v5 => core-2}/nextjs/import-api-version.md | 0 .../{v5 => core-2}/nextjs/import-clerk-js-url.md | 0 .../{v5 => core-2}/nextjs/import-clerk-js-version.md | 0 .../versions/{v5 => core-2}/nextjs/import-domain.md | 0 .../{v5 => core-2}/nextjs/import-is-satellite.md | 0 .../{v5 => core-2}/nextjs/import-nextjs-api.md | 0 .../{v5 => core-2}/nextjs/import-nextjs-app-beta.md | 0 .../nextjs/import-nextjs-edge-middleware.md | 0 .../nextjs/import-nextjs-edge-middlewarefiles.md | 0 .../{v5 => core-2}/nextjs/import-nextjs-ssr.md | 0 .../{v5 => core-2}/nextjs/import-proxy-url.md | 0 .../{v5 => core-2}/nextjs/import-publishable-key.md | 0 .../{v5 => core-2}/nextjs/import-secret-key.md | 0 .../{v5 => core-2}/nextjs/import-sign-in-url.md | 0 .../{v5 => core-2}/nextjs/import-sign-up-url.md | 0 .../nextjs/isclerkapiresponserror-import-change.md | 0 .../nextjs/isemaillinkerror-import-change.md | 0 .../nextjs/isknownerror-import-change.md | 0 .../{v5 => core-2}/nextjs/min-nextjs-version.md | 0 .../nextjs/multisessionappsupport-import-change.md | 0 .../{v5 => core-2}/nextjs/next-public-clerk-js-url.md | 0 .../{v5 => core-2}/nextjs/redirect-import-change.md | 0 .../nextjs/redirecttosignin-import-path.md | 0 .../nextjs/redirecttosignup-import-path.md | 0 .../{v5 => core-2}/nextjs/signjwt-import-change.md | 0 .../{v5 => core-2}/nextjs/verifyjwt-import-change.md | 0 .../nextjs/verifytoken-import-change.md | 0 .../nextjs/with-clerk-middleware-removed.md | 0 .../{v5 => core-2}/node/api-url-value-change.md | 0 .../versions/{v5 => core-2}/node/cjs-esm-instance.md | 0 .../{v5 => core-2}/node/clerk-import-change.md | 0 .../node/clerkexpressrequireauth-apikey.md | 0 .../node/clerkexpressrequireauth-frontendapi.md | 0 .../node/clerkexpresswithauth-apikey.md | 0 .../node/clerkexpresswithauth-frontendapi.md | 0 .../{v5 => core-2}/node/createclerkclient-apikey.md | 0 .../node/createclerkclient-frontendapi.md | 0 .../node/createclerkexpressrequireauth-apikey.md | 0 .../node/createclerkexpressrequireauth-frontendapi.md | 0 .../node/createclerkexpresswithauth-apikey.md | 0 .../node/createclerkexpresswithauth-frontendapi.md | 0 .../{v5 => core-2}/node/legacyauthobject-removed.md | 0 .../versions/{v5 => core-2}/node/setclerkapikey.md | 0 .../{v5 => core-2}/node/setclerkapiversion.md | 0 .../{v5 => core-2}/node/setclerkhttpoptions.md | 0 .../{v5 => core-2}/node/setclerkserverapiurl.md | 0 .../{v5 => core-2}/react/api-url-value-change.md | 0 .../{v5 => core-2}/remix/clerk-import-change.md | 0 .../remix/clerkerrorboundary-removed.md | 0 .../{v5 => core-2}/remix/createclerkclient-apikey.md | 0 .../versions/{v5 => core-2}/remix/getauth-apikey.md | 0 .../{v5 => core-2}/remix/rootauthloader-apikey.md | 0 .../remix/rootauthloader-frontendapi.md | 0 .../versions/{v5 => core-2}/shared/getrequesturl.md | 0 .../{v5 => core-2}/shared/organizationcontext.md | 0 .../shared/useorganizationlist-organizationlist.md | 4 ++-- 247 files changed, 60 insertions(+), 51 deletions(-) rename packages/upgrade/source/guide-generators/{v5 => core-2}/backend/import-paths.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/backend/index.js (98%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/backend/intro.mdx (100%) rename packages/upgrade/source/guide-generators/{v5/chromeExtension => core-2/chrome-extension}/index.js (93%) rename packages/upgrade/source/guide-generators/{v5/chromeExtension => core-2/chrome-extension}/intro.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/expo/index.js (90%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/expo/intro.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/fastify/index.js (89%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/fastify/intro.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/gatsby/index.js (81%) create mode 100644 packages/upgrade/source/guide-generators/core-2/gatsby/intro.mdx rename packages/upgrade/source/guide-generators/{v5 => core-2}/generate-all.sh (91%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/js/index.js (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/js/intro.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/nextjs/import-changes.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/nextjs/index.js (89%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/nextjs/intro.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/nextjs/middleware-changes.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/nextjs/nextjs-version.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/node/index.js (90%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/node/intro.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/node/node-setters-removals.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/overview/index.js (63%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/overview/intro.mdx (90%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/react/hof-removals.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/react/index.js (91%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/react/intro.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/remix/index.js (90%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/remix/intro.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/retheme/index.js (94%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/retheme/intro.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/after-sign-x-handling.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/cli.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/deprecation-removals.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/image-url.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/node-version.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/orgs-claim.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/pagination-args.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/pagination-return.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/path-routing.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/prepare.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/react-version.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/redesign-preview.mdx (100%) rename packages/upgrade/source/guide-generators/{v5 => core-2}/shared/update-version.mdx (100%) delete mode 100644 packages/upgrade/source/guide-generators/v5/gatsby/intro.mdx rename packages/upgrade/source/versions/{v5 => core-2}/backend/api-url-value-changed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/authenticaterequest-params-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/buildrequesturl-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/clerk-import.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/client-unstableoptions-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/clockskewinseconds.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/constants-import-path-move.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/createauthenticaterequest-import-path-move.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/createclerkclient-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/createclerkclient-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/createemail-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/createisomorphicrequest-import-path-move.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/createisomorphicrequest-removed.md (100%) rename packages/upgrade/source/versions/{v5/backend/decodeJwt-import-path-move.md => core-2/backend/decodejwt-import-path-move.md} (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/getorganizationmembershiplist-return-signature.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/getpendingorganizationinvitationlist.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/httpoptions-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/membershiprole.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/organizationjson-logourl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/organizationmembershippublicuserdatajson-profileimageurl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/pkgversion.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/redirect-import-path-move.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/signjwt-import-path-move.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/signjwterror-import-move.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/tokenverificationerror-import-move.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/tokenverificationerroraction-import-move.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/tokenverificationerrorcode-import-move.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/tokenverificationerrorreason-import-move.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/userjson-profileimageurl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/backend/verifyjwt-import-path-move.md (100%) rename packages/upgrade/source/versions/{v5/chromeExtension => core-2/chrome-extension}/clerkprovider-tokencache.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/afterswitchorganizationurl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/alternativemethods-backlink.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/api-key-to-secret-key.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/appearance-organizationpreview-organizationswitcher.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/button-to-organizationlistcreateorganizationactionbutton.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/card-changes.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/changed-localization-keys.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/clerkprovider-frontendapi-2.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/clerkprovideroptionswrapper-dropped.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/connected-accounts-dropdown.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/emaillinkerrorcode-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/externalaccount-avatarurl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/externalaccount-picture.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/externalaccountjson-avatarurl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/frontend-api-to-publishable-key.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/getorganizationinvitationlist-return-signature.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/getorganizationinvitationlist-return-type-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/getorganizationlist-return-signature.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/getorganizationlist-return-type-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/getorganizationmembershiplist-return-type-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/handlemagiclinkverification.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/isclerkapiresponserror-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/isemaillinkerror-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/isknownerror-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/ismagiclinkerror.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/ismetamaskerror-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/magiclinkerror.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/magiclinkerrorcode.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/mfa-dropdown.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/min-react-version.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/multisessionappsupport-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/navigate-to-routerpush-routerreplace.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/new-localization-keys.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/organization-create-string.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/organization-getdomains-arguments-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/organization-getinvitations-arguments-changed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/organization-getmembershiprequests-arguments-changed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/organization-getmemberships-arguments-changed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/organization-getpendinginvitations.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/organization-getroles-arguments-changed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/organization-logourl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/organizationmembershippublicuserdata-profileimageurl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/organizationprofile-settings.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/organizationswitcherpopoveractionbuttontext-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/remove-identitypreview-avatar.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/remove-socialbuttonsblockbuttonarrow.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/removed-localization-keys.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/setsession.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/signoutcallback-to-redirecturl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/usemagiclink.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/useorganization-invitationlist.md (86%) rename packages/upgrade/source/versions/{v5 => core-2}/common/useorganization-membershiplist.md (85%) rename packages/upgrade/source/versions/{v5 => core-2}/common/useorganizations.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/user-getorganizationinvitations-arguments-changed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/user-getorganizationmemberships-arguments-changed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/user-getorganizationsuggestions-arguments-changed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/user-profileimageurl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/user-update-password.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/userbuttonpopoveractionbuttontext-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/userbuttontrigger-userbuttonbox-invert.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/userprofile-prop.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/userprofile-security.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/withclerk-hof-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/withclerk-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/withsession-hof-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/withsession-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/withuser-hof-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/common/withuser-removed-2.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/expo/apikey-to-publishable-key.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/expo/clerkprovider-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/fastify/api-url-value-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/fastify/clerk-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/fastify/clerkplugin-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/fastify/createclerkclient-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/fastify/createclerkclient-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/gatsby/api-url-value-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/gatsby/apikey-to-publishable-key.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/gatsby/clerk-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/gatsby/createclerkclient-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/gatsby/createclerkclient-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/gatsby/withserverauth-return-type.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/index.js (98%) rename packages/upgrade/source/versions/{v5 => core-2}/js/clerk-isready-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/js/experimental-canusecaptcha.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/js/experimental-captchasitekey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/js/experimental-captchaurl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/js/getorganizationmemberships.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/js/lastorganizationinvitation-member.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/js/redirecttohome.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/js/signup-attemptweb3walletverification-generatedsignature.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/js/unstable-invitationupdate.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/js/unstable-membershipupdate.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/js/user-createexternalaccount-redirecturl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/js/user-orgpublicdata-profileimageurl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/api-url-value-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/auth-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/auth-middleware-deprecated.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/authmiddleware-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/authmiddleware-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/authmiddleware-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/buildclerkprops-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/clerk-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/clerk-js-version-next-public.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/constants-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/createauthenticaterequest-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/createclerkclient-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/createclerkclient-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/createisomorphicrequest-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/currentuser-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/decodejwt-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/emaillinkerrorcode-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/getauth-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-api-url.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-api-version.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-clerk-js-url.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-clerk-js-version.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-domain.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-is-satellite.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-nextjs-api.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-nextjs-app-beta.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-nextjs-edge-middleware.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-nextjs-edge-middlewarefiles.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-nextjs-ssr.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-proxy-url.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-publishable-key.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-secret-key.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-sign-in-url.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/import-sign-up-url.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/isclerkapiresponserror-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/isemaillinkerror-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/isknownerror-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/min-nextjs-version.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/multisessionappsupport-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/next-public-clerk-js-url.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/redirect-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/redirecttosignin-import-path.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/redirecttosignup-import-path.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/signjwt-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/verifyjwt-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/verifytoken-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/nextjs/with-clerk-middleware-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/api-url-value-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/cjs-esm-instance.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/clerk-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/clerkexpressrequireauth-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/clerkexpressrequireauth-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/clerkexpresswithauth-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/clerkexpresswithauth-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/createclerkclient-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/createclerkclient-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/createclerkexpressrequireauth-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/createclerkexpressrequireauth-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/createclerkexpresswithauth-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/createclerkexpresswithauth-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/legacyauthobject-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/setclerkapikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/setclerkapiversion.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/setclerkhttpoptions.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/node/setclerkserverapiurl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/react/api-url-value-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/remix/clerk-import-change.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/remix/clerkerrorboundary-removed.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/remix/createclerkclient-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/remix/getauth-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/remix/rootauthloader-apikey.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/remix/rootauthloader-frontendapi.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/shared/getrequesturl.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/shared/organizationcontext.md (100%) rename packages/upgrade/source/versions/{v5 => core-2}/shared/useorganizationlist-organizationlist.md (84%) diff --git a/packages/upgrade/source/constants/sdks.js b/packages/upgrade/source/constants/sdks.js index 8e69f3fb644..502fa900c49 100644 --- a/packages/upgrade/source/constants/sdks.js +++ b/packages/upgrade/source/constants/sdks.js @@ -13,5 +13,5 @@ export default [ { label: '@clerk/localizations', value: 'localizations' }, { label: '@clerk/shared', value: 'shared' }, { label: '@clerk/types', value: 'types' }, - { label: '@clerk/chrome-extension', value: 'chromeExtension' }, + { label: '@clerk/chrome-extension', value: 'chrome-extension' }, ]; diff --git a/packages/upgrade/source/guide-generators/v5/backend/import-paths.mdx b/packages/upgrade/source/guide-generators/core-2/backend/import-paths.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/backend/import-paths.mdx rename to packages/upgrade/source/guide-generators/core-2/backend/import-paths.mdx diff --git a/packages/upgrade/source/guide-generators/v5/backend/index.js b/packages/upgrade/source/guide-generators/core-2/backend/index.js similarity index 98% rename from packages/upgrade/source/guide-generators/v5/backend/index.js rename to packages/upgrade/source/guide-generators/core-2/backend/index.js index 9758595f0b3..7c8fb025632 100644 --- a/packages/upgrade/source/guide-generators/v5/backend/index.js +++ b/packages/upgrade/source/guide-generators/core-2/backend/index.js @@ -10,7 +10,7 @@ import { writeToFile, } from '../../text-generation.js'; -const version = 'v5'; +const version = 'core-2'; const name = 'backend'; const properName = 'Backend'; const packageName = '@clerk/backend'; diff --git a/packages/upgrade/source/guide-generators/v5/backend/intro.mdx b/packages/upgrade/source/guide-generators/core-2/backend/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/backend/intro.mdx rename to packages/upgrade/source/guide-generators/core-2/backend/intro.mdx diff --git a/packages/upgrade/source/guide-generators/v5/chromeExtension/index.js b/packages/upgrade/source/guide-generators/core-2/chrome-extension/index.js similarity index 93% rename from packages/upgrade/source/guide-generators/v5/chromeExtension/index.js rename to packages/upgrade/source/guide-generators/core-2/chrome-extension/index.js index 47e0f6e39e6..1de0d8420ba 100644 --- a/packages/upgrade/source/guide-generators/v5/chromeExtension/index.js +++ b/packages/upgrade/source/guide-generators/core-2/chrome-extension/index.js @@ -10,11 +10,11 @@ import { writeToFile, } from '../../text-generation.js'; -const version = 'v5'; -const name = 'chromeExtension'; +const version = 'core-2'; +const name = 'chrome-extension'; const properName = 'Chrome Extension'; const packageName = '@clerk/chrome-extension'; -const cwd = `${version}/chromeExtension`; +const cwd = `${version}/${name}`; async function generate() { const data = await loadVersionChangeData(version, name); diff --git a/packages/upgrade/source/guide-generators/v5/chromeExtension/intro.mdx b/packages/upgrade/source/guide-generators/core-2/chrome-extension/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/chromeExtension/intro.mdx rename to packages/upgrade/source/guide-generators/core-2/chrome-extension/intro.mdx diff --git a/packages/upgrade/source/guide-generators/v5/expo/index.js b/packages/upgrade/source/guide-generators/core-2/expo/index.js similarity index 90% rename from packages/upgrade/source/guide-generators/v5/expo/index.js rename to packages/upgrade/source/guide-generators/core-2/expo/index.js index 56dc48ea22e..ee1f8d6bc7e 100644 --- a/packages/upgrade/source/guide-generators/v5/expo/index.js +++ b/packages/upgrade/source/guide-generators/core-2/expo/index.js @@ -9,7 +9,8 @@ import { writeToFile, } from '../../text-generation.js'; -const version = 'v5'; +const version = 'core-2'; +const semverVersion = 'v1'; const name = 'expo'; const properName = 'Expo'; const packageName = '@clerk/clerk-expo'; @@ -25,7 +26,7 @@ async function generate() { }), `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdownTemplate('prepare', { version: 'v1', packageName }), + markdownTemplate('prepare', { version: semverVersion, packageName }), markdown('node-version'), markdown('react-version'), markdownTemplate('update-version', { packageName }), diff --git a/packages/upgrade/source/guide-generators/v5/expo/intro.mdx b/packages/upgrade/source/guide-generators/core-2/expo/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/expo/intro.mdx rename to packages/upgrade/source/guide-generators/core-2/expo/intro.mdx diff --git a/packages/upgrade/source/guide-generators/v5/fastify/index.js b/packages/upgrade/source/guide-generators/core-2/fastify/index.js similarity index 89% rename from packages/upgrade/source/guide-generators/v5/fastify/index.js rename to packages/upgrade/source/guide-generators/core-2/fastify/index.js index 9a793b642f0..4fcd6907c84 100644 --- a/packages/upgrade/source/guide-generators/v5/fastify/index.js +++ b/packages/upgrade/source/guide-generators/core-2/fastify/index.js @@ -9,7 +9,8 @@ import { writeToFile, } from '../../text-generation.js'; -const version = 'v5'; +const version = 'core-2'; +const semverVersion = 'v1'; const name = 'fastify'; const properName = 'Fastify'; const packageName = '@clerk/fastify'; @@ -25,7 +26,7 @@ async function generate() { }), `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdownTemplate('prepare', { version: 'v1', packageName }), + markdownTemplate('prepare', { version: semverVersion, packageName }), markdown('node-version'), markdownTemplate('update-version', { packageName }), markdown('cli'), diff --git a/packages/upgrade/source/guide-generators/v5/fastify/intro.mdx b/packages/upgrade/source/guide-generators/core-2/fastify/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/fastify/intro.mdx rename to packages/upgrade/source/guide-generators/core-2/fastify/intro.mdx diff --git a/packages/upgrade/source/guide-generators/v5/gatsby/index.js b/packages/upgrade/source/guide-generators/core-2/gatsby/index.js similarity index 81% rename from packages/upgrade/source/guide-generators/v5/gatsby/index.js rename to packages/upgrade/source/guide-generators/core-2/gatsby/index.js index c9f02cbf93c..9089b2e1ef6 100644 --- a/packages/upgrade/source/guide-generators/v5/gatsby/index.js +++ b/packages/upgrade/source/guide-generators/core-2/gatsby/index.js @@ -9,7 +9,8 @@ import { writeToFile, } from '../../text-generation.js'; -const version = 'v5'; +const version = 'core-2'; +const semverVersion = 'v5'; const name = 'gatsby'; const properName = 'Gatsby'; const packageName = 'gatsby-plugin-clerk'; @@ -20,12 +21,12 @@ async function generate() { return assembleContent({ data, cwd }, [ frontmatter({ - title: `Upgrading ${properName} from v4 to v5`, - description: `Learn how to upgrade Clerk's ${properName} SDK from v4 to v5.`, + title: `Upgrading ${properName} to Core 2`, + description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version`, }), - `# Upgrading \`${packageName}\` from v4 to v5`, + `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdownTemplate('prepare', { version, packageName }), + markdownTemplate('prepare', { version: semverVersion, packageName }), markdown('node-version'), markdown('react-version'), markdownTemplate('update-version', { packageName: 'gatsby-plugin-clerk' }), diff --git a/packages/upgrade/source/guide-generators/core-2/gatsby/intro.mdx b/packages/upgrade/source/guide-generators/core-2/gatsby/intro.mdx new file mode 100644 index 00000000000..45fd3e876ec --- /dev/null +++ b/packages/upgrade/source/guide-generators/core-2/gatsby/intro.mdx @@ -0,0 +1,3 @@ +Clerk's Core 2 release includes a new major version of the Gatsby SDK, v5. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. + +By the end of this guide, you’ll have successfully upgraded your Gatsby project to use `gatsby-plugin-clerk` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/v5/generate-all.sh b/packages/upgrade/source/guide-generators/core-2/generate-all.sh similarity index 91% rename from packages/upgrade/source/guide-generators/v5/generate-all.sh rename to packages/upgrade/source/guide-generators/core-2/generate-all.sh index e4a78f21b42..e9978f30d8e 100755 --- a/packages/upgrade/source/guide-generators/v5/generate-all.sh +++ b/packages/upgrade/source/guide-generators/core-2/generate-all.sh @@ -4,7 +4,7 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) node $SCRIPT_DIR/overview/index.js node $SCRIPT_DIR/backend/index.js -node $SCRIPT_DIR/chromeExtension/index.js +node $SCRIPT_DIR/chrome-extension/index.js node $SCRIPT_DIR/expo/index.js node $SCRIPT_DIR/fastify/index.js node $SCRIPT_DIR/gatsby/index.js diff --git a/packages/upgrade/source/guide-generators/v5/js/index.js b/packages/upgrade/source/guide-generators/core-2/js/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/v5/js/index.js rename to packages/upgrade/source/guide-generators/core-2/js/index.js diff --git a/packages/upgrade/source/guide-generators/v5/js/intro.mdx b/packages/upgrade/source/guide-generators/core-2/js/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/js/intro.mdx rename to packages/upgrade/source/guide-generators/core-2/js/intro.mdx diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx b/packages/upgrade/source/guide-generators/core-2/nextjs/import-changes.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/nextjs/import-changes.mdx rename to packages/upgrade/source/guide-generators/core-2/nextjs/import-changes.mdx diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/index.js b/packages/upgrade/source/guide-generators/core-2/nextjs/index.js similarity index 89% rename from packages/upgrade/source/guide-generators/v5/nextjs/index.js rename to packages/upgrade/source/guide-generators/core-2/nextjs/index.js index 2d39ead3d24..1b9f23174df 100644 --- a/packages/upgrade/source/guide-generators/v5/nextjs/index.js +++ b/packages/upgrade/source/guide-generators/core-2/nextjs/index.js @@ -9,11 +9,12 @@ import { writeToFile, } from '../../text-generation.js'; -const version = 'v5'; +const version = 'core-2'; +const semverVersion = 'v5'; const name = 'nextjs'; const properName = 'Next.js'; const packageName = '@clerk/nextjs'; -const cwd = 'v5/nextjs'; +const cwd = `${version}/${name}`; async function generate() { const data = await loadVersionChangeData(version, name); @@ -25,7 +26,7 @@ async function generate() { }), `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdownTemplate('prepare', { version, packageName }), + markdownTemplate('prepare', { version: semverVersion, packageName }), markdown('node-version'), markdown('react-version'), markdown('nextjs-version'), diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/intro.mdx b/packages/upgrade/source/guide-generators/core-2/nextjs/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/nextjs/intro.mdx rename to packages/upgrade/source/guide-generators/core-2/nextjs/intro.mdx diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/middleware-changes.mdx b/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/nextjs/middleware-changes.mdx rename to packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx diff --git a/packages/upgrade/source/guide-generators/v5/nextjs/nextjs-version.mdx b/packages/upgrade/source/guide-generators/core-2/nextjs/nextjs-version.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/nextjs/nextjs-version.mdx rename to packages/upgrade/source/guide-generators/core-2/nextjs/nextjs-version.mdx diff --git a/packages/upgrade/source/guide-generators/v5/node/index.js b/packages/upgrade/source/guide-generators/core-2/node/index.js similarity index 90% rename from packages/upgrade/source/guide-generators/v5/node/index.js rename to packages/upgrade/source/guide-generators/core-2/node/index.js index 93fe8a3ebc8..63bf1cc7d10 100644 --- a/packages/upgrade/source/guide-generators/v5/node/index.js +++ b/packages/upgrade/source/guide-generators/core-2/node/index.js @@ -10,7 +10,8 @@ import { writeToFile, } from '../../text-generation.js'; -const version = 'v5'; +const version = 'core-2'; +const semverVersion = 'v5'; const name = 'node'; const properName = 'Node'; const packageName = '@clerk/clerk-sdk-node'; @@ -26,7 +27,7 @@ async function generate() { }), `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdownTemplate('prepare', { version, packageName }), + markdownTemplate('prepare', { version: semverVersion, packageName }), markdown('node-version'), markdownTemplate('update-version', { packageName }), markdown('cli'), diff --git a/packages/upgrade/source/guide-generators/v5/node/intro.mdx b/packages/upgrade/source/guide-generators/core-2/node/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/node/intro.mdx rename to packages/upgrade/source/guide-generators/core-2/node/intro.mdx diff --git a/packages/upgrade/source/guide-generators/v5/node/node-setters-removals.mdx b/packages/upgrade/source/guide-generators/core-2/node/node-setters-removals.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/node/node-setters-removals.mdx rename to packages/upgrade/source/guide-generators/core-2/node/node-setters-removals.mdx diff --git a/packages/upgrade/source/guide-generators/v5/overview/index.js b/packages/upgrade/source/guide-generators/core-2/overview/index.js similarity index 63% rename from packages/upgrade/source/guide-generators/v5/overview/index.js rename to packages/upgrade/source/guide-generators/core-2/overview/index.js index 4955acc3f15..9655397f444 100644 --- a/packages/upgrade/source/guide-generators/v5/overview/index.js +++ b/packages/upgrade/source/guide-generators/core-2/overview/index.js @@ -1,12 +1,12 @@ import { assembleContent, frontmatter, markdown, writeToFile } from '../../text-generation.js'; -const cwd = 'v5/overview'; +const cwd = 'core-2/overview'; async function generate() { return assembleContent({ data: {}, cwd }, [ frontmatter({ - title: `Upgrading from v4 to v5 core`, - description: `Learn how to upgrade from v4 to v5 core for Clerk's SDKs`, + title: `Upgrading to Clerk Core 2`, + description: `Learn how to upgrade to the latest version of Clerk's SDKs`, }), markdown('intro'), ]); diff --git a/packages/upgrade/source/guide-generators/v5/overview/intro.mdx b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx similarity index 90% rename from packages/upgrade/source/guide-generators/v5/overview/intro.mdx rename to packages/upgrade/source/guide-generators/core-2/overview/intro.mdx index c038d479174..1cbef196a34 100644 --- a/packages/upgrade/source/guide-generators/v5/overview/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx @@ -1,6 +1,6 @@ # Upgrading to Clerk Core 2 -On TODO:DATE, Core 2 for all Clerk SDKs [was released](https://clerk.com/changelog/2024-01-16), broadly featuring the following upgrades: +On TODO:DATE, the first beta Core 2 for all Clerk SDKs [was released](https://clerk.com/changelog/2024-01-16), broadly featuring the following upgrades: - 💅 Redesigned and improved component UIs. - 🔪 The 401 & "flash of white page" that was visible sometimes when syncing auth state was eliminated. diff --git a/packages/upgrade/source/guide-generators/v5/react/hof-removals.mdx b/packages/upgrade/source/guide-generators/core-2/react/hof-removals.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/react/hof-removals.mdx rename to packages/upgrade/source/guide-generators/core-2/react/hof-removals.mdx diff --git a/packages/upgrade/source/guide-generators/v5/react/index.js b/packages/upgrade/source/guide-generators/core-2/react/index.js similarity index 91% rename from packages/upgrade/source/guide-generators/v5/react/index.js rename to packages/upgrade/source/guide-generators/core-2/react/index.js index 4f1574b757e..88de6d4e66e 100644 --- a/packages/upgrade/source/guide-generators/v5/react/index.js +++ b/packages/upgrade/source/guide-generators/core-2/react/index.js @@ -10,7 +10,8 @@ import { writeToFile, } from '../../text-generation.js'; -const version = 'v5'; +const version = 'core-2'; +const semverVersion = 'v5'; const name = 'react'; const properName = 'React'; const packageName = '@clerk/clerk-react'; @@ -26,7 +27,7 @@ async function generate() { }), `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdownTemplate('prepare', { packageName, version }), + markdownTemplate('prepare', { packageName, version: semverVersion }), markdown('node-version'), markdown('react-version'), markdownTemplate('update-version', { packageName }), diff --git a/packages/upgrade/source/guide-generators/v5/react/intro.mdx b/packages/upgrade/source/guide-generators/core-2/react/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/react/intro.mdx rename to packages/upgrade/source/guide-generators/core-2/react/intro.mdx diff --git a/packages/upgrade/source/guide-generators/v5/remix/index.js b/packages/upgrade/source/guide-generators/core-2/remix/index.js similarity index 90% rename from packages/upgrade/source/guide-generators/v5/remix/index.js rename to packages/upgrade/source/guide-generators/core-2/remix/index.js index 3d36373b1a1..11001cade42 100644 --- a/packages/upgrade/source/guide-generators/v5/remix/index.js +++ b/packages/upgrade/source/guide-generators/core-2/remix/index.js @@ -10,7 +10,8 @@ import { writeToFile, } from '../../text-generation.js'; -const version = 'v5'; +const version = 'core-2'; +const semverVersion = 'v4'; const name = 'remix'; const properName = 'Remix'; const packageName = '@clerk/remix'; @@ -26,7 +27,7 @@ async function generate() { }), `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdownTemplate('prepare', { version: 'v4', packageName }), + markdownTemplate('prepare', { version: semverVersion, packageName }), markdown('node-version'), markdown('react-version'), markdownTemplate('update-version', { packageName }), diff --git a/packages/upgrade/source/guide-generators/v5/remix/intro.mdx b/packages/upgrade/source/guide-generators/core-2/remix/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/remix/intro.mdx rename to packages/upgrade/source/guide-generators/core-2/remix/intro.mdx diff --git a/packages/upgrade/source/guide-generators/v5/retheme/index.js b/packages/upgrade/source/guide-generators/core-2/retheme/index.js similarity index 94% rename from packages/upgrade/source/guide-generators/v5/retheme/index.js rename to packages/upgrade/source/guide-generators/core-2/retheme/index.js index fa357e1a023..d4b49a59097 100644 --- a/packages/upgrade/source/guide-generators/v5/retheme/index.js +++ b/packages/upgrade/source/guide-generators/core-2/retheme/index.js @@ -7,10 +7,10 @@ import { writeToFile, } from '../../text-generation.js'; -const cwd = 'v5/retheme'; +const cwd = 'core-2/retheme'; async function generate() { - const data = await loadVersionChangeData('v5', 'nextjs'); + const data = await loadVersionChangeData('core-2', 'nextjs'); const defaultsChangeItem = { title: 'Changes to default variables', diff --git a/packages/upgrade/source/guide-generators/v5/retheme/intro.mdx b/packages/upgrade/source/guide-generators/core-2/retheme/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/retheme/intro.mdx rename to packages/upgrade/source/guide-generators/core-2/retheme/intro.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/after-sign-x-handling.mdx b/packages/upgrade/source/guide-generators/core-2/shared/after-sign-x-handling.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/after-sign-x-handling.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/after-sign-x-handling.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/cli.mdx b/packages/upgrade/source/guide-generators/core-2/shared/cli.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/cli.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/cli.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx b/packages/upgrade/source/guide-generators/core-2/shared/deprecation-removals.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/deprecation-removals.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/deprecation-removals.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/image-url.mdx b/packages/upgrade/source/guide-generators/core-2/shared/image-url.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/image-url.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/image-url.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/node-version.mdx b/packages/upgrade/source/guide-generators/core-2/shared/node-version.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/node-version.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/node-version.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/orgs-claim.mdx b/packages/upgrade/source/guide-generators/core-2/shared/orgs-claim.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/orgs-claim.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/orgs-claim.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/pagination-args.mdx b/packages/upgrade/source/guide-generators/core-2/shared/pagination-args.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/pagination-args.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/pagination-args.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/pagination-return.mdx b/packages/upgrade/source/guide-generators/core-2/shared/pagination-return.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/pagination-return.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/pagination-return.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/path-routing.mdx b/packages/upgrade/source/guide-generators/core-2/shared/path-routing.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/path-routing.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/path-routing.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/prepare.mdx b/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/prepare.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/react-version.mdx b/packages/upgrade/source/guide-generators/core-2/shared/react-version.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/react-version.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/react-version.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/redesign-preview.mdx b/packages/upgrade/source/guide-generators/core-2/shared/redesign-preview.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/redesign-preview.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/redesign-preview.mdx diff --git a/packages/upgrade/source/guide-generators/v5/shared/update-version.mdx b/packages/upgrade/source/guide-generators/core-2/shared/update-version.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/v5/shared/update-version.mdx rename to packages/upgrade/source/guide-generators/core-2/shared/update-version.mdx diff --git a/packages/upgrade/source/guide-generators/v5/gatsby/intro.mdx b/packages/upgrade/source/guide-generators/v5/gatsby/intro.mdx deleted file mode 100644 index 5cdefc1d67e..00000000000 --- a/packages/upgrade/source/guide-generators/v5/gatsby/intro.mdx +++ /dev/null @@ -1,3 +0,0 @@ -Version 5 of the Gatsby SDK ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. - -By the end of this guide, you’ll have successfully upgraded your Expo project to use `gatsby-plugin-clerk` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/util/load-change.js b/packages/upgrade/source/util/load-change.js index 2dac153b65e..42e1e22c84b 100644 --- a/packages/upgrade/source/util/load-change.js +++ b/packages/upgrade/source/util/load-change.js @@ -10,8 +10,8 @@ export default function createLoader({ version, baseUrl }) { // Note: This could benefit perf-wise by being converted to async, but it would // make the code a decent amount more complex. return slugs.map(slug => { - const sdkPath = path.join(__dirname, '../versions', `v${version}`, sdk, `${slug}.md`); - const sharedPath = path.join(__dirname, '../versions', `v${version}`, 'common', `${slug}.md`); + const sdkPath = path.join(__dirname, '../versions', `${version}`, sdk, `${slug}.md`); + const sharedPath = path.join(__dirname, '../versions', `${version}`, 'common', `${slug}.md`); const loadPath = fs.existsSync(sdkPath) ? sdkPath : sharedPath; const content = fs.readFileSync(loadPath, 'utf8'); diff --git a/packages/upgrade/source/versions/v5/backend/api-url-value-changed.md b/packages/upgrade/source/versions/core-2/backend/api-url-value-changed.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/api-url-value-changed.md rename to packages/upgrade/source/versions/core-2/backend/api-url-value-changed.md diff --git a/packages/upgrade/source/versions/v5/backend/authenticaterequest-params-change.md b/packages/upgrade/source/versions/core-2/backend/authenticaterequest-params-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/authenticaterequest-params-change.md rename to packages/upgrade/source/versions/core-2/backend/authenticaterequest-params-change.md diff --git a/packages/upgrade/source/versions/v5/backend/buildrequesturl-removed.md b/packages/upgrade/source/versions/core-2/backend/buildrequesturl-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/buildrequesturl-removed.md rename to packages/upgrade/source/versions/core-2/backend/buildrequesturl-removed.md diff --git a/packages/upgrade/source/versions/v5/backend/clerk-import.md b/packages/upgrade/source/versions/core-2/backend/clerk-import.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/clerk-import.md rename to packages/upgrade/source/versions/core-2/backend/clerk-import.md diff --git a/packages/upgrade/source/versions/v5/backend/client-unstableoptions-removed.md b/packages/upgrade/source/versions/core-2/backend/client-unstableoptions-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/client-unstableoptions-removed.md rename to packages/upgrade/source/versions/core-2/backend/client-unstableoptions-removed.md diff --git a/packages/upgrade/source/versions/v5/backend/clockskewinseconds.md b/packages/upgrade/source/versions/core-2/backend/clockskewinseconds.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/clockskewinseconds.md rename to packages/upgrade/source/versions/core-2/backend/clockskewinseconds.md diff --git a/packages/upgrade/source/versions/v5/backend/constants-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/constants-import-path-move.md rename to packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md diff --git a/packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/createauthenticaterequest-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/createauthenticaterequest-import-path-move.md rename to packages/upgrade/source/versions/core-2/backend/createauthenticaterequest-import-path-move.md diff --git a/packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md b/packages/upgrade/source/versions/core-2/backend/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/createclerkclient-apikey.md rename to packages/upgrade/source/versions/core-2/backend/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/core-2/backend/createclerkclient-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/createclerkclient-frontendapi.md rename to packages/upgrade/source/versions/core-2/backend/createclerkclient-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/backend/createemail-removed.md b/packages/upgrade/source/versions/core-2/backend/createemail-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/createemail-removed.md rename to packages/upgrade/source/versions/core-2/backend/createemail-removed.md diff --git a/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/createisomorphicrequest-import-path-move.md rename to packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md diff --git a/packages/upgrade/source/versions/v5/backend/createisomorphicrequest-removed.md b/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/createisomorphicrequest-removed.md rename to packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md diff --git a/packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/decodeJwt-import-path-move.md rename to packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md diff --git a/packages/upgrade/source/versions/v5/backend/getorganizationmembershiplist-return-signature.md b/packages/upgrade/source/versions/core-2/backend/getorganizationmembershiplist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/getorganizationmembershiplist-return-signature.md rename to packages/upgrade/source/versions/core-2/backend/getorganizationmembershiplist-return-signature.md diff --git a/packages/upgrade/source/versions/v5/backend/getpendingorganizationinvitationlist.md b/packages/upgrade/source/versions/core-2/backend/getpendingorganizationinvitationlist.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/getpendingorganizationinvitationlist.md rename to packages/upgrade/source/versions/core-2/backend/getpendingorganizationinvitationlist.md diff --git a/packages/upgrade/source/versions/v5/backend/httpoptions-removed.md b/packages/upgrade/source/versions/core-2/backend/httpoptions-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/httpoptions-removed.md rename to packages/upgrade/source/versions/core-2/backend/httpoptions-removed.md diff --git a/packages/upgrade/source/versions/v5/backend/membershiprole.md b/packages/upgrade/source/versions/core-2/backend/membershiprole.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/membershiprole.md rename to packages/upgrade/source/versions/core-2/backend/membershiprole.md diff --git a/packages/upgrade/source/versions/v5/backend/organizationjson-logourl.md b/packages/upgrade/source/versions/core-2/backend/organizationjson-logourl.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/organizationjson-logourl.md rename to packages/upgrade/source/versions/core-2/backend/organizationjson-logourl.md diff --git a/packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdatajson-profileimageurl.md b/packages/upgrade/source/versions/core-2/backend/organizationmembershippublicuserdatajson-profileimageurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/organizationmembershippublicuserdatajson-profileimageurl.md rename to packages/upgrade/source/versions/core-2/backend/organizationmembershippublicuserdatajson-profileimageurl.md diff --git a/packages/upgrade/source/versions/v5/backend/pkgversion.md b/packages/upgrade/source/versions/core-2/backend/pkgversion.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/pkgversion.md rename to packages/upgrade/source/versions/core-2/backend/pkgversion.md diff --git a/packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/redirect-import-path-move.md rename to packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md diff --git a/packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/signjwt-import-path-move.md rename to packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md diff --git a/packages/upgrade/source/versions/v5/backend/signjwterror-import-move.md b/packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/signjwterror-import-move.md rename to packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerror-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/tokenverificationerror-import-move.md rename to packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerroraction-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/tokenverificationerroraction-import-move.md rename to packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerrorcode-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/tokenverificationerrorcode-import-move.md rename to packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md diff --git a/packages/upgrade/source/versions/v5/backend/tokenverificationerrorreason-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/tokenverificationerrorreason-import-move.md rename to packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md diff --git a/packages/upgrade/source/versions/v5/backend/userjson-profileimageurl.md b/packages/upgrade/source/versions/core-2/backend/userjson-profileimageurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/userjson-profileimageurl.md rename to packages/upgrade/source/versions/core-2/backend/userjson-profileimageurl.md diff --git a/packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/v5/backend/verifyjwt-import-path-move.md rename to packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md diff --git a/packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md b/packages/upgrade/source/versions/core-2/chrome-extension/clerkprovider-tokencache.md similarity index 100% rename from packages/upgrade/source/versions/v5/chromeExtension/clerkprovider-tokencache.md rename to packages/upgrade/source/versions/core-2/chrome-extension/clerkprovider-tokencache.md diff --git a/packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md b/packages/upgrade/source/versions/core-2/common/afterswitchorganizationurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/afterswitchorganizationurl.md rename to packages/upgrade/source/versions/core-2/common/afterswitchorganizationurl.md diff --git a/packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md b/packages/upgrade/source/versions/core-2/common/alternativemethods-backlink.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/alternativemethods-backlink.md rename to packages/upgrade/source/versions/core-2/common/alternativemethods-backlink.md diff --git a/packages/upgrade/source/versions/v5/common/api-key-to-secret-key.md b/packages/upgrade/source/versions/core-2/common/api-key-to-secret-key.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/api-key-to-secret-key.md rename to packages/upgrade/source/versions/core-2/common/api-key-to-secret-key.md diff --git a/packages/upgrade/source/versions/v5/common/appearance-organizationpreview-organizationswitcher.md b/packages/upgrade/source/versions/core-2/common/appearance-organizationpreview-organizationswitcher.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/appearance-organizationpreview-organizationswitcher.md rename to packages/upgrade/source/versions/core-2/common/appearance-organizationpreview-organizationswitcher.md diff --git a/packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md b/packages/upgrade/source/versions/core-2/common/button-to-organizationlistcreateorganizationactionbutton.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/button-to-organizationlistcreateorganizationactionbutton.md rename to packages/upgrade/source/versions/core-2/common/button-to-organizationlistcreateorganizationactionbutton.md diff --git a/packages/upgrade/source/versions/v5/common/card-changes.md b/packages/upgrade/source/versions/core-2/common/card-changes.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/card-changes.md rename to packages/upgrade/source/versions/core-2/common/card-changes.md diff --git a/packages/upgrade/source/versions/v5/common/changed-localization-keys.md b/packages/upgrade/source/versions/core-2/common/changed-localization-keys.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/changed-localization-keys.md rename to packages/upgrade/source/versions/core-2/common/changed-localization-keys.md diff --git a/packages/upgrade/source/versions/v5/common/clerkprovider-frontendapi-2.md b/packages/upgrade/source/versions/core-2/common/clerkprovider-frontendapi-2.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/clerkprovider-frontendapi-2.md rename to packages/upgrade/source/versions/core-2/common/clerkprovider-frontendapi-2.md diff --git a/packages/upgrade/source/versions/v5/common/clerkprovideroptionswrapper-dropped.md b/packages/upgrade/source/versions/core-2/common/clerkprovideroptionswrapper-dropped.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/clerkprovideroptionswrapper-dropped.md rename to packages/upgrade/source/versions/core-2/common/clerkprovideroptionswrapper-dropped.md diff --git a/packages/upgrade/source/versions/v5/common/connected-accounts-dropdown.md b/packages/upgrade/source/versions/core-2/common/connected-accounts-dropdown.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/connected-accounts-dropdown.md rename to packages/upgrade/source/versions/core-2/common/connected-accounts-dropdown.md diff --git a/packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/emaillinkerrorcode-import-change.md rename to packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md diff --git a/packages/upgrade/source/versions/v5/common/externalaccount-avatarurl.md b/packages/upgrade/source/versions/core-2/common/externalaccount-avatarurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/externalaccount-avatarurl.md rename to packages/upgrade/source/versions/core-2/common/externalaccount-avatarurl.md diff --git a/packages/upgrade/source/versions/v5/common/externalaccount-picture.md b/packages/upgrade/source/versions/core-2/common/externalaccount-picture.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/externalaccount-picture.md rename to packages/upgrade/source/versions/core-2/common/externalaccount-picture.md diff --git a/packages/upgrade/source/versions/v5/common/externalaccountjson-avatarurl.md b/packages/upgrade/source/versions/core-2/common/externalaccountjson-avatarurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/externalaccountjson-avatarurl.md rename to packages/upgrade/source/versions/core-2/common/externalaccountjson-avatarurl.md diff --git a/packages/upgrade/source/versions/v5/common/frontend-api-to-publishable-key.md b/packages/upgrade/source/versions/core-2/common/frontend-api-to-publishable-key.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/frontend-api-to-publishable-key.md rename to packages/upgrade/source/versions/core-2/common/frontend-api-to-publishable-key.md diff --git a/packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-signature.md b/packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-signature.md rename to packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-signature.md diff --git a/packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md b/packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-type-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/getorganizationinvitationlist-return-type-change.md rename to packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-type-change.md diff --git a/packages/upgrade/source/versions/v5/common/getorganizationlist-return-signature.md b/packages/upgrade/source/versions/core-2/common/getorganizationlist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/getorganizationlist-return-signature.md rename to packages/upgrade/source/versions/core-2/common/getorganizationlist-return-signature.md diff --git a/packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md b/packages/upgrade/source/versions/core-2/common/getorganizationlist-return-type-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/getorganizationlist-return-type-change.md rename to packages/upgrade/source/versions/core-2/common/getorganizationlist-return-type-change.md diff --git a/packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md b/packages/upgrade/source/versions/core-2/common/getorganizationmembershiplist-return-type-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/getorganizationmembershiplist-return-type-change.md rename to packages/upgrade/source/versions/core-2/common/getorganizationmembershiplist-return-type-change.md diff --git a/packages/upgrade/source/versions/v5/common/handlemagiclinkverification.md b/packages/upgrade/source/versions/core-2/common/handlemagiclinkverification.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/handlemagiclinkverification.md rename to packages/upgrade/source/versions/core-2/common/handlemagiclinkverification.md diff --git a/packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/isclerkapiresponserror-import-change.md rename to packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md diff --git a/packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/isemaillinkerror-import-change.md rename to packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md diff --git a/packages/upgrade/source/versions/v5/common/isknownerror-import-change.md b/packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/isknownerror-import-change.md rename to packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md diff --git a/packages/upgrade/source/versions/v5/common/ismagiclinkerror.md b/packages/upgrade/source/versions/core-2/common/ismagiclinkerror.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/ismagiclinkerror.md rename to packages/upgrade/source/versions/core-2/common/ismagiclinkerror.md diff --git a/packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/ismetamaskerror-import-change.md rename to packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md diff --git a/packages/upgrade/source/versions/v5/common/magiclinkerror.md b/packages/upgrade/source/versions/core-2/common/magiclinkerror.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/magiclinkerror.md rename to packages/upgrade/source/versions/core-2/common/magiclinkerror.md diff --git a/packages/upgrade/source/versions/v5/common/magiclinkerrorcode.md b/packages/upgrade/source/versions/core-2/common/magiclinkerrorcode.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/magiclinkerrorcode.md rename to packages/upgrade/source/versions/core-2/common/magiclinkerrorcode.md diff --git a/packages/upgrade/source/versions/v5/common/mfa-dropdown.md b/packages/upgrade/source/versions/core-2/common/mfa-dropdown.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/mfa-dropdown.md rename to packages/upgrade/source/versions/core-2/common/mfa-dropdown.md diff --git a/packages/upgrade/source/versions/v5/common/min-react-version.md b/packages/upgrade/source/versions/core-2/common/min-react-version.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/min-react-version.md rename to packages/upgrade/source/versions/core-2/common/min-react-version.md diff --git a/packages/upgrade/source/versions/v5/common/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/multisessionappsupport-import-change.md rename to packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md diff --git a/packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md b/packages/upgrade/source/versions/core-2/common/navigate-to-routerpush-routerreplace.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/navigate-to-routerpush-routerreplace.md rename to packages/upgrade/source/versions/core-2/common/navigate-to-routerpush-routerreplace.md diff --git a/packages/upgrade/source/versions/v5/common/new-localization-keys.md b/packages/upgrade/source/versions/core-2/common/new-localization-keys.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/new-localization-keys.md rename to packages/upgrade/source/versions/core-2/common/new-localization-keys.md diff --git a/packages/upgrade/source/versions/v5/common/organization-create-string.md b/packages/upgrade/source/versions/core-2/common/organization-create-string.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/organization-create-string.md rename to packages/upgrade/source/versions/core-2/common/organization-create-string.md diff --git a/packages/upgrade/source/versions/v5/common/organization-getdomains-arguments-change.md b/packages/upgrade/source/versions/core-2/common/organization-getdomains-arguments-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/organization-getdomains-arguments-change.md rename to packages/upgrade/source/versions/core-2/common/organization-getdomains-arguments-change.md diff --git a/packages/upgrade/source/versions/v5/common/organization-getinvitations-arguments-changed.md b/packages/upgrade/source/versions/core-2/common/organization-getinvitations-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/organization-getinvitations-arguments-changed.md rename to packages/upgrade/source/versions/core-2/common/organization-getinvitations-arguments-changed.md diff --git a/packages/upgrade/source/versions/v5/common/organization-getmembershiprequests-arguments-changed.md b/packages/upgrade/source/versions/core-2/common/organization-getmembershiprequests-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/organization-getmembershiprequests-arguments-changed.md rename to packages/upgrade/source/versions/core-2/common/organization-getmembershiprequests-arguments-changed.md diff --git a/packages/upgrade/source/versions/v5/common/organization-getmemberships-arguments-changed.md b/packages/upgrade/source/versions/core-2/common/organization-getmemberships-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/organization-getmemberships-arguments-changed.md rename to packages/upgrade/source/versions/core-2/common/organization-getmemberships-arguments-changed.md diff --git a/packages/upgrade/source/versions/v5/common/organization-getpendinginvitations.md b/packages/upgrade/source/versions/core-2/common/organization-getpendinginvitations.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/organization-getpendinginvitations.md rename to packages/upgrade/source/versions/core-2/common/organization-getpendinginvitations.md diff --git a/packages/upgrade/source/versions/v5/common/organization-getroles-arguments-changed.md b/packages/upgrade/source/versions/core-2/common/organization-getroles-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/organization-getroles-arguments-changed.md rename to packages/upgrade/source/versions/core-2/common/organization-getroles-arguments-changed.md diff --git a/packages/upgrade/source/versions/v5/common/organization-logourl.md b/packages/upgrade/source/versions/core-2/common/organization-logourl.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/organization-logourl.md rename to packages/upgrade/source/versions/core-2/common/organization-logourl.md diff --git a/packages/upgrade/source/versions/v5/common/organizationmembershippublicuserdata-profileimageurl.md b/packages/upgrade/source/versions/core-2/common/organizationmembershippublicuserdata-profileimageurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/organizationmembershippublicuserdata-profileimageurl.md rename to packages/upgrade/source/versions/core-2/common/organizationmembershippublicuserdata-profileimageurl.md diff --git a/packages/upgrade/source/versions/v5/common/organizationprofile-settings.md b/packages/upgrade/source/versions/core-2/common/organizationprofile-settings.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/organizationprofile-settings.md rename to packages/upgrade/source/versions/core-2/common/organizationprofile-settings.md diff --git a/packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md b/packages/upgrade/source/versions/core-2/common/organizationswitcherpopoveractionbuttontext-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/organizationswitcherpopoveractionbuttontext-removed.md rename to packages/upgrade/source/versions/core-2/common/organizationswitcherpopoveractionbuttontext-removed.md diff --git a/packages/upgrade/source/versions/v5/common/remove-identitypreview-avatar.md b/packages/upgrade/source/versions/core-2/common/remove-identitypreview-avatar.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/remove-identitypreview-avatar.md rename to packages/upgrade/source/versions/core-2/common/remove-identitypreview-avatar.md diff --git a/packages/upgrade/source/versions/v5/common/remove-socialbuttonsblockbuttonarrow.md b/packages/upgrade/source/versions/core-2/common/remove-socialbuttonsblockbuttonarrow.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/remove-socialbuttonsblockbuttonarrow.md rename to packages/upgrade/source/versions/core-2/common/remove-socialbuttonsblockbuttonarrow.md diff --git a/packages/upgrade/source/versions/v5/common/removed-localization-keys.md b/packages/upgrade/source/versions/core-2/common/removed-localization-keys.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/removed-localization-keys.md rename to packages/upgrade/source/versions/core-2/common/removed-localization-keys.md diff --git a/packages/upgrade/source/versions/v5/common/setsession.md b/packages/upgrade/source/versions/core-2/common/setsession.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/setsession.md rename to packages/upgrade/source/versions/core-2/common/setsession.md diff --git a/packages/upgrade/source/versions/v5/common/signoutcallback-to-redirecturl.md b/packages/upgrade/source/versions/core-2/common/signoutcallback-to-redirecturl.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/signoutcallback-to-redirecturl.md rename to packages/upgrade/source/versions/core-2/common/signoutcallback-to-redirecturl.md diff --git a/packages/upgrade/source/versions/v5/common/usemagiclink.md b/packages/upgrade/source/versions/core-2/common/usemagiclink.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/usemagiclink.md rename to packages/upgrade/source/versions/core-2/common/usemagiclink.md diff --git a/packages/upgrade/source/versions/v5/common/useorganization-invitationlist.md b/packages/upgrade/source/versions/core-2/common/useorganization-invitationlist.md similarity index 86% rename from packages/upgrade/source/versions/v5/common/useorganization-invitationlist.md rename to packages/upgrade/source/versions/core-2/common/useorganization-invitationlist.md index 6623420a7c8..f4cc8a6dcea 100644 --- a/packages/upgrade/source/versions/v5/common/useorganization-invitationlist.md +++ b/packages/upgrade/source/versions/core-2/common/useorganization-invitationlist.md @@ -9,15 +9,15 @@ The `invitationList` param to the `useOrganizations` hook has been replaced by ` ```js // before const { invitationList } = useOrganization({ - invitationList: { limit: 10, offset: 1 }, + invitationList: { limit: 10, offset: 1 }, }); // after const { invitations } = useOrganization({ - invitations: { - initialPage: 1, - pageSize: 10, - }, + invitations: { + initialPage: 1, + pageSize: 10, + }, }); // you can also simply return all invitations diff --git a/packages/upgrade/source/versions/v5/common/useorganization-membershiplist.md b/packages/upgrade/source/versions/core-2/common/useorganization-membershiplist.md similarity index 85% rename from packages/upgrade/source/versions/v5/common/useorganization-membershiplist.md rename to packages/upgrade/source/versions/core-2/common/useorganization-membershiplist.md index 1c127f96264..28091c7bd2e 100644 --- a/packages/upgrade/source/versions/v5/common/useorganization-membershiplist.md +++ b/packages/upgrade/source/versions/core-2/common/useorganization-membershiplist.md @@ -9,15 +9,15 @@ The `membershipList` param from the `useOrganization` hook has been removed. Ins ```js // before const { membershipList } = useOrganization({ - membershipList: { limit: 10, offset: 1 }, + membershipList: { limit: 10, offset: 1 }, }); // after const { memberships } = useOrganization({ - memberships: { - initialPage: 1, - pageSize: 10, - }, + memberships: { + initialPage: 1, + pageSize: 10, + }, }); // you can also simply return all memberships diff --git a/packages/upgrade/source/versions/v5/common/useorganizations.md b/packages/upgrade/source/versions/core-2/common/useorganizations.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/useorganizations.md rename to packages/upgrade/source/versions/core-2/common/useorganizations.md diff --git a/packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-changed.md b/packages/upgrade/source/versions/core-2/common/user-getorganizationinvitations-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/user-getorganizationinvitations-arguments-changed.md rename to packages/upgrade/source/versions/core-2/common/user-getorganizationinvitations-arguments-changed.md diff --git a/packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-changed.md b/packages/upgrade/source/versions/core-2/common/user-getorganizationmemberships-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/user-getorganizationmemberships-arguments-changed.md rename to packages/upgrade/source/versions/core-2/common/user-getorganizationmemberships-arguments-changed.md diff --git a/packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-changed.md b/packages/upgrade/source/versions/core-2/common/user-getorganizationsuggestions-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/user-getorganizationsuggestions-arguments-changed.md rename to packages/upgrade/source/versions/core-2/common/user-getorganizationsuggestions-arguments-changed.md diff --git a/packages/upgrade/source/versions/v5/common/user-profileimageurl.md b/packages/upgrade/source/versions/core-2/common/user-profileimageurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/user-profileimageurl.md rename to packages/upgrade/source/versions/core-2/common/user-profileimageurl.md diff --git a/packages/upgrade/source/versions/v5/common/user-update-password.md b/packages/upgrade/source/versions/core-2/common/user-update-password.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/user-update-password.md rename to packages/upgrade/source/versions/core-2/common/user-update-password.md diff --git a/packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md b/packages/upgrade/source/versions/core-2/common/userbuttonpopoveractionbuttontext-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/userbuttonpopoveractionbuttontext-removed.md rename to packages/upgrade/source/versions/core-2/common/userbuttonpopoveractionbuttontext-removed.md diff --git a/packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md b/packages/upgrade/source/versions/core-2/common/userbuttontrigger-userbuttonbox-invert.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/userbuttontrigger-userbuttonbox-invert.md rename to packages/upgrade/source/versions/core-2/common/userbuttontrigger-userbuttonbox-invert.md diff --git a/packages/upgrade/source/versions/v5/common/userprofile-prop.md b/packages/upgrade/source/versions/core-2/common/userprofile-prop.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/userprofile-prop.md rename to packages/upgrade/source/versions/core-2/common/userprofile-prop.md diff --git a/packages/upgrade/source/versions/v5/common/userprofile-security.md b/packages/upgrade/source/versions/core-2/common/userprofile-security.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/userprofile-security.md rename to packages/upgrade/source/versions/core-2/common/userprofile-security.md diff --git a/packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md b/packages/upgrade/source/versions/core-2/common/withclerk-hof-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/withclerk-hof-removed.md rename to packages/upgrade/source/versions/core-2/common/withclerk-hof-removed.md diff --git a/packages/upgrade/source/versions/v5/common/withclerk-removed.md b/packages/upgrade/source/versions/core-2/common/withclerk-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/withclerk-removed.md rename to packages/upgrade/source/versions/core-2/common/withclerk-removed.md diff --git a/packages/upgrade/source/versions/v5/common/withsession-hof-removed.md b/packages/upgrade/source/versions/core-2/common/withsession-hof-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/withsession-hof-removed.md rename to packages/upgrade/source/versions/core-2/common/withsession-hof-removed.md diff --git a/packages/upgrade/source/versions/v5/common/withsession-removed.md b/packages/upgrade/source/versions/core-2/common/withsession-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/withsession-removed.md rename to packages/upgrade/source/versions/core-2/common/withsession-removed.md diff --git a/packages/upgrade/source/versions/v5/common/withuser-hof-removed.md b/packages/upgrade/source/versions/core-2/common/withuser-hof-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/withuser-hof-removed.md rename to packages/upgrade/source/versions/core-2/common/withuser-hof-removed.md diff --git a/packages/upgrade/source/versions/v5/common/withuser-removed-2.md b/packages/upgrade/source/versions/core-2/common/withuser-removed-2.md similarity index 100% rename from packages/upgrade/source/versions/v5/common/withuser-removed-2.md rename to packages/upgrade/source/versions/core-2/common/withuser-removed-2.md diff --git a/packages/upgrade/source/versions/v5/expo/apikey-to-publishable-key.md b/packages/upgrade/source/versions/core-2/expo/apikey-to-publishable-key.md similarity index 100% rename from packages/upgrade/source/versions/v5/expo/apikey-to-publishable-key.md rename to packages/upgrade/source/versions/core-2/expo/apikey-to-publishable-key.md diff --git a/packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md b/packages/upgrade/source/versions/core-2/expo/clerkprovider-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/expo/clerkprovider-frontendapi.md rename to packages/upgrade/source/versions/core-2/expo/clerkprovider-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/fastify/api-url-value-change.md b/packages/upgrade/source/versions/core-2/fastify/api-url-value-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/fastify/api-url-value-change.md rename to packages/upgrade/source/versions/core-2/fastify/api-url-value-change.md diff --git a/packages/upgrade/source/versions/v5/fastify/clerk-import-change.md b/packages/upgrade/source/versions/core-2/fastify/clerk-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/fastify/clerk-import-change.md rename to packages/upgrade/source/versions/core-2/fastify/clerk-import-change.md diff --git a/packages/upgrade/source/versions/v5/fastify/clerkplugin-frontendapi.md b/packages/upgrade/source/versions/core-2/fastify/clerkplugin-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/fastify/clerkplugin-frontendapi.md rename to packages/upgrade/source/versions/core-2/fastify/clerkplugin-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/fastify/createclerkclient-apikey.md b/packages/upgrade/source/versions/core-2/fastify/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/fastify/createclerkclient-apikey.md rename to packages/upgrade/source/versions/core-2/fastify/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/v5/fastify/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/core-2/fastify/createclerkclient-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/fastify/createclerkclient-frontendapi.md rename to packages/upgrade/source/versions/core-2/fastify/createclerkclient-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/gatsby/api-url-value-change.md b/packages/upgrade/source/versions/core-2/gatsby/api-url-value-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/gatsby/api-url-value-change.md rename to packages/upgrade/source/versions/core-2/gatsby/api-url-value-change.md diff --git a/packages/upgrade/source/versions/v5/gatsby/apikey-to-publishable-key.md b/packages/upgrade/source/versions/core-2/gatsby/apikey-to-publishable-key.md similarity index 100% rename from packages/upgrade/source/versions/v5/gatsby/apikey-to-publishable-key.md rename to packages/upgrade/source/versions/core-2/gatsby/apikey-to-publishable-key.md diff --git a/packages/upgrade/source/versions/v5/gatsby/clerk-import-change.md b/packages/upgrade/source/versions/core-2/gatsby/clerk-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/gatsby/clerk-import-change.md rename to packages/upgrade/source/versions/core-2/gatsby/clerk-import-change.md diff --git a/packages/upgrade/source/versions/v5/gatsby/createclerkclient-apikey.md b/packages/upgrade/source/versions/core-2/gatsby/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/gatsby/createclerkclient-apikey.md rename to packages/upgrade/source/versions/core-2/gatsby/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/v5/gatsby/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/core-2/gatsby/createclerkclient-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/gatsby/createclerkclient-frontendapi.md rename to packages/upgrade/source/versions/core-2/gatsby/createclerkclient-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/gatsby/withserverauth-return-type.md b/packages/upgrade/source/versions/core-2/gatsby/withserverauth-return-type.md similarity index 100% rename from packages/upgrade/source/versions/v5/gatsby/withserverauth-return-type.md rename to packages/upgrade/source/versions/core-2/gatsby/withserverauth-return-type.md diff --git a/packages/upgrade/source/versions/v5/index.js b/packages/upgrade/source/versions/core-2/index.js similarity index 98% rename from packages/upgrade/source/versions/v5/index.js rename to packages/upgrade/source/versions/core-2/index.js index 0302665521a..a5623654955 100644 --- a/packages/upgrade/source/versions/v5/index.js +++ b/packages/upgrade/source/versions/core-2/index.js @@ -1,8 +1,8 @@ import createLoader from '../../util/load-change.js'; const load = createLoader({ - version: '5', - baseUrl: 'https://clerk.com/docs/upgrade-guides/v5', + version: 'core-2', + baseUrl: 'https://clerk.com/docs/upgrade-guides/core-2', }); const changesAffectingAll = [ @@ -265,7 +265,6 @@ export default { 'magiclinkerrorcode', 'usemagiclink', 'handlemagiclinkverification', - 'external-account-avatarurl', 'user-orgpublicdata-profileimageurl', 'experimental-canusecaptcha', 'experimental-captchaurl', @@ -306,7 +305,10 @@ export default { 'organizationcontext', 'useorganizationlist-organizationlist', // shared outside this pkg? ]), - chromeExtension: load('chromeExtension', dedupeMerge(changesAffectingAll, jsChanges, ['clerkprovider-tokencache'])), + 'chrome-extension': load( + 'chrome-extension', + dedupeMerge(changesAffectingAll, jsChanges, ['clerkprovider-tokencache']), + ), localizations: load('localization', [ 'new-localization-keys', 'removed-localization-keys', diff --git a/packages/upgrade/source/versions/v5/js/clerk-isready-removed.md b/packages/upgrade/source/versions/core-2/js/clerk-isready-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/clerk-isready-removed.md rename to packages/upgrade/source/versions/core-2/js/clerk-isready-removed.md diff --git a/packages/upgrade/source/versions/v5/js/experimental-canusecaptcha.md b/packages/upgrade/source/versions/core-2/js/experimental-canusecaptcha.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/experimental-canusecaptcha.md rename to packages/upgrade/source/versions/core-2/js/experimental-canusecaptcha.md diff --git a/packages/upgrade/source/versions/v5/js/experimental-captchasitekey.md b/packages/upgrade/source/versions/core-2/js/experimental-captchasitekey.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/experimental-captchasitekey.md rename to packages/upgrade/source/versions/core-2/js/experimental-captchasitekey.md diff --git a/packages/upgrade/source/versions/v5/js/experimental-captchaurl.md b/packages/upgrade/source/versions/core-2/js/experimental-captchaurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/experimental-captchaurl.md rename to packages/upgrade/source/versions/core-2/js/experimental-captchaurl.md diff --git a/packages/upgrade/source/versions/v5/js/getorganizationmemberships.md b/packages/upgrade/source/versions/core-2/js/getorganizationmemberships.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/getorganizationmemberships.md rename to packages/upgrade/source/versions/core-2/js/getorganizationmemberships.md diff --git a/packages/upgrade/source/versions/v5/js/lastorganizationinvitation-member.md b/packages/upgrade/source/versions/core-2/js/lastorganizationinvitation-member.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/lastorganizationinvitation-member.md rename to packages/upgrade/source/versions/core-2/js/lastorganizationinvitation-member.md diff --git a/packages/upgrade/source/versions/v5/js/redirecttohome.md b/packages/upgrade/source/versions/core-2/js/redirecttohome.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/redirecttohome.md rename to packages/upgrade/source/versions/core-2/js/redirecttohome.md diff --git a/packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md b/packages/upgrade/source/versions/core-2/js/signup-attemptweb3walletverification-generatedsignature.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/signup-attemptweb3walletverification-generatedsignature.md rename to packages/upgrade/source/versions/core-2/js/signup-attemptweb3walletverification-generatedsignature.md diff --git a/packages/upgrade/source/versions/v5/js/unstable-invitationupdate.md b/packages/upgrade/source/versions/core-2/js/unstable-invitationupdate.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/unstable-invitationupdate.md rename to packages/upgrade/source/versions/core-2/js/unstable-invitationupdate.md diff --git a/packages/upgrade/source/versions/v5/js/unstable-membershipupdate.md b/packages/upgrade/source/versions/core-2/js/unstable-membershipupdate.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/unstable-membershipupdate.md rename to packages/upgrade/source/versions/core-2/js/unstable-membershipupdate.md diff --git a/packages/upgrade/source/versions/v5/js/user-createexternalaccount-redirecturl.md b/packages/upgrade/source/versions/core-2/js/user-createexternalaccount-redirecturl.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/user-createexternalaccount-redirecturl.md rename to packages/upgrade/source/versions/core-2/js/user-createexternalaccount-redirecturl.md diff --git a/packages/upgrade/source/versions/v5/js/user-orgpublicdata-profileimageurl.md b/packages/upgrade/source/versions/core-2/js/user-orgpublicdata-profileimageurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/js/user-orgpublicdata-profileimageurl.md rename to packages/upgrade/source/versions/core-2/js/user-orgpublicdata-profileimageurl.md diff --git a/packages/upgrade/source/versions/v5/nextjs/api-url-value-change.md b/packages/upgrade/source/versions/core-2/nextjs/api-url-value-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/api-url-value-change.md rename to packages/upgrade/source/versions/core-2/nextjs/api-url-value-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/auth-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/auth-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/auth-middleware-deprecated.md b/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/auth-middleware-deprecated.md rename to packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md diff --git a/packages/upgrade/source/versions/v5/nextjs/authmiddleware-apikey.md b/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/authmiddleware-apikey.md rename to packages/upgrade/source/versions/core-2/nextjs/authmiddleware-apikey.md diff --git a/packages/upgrade/source/versions/v5/nextjs/authmiddleware-frontendapi.md b/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/authmiddleware-frontendapi.md rename to packages/upgrade/source/versions/core-2/nextjs/authmiddleware-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/nextjs/authmiddleware-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/authmiddleware-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/buildclerkprops-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/buildclerkprops-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/clerk-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/clerk-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/clerk-js-version-next-public.md b/packages/upgrade/source/versions/core-2/nextjs/clerk-js-version-next-public.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/clerk-js-version-next-public.md rename to packages/upgrade/source/versions/core-2/nextjs/clerk-js-version-next-public.md diff --git a/packages/upgrade/source/versions/v5/nextjs/constants-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/constants-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/createauthenticaterequest-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/createauthenticaterequest-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/createclerkclient-apikey.md b/packages/upgrade/source/versions/core-2/nextjs/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/createclerkclient-apikey.md rename to packages/upgrade/source/versions/core-2/nextjs/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/v5/nextjs/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/core-2/nextjs/createclerkclient-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/createclerkclient-frontendapi.md rename to packages/upgrade/source/versions/core-2/nextjs/createclerkclient-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/nextjs/createisomorphicrequest-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/createisomorphicrequest-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/currentuser-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/currentuser-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/decodejwt-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/decodejwt-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/emaillinkerrorcode-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/getauth-apikey.md b/packages/upgrade/source/versions/core-2/nextjs/getauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/getauth-apikey.md rename to packages/upgrade/source/versions/core-2/nextjs/getauth-apikey.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-api-url.md b/packages/upgrade/source/versions/core-2/nextjs/import-api-url.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-api-url.md rename to packages/upgrade/source/versions/core-2/nextjs/import-api-url.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-api-version.md b/packages/upgrade/source/versions/core-2/nextjs/import-api-version.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-api-version.md rename to packages/upgrade/source/versions/core-2/nextjs/import-api-version.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-clerk-js-url.md b/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-url.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-clerk-js-url.md rename to packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-url.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-clerk-js-version.md b/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-version.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-clerk-js-version.md rename to packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-version.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-domain.md b/packages/upgrade/source/versions/core-2/nextjs/import-domain.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-domain.md rename to packages/upgrade/source/versions/core-2/nextjs/import-domain.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-is-satellite.md b/packages/upgrade/source/versions/core-2/nextjs/import-is-satellite.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-is-satellite.md rename to packages/upgrade/source/versions/core-2/nextjs/import-is-satellite.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-nextjs-api.md b/packages/upgrade/source/versions/core-2/nextjs/import-nextjs-api.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-nextjs-api.md rename to packages/upgrade/source/versions/core-2/nextjs/import-nextjs-api.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-nextjs-app-beta.md b/packages/upgrade/source/versions/core-2/nextjs/import-nextjs-app-beta.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-nextjs-app-beta.md rename to packages/upgrade/source/versions/core-2/nextjs/import-nextjs-app-beta.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-nextjs-edge-middleware.md b/packages/upgrade/source/versions/core-2/nextjs/import-nextjs-edge-middleware.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-nextjs-edge-middleware.md rename to packages/upgrade/source/versions/core-2/nextjs/import-nextjs-edge-middleware.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-nextjs-edge-middlewarefiles.md b/packages/upgrade/source/versions/core-2/nextjs/import-nextjs-edge-middlewarefiles.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-nextjs-edge-middlewarefiles.md rename to packages/upgrade/source/versions/core-2/nextjs/import-nextjs-edge-middlewarefiles.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-nextjs-ssr.md b/packages/upgrade/source/versions/core-2/nextjs/import-nextjs-ssr.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-nextjs-ssr.md rename to packages/upgrade/source/versions/core-2/nextjs/import-nextjs-ssr.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-proxy-url.md b/packages/upgrade/source/versions/core-2/nextjs/import-proxy-url.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-proxy-url.md rename to packages/upgrade/source/versions/core-2/nextjs/import-proxy-url.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-publishable-key.md b/packages/upgrade/source/versions/core-2/nextjs/import-publishable-key.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-publishable-key.md rename to packages/upgrade/source/versions/core-2/nextjs/import-publishable-key.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-secret-key.md b/packages/upgrade/source/versions/core-2/nextjs/import-secret-key.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-secret-key.md rename to packages/upgrade/source/versions/core-2/nextjs/import-secret-key.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-sign-in-url.md b/packages/upgrade/source/versions/core-2/nextjs/import-sign-in-url.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-sign-in-url.md rename to packages/upgrade/source/versions/core-2/nextjs/import-sign-in-url.md diff --git a/packages/upgrade/source/versions/v5/nextjs/import-sign-up-url.md b/packages/upgrade/source/versions/core-2/nextjs/import-sign-up-url.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/import-sign-up-url.md rename to packages/upgrade/source/versions/core-2/nextjs/import-sign-up-url.md diff --git a/packages/upgrade/source/versions/v5/nextjs/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/isclerkapiresponserror-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/isemaillinkerror-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/isknownerror-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/isknownerror-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/min-nextjs-version.md b/packages/upgrade/source/versions/core-2/nextjs/min-nextjs-version.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/min-nextjs-version.md rename to packages/upgrade/source/versions/core-2/nextjs/min-nextjs-version.md diff --git a/packages/upgrade/source/versions/v5/nextjs/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/multisessionappsupport-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/next-public-clerk-js-url.md b/packages/upgrade/source/versions/core-2/nextjs/next-public-clerk-js-url.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/next-public-clerk-js-url.md rename to packages/upgrade/source/versions/core-2/nextjs/next-public-clerk-js-url.md diff --git a/packages/upgrade/source/versions/v5/nextjs/redirect-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/redirect-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/redirecttosignin-import-path.md b/packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/redirecttosignin-import-path.md rename to packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md diff --git a/packages/upgrade/source/versions/v5/nextjs/redirecttosignup-import-path.md b/packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/redirecttosignup-import-path.md rename to packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md diff --git a/packages/upgrade/source/versions/v5/nextjs/signjwt-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/signjwt-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/verifyjwt-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/verifyjwt-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/verifytoken-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/verifytoken-import-change.md rename to packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md diff --git a/packages/upgrade/source/versions/v5/nextjs/with-clerk-middleware-removed.md b/packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/nextjs/with-clerk-middleware-removed.md rename to packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md diff --git a/packages/upgrade/source/versions/v5/node/api-url-value-change.md b/packages/upgrade/source/versions/core-2/node/api-url-value-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/api-url-value-change.md rename to packages/upgrade/source/versions/core-2/node/api-url-value-change.md diff --git a/packages/upgrade/source/versions/v5/node/cjs-esm-instance.md b/packages/upgrade/source/versions/core-2/node/cjs-esm-instance.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/cjs-esm-instance.md rename to packages/upgrade/source/versions/core-2/node/cjs-esm-instance.md diff --git a/packages/upgrade/source/versions/v5/node/clerk-import-change.md b/packages/upgrade/source/versions/core-2/node/clerk-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/clerk-import-change.md rename to packages/upgrade/source/versions/core-2/node/clerk-import-change.md diff --git a/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-apikey.md b/packages/upgrade/source/versions/core-2/node/clerkexpressrequireauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-apikey.md rename to packages/upgrade/source/versions/core-2/node/clerkexpressrequireauth-apikey.md diff --git a/packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-frontendapi.md b/packages/upgrade/source/versions/core-2/node/clerkexpressrequireauth-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/clerkexpressrequireauth-frontendapi.md rename to packages/upgrade/source/versions/core-2/node/clerkexpressrequireauth-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-apikey.md b/packages/upgrade/source/versions/core-2/node/clerkexpresswithauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/clerkexpresswithauth-apikey.md rename to packages/upgrade/source/versions/core-2/node/clerkexpresswithauth-apikey.md diff --git a/packages/upgrade/source/versions/v5/node/clerkexpresswithauth-frontendapi.md b/packages/upgrade/source/versions/core-2/node/clerkexpresswithauth-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/clerkexpresswithauth-frontendapi.md rename to packages/upgrade/source/versions/core-2/node/clerkexpresswithauth-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/node/createclerkclient-apikey.md b/packages/upgrade/source/versions/core-2/node/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/createclerkclient-apikey.md rename to packages/upgrade/source/versions/core-2/node/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/v5/node/createclerkclient-frontendapi.md b/packages/upgrade/source/versions/core-2/node/createclerkclient-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/createclerkclient-frontendapi.md rename to packages/upgrade/source/versions/core-2/node/createclerkclient-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-apikey.md b/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-apikey.md rename to packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-apikey.md diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-frontendapi.md b/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/createclerkexpressrequireauth-frontendapi.md rename to packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-apikey.md b/packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-apikey.md rename to packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-apikey.md diff --git a/packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-frontendapi.md b/packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/createclerkexpresswithauth-frontendapi.md rename to packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md b/packages/upgrade/source/versions/core-2/node/legacyauthobject-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/legacyauthobject-removed.md rename to packages/upgrade/source/versions/core-2/node/legacyauthobject-removed.md diff --git a/packages/upgrade/source/versions/v5/node/setclerkapikey.md b/packages/upgrade/source/versions/core-2/node/setclerkapikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/setclerkapikey.md rename to packages/upgrade/source/versions/core-2/node/setclerkapikey.md diff --git a/packages/upgrade/source/versions/v5/node/setclerkapiversion.md b/packages/upgrade/source/versions/core-2/node/setclerkapiversion.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/setclerkapiversion.md rename to packages/upgrade/source/versions/core-2/node/setclerkapiversion.md diff --git a/packages/upgrade/source/versions/v5/node/setclerkhttpoptions.md b/packages/upgrade/source/versions/core-2/node/setclerkhttpoptions.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/setclerkhttpoptions.md rename to packages/upgrade/source/versions/core-2/node/setclerkhttpoptions.md diff --git a/packages/upgrade/source/versions/v5/node/setclerkserverapiurl.md b/packages/upgrade/source/versions/core-2/node/setclerkserverapiurl.md similarity index 100% rename from packages/upgrade/source/versions/v5/node/setclerkserverapiurl.md rename to packages/upgrade/source/versions/core-2/node/setclerkserverapiurl.md diff --git a/packages/upgrade/source/versions/v5/react/api-url-value-change.md b/packages/upgrade/source/versions/core-2/react/api-url-value-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/react/api-url-value-change.md rename to packages/upgrade/source/versions/core-2/react/api-url-value-change.md diff --git a/packages/upgrade/source/versions/v5/remix/clerk-import-change.md b/packages/upgrade/source/versions/core-2/remix/clerk-import-change.md similarity index 100% rename from packages/upgrade/source/versions/v5/remix/clerk-import-change.md rename to packages/upgrade/source/versions/core-2/remix/clerk-import-change.md diff --git a/packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md b/packages/upgrade/source/versions/core-2/remix/clerkerrorboundary-removed.md similarity index 100% rename from packages/upgrade/source/versions/v5/remix/clerkerrorboundary-removed.md rename to packages/upgrade/source/versions/core-2/remix/clerkerrorboundary-removed.md diff --git a/packages/upgrade/source/versions/v5/remix/createclerkclient-apikey.md b/packages/upgrade/source/versions/core-2/remix/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/remix/createclerkclient-apikey.md rename to packages/upgrade/source/versions/core-2/remix/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/v5/remix/getauth-apikey.md b/packages/upgrade/source/versions/core-2/remix/getauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/remix/getauth-apikey.md rename to packages/upgrade/source/versions/core-2/remix/getauth-apikey.md diff --git a/packages/upgrade/source/versions/v5/remix/rootauthloader-apikey.md b/packages/upgrade/source/versions/core-2/remix/rootauthloader-apikey.md similarity index 100% rename from packages/upgrade/source/versions/v5/remix/rootauthloader-apikey.md rename to packages/upgrade/source/versions/core-2/remix/rootauthloader-apikey.md diff --git a/packages/upgrade/source/versions/v5/remix/rootauthloader-frontendapi.md b/packages/upgrade/source/versions/core-2/remix/rootauthloader-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/v5/remix/rootauthloader-frontendapi.md rename to packages/upgrade/source/versions/core-2/remix/rootauthloader-frontendapi.md diff --git a/packages/upgrade/source/versions/v5/shared/getrequesturl.md b/packages/upgrade/source/versions/core-2/shared/getrequesturl.md similarity index 100% rename from packages/upgrade/source/versions/v5/shared/getrequesturl.md rename to packages/upgrade/source/versions/core-2/shared/getrequesturl.md diff --git a/packages/upgrade/source/versions/v5/shared/organizationcontext.md b/packages/upgrade/source/versions/core-2/shared/organizationcontext.md similarity index 100% rename from packages/upgrade/source/versions/v5/shared/organizationcontext.md rename to packages/upgrade/source/versions/core-2/shared/organizationcontext.md diff --git a/packages/upgrade/source/versions/v5/shared/useorganizationlist-organizationlist.md b/packages/upgrade/source/versions/core-2/shared/useorganizationlist-organizationlist.md similarity index 84% rename from packages/upgrade/source/versions/v5/shared/useorganizationlist-organizationlist.md rename to packages/upgrade/source/versions/core-2/shared/useorganizationlist-organizationlist.md index f80c5531cee..8ba2602a28f 100644 --- a/packages/upgrade/source/versions/v5/shared/useorganizationlist-organizationlist.md +++ b/packages/upgrade/source/versions/core-2/shared/useorganizationlist-organizationlist.md @@ -9,11 +9,11 @@ The deprecated `organizationList` param to `useOrganizationList` has been remove ```js // before const { organizationList } = useOrganizationList({ - organizationList: { limit: 10, offset: 1 }, + organizationList: { limit: 10, offset: 1 }, }); // after const { memberships } = useOrganizationList({ - userMemberships: { initialPage: 1, pageSize: 10 }, + userMemberships: { initialPage: 1, pageSize: 10 }, }); ``` From 7b8f7ec5ddc4f03a2ea8ba86cc06cd8638ff7b77 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Sun, 18 Feb 2024 21:30:00 -0500 Subject: [PATCH 106/159] chore(upgrade): Add note about gatsby, go, ruby sdks to overview --- .../upgrade/source/guide-generators/core-2/overview/intro.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx index 1cbef196a34..a0a2dfdc251 100644 --- a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx @@ -29,3 +29,5 @@ Select the SDK(s) you are using for your project from the list below to get star - [Backend](/backend) - [JS](/js) - [Chrome Extension](/chrome-extension) + +Note that the `Gastsby`, `Go`, and `Ruby` SDKs do not yet have a beta release ready - if you are using any of these SDKs there is nothing actionable right now. From 97c1df01f728eea4979c31fb73c6aee435b91db3 Mon Sep 17 00:00:00 2001 From: Stefanos Anagnostou Date: Wed, 21 Feb 2024 03:11:44 +0200 Subject: [PATCH 107/159] fix(upgrade): Add the latest changes of retheme project (#2805) * fix(upgrade): Add the latest changes of retheme project This includes a breaking changes section. * chore(repo): Update with the latest localization changes * chore(repo): Fix the slashes --- .changeset/strange-paws-sparkle.md | 2 + .../guide-generators/core-2/retheme/index.js | 6 +- .../appearance-variables-breaking-changes.md | 15 ++ .../common/changed-localization-keys.md | 32 ++-- .../core-2/common/new-localization-keys.md | 166 +++++++----------- .../common/removed-localization-keys.md | 90 +++++----- .../upgrade/source/versions/core-2/index.js | 1 + 7 files changed, 149 insertions(+), 163 deletions(-) create mode 100644 .changeset/strange-paws-sparkle.md create mode 100644 packages/upgrade/source/versions/core-2/common/appearance-variables-breaking-changes.md diff --git a/.changeset/strange-paws-sparkle.md b/.changeset/strange-paws-sparkle.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/strange-paws-sparkle.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/upgrade/source/guide-generators/core-2/retheme/index.js b/packages/upgrade/source/guide-generators/core-2/retheme/index.js index d4b49a59097..78b4345aa7d 100644 --- a/packages/upgrade/source/guide-generators/core-2/retheme/index.js +++ b/packages/upgrade/source/guide-generators/core-2/retheme/index.js @@ -18,8 +18,7 @@ async function generate() { - The default \`colorPrimary\` value changed from \`#103FEF\` to \`#2F3037\`. As the new color is a dark grey, the \`colorPrimary\` of the dark theme was changed to \`#FFFFFF\`. - The default \`fontSize\` value changed from \`1rem\` to \`0.8125rem\` - - The default \`fontWeight\` values changed from \`{ normal: 400, medium: 500, bold: 600 }\` to \`{ normal: 400, medium: 500, bold: 700 }\` - - Previously, the default value for \`fontSmoothing\` was \`auto\`. This value is now unset. If you want to pass a custom value to it, you can still do so.\n`, + - The default \`fontWeight\` values changed from \`{ normal: 400, medium: 500, bold: 600 }\` to \`{ normal: 400, medium: 500, semibold: 600, bold: 700 }\`.\n`, }; return assembleContent({ data: data, cwd }, [ @@ -30,7 +29,8 @@ async function generate() { '# Redesigned Components in v5', markdown('intro'), '## Appearance Changes', - accordionForCategory('appearance', { additionalItems: defaultsChangeItem }), + accordionForCategory('appearance-breaking-changes'), + accordionForCategory('appearance', { additionalItems: [defaultsChangeItem] }), '## Localization Changes', accordionForCategory('localization'), ]); diff --git a/packages/upgrade/source/versions/core-2/common/appearance-variables-breaking-changes.md b/packages/upgrade/source/versions/core-2/common/appearance-variables-breaking-changes.md new file mode 100644 index 00000000000..9f948e980ae --- /dev/null +++ b/packages/upgrade/source/versions/core-2/common/appearance-variables-breaking-changes.md @@ -0,0 +1,15 @@ +--- +title: 'Breaking Changes to appearance variables' +matcherFlags: 'm' +category: 'appearance-breaking-changes' +matcher: + - "variables:\\s+{[\\s\\S]*?fontSmoothing:" + - "variables:\\s+{[\\s\\S]*?shadowShimmer:" + - "variables:\\s+{[\\s\\S]*?colorAlphaShade:" +--- + +Several appearance variables have been removed or renamed. If you were using these variables in your application, you will need to update your code to use the new variables. + +- The \`fontSmoothing\` variable has been removed. +- The \`shadowShimmer\` variable has been removed. +- The \`colorAlphaShade\` variable has been renamed to \`colorNeutral\`. diff --git a/packages/upgrade/source/versions/core-2/common/changed-localization-keys.md b/packages/upgrade/source/versions/core-2/common/changed-localization-keys.md index 9e1eeedb1ed..fb3c69351e0 100644 --- a/packages/upgrade/source/versions/core-2/common/changed-localization-keys.md +++ b/packages/upgrade/source/versions/core-2/common/changed-localization-keys.md @@ -22,27 +22,27 @@ matcher: - "signIn:\\s+{[\\s\\S]*?phoneCodeMfa:\\s+{[\\s\\S]*?subtitle:" - "signIn:\\s+{[\\s\\S]*?totpMfa:\\s+{[\\s\\S]*?subtitle:" - "signIn:\\s+{[\\s\\S]*?backupCodeMfa:\\s+{[\\s\\S]*?subtitle:" - - "userProfile:\\s+{[\\s\\S]*?formButtonPrimary__continue:" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__account" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?profileSection:\\s+{[\\s\\S]*?primaryButton:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__account:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?primaryButton:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsAction__unverified:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?destructiveAction:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?phoneNumbersSection:\\s+{[\\s\\S]*?primaryButton:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?destructiveActionLabel:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?backupCodes:\\s+{[\\s\\S]*?actionLabel__regenerate:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?title:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?deleteAccountButton:" - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?imageFormSubtitle:" - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?imageFormDestructiveActionSubtitle:" - - "userProfile:\\s+{[\\s\\S]*?phoneNumberPage:\\s+{[\\s\\S]*?title:" + - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?fileDropAreaHint:" - "userProfile:\\s+{[\\s\\S]*?phoneNumberPage:\\s+{[\\s\\S]*?infoText:" - "userProfile:\\s+{[\\s\\S]*?connectedAccountPage:\\s+{[\\s\\S]*?socialButtonsBlockButton:" + - "userProfile:\\s+{[\\s\\S]*?mfaPhoneCodePage:\\s+{[\\s\\S]*?primaryButton__addPhoneNumber:" - "userProfile:\\s+{[\\s\\S]*?mfaPhoneCodePage:\\s+{[\\s\\S]*?subtitle__availablePhoneNumbers:" - "userProfile:\\s+{[\\s\\S]*?mfaPhoneCodePage:\\s+{[\\s\\S]*?subtitle__unavailablePhoneNumbers:" - "userProfile:\\s+{[\\s\\S]*?deletePage:\\s+{[\\s\\S]*?actionDescription:" - "organizationSwitcher:\\s+{[\\s\\S]*?action__createOrganization:" - "organizationSwitcher:\\s+{[\\s\\S]*?action__manageOrganization:" - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?title:" - - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?title:" - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?leaveOrganization:\\s+{[\\s\\S]*?actionDescription:" - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?deleteOrganization:\\s+{[\\s\\S]*?actionDescription:" - "organizationProfile:\\s+{[\\s\\S]*?invitePage:\\s+{[\\s\\S]*?title:" @@ -102,16 +102,16 @@ const changedValues = { }, }, userProfile: { - formButtonPrimary__continue: 'Save', start: { headerTitle__account: 'Profile details', - profileSection: { - primaryButton: 'Edit profile', - }, emailAddressesSection: { + primaryButton: 'Add email address', detailsAction__unverified: 'Verify', destructiveAction: 'Remove email', }, + phoneNumbersSection: { + primaryButton: 'Add phone number', + }, mfaSection: { phoneCode: { destructiveActionLabel: 'Remove', @@ -121,30 +121,31 @@ const changedValues = { }, }, dangerSection: { - title: 'Account termination', + title: 'Delete account', deleteAccountButton: 'Delete account', }, }, profilePage: { imageFormSubtitle: 'Upload', imageFormDestructiveActionSubtitle: 'Remove', + fileDropAreaHint: 'Recommended size 1:1, up to 10MB.', }, phoneNumberPage: { - title: 'Add a phone number', infoText: - 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', + 'A text message containing a verification code will be sent to this phone number. Message and data rates may apply.', }, connectedAccountPage: { socialButtonsBlockButton: '{{provider|titleize}}', }, mfaPhoneCodePage: { + primaryButton__addPhoneNumber: 'Add phone number', subtitle__availablePhoneNumbers: 'Select an existing phone number to register for SMS code two-step verification or add a new one.', subtitle__unavailablePhoneNumbers: 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', }, deletePage: { - actionDescription: 'Type "Delete account" below to continue.', + actionDescription: "Type 'Delete account' below to continue.", }, }, organizationSwitcher: { @@ -155,12 +156,11 @@ const changedValues = { profilePage: { title: 'Update Profile', dangerSection: { - title: 'Danger', leaveOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', + actionDescription: "Type '{{organizationName}}' below to continue.", }, deleteOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', + actionDescription: "Type '{{organizationName}}' below to continue.", }, }, }, diff --git a/packages/upgrade/source/versions/core-2/common/new-localization-keys.md b/packages/upgrade/source/versions/core-2/common/new-localization-keys.md index 41bb37d211e..afeddaee25d 100644 --- a/packages/upgrade/source/versions/core-2/common/new-localization-keys.md +++ b/packages/upgrade/source/versions/core-2/common/new-localization-keys.md @@ -10,125 +10,87 @@ As part of the redesign of Clerk's components, a number of new localization keys ```js const newValues = { - formFieldLabel__organizationName: 'Name', - formFieldLabel__organizationSlug: 'Slug', - formFieldInputPlaceholder__emailAddresses: 'example@email.com, example2@email.com', - formFieldInputPlaceholder__organizationSlug: 'my-org', - signUp: { - start: { - subtitle: 'Welcome! Please fill in the details to get started.', - actionText: 'Already have an account?', - }, - emailCode: { - subtitle: 'Enter the verification code sent to your email', + formButtonPrimary__verify: 'Verify', + formFieldInputPlaceholder__confirmDeletionUserAccount: 'Delete account', + organizationProfile: { + invitePage: { + selectDropdown__role: 'Select role', }, - phoneCode: { - subtitle: 'Enter the verification code sent to your phone', + navbar: { + description: 'Manage your organization.', + general: 'General', + members: 'Members', + title: 'Organization', }, - continue: { - subtitle: 'Please fill in the remaining details to continue.', - actionText: 'Already have an account?', + profilePage: { + domainSection: { + menuAction__manage: 'Manage', + menuAction__remove: 'Delete', + menuAction__verify: 'Verify', + }, }, - }, - signIn: { start: { - title: 'Sign in to {{applicationName}}', - subtitle: 'Welcome back! Please sign in to continue', - actionText: 'Don’t have an account?', - }, - password: { - subtitle: 'Enter the password associated with your account', - }, - forgotPasswordAlternativeMethods: { - label__alternativeMethods: 'Or, sign in with another method', + headerTitle__general: 'General', + profileSection: { + primaryButton: 'Edit profile', + title: 'Organization Profile', + uploadAction__title: 'Logo', + }, }, - resetPassword: { - title: 'Set new password', + verifiedDomainPage: { + title: 'Update {{domain}}', }, - phoneCodeMfa: { - subtitle: 'To continue, please enter the verification code sent to your phone', + }, + signIn: { + accountSwitcher: { + action__addAccount: 'Add account', + action__signOutAll: 'Sign out of all accounts', + subtitle: 'Select the account with which you wish to continue.', + title: 'Choose an account', }, - totpMfa: { - subtitle: 'To continue, please enter the verification code generated by your authenticator app', + alternativeMethods: { + actionText: 'Don’t have any of these?', + subtitle: 'Facing issues? You can use any of these methods to sign in.', }, - backupCodeMfa: { - subtitle: 'Your backup code is the one you got when setting up two-step authentication.', + forgotPassword: { + subtitle_email: 'First, enter the code sent to your email ID', + subtitle_phone: 'First, enter the code sent to your phone', + title: 'Reset password', }, }, + unstable__errors: { + form_param_format_invalid__phone_number: 'Phone number must be in a valid international format', + }, userProfile: { - formButtonPrimary__continue: 'Save', - start: { - headerTitle__account: 'Profile details', - profileSection: { - primaryButton: 'Edit profile', - }, - emailAddressesSection: { - detailsAction__unverified: 'Verify', - destructiveAction: 'Remove email', - }, - mfaSection: { - phoneCode: { - destructiveActionLabel: 'Remove', - }, - backupCodes: { - actionLabel__regenerate: 'Regenerate', - }, - }, - dangerSection: { - title: 'Account termination', - deleteAccountButton: 'Delete account', - }, - }, - profilePage: { - imageFormSubtitle: 'Upload', - imageFormDestructiveActionSubtitle: 'Remove', - }, - phoneNumberPage: { - title: 'Add a phone number', - infoText: - 'A text message containing a verification link will be sent to this phone number. Message and data rates may apply.', - }, - connectedAccountPage: { - socialButtonsBlockButton: '{{provider|titleize}}', + emailAddressPage: { + verifyTitle: 'Verify email address', }, + formButtonPrimary__add: 'Add', + formButtonPrimary__remove: 'Remove', + formButtonPrimary__save: 'Save', mfaPhoneCodePage: { - subtitle__availablePhoneNumbers: - 'Select an existing phone number to register for SMS code two-step verification or add a new one.', - subtitle__unavailablePhoneNumbers: - 'There are no available phone numbers to register for SMS code two-step verification, please add a new one.', + backButton: 'Use existing number', + successMessage1: + 'When signing in, you will need to enter a verification code sent to this phone number as an additional step.', + successMessage2: + 'Save these backup codes and store them somewhere safe. If you lose access to your authentication device, you can use backup codes to sign in.', + successTitle: 'SMS code verification enabled', + }, + navbar: { + account: 'Profile', + description: 'Manage your account info.', + security: 'Security', + title: 'Account', }, - deletePage: { - actionDescription: 'Type "Delete account" below to continue.', + phoneNumberPage: { + verifySubtitle: 'Enter the verification code sent to {{identifier}}', + verifyTitle: 'Verify phone number', }, - }, - organizationSwitcher: { - action__createOrganization: 'Create organization', - action__manageOrganization: 'Manage', - }, - organizationProfile: { - profilePage: { - title: 'Update Profile', - dangerSection: { - title: 'Danger', - leaveOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', - }, - deleteOrganization: { - actionDescription: 'Type "{{organizationName}}" below to continue.', - }, + start: { + profileSection: { + primaryButton: 'Edit profile', }, }, - invitePage: { - title: 'Invite new members', - subtitle: 'Enter or paste one or more email addresses, separated by spaces or commas.', - }, - }, - createOrganization: { - title: 'Create organization', - }, - organizationList: { - title: 'Choose an account', - titleWithoutPersonal: 'Choose an organization', }, }; ``` diff --git a/packages/upgrade/source/versions/core-2/common/removed-localization-keys.md b/packages/upgrade/source/versions/core-2/common/removed-localization-keys.md index 67bcd2f37ee..04fa02e7054 100644 --- a/packages/upgrade/source/versions/core-2/common/removed-localization-keys.md +++ b/packages/upgrade/source/versions/core-2/common/removed-localization-keys.md @@ -3,6 +3,12 @@ title: 'Removed localization keys' matcherFlags: 'm' category: 'localization' matcher: + - 'formFieldLabel__emailAddress_phoneNumber:' + - 'formFieldLabel__phoneNumber_username:' + - 'formFieldLabel__emailAddress_phoneNumber_username:' + - 'formFieldInputPlaceholder__emailAddress_phoneNumber:' + - 'formFieldInputPlaceholder__phoneNumber_username:' + - 'formFieldInputPlaceholder__emailAddress_phoneNumber_username:' - "signIn:\\s+{[\\s\\S]*?forgotPassword:\\s+{[\\s\\S]*?title_email:" - "signIn:\\s+{[\\s\\S]*?forgotPassword:\\s+{[\\s\\S]*?title_phone:" - "signIn:\\s+{[\\s\\S]*?forgotPassword:\\s+{[\\s\\S]*?formSubtitle_email:" @@ -12,7 +18,9 @@ matcher: - "signIn:\\s+{[\\s\\S]*?phoneCodeMfa:\\s+{[\\s\\S]*?formSubtitle:" - "signIn:\\s+{[\\s\\S]*?totpMfa:\\s+{[\\s\\S]*?formSubtitle:" - "signIn:\\s+{[\\s\\S]*?backupCodeMfa:\\s+{[\\s\\S]*?formTitle:" - - "signIn:\\s+{[\\s\\S]*?backupCodeMfa:\\s+{[\\s\\S]*?formSubTitle:" + - "signIn:\\s+{[\\s\\S]*?backupCodeMfa:\\s+{[\\s\\S]*?formSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__account:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__security:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsTitle__primary:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsSubtitle__primary:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsTitle__nonPrimary:" @@ -32,20 +40,19 @@ matcher: - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?title__conectionFailed:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?title__connectionFailed:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?title__reauthorize:" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?subtitle__reauthorize:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?actionLabel__conectionFailed:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?destructiveActionSubtitle:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?destructiveActionAccordionSubtitle:" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.destructiveActionTitle" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.destructiveActionSubtitle" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.title__default" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.title__setDefault" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.subtitle__default" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:.subtitle__setDefault" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:.title" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:.subtitle" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:.destructiveActionSubtitle" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:.destructiveActionLabel" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?destructiveActionTitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?destructiveActionSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?title__default:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?title__setDefault:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?subtitle__default:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?subtitle__setDefault:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:\\s+{[\\s\\S]*?title:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:\\s+{[\\s\\S]*?subtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:\\s+{[\\s\\S]*?destructiveActionSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?totp:\\s+{[\\s\\S]*?destructiveActionLabel:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?activeDevicesSection:\\s+{[\\s\\S]*?primaryButton:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?activeDevicesSection:\\s+{[\\s\\S]*?detailsTitle:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?activeDevicesSection:\\s+{[\\s\\S]*?detailsSubtitle:" @@ -55,33 +62,35 @@ matcher: - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?web3WalletsSection:\\s+{[\\s\\S]*?destructiveActionSubtitle:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?deleteAccountTitle:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?deleteAccountDescription:" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__account:" - - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__security:" + - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?fileDropAreaTitle:" + - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?fileDropAreaAction:" + - "userProfile:\\s+{[\\s\\S]*?phoneNumberPage:\\s+{[\\s\\S]*?infoText__secondary:" + - "userProfile:\\s+{[\\s\\S]*?mfaPhoneCodePage:\\s+{[\\s\\S]*?successMessage:" - "organizationProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__settings:" - "organizationProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__members:" - "organizationProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__settings:" + - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?subtitle:" - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?domainSection:\\s+{[\\s\\S]*?unverifiedDomain_menuAction__verify:" - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?domainSection:\\s+{[\\s\\S]*?unverifiedDomain_menuAction__remove:" - - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?subtitle" - - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__active" - - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__invited" - - "createOrganization:\\s+{[\\s\\S]*?subtitle" - - 'formFieldLabel__emailAddress_phoneNumber:' - - 'formFieldLabel__phoneNumber_username:' - - 'formFieldLabel__emailAddress_phoneNumber_username:' - - 'formFieldInputPlaceholder__emailAddress_phoneNumber:' - - 'formFieldInputPlaceholder__phoneNumber_username:' - - 'formFieldInputPlaceholder__emailAddress_phoneNumber_username:' - - "userProfile:\\s+{[\\s\\S]*?phoneNumberPage:\\s+{[\\s\\S]*?infoText__secondary:" - - "userProfile:\\s+{[\\s\\S]*?mfaPhoneCodePage:\\s+{[\\s\\S]*?successMessage:" - - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?fileDropAreaTitle:" - - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?fileDropAreaAction:" + - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__active:" + - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__invited:" + - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?invitationsTab:\\s+{[\\s\\S]*?manualInvitations:\\s+{[\\s\\S]*?headerTitle:" + - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?invitationsTab:\\s+{[\\s\\S]*?manualInvitations:\\s+{[\\s\\S]*?headerSubtitle:" + - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?requestsTab:\\s+{[\\s\\S]*?requests:\\s+{[\\s\\S]*?headerTitle:" + - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?requestsTab:\\s+{[\\s\\S]*?requests:\\s+{[\\s\\S]*?headerSubtitle:" + - "createOrganization:\\s+{[\\s\\S]*?subtitle:" --- As part of the redesign of Clerk's components, a number of localization keys have been removed as they were no longer present in the new designs. You should remove any of these keys that are present in your localization object as they are no longer needed. ```js const deletedKeys = [ + 'formFieldLabel__emailAddress_phoneNumber', + 'formFieldLabel__phoneNumber_username', + 'formFieldLabel__emailAddress_phoneNumber_username', + 'formFieldInputPlaceholder__emailAddress_phoneNumber', + 'formFieldInputPlaceholder__phoneNumber_username', + 'formFieldInputPlaceholder__emailAddress_phoneNumber_username', 'signIn.forgotPassword.title_email', 'signIn.forgotPassword.title_phone', 'signIn.forgotPassword.formSubtitle_email', @@ -92,6 +101,8 @@ const deletedKeys = [ 'signIn.totpMfa.formSubtitle', 'signIn.backupCodeMfa.formTitle', 'signIn.backupCodeMfa.formSubtitle', + 'userProfile.start.headerSubtitle__account', + 'userProfile.start.headerSubtitle__security', 'userProfile.start.emailAddressesSection.detailsTitle__primary', 'userProfile.start.emailAddressesSection.detailsSubtitle__primary', 'userProfile.start.emailAddressesSection.detailsTitle__nonPrimary', @@ -111,7 +122,6 @@ const deletedKeys = [ 'userProfile.start.connectedAccountsSection.title__conectionFailed', 'userProfile.start.connectedAccountsSection.title__connectionFailed', 'userProfile.start.connectedAccountsSection.title__reauthorize', - 'userProfile.start.connectedAccountsSection.subtitle__reauthorize', 'userProfile.start.connectedAccountsSection.actionLabel__conectionFailed', 'userProfile.start.connectedAccountsSection.destructiveActionSubtitle', 'userProfile.start.connectedAccountsSection.destructiveActionAccordionSubtitle', @@ -134,27 +144,23 @@ const deletedKeys = [ 'userProfile.start.web3WalletsSection.destructiveActionSubtitle', 'userProfile.start.dangerSection.deleteAccountTitle', 'userProfile.start.dangerSection.deleteAccountDescription', - 'userProfile.start.headerSubtitle__account', - 'userProfile.start.headerSubtitle__security', + 'userProfile.profilePage.fileDropAreaTitle', + 'userProfile.profilePage.fileDropAreaAction', + 'userProfile.phoneNumberPage.infoText__secondary', + 'userProfile.mfaPhoneCodePage.successMessage', 'organizationProfile.start.headerTitle__settings', 'organizationProfile.start.headerSubtitle__members', 'organizationProfile.start.headerSubtitle__settings', + 'organizationProfile.profilePage.subtitle', 'organizationProfile.profilePage.domainSection.unverifiedDomain_menuAction__verify', 'organizationProfile.profilePage.domainSection.unverifiedDomain_menuAction__remove', - 'organizationProfile.profilePage.subtitle', 'organizationProfile.membersPage.start.headerTitle__active', 'organizationProfile.membersPage.start.headerTitle__invited', + 'organizationProfile.membersPage.invitationsTab.manualInvitations.headerTitle', + 'organizationProfile.membersPage.invitationsTab.manualInvitations.headerSubtitle', + 'organizationProfile.membersPage.requestsTab.requests.headerTitle', + 'organizationProfile.membersPage.requestsTab.requests.headerSubtitle', 'createOrganization.subtitle', - 'formFieldLabel__emailAddress_phoneNumber', - 'formFieldLabel__phoneNumber_username', - 'formFieldLabel__emailAddress_phoneNumber_username', - 'formFieldInputPlaceholder__emailAddress_phoneNumber', - 'formFieldInputPlaceholder__phoneNumber_username', - 'formFieldInputPlaceholder__emailAddress_phoneNumber_username', - 'userProfile.phoneNumberPage.infoText__secondary', - 'userProfile.mfaPhoneCodePage.successMessage', - 'userProfile.profilePage.fileDropAreaTitle', - 'userProfile.profilePage.fileDropAreaAction', ]; ``` diff --git a/packages/upgrade/source/versions/core-2/index.js b/packages/upgrade/source/versions/core-2/index.js index a5623654955..0259d8f9dbd 100644 --- a/packages/upgrade/source/versions/core-2/index.js +++ b/packages/upgrade/source/versions/core-2/index.js @@ -66,6 +66,7 @@ const reactChanges = [ 'min-react-version', 'externalaccount-avatarurl', 'organizationmembershippublicuserdata-profileimageurl', + 'appearance-variables-breaking-changes', ]; export default { From a10d89363b809aacecdca4ba2062f81bbc99dcec Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 21 Feb 2024 10:04:39 -0500 Subject: [PATCH 108/159] chore(upgrade): Some fixes for the next middleware guide --- .../core-2/nextjs/middleware-changes.mdx | 61 +++++++++---------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx b/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx index efa58d74283..30d7129bb2b 100644 --- a/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx +++ b/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx @@ -9,40 +9,39 @@ Additionally, there are now new helpers that enable controlling auth on a _per-p Sometimes, code speaks louder than words. Let's get right into an example: - -```ts filename="app/src/dashboard/layout.tsx" -import { auth } from '@clerk/nextjs/server' + + ```ts filename="app/src/dashboard/layout.tsx" + import { auth } from '@clerk/nextjs/server' -export default async function DashboardLayout({ children }) { - auth().protect(); - // 👆 This one line is all it takes - the layout and all its children - // will now redirect to your sign in page for un-authenticated users. + export default async function DashboardLayout({ children }) { + auth().protect(); + // 👆 This one line is all it takes - the layout and all its children + // will now redirect to your sign in page for un-authenticated users. - return <>{children} - -} + return <>{children} + } + ``` -```` - - -```ts filename="app/src/dashboard/page.tsx" -import { auth } from '@clerk/nextjs/server' + + + ```ts filename="app/src/dashboard/page.tsx" + import { auth } from '@clerk/nextjs/server' -export default async function DashboardPage() { - auth().protect(); - // 👆 This one line is all it takes - the layout and all its children - // will now redirect to your sign in page for un-authenticated users. + export default async function DashboardPage() { + auth().protect(); + // 👆 This one line is all it takes - the layout and all its children + // will now redirect to your sign in page for un-authenticated users. - return

This page is now protected!

-} -```` + return

This page is now protected!

+ } + ``` -
+
-In this example, you add `auth().protect()` to a layout, and like magic, that layout and all of it's children will be gated by auth. The same logic can be applied for pages. +In this example, you add `auth().protect()` to a layout and that layout and all of it's children will be gated by auth. The same logic can be applied for pages. -Want to get more specific with permission gating? Add the role you are gating as a param: +Want to get more specific with permission gating? Add the role you are gating as a param to `protect()` as such: ```ts filename="app/src/admin/layout.tsx" import { auth } from '@clerk/nextjs/server'; @@ -103,14 +102,14 @@ A couple things to note here: Clerk strongly recommends migrating to the new `clerkMiddleware()` for an improved DX and access to all present and upcoming features, but also want to note that `authMiddleware()`, while deprecated, will continue to work in v5 and will not be removed until the next major version, so you do not _need_ to make any changes to your Middleware setup this version. -The most basic migration will be updating the import and changing out the default export. +The most basic migration will be updating the import and changing out the default export, then mirroring the previous behavior of protecting all routes as such: ```diff - import { authMiddleware } from "@clerk/nextjs" + import { clerkMiddleware } from '@clerk/nextjs/server' - export default authMiddleware() -+ export default clerkMiddleware() ++ export default clerkMiddleware((auth) => auth().protect()) export const config = { matcher: ["/((?!.*\\..*|_next).*)", "/", "/(api|trpc)(.*)"], @@ -181,9 +180,7 @@ Of course, in most cases you'll have a more complicated setup than this. You can const isDashboardRoute = createRouteMatcher(["/dashboard(.*)"]) export default clerkMiddleware((auth, request) => { - if (isDashboardRoute(request)) { - auth().protect() - } + if (isDashboardRoute(request)) auth().protect() }) export const config = { @@ -235,9 +232,7 @@ Of course, in most cases you'll have a more complicated setup than this. You can const isDashboardRoute = createRouteMatcher(["/dashboard(.*)"]) export default clerkMiddleware((auth, request) => { - if (isDashboardRoute(request)) { - auth().protect() - } + if (isDashboardRoute(request)) auth().protect() return intlMiddleware(request) }) From 8d747eb42184f7cdc759480263a5b16905d11c61 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 21 Feb 2024 10:23:09 -0500 Subject: [PATCH 109/159] chore(upgrade): Some fixes for the next middleware guide --- .../core-2/nextjs/middleware-changes.mdx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx b/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx index 30d7129bb2b..9379ca44e29 100644 --- a/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx +++ b/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx @@ -118,9 +118,9 @@ The most basic migration will be updating the import and changing out the defaul Of course, in most cases you'll have a more complicated setup than this. You can find some examples below for how to migrate a few common use cases. Be sure to review the [`clerkMiddleware()` documentation](/docs/references/nextjs/clerk-middleware) and [route protection guide](/docs/references/nextjs/route-protection) if your specific use case is not mentioned. - + - By default, `clerkMiddleware()` treats all pages as public, so you no longer need to explcitly set `/` as public. + By default, `clerkMiddleware()` treats all pages as public unless explicitly protected. If you prefer for it to operate the other way around (all pages are protected unless explicitly made public), you can reverse the middleware logic in this way: Before: @@ -128,7 +128,7 @@ Of course, in most cases you'll have a more complicated setup than this. You can import { authMiddleware } from "@clerk/nextjs" export default authMiddleware({ - publicRoutes: ["/"], + publicRoutes: ["/", "/contact"], }) export const config = { @@ -144,7 +144,12 @@ Of course, in most cases you'll have a more complicated setup than this. You can createRouteMatcher } from "@clerk/nextjs/server" - export default clerkMiddleware() + const isPublicRoute = createRouteMatcher(["/", "/contact"]) + + export default clerkMiddleware((auth, req) => { + if (isPublicRoute(req)) return // if it's a public route, do nothing + auth().protect() // for any other route, require auth + }) export const config = { matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], @@ -153,7 +158,7 @@ Of course, in most cases you'll have a more complicated setup than this. You can - Having all routes public except everything under `/dashboard`. + An example can be seen below of code that ensures that all routes are public except everything under `/dashboard`. Before: From 82d74180fa30655ed28b00ea250add64d5c7058b Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 21 Feb 2024 16:54:33 -0500 Subject: [PATCH 110/159] chore(upgrade): A variety of adjustments to the text content of guides --- .../guide-generators/core-2/js/index.js | 5 ++- .../core-2/nextjs/import-changes.mdx | 4 +- .../core-2/nextjs/middleware-changes.mdx | 38 ++++--------------- .../guide-generators/core-2/retheme/index.js | 7 ++-- .../core-2/shared/prepare.mdx | 2 +- .../core-2/shared/redesign-preview.mdx | 2 +- .../appearance-variables-breaking-changes.md | 8 ++-- .../upgrade/source/versions/core-2/index.js | 9 ++++- 8 files changed, 29 insertions(+), 46 deletions(-) diff --git a/packages/upgrade/source/guide-generators/core-2/js/index.js b/packages/upgrade/source/guide-generators/core-2/js/index.js index 339420d2397..69731447fa4 100644 --- a/packages/upgrade/source/guide-generators/core-2/js/index.js +++ b/packages/upgrade/source/guide-generators/core-2/js/index.js @@ -9,7 +9,8 @@ import { writeToFile, } from '../../text-generation.js'; -const version = 'v5'; +const version = 'core-2'; +const semverVersion = 'v5'; const name = 'js'; const properName = 'Javascript'; const packageName = '@clerk/clerk-js'; @@ -25,7 +26,7 @@ async function generate() { }), `# Upgrading \`${packageName}\` to Core 2`, markdown('intro'), - markdownTemplate('prepare', { version, packageName }), + markdownTemplate('prepare', { version: semverVersion, packageName }), markdownTemplate('update-version', { packageName }), markdown('cli'), '## Breaking Changes', diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/import-changes.mdx b/packages/upgrade/source/guide-generators/core-2/nextjs/import-changes.mdx index 665ac825307..56747e93f9c 100644 --- a/packages/upgrade/source/guide-generators/core-2/nextjs/import-changes.mdx +++ b/packages/upgrade/source/guide-generators/core-2/nextjs/import-changes.mdx @@ -1,4 +1,4 @@ -## Changes to top-level exports +### Changes to top-level exports As part of this release, some of the top-level exports of `@clerk/nextjs` have been changed in order to improve bundle size and tree-shaking efficiency. These changes have resulted in a ~75% reduction in build size for middleware bundles. However, you will likely need to make some changes to import paths as a result. @@ -8,7 +8,7 @@ As part of this release, some of the top-level exports of `@clerk/nextjs` have b - Previously these exports have been exported both from `@clerk/nextjs` and `@clerk/nextjs/server`. As of v5 they are only exported from the latter. + Previously these exports have been exported both from `@clerk/nextjs` and `@clerk/nextjs/server`. As of v5 they are only exported from the latter. Going forward, the expectation can be that any imports that are intended to run within react on the client side, will come from `@clerk/nextjs` and imports that are intended to run on the server, will come from `@clerk/nextjs/server`. ```diff import { diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx b/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx index 9379ca44e29..0c9f802ca3d 100644 --- a/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx +++ b/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx @@ -1,10 +1,10 @@ -## New Middleware architecture +### New Middleware architecture -User and customer feedback about `authMiddleware()` has been clear in that Middleware logic was a often friction point. As such, in v5 you will find a completely new Middleware helper called [`clerkMiddleware()`](/docs/references/nextjs/clerk-middleware) that will hopefully alleviate all of the issues folks had with `authMiddleware()`. +User and customer feedback about `authMiddleware()` has been clear in that Middleware logic was a often friction point. As such, in v5 you will find a completely new Middleware helper called [`clerkMiddleware()`](/docs/references/nextjs/clerk-middleware) that should alleviate the issues folks had with `authMiddleware()`. Additionally, there are now new helpers that enable controlling auth on a _per-page and/or per-layout basis_ when using App Router. While you can still configure which routes are protected via Middleware, the page-based protection strategy is what is now recommended, as the co-location of auth protection configuration with the code for the pages themselves results in a superior developer experience that adds clarity as you navigate your codebase. -### Per-route auth config +#### Per-route auth config Sometimes, code speaks louder than words. Let's get right into an example: @@ -39,35 +39,13 @@ Sometimes, code speaks louder than words. Let's get right into an example: -In this example, you add `auth().protect()` to a layout and that layout and all of it's children will be gated by auth. The same logic can be applied for pages. +In this example, you add [`auth().protect()`](/docs/references/nextjs/auth#protect) to a layout and that layout and all of it's children will be gated by auth. The same logic can be applied for pages. -Want to get more specific with permission gating? Add the role you are gating as a param to `protect()` as such: - -```ts filename="app/src/admin/layout.tsx" -import { auth } from '@clerk/nextjs/server'; - -export default async function AdminLayout({ children }) { - auth().protect({ role: 'org:admin' }); - - return <>{children}; -} -``` - -Note that in order for this to work, you will still need Middleware to be present, but it only requires the most minimal configuration: - -```ts filename="middleware.ts" -import { clerkMiddleware } from '@clerk/nextjs/server'; - -export default clerkMiddleware(); - -export const config = { - matcher: ['/((?!.*\\..*|_next).*)', '/', '/(api|trpc)(.*)'], -}; -``` +For more details on route protection, check out the [route protection guide](/references/nextjs/route-protection). If you are using the pages router, per-route gating won't work. Instead, configure your auth gating via Middleware as described in the next section. -### Middleware auth config +#### Middleware auth config If you prefer to define your auth logic within the Middleware, you can still do this using the new `clerkMiddleware`. The primary change from the previous `authMiddleware()` is that `clerkMiddleware()` does not protect any routes by default, instead requiring the developer to add routes they would like to be protected by auth. This is a substantial contrast to the previous `authMiddleware()`, which protected all routes by default, requiring the developer to add exceptions. The API was also substantially simplified, and it has become easier to combine with other Middleware helpers smoothly as well. @@ -77,7 +55,7 @@ Here's an example that replicates the auth protection scheme above, but entirely import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'; const isDashboardRoute = createRouteMatcher(['/dashboard(.*)']); -const isAdminRoute = createRouteMatcher(['/admin']); +const isAdminRoute = createRouteMatcher(['/admin(.*)']); export default clerkMiddleware((auth, req) => { // Restrict admin route to users with specific role @@ -98,7 +76,7 @@ A couple things to note here: - With `clerkMiddleware`, you're defining the routes you want **to be protected**, rather than the routes you don't want to be protected. - You are able to use the same `auth().protect()` helpers that you can use within layouts/pages here in the Middleware. -### Migrating to `clerkMiddleware()` +#### Migrating to `clerkMiddleware()` Clerk strongly recommends migrating to the new `clerkMiddleware()` for an improved DX and access to all present and upcoming features, but also want to note that `authMiddleware()`, while deprecated, will continue to work in v5 and will not be removed until the next major version, so you do not _need_ to make any changes to your Middleware setup this version. diff --git a/packages/upgrade/source/guide-generators/core-2/retheme/index.js b/packages/upgrade/source/guide-generators/core-2/retheme/index.js index 78b4345aa7d..3db473d47ca 100644 --- a/packages/upgrade/source/guide-generators/core-2/retheme/index.js +++ b/packages/upgrade/source/guide-generators/core-2/retheme/index.js @@ -23,13 +23,12 @@ async function generate() { return assembleContent({ data: data, cwd }, [ frontmatter({ - title: 'Redesigned Components in v5', - description: 'Learn how to handle changes as a result of redesigned components in Clerk version 5', + title: 'Redesigned Components in Core 2', + description: 'Learn how to handle changes as a result of redesigned components in Clerk Core 2', }), - '# Redesigned Components in v5', + '# Redesigned Components in Core 2', markdown('intro'), '## Appearance Changes', - accordionForCategory('appearance-breaking-changes'), accordionForCategory('appearance', { additionalItems: [defaultsChangeItem] }), '## Localization Changes', accordionForCategory('localization'), diff --git a/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx b/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx index ff46d47be9d..ad194d8bd7e 100644 --- a/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx +++ b/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx @@ -1,6 +1,6 @@ ## Preparing to upgrade -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest Core 1 version (`npm i <%= packageName %>@core-1`). Some changes required for Core 2 can be applied incrementally to the latest <%= version %> release, which should contribute to a smoother upgrading experience. After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes from Core 2. +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest Core 1 version (`npm i <%= packageName %>@<%= parseInt(version.substring(1)) - 1 %>`). Some changes required for Core 2 can be applied incrementally to the <%= version %> release, which should contribute to a smoother upgrading experience. After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes from Core 2. Note that Core 2 is currently in beta, while we field feedback and ensure stability. Deploying beta versions to diff --git a/packages/upgrade/source/guide-generators/core-2/shared/redesign-preview.mdx b/packages/upgrade/source/guide-generators/core-2/shared/redesign-preview.mdx index 81232ede09a..4f127e11b8b 100644 --- a/packages/upgrade/source/guide-generators/core-2/shared/redesign-preview.mdx +++ b/packages/upgrade/source/guide-generators/core-2/shared/redesign-preview.mdx @@ -2,4 +2,4 @@ The new version ships with improved design and UX across all of Clerk's [UI components](/docs/components/overview). If you have used the [`appearance` prop](/docs/components/customization/overview) or tokens for a [custom theme](/docs/components/customization/overview#create-a-custom-theme), you will likely need to make some adjustments to ensure your styling is still looking great. If you're using the [localization prop](/docs/components/customization/localization) you will likely need to make adjustments to account for added or removed localization keys. -[More detail on these changes »](/components-redesigned) +[More detail on these changes »](component-redesign) diff --git a/packages/upgrade/source/versions/core-2/common/appearance-variables-breaking-changes.md b/packages/upgrade/source/versions/core-2/common/appearance-variables-breaking-changes.md index 9f948e980ae..1fbdc48aebc 100644 --- a/packages/upgrade/source/versions/core-2/common/appearance-variables-breaking-changes.md +++ b/packages/upgrade/source/versions/core-2/common/appearance-variables-breaking-changes.md @@ -1,7 +1,7 @@ --- title: 'Breaking Changes to appearance variables' matcherFlags: 'm' -category: 'appearance-breaking-changes' +category: 'appearance' matcher: - "variables:\\s+{[\\s\\S]*?fontSmoothing:" - "variables:\\s+{[\\s\\S]*?shadowShimmer:" @@ -10,6 +10,6 @@ matcher: Several appearance variables have been removed or renamed. If you were using these variables in your application, you will need to update your code to use the new variables. -- The \`fontSmoothing\` variable has been removed. -- The \`shadowShimmer\` variable has been removed. -- The \`colorAlphaShade\` variable has been renamed to \`colorNeutral\`. +- The `fontSmoothing` variable has been removed. +- The `shadowShimmer` variable has been removed. +- The `colorAlphaShade` variable has been renamed to `colorNeutral`. diff --git a/packages/upgrade/source/versions/core-2/index.js b/packages/upgrade/source/versions/core-2/index.js index 0259d8f9dbd..2df4c5cba5f 100644 --- a/packages/upgrade/source/versions/core-2/index.js +++ b/packages/upgrade/source/versions/core-2/index.js @@ -24,7 +24,13 @@ const changesAffectingAll = [ 'user-update-password', ]; -const jsChanges = ['setsession', 'organization-create-string', 'organization-getpendinginvitations', 'mfa-dropdown']; +const jsChanges = [ + 'setsession', + 'organization-create-string', + 'organization-getpendinginvitations', + 'mfa-dropdown', + 'appearance-variables-breaking-changes', +]; const reactChanges = [ 'magiclinkerrorcode', @@ -66,7 +72,6 @@ const reactChanges = [ 'min-react-version', 'externalaccount-avatarurl', 'organizationmembershippublicuserdata-profileimageurl', - 'appearance-variables-breaking-changes', ]; export default { From 1fe2a40f913106b41e6d768a5d25ddba49a40fb8 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 22 Feb 2024 16:24:15 -0500 Subject: [PATCH 111/159] chore(upgrade): Apply colin edits to overview --- .../upgrade/source/guide-generators/core-2/overview/intro.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx index a0a2dfdc251..5664ff0d46e 100644 --- a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx @@ -8,6 +8,7 @@ On TODO:DATE, the first beta Core 2 for all Clerk SDKs [was released](https://cl - 📉 ~75% build size reduction for next.js SDK due to deprecation removals and top level import changes. - 🤖 A new CLI tool that will scan codebases and detect breaking changes to aid with migration. - 🧹 A large number of smaller housekeeping changes, bugfixes, and improvements. +- 📊 [Telemetry](/docs/telemetry) to allow us to better determine feature usage and priority (easy opt-out if you don't like this) The term "Core 2" refers to the current release cycle across all SDK libraries, rather than a specific version of any From 81b16d7aee43aba008400551a38a8b3da75eb00e Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 22 Feb 2024 16:25:50 -0500 Subject: [PATCH 112/159] chore(upgrade): A couple more overview edits --- .../guide-generators/core-2/overview/intro.mdx | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx index 5664ff0d46e..367f8e5b777 100644 --- a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx @@ -1,25 +1,16 @@ # Upgrading to Clerk Core 2 -On TODO:DATE, the first beta Core 2 for all Clerk SDKs [was released](https://clerk.com/changelog/2024-01-16), broadly featuring the following upgrades: +In Febrary 2024, the first beta Core 2 for all Clerk SDKs [was released](https://clerk.com/changelog/2024-01-16), broadly featuring the following upgrades: - 💅 Redesigned and improved component UIs. - 🔪 The 401 & "flash of white page" that was visible sometimes when syncing auth state was eliminated. -- 🔒 New middleware for next.js SDK with improved DX. -- 📉 ~75% build size reduction for next.js SDK due to deprecation removals and top level import changes. -- 🤖 A new CLI tool that will scan codebases and detect breaking changes to aid with migration. - 🧹 A large number of smaller housekeeping changes, bugfixes, and improvements. - 📊 [Telemetry](/docs/telemetry) to allow us to better determine feature usage and priority (easy opt-out if you don't like this) - - The term "Core 2" refers to the current release cycle across all SDK libraries, rather than a specific version of any - individual SDK. See [how Clerk SDKs are versioned](sdk-versioning) for more details! - - -If you're curious about Clerk's approach to long term version support, head to the [long term support](/docs/upgrade-guides/long-term-support) document. Core 2 includes potentially breaking changes as well as the removal of previously deprecated features. It's very likely that all Clerk apps will need to make some code changes in order to upgrade successfully, however, in the majority of cases, the changes needed should be quick to implement. - ## SDK Guides -Select the SDK(s) you are using for your project from the list below to get started with the upgrade process: +Core 2 brings both UI changes and breaking code changes, so each SDK has been updated to a new major version. +We expect upgrades to take less than 30 minutes, and are providing a CLI tool to assist with the process. Please select your SDK below to get started: - [Next.js](/nextjs) - [Remix](/remix) From e535d80b6524d9355a93ac55c00e38cbf1cd4ed3 Mon Sep 17 00:00:00 2001 From: Stefanos Anagnostou Date: Wed, 28 Feb 2024 15:36:32 +0200 Subject: [PATCH 113/159] chore(upgrade): Update with the latest localization changes (#2885) --- .../common/changed-localization-keys.md | 2 +- .../core-2/common/new-localization-keys.md | 23 +++++++++++++++++-- .../common/removed-localization-keys.md | 18 +++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/packages/upgrade/source/versions/core-2/common/changed-localization-keys.md b/packages/upgrade/source/versions/core-2/common/changed-localization-keys.md index fb3c69351e0..cff4bb8c844 100644 --- a/packages/upgrade/source/versions/core-2/common/changed-localization-keys.md +++ b/packages/upgrade/source/versions/core-2/common/changed-localization-keys.md @@ -154,7 +154,7 @@ const changedValues = { }, organizationProfile: { profilePage: { - title: 'Update Profile', + title: 'Update profile', dangerSection: { leaveOrganization: { actionDescription: "Type '{{organizationName}}' below to continue.", diff --git a/packages/upgrade/source/versions/core-2/common/new-localization-keys.md b/packages/upgrade/source/versions/core-2/common/new-localization-keys.md index afeddaee25d..c3342545318 100644 --- a/packages/upgrade/source/versions/core-2/common/new-localization-keys.md +++ b/packages/upgrade/source/versions/core-2/common/new-localization-keys.md @@ -32,7 +32,7 @@ const newValues = { start: { headerTitle__general: 'General', profileSection: { - primaryButton: 'Edit profile', + primaryButton: 'Update profile', title: 'Organization Profile', uploadAction__title: 'Logo', }, @@ -82,14 +82,33 @@ const newValues = { security: 'Security', title: 'Account', }, + passwordPage: { + checkboxInfoText__signOutOfOtherSessions: + 'It is recommended to sign out of all other devices which may have used your old password.', + successMessage__set: 'Your password has been set.', + successMessage__signOutOfOtherSessions: 'All other devices have been signed out.', + successMessage__update: 'Your password has been updated.', + title__set: 'Set password', + title__update: 'Update password', + }, phoneNumberPage: { verifySubtitle: 'Enter the verification code sent to {{identifier}}', verifyTitle: 'Verify phone number', }, start: { + passwordSection: { + primaryButton__updatePassword: 'Update password', + }, profileSection: { - primaryButton: 'Edit profile', + primaryButton: 'Update profile', }, + usernameSection: { + primaryButton__updateUsername: 'Update username', + }, + }, + usernamePage: { + title__set: 'Set username', + title__update: 'Update username', }, }, }; diff --git a/packages/upgrade/source/versions/core-2/common/removed-localization-keys.md b/packages/upgrade/source/versions/core-2/common/removed-localization-keys.md index 04fa02e7054..5b03ef27d59 100644 --- a/packages/upgrade/source/versions/core-2/common/removed-localization-keys.md +++ b/packages/upgrade/source/versions/core-2/common/removed-localization-keys.md @@ -21,6 +21,7 @@ matcher: - "signIn:\\s+{[\\s\\S]*?backupCodeMfa:\\s+{[\\s\\S]*?formSubtitle:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__account:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__security:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?usernameSection:\\s+{[\\s\\S]*?primaryButton__changeUsername:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsTitle__primary:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsSubtitle__primary:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?emailAddressesSection:\\s+{[\\s\\S]*?detailsTitle__nonPrimary:" @@ -43,6 +44,7 @@ matcher: - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?actionLabel__conectionFailed:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?destructiveActionSubtitle:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?connectedAccountsSection:\\s+{[\\s\\S]*?destructiveActionAccordionSubtitle:" + - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?passwordSection:\\s+{[\\s\\S]*?primaryButton__changePassword:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?destructiveActionTitle:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?destructiveActionSubtitle:" - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?mfaSection:\\s+{[\\s\\S]*?phoneCode:\\s+{[\\s\\S]*?title__default:" @@ -64,7 +66,13 @@ matcher: - "userProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?dangerSection:\\s+{[\\s\\S]*?deleteAccountDescription:" - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?fileDropAreaTitle:" - "userProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?fileDropAreaAction:" + - "userProfile:\\s+{[\\s\\S]*?usernamePage:\\s+{[\\s\\S]*?title:" - "userProfile:\\s+{[\\s\\S]*?phoneNumberPage:\\s+{[\\s\\S]*?infoText__secondary:" + - "userProfile:\\s+{[\\s\\S]*?passwordPage:\\s+{[\\s\\S]*?title:" + - "userProfile:\\s+{[\\s\\S]*?passwordPage:\\s+{[\\s\\S]*?changePasswordTitle:" + - "userProfile:\\s+{[\\s\\S]*?passwordPage:\\s+{[\\s\\S]*?successMessage:" + - "userProfile:\\s+{[\\s\\S]*?passwordPage:\\s+{[\\s\\S]*?changePasswordSuccessMessage:" + - "userProfile:\\s+{[\\s\\S]*?passwordPage:\\s+{[\\s\\S]*?sessionsSignedOutSuccessMessage:" - "userProfile:\\s+{[\\s\\S]*?mfaPhoneCodePage:\\s+{[\\s\\S]*?successMessage:" - "organizationProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__settings:" - "organizationProfile:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerSubtitle__members:" @@ -72,6 +80,7 @@ matcher: - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?subtitle:" - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?domainSection:\\s+{[\\s\\S]*?unverifiedDomain_menuAction__verify:" - "organizationProfile:\\s+{[\\s\\S]*?profilePage:\\s+{[\\s\\S]*?domainSection:\\s+{[\\s\\S]*?unverifiedDomain_menuAction__remove:" + - "organizationProfile:\\s+{[\\s\\S]*?verifiedDomainPage:\\s+{[\\s\\S]*?enrollmentTab:\\s+{[\\s\\S]*?formButton__save:" - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__active:" - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?start:\\s+{[\\s\\S]*?headerTitle__invited:" - "organizationProfile:\\s+{[\\s\\S]*?membersPage:\\s+{[\\s\\S]*?invitationsTab:\\s+{[\\s\\S]*?manualInvitations:\\s+{[\\s\\S]*?headerTitle:" @@ -103,6 +112,7 @@ const deletedKeys = [ 'signIn.backupCodeMfa.formSubtitle', 'userProfile.start.headerSubtitle__account', 'userProfile.start.headerSubtitle__security', + 'userProfile.start.usernameSection.primaryButton__changeUsername', 'userProfile.start.emailAddressesSection.detailsTitle__primary', 'userProfile.start.emailAddressesSection.detailsSubtitle__primary', 'userProfile.start.emailAddressesSection.detailsTitle__nonPrimary', @@ -125,6 +135,7 @@ const deletedKeys = [ 'userProfile.start.connectedAccountsSection.actionLabel__conectionFailed', 'userProfile.start.connectedAccountsSection.destructiveActionSubtitle', 'userProfile.start.connectedAccountsSection.destructiveActionAccordionSubtitle', + 'userProfile.start.passwordSection.primaryButton__changePassword', 'userProfile.start.mfaSection.phoneCode.destructiveActionTitle', 'userProfile.start.mfaSection.phoneCode.destructiveActionSubtitle', 'userProfile.start.mfaSection.phoneCode.title__default', @@ -146,7 +157,13 @@ const deletedKeys = [ 'userProfile.start.dangerSection.deleteAccountDescription', 'userProfile.profilePage.fileDropAreaTitle', 'userProfile.profilePage.fileDropAreaAction', + 'userProfile.usernamePage.title', 'userProfile.phoneNumberPage.infoText__secondary', + 'userProfile.passwordPage.title', + 'userProfile.passwordPage.changePasswordTitle', + 'userProfile.passwordPage.successMessage', + 'userProfile.passwordPage.changePasswordSuccessMessage', + 'userProfile.passwordPage.sessionsSignedOutSuccessMessage', 'userProfile.mfaPhoneCodePage.successMessage', 'organizationProfile.start.headerTitle__settings', 'organizationProfile.start.headerSubtitle__members', @@ -154,6 +171,7 @@ const deletedKeys = [ 'organizationProfile.profilePage.subtitle', 'organizationProfile.profilePage.domainSection.unverifiedDomain_menuAction__verify', 'organizationProfile.profilePage.domainSection.unverifiedDomain_menuAction__remove', + 'organizationProfile.verifiedDomainPage.enrollmentTab.formButton__save', 'organizationProfile.membersPage.start.headerTitle__active', 'organizationProfile.membersPage.start.headerTitle__invited', 'organizationProfile.membersPage.invitationsTab.manualInvitations.headerTitle', From a3634c57defe50343807e954b6f277b1675c23f5 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 23 Feb 2024 13:31:24 -0500 Subject: [PATCH 114/159] fix(upgrade): Change verbiage around core 2 --- .../upgrade/source/guide-generators/core-2/backend/intro.mdx | 2 +- .../source/guide-generators/core-2/chrome-extension/intro.mdx | 2 +- packages/upgrade/source/guide-generators/core-2/expo/intro.mdx | 2 +- .../upgrade/source/guide-generators/core-2/fastify/intro.mdx | 2 +- .../upgrade/source/guide-generators/core-2/gatsby/intro.mdx | 2 +- packages/upgrade/source/guide-generators/core-2/js/intro.mdx | 2 +- .../upgrade/source/guide-generators/core-2/nextjs/intro.mdx | 2 +- packages/upgrade/source/guide-generators/core-2/node/intro.mdx | 2 +- .../upgrade/source/guide-generators/core-2/overview/intro.mdx | 2 +- packages/upgrade/source/guide-generators/core-2/react/intro.mdx | 2 +- packages/upgrade/source/guide-generators/core-2/remix/intro.mdx | 2 +- packages/upgrade/source/guide-generators/core-2/shared/cli.mdx | 2 +- .../upgrade/source/guide-generators/core-2/shared/prepare.mdx | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/upgrade/source/guide-generators/core-2/backend/intro.mdx b/packages/upgrade/source/guide-generators/core-2/backend/intro.mdx index 00df1d24493..0ae93fe5bff 100644 --- a/packages/upgrade/source/guide-generators/core-2/backend/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/backend/intro.mdx @@ -1,3 +1,3 @@ -Clerk's Core 2 release includes a new major version of the Backend SDK, v1. This new version ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Core 2 is included in the Backend SDK starting with version 1. This new version ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your Backend project to use `@clerk/backend` v1. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/core-2/chrome-extension/intro.mdx b/packages/upgrade/source/guide-generators/core-2/chrome-extension/intro.mdx index 664610b427c..6ba5a6a0bb0 100644 --- a/packages/upgrade/source/guide-generators/core-2/chrome-extension/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/chrome-extension/intro.mdx @@ -1,3 +1,3 @@ -Clerk's Core 2 release includes a new major version of the Chrome Extension SDK, v1. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Core 2 is included in the Chrome Extension SDK starting with version 1. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your project to use `@clerk/chrome-extension` v1. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/core-2/expo/intro.mdx b/packages/upgrade/source/guide-generators/core-2/expo/intro.mdx index e98638fd365..97d967e3ba1 100644 --- a/packages/upgrade/source/guide-generators/core-2/expo/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/expo/intro.mdx @@ -1,3 +1,3 @@ -Clerk's Core 2 release includes a new major version of the Expo SDK, v1. This release ships with an improved design and UX for its built-in components and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Core 2 is included in the Expo SDK starting with version 1. This release ships with an improved design and UX for its built-in components and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your Expo project to use `@clerk/clerk-expo` v1. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/core-2/fastify/intro.mdx b/packages/upgrade/source/guide-generators/core-2/fastify/intro.mdx index 7ce3905a0d1..b5f31c35ee0 100644 --- a/packages/upgrade/source/guide-generators/core-2/fastify/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/fastify/intro.mdx @@ -1,3 +1,3 @@ -Clerk's Core 2 release includes a new major version of the Fastify SDK, v1. This release ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Core 2 is included in the Fastify SDK starting with version 1. This release ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your Fastify project to use `@clerk/fastify` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/core-2/gatsby/intro.mdx b/packages/upgrade/source/guide-generators/core-2/gatsby/intro.mdx index 45fd3e876ec..76909cb1f22 100644 --- a/packages/upgrade/source/guide-generators/core-2/gatsby/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/gatsby/intro.mdx @@ -1,3 +1,3 @@ -Clerk's Core 2 release includes a new major version of the Gatsby SDK, v5. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Core 2 is included in the Gatsby SDK starting with version 5. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your Gatsby project to use `gatsby-plugin-clerk` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/core-2/js/intro.mdx b/packages/upgrade/source/guide-generators/core-2/js/intro.mdx index fbe7aa655ef..f344da4a610 100644 --- a/packages/upgrade/source/guide-generators/core-2/js/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/js/intro.mdx @@ -1,3 +1,3 @@ -Clerk's Core 2 release includes a new major version of the Javascript SDK, v5. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Core 2 is included in the Javascript SDK starting with version 5. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you'll have successfully upgraded your JS project to use `@clerk/clerk-js` v5. You'll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/intro.mdx b/packages/upgrade/source/guide-generators/core-2/nextjs/intro.mdx index e3326c4eff2..b31974ebd0f 100644 --- a/packages/upgrade/source/guide-generators/core-2/nextjs/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/nextjs/intro.mdx @@ -1,3 +1,3 @@ -Clerk's Core 2 release includes a new major version of the Next.js SDK, v5. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, a substantially improved middleware import, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Core 2 is included in the Next.js SDK starting with version 5.0.0. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, a substantially improved middleware import, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your Next.js project to use `@clerk/nextjs` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/core-2/node/intro.mdx b/packages/upgrade/source/guide-generators/core-2/node/intro.mdx index 689d23b4470..0050ad792c9 100644 --- a/packages/upgrade/source/guide-generators/core-2/node/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/node/intro.mdx @@ -1,3 +1,3 @@ -Clerk's Core 2 release includes a new major version of the Node SDK, v5. This new version ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Core 2 is included in the Node.js SDK starting with version 5. This new version ships with a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your Node project to use `@clerk/clerk-sdk-node` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx index 367f8e5b777..2963cc3c17d 100644 --- a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx @@ -1,6 +1,6 @@ # Upgrading to Clerk Core 2 -In Febrary 2024, the first beta Core 2 for all Clerk SDKs [was released](https://clerk.com/changelog/2024-01-16), broadly featuring the following upgrades: +In Febrary 2024, [we updated](https://clerk.com/changelog/2024-01-16) Clerk's SDKs to include Core 2. This new core includes: - 💅 Redesigned and improved component UIs. - 🔪 The 401 & "flash of white page" that was visible sometimes when syncing auth state was eliminated. diff --git a/packages/upgrade/source/guide-generators/core-2/react/intro.mdx b/packages/upgrade/source/guide-generators/core-2/react/intro.mdx index 58fd9c33c05..e1e96689124 100644 --- a/packages/upgrade/source/guide-generators/core-2/react/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/react/intro.mdx @@ -1,3 +1,3 @@ -Clerk's Core 2 release includes a new major version of the React SDK, v5. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Core 2 is included in the React SDK starting with version 5. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your React project to use `@clerk/clerk-react` v5. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/core-2/remix/intro.mdx b/packages/upgrade/source/guide-generators/core-2/remix/intro.mdx index e41e8d071c8..d1ec70ce1a2 100644 --- a/packages/upgrade/source/guide-generators/core-2/remix/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/remix/intro.mdx @@ -1,3 +1,3 @@ -Clerk's Core 2 release includes a new major version of the Remix SDK, v4. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, no more need to add a custom error boundary, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. +Core 2 is included in the Remix SDK starting with version 4. This new version ships with an improved design and UX for its built-in components, no "flash of white page" when authenticating, no more need to add a custom error boundary, and a variety of smaller DX improvements and housekeeping items. Each of the potentially breaking changes are detailed in this guide, below. By the end of this guide, you’ll have successfully upgraded your Remix project to use `@clerk/remix` v4. You’ll learn how to update your dependencies, resolve breaking changes, and find deprecations. Step-by-step instructions will lead you through the process. diff --git a/packages/upgrade/source/guide-generators/core-2/shared/cli.mdx b/packages/upgrade/source/guide-generators/core-2/shared/cli.mdx index de3ba43683f..d96574add0b 100644 --- a/packages/upgrade/source/guide-generators/core-2/shared/cli.mdx +++ b/packages/upgrade/source/guide-generators/core-2/shared/cli.mdx @@ -1,6 +1,6 @@ ## CLI upgrade helper -As of this release cycle, Clerk provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade. The tool will scan your codebase and produce a list of changes you'll need to apply to your project. It should catch the vast majority of the changes needed for a successful upgrade to Core 2. This can save you a lot of time reading through changes that don't apply to your project. +Clerk now provides a `@clerk/upgrade` CLI tool that you can use to ease the upgrade process. The tool will scan your codebase and produce a list of changes you'll need to apply to your project. It should catch the vast majority of the changes needed for a successful upgrade to any SDK including Core 2. This can save you a lot of time reading through changes that don't apply to your project. To run the CLI tool, navigate to your project and run it in the terminal: diff --git a/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx b/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx index ad194d8bd7e..134060cb3b8 100644 --- a/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx +++ b/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx @@ -1,6 +1,6 @@ ## Preparing to upgrade -Before uprading, it's highly recommended that you update your Clerk SDKs to the latest Core 1 version (`npm i <%= packageName %>@<%= parseInt(version.substring(1)) - 1 %>`). Some changes required for Core 2 can be applied incrementally to the <%= version %> release, which should contribute to a smoother upgrading experience. After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes from Core 2. +Before uprading, it's highly recommended that you update your Clerk SDKs to the latest Core 1 version (`npm i <%= packageName %>@<%= parseInt(version.substring(1)) - 1 %>`). Some changes required for Core 2 SDKs can be applied incrementally to the <%= version %> release, which should contribute to a smoother upgrading experience. After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes from Core 2. Note that Core 2 is currently in beta, while we field feedback and ensure stability. Deploying beta versions to From 4574c6779f9b24be33ae973c9ec07c1d6ad4fc13 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 29 Feb 2024 17:39:46 -0500 Subject: [PATCH 115/159] chore(upgrade): Version for beta release --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 5fb1e3fa90a..34c4e156acf 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.3.0", + "version": "0.4.0", "license": "MIT", "type": "module", "main": "dist/cli.js", From a5b60061ed3d4b820069055bd4687a015d22323b Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 29 Feb 2024 18:00:42 -0500 Subject: [PATCH 116/159] fix(upgrade): Fix CLI interface change with coreX naming --- package-lock.json | 2 +- packages/upgrade/source/app.js | 4 ++-- packages/upgrade/source/cli.js | 7 ++++--- packages/upgrade/source/constants/versions.js | 4 ++-- packages/upgrade/source/scan.js | 2 +- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 640a8f0ade6..8cec4350fde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35448,7 +35448,7 @@ }, "packages/upgrade": { "name": "@clerk/upgrade", - "version": "0.2.1", + "version": "0.4.0", "license": "MIT", "dependencies": { "@inkjs/ui": "^1.0.0", diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index 38ba8b27196..57dd864bcb2 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -217,9 +217,9 @@ export default function App({ Migrating from - v{fromVersion} + {fromVersion} to - v{toVersion} + {toVersion} Looking in the directory diff --git a/packages/upgrade/source/cli.js b/packages/upgrade/source/cli.js index bb5b7759b3e..f5b4e2a59c1 100644 --- a/packages/upgrade/source/cli.js +++ b/packages/upgrade/source/cli.js @@ -26,8 +26,8 @@ const cli = meow( { importMeta: import.meta, flags: { - from: { type: 'string', default: '4' }, - to: { type: 'string', default: '5' }, + from: { type: 'string', default: 'core-1' }, + to: { type: 'string', default: 'core-2' }, sdk: { type: 'string', choices: sdks.map(i => i.value) }, dir: { type: 'string' }, ignore: { type: 'string', isMultiple: true }, @@ -48,5 +48,6 @@ render( noWarnings={cli.flags.noWarnings} disableTelemetry={cli.flags.disableTelemetry} />, - // { debug: true }, if having issues with errors being swallowed, uncomment this + // if having issues with errors being swallowed, uncomment this + // { debug: true } ); diff --git a/packages/upgrade/source/constants/versions.js b/packages/upgrade/source/constants/versions.js index bc9dde31842..3e32d88b991 100644 --- a/packages/upgrade/source/constants/versions.js +++ b/packages/upgrade/source/constants/versions.js @@ -1,4 +1,4 @@ export default [ - { label: 'v5', value: 5 }, - { label: 'v4', value: 4 }, + { label: 'Core 2', value: 'core-2' }, + { label: 'Core 1', value: 'core-1' }, ]; diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index e2489ecfa07..9b80c931dcf 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -29,7 +29,7 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarn // { sdkName: [{ title: 'x', matcher: /x/, slug: 'x', ... }] } useEffect(() => { setStatus(`Loading data for v${toVersion} migration`); - import(`./versions/v${toVersion}/index.js`).then(version => { + import(`./versions/${toVersion}/index.js`).then(version => { setMatchers( sdks.reduce((m, sdk) => { m[sdk] = version.default[sdk]; From 414218afaf4160ccec8f99f4979950812b3e6063 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 29 Feb 2024 18:01:09 -0500 Subject: [PATCH 117/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 34c4e156acf..e196e4cd7f0 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.4.0", + "version": "0.4.1", "license": "MIT", "type": "module", "main": "dist/cli.js", From bfe5c8e1d76eba88229afb42f983f1ddc6ceb462 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 13 Mar 2024 12:56:02 -0400 Subject: [PATCH 118/159] fix(upgrade): Fix regexes not matching import paths after change --- packages/upgrade/source/app.js | 4 ++-- packages/upgrade/source/cli.js | 2 +- packages/upgrade/source/scan.js | 2 +- .../versions/core-2/backend/constants-import-path-move.md | 2 +- .../backend/createisomorphicrequest-import-path-move.md | 2 +- .../core-2/backend/createisomorphicrequest-removed.md | 2 +- .../versions/core-2/backend/decodejwt-import-path-move.md | 2 +- .../versions/core-2/backend/redirect-import-path-move.md | 2 +- .../versions/core-2/backend/signjwt-import-path-move.md | 2 +- .../versions/core-2/backend/signjwterror-import-move.md | 2 +- .../core-2/backend/tokenverificationerror-import-move.md | 2 +- .../backend/tokenverificationerroraction-import-move.md | 2 +- .../core-2/backend/tokenverificationerrorcode-import-move.md | 2 +- .../backend/tokenverificationerrorreason-import-move.md | 2 +- .../versions/core-2/backend/verifyjwt-import-path-move.md | 2 +- .../core-2/common/emaillinkerrorcode-import-change.md | 2 +- .../core-2/common/isclerkapiresponserror-import-change.md | 2 +- .../versions/core-2/common/isemaillinkerror-import-change.md | 2 +- .../versions/core-2/common/isknownerror-import-change.md | 2 +- .../versions/core-2/common/ismetamaskerror-import-change.md | 2 +- .../core-2/common/multisessionappsupport-import-change.md | 2 +- .../source/versions/core-2/nextjs/auth-import-change.md | 2 +- .../versions/core-2/nextjs/authmiddleware-import-change.md | 2 +- .../versions/core-2/nextjs/buildclerkprops-import-change.md | 2 +- .../source/versions/core-2/nextjs/clerk-import-change.md | 2 +- .../source/versions/core-2/nextjs/constants-import-change.md | 2 +- .../core-2/nextjs/createauthenticaterequest-import-change.md | 2 +- .../core-2/nextjs/createisomorphicrequest-import-change.md | 2 +- .../versions/core-2/nextjs/currentuser-import-change.md | 2 +- .../source/versions/core-2/nextjs/decodejwt-import-change.md | 2 +- .../core-2/nextjs/emaillinkerrorcode-import-change.md | 2 +- .../core-2/nextjs/isclerkapiresponserror-import-change.md | 2 +- .../versions/core-2/nextjs/isemaillinkerror-import-change.md | 2 +- .../versions/core-2/nextjs/isknownerror-import-change.md | 2 +- .../core-2/nextjs/multisessionappsupport-import-change.md | 2 +- .../source/versions/core-2/nextjs/redirect-import-change.md | 2 +- .../versions/core-2/nextjs/redirecttosignin-import-path.md | 4 ++-- .../versions/core-2/nextjs/redirecttosignup-import-path.md | 2 +- .../source/versions/core-2/nextjs/signjwt-import-change.md | 2 +- .../source/versions/core-2/nextjs/verifyjwt-import-change.md | 2 +- .../versions/core-2/nextjs/verifytoken-import-change.md | 2 +- 41 files changed, 43 insertions(+), 43 deletions(-) diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index 57dd864bcb2..fa402f630b6 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -78,8 +78,8 @@ export default function App({ <> Hello friend! We're excited to help you upgrade Clerk - {fromVersion ? ` from v${fromVersion}` : ''} - {toVersion ? ` to v${toVersion}` : ''}. Before we get started, a couple questions... + {fromVersion ? ` from ${fromVersion}` : ''} + {toVersion ? ` to ${toVersion}` : ''}. Before we get started, a couple questions... diff --git a/packages/upgrade/source/cli.js b/packages/upgrade/source/cli.js index f5b4e2a59c1..59177fc314a 100644 --- a/packages/upgrade/source/cli.js +++ b/packages/upgrade/source/cli.js @@ -49,5 +49,5 @@ render( disableTelemetry={cli.flags.disableTelemetry} />, // if having issues with errors being swallowed, uncomment this - // { debug: true } + // { debug: true }, ); diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index 9b80c931dcf..33213d5e94f 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -28,7 +28,7 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarn // result = `matchers` set to format: // { sdkName: [{ title: 'x', matcher: /x/, slug: 'x', ... }] } useEffect(() => { - setStatus(`Loading data for v${toVersion} migration`); + setStatus(`Loading data for ${toVersion} migration`); import(`./versions/${toVersion}/index.js`).then(version => { setMatchers( sdks.reduce((m, sdk) => { diff --git a/packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md index 7ad6ef625a4..7e4ff503a7d 100644 --- a/packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`constants` import moved to `@clerk/backend/internal`' -matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]" matcherFlags: 'm' replaceWithString: 'backend/internal' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md index baaf8e27ca0..23861336fb7 100644 --- a/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`createIsomorphicRequest` import moved to `@clerk/backend/internal`' -matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]" matcherFlags: 'm' replaceWithString: 'backend/internal' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md b/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md index 34b06032d7a..eff4b631351 100644 --- a/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md +++ b/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md @@ -1,6 +1,6 @@ --- title: '`createIsomorphicRequest` import moved to `/internal`' -matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/(backend)(?!\/internal)['\"]" replaceWithString: 'backend/internal' matcherFlags: 'm' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md index d1e0483f3f6..52bd2927962 100644 --- a/packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`decodeJwt` import moved to `@clerk/backend/tokens`' -matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]" matcherFlags: 'm' replaceWithString: 'backend/tokens' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md index 8424d5a2f89..a7e1cc640d9 100644 --- a/packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`redirect` import moved to `@clerk/backend/internal`' -matcher: "import\\s+{[\\s\\S]*?redirect[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?redirect[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]" matcherFlags: 'm' replaceWithString: 'backend/internal' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md index 1ed521f288d..d0173ba60f9 100644 --- a/packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`signJwt` import moved to `@clerk/backend/tokens`' -matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]" matcherFlags: 'm' replaceWithString: 'backend/tokens' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md b/packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md index 2a0bc89e009..370d206b574 100644 --- a/packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md +++ b/packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md @@ -1,6 +1,6 @@ --- title: '`SignJWTError` import moved to `@clerk/backend/errors`' -matcher: "import\\s+{[\\s\\S]*?SignJWTError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?SignJWTError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md index baf9b1f9c1d..90d982ee06f 100644 --- a/packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md +++ b/packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md @@ -1,6 +1,6 @@ --- title: '`TokenVerificationError` import moved to `@clerk/backend/errors`' -matcher: "import\\s+{[\\s\\S]*?TokenVerificationError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?TokenVerificationError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md index 46d9ba05ccb..10730f54d0e 100644 --- a/packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md +++ b/packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md @@ -1,6 +1,6 @@ --- title: '`TokenVerificationErrorAction` import moved to `@clerk/backend/errors`' -matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorAction[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorAction[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md index f1b36632bdd..1daf783e9a2 100644 --- a/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md +++ b/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md @@ -1,6 +1,6 @@ --- title: '`TokenVerificationErrorCode` import moved to `@clerk/backend/errors`' -matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorCode[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorCode[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md index 78f0b60a88f..684dd8f11e8 100644 --- a/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md +++ b/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md @@ -1,6 +1,6 @@ --- title: '`TokenVerificationErrorReason` import moved to `@clerk/backend/errors`' -matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorReason[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorReason[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md index 74eef45a4ac..f90e5481ab9 100644 --- a/packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`verifyJwt` import moved to `@clerk/backend/tokens`' -matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]" matcherFlags: 'm' replaceWithString: 'backend/tokens' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md index 7e1541b7699..df4f69605b2 100644 --- a/packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md @@ -1,6 +1,6 @@ --- title: '`EmailLinkErrorCode` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'error-imports' replaceWithString: 'clerk-react/errors' diff --git a/packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md index c5c9df7dce9..d593d46dcb6 100644 --- a/packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isClerkAPIResponseError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'error-imports' replaceWithString: 'clerk-react/errors' diff --git a/packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md index 62c2daaa0af..8840d54e5f4 100644 --- a/packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isEmailLinkError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'error-imports' replaceWithString: 'clerk-react/errors' diff --git a/packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md b/packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md index 1e246ac2c2c..30998e05a9e 100644 --- a/packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isKnownError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'error-imports' replaceWithString: 'clerk-react/errors' diff --git a/packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md index 0bba0740caa..729fe65f2a9 100644 --- a/packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isMetamaskError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(react)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'error-imports' replaceWithString: 'react/errors' diff --git a/packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md index eb730fc50da..ed4693f936b 100644 --- a/packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md @@ -1,6 +1,6 @@ --- title: '`MultisessionAppSupport` import moved to `/internal`' -matcher: "import\\s+{[\\s\\S]*?MutliSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/clerk-react[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?MutliSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/clerk-react(?!\/internal)[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md index cb1ee814beb..972086ddeb6 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md @@ -1,6 +1,6 @@ --- title: '`auth` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]auth[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?[,\\s]auth[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md index d1f3a6fe169..937e03dfa68 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md @@ -1,6 +1,6 @@ --- title: '`authMiddleware` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md index 6fcda0f5264..db9ae9f777d 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md @@ -1,6 +1,6 @@ --- title: '`buildClerkProps` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?buildClerkProps[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?buildClerkProps[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md index 28384d97fe0..a5bbda68936 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md @@ -1,6 +1,6 @@ --- title: '`Clerk` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/nextjs(?!\/server)[\\s\\S]*?['\"]" category: 'top-level-imports' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md index c7757ccfdb1..c88350469e6 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md @@ -1,6 +1,6 @@ --- title: '`constants` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md index 690502e19dc..ea2738ce96b 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md @@ -1,6 +1,6 @@ --- title: '`createAuthenticateRequest` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?createAuthenticateRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?createAuthenticateRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md index 7107f699e9f..1484c93b4a6 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md @@ -1,6 +1,6 @@ --- title: '`createIsomorphicRequest` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md index 0dd610673e5..1bd9e6ff837 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md @@ -1,6 +1,6 @@ --- title: '`currentUser` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?currentUser[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?currentUser[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md index a9baf5ccb12..84d26db0e4f 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md @@ -1,6 +1,6 @@ --- title: '`decodeJwt` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md index 0472db1b8c9..11906c675ae 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md @@ -1,6 +1,6 @@ --- title: '`EmailLinkErrorCode` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/errors' diff --git a/packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md index 221290607bf..cd9368f33f1 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isClerkAPIResponseError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/errors' diff --git a/packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md index 9f730bb0d4a..17001b00003 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isEmailLinkError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/errors' diff --git a/packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md index 0017d8f082b..76d26e2b5be 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isKnownError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/errors' diff --git a/packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md index fabb411b6f8..43d8ab3e66b 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md @@ -1,6 +1,6 @@ --- title: '`MultiSessionAppSupport` import moved under `/internal`' -matcher: "import\\s+{[\\s\\S]*?MultiSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?MultiSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/internal)[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' replaceWithString: 'nextjs/internal' diff --git a/packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md index 3079ec7e30a..e821b1e5b4f 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md @@ -1,6 +1,6 @@ --- title: '`redirect` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]redirect[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?[,\\s]redirect[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md b/packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md index 50bf2c7957e..9d7890041c0 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md +++ b/packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md @@ -1,6 +1,6 @@ --- -title: '`redirectToSignIn` import moved under `/server' -matcher: "import\\s+{[\\s\\S]*?[,\\s]redirectToSignIn[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +title: '`redirectToSignIn` import moved under `/server`' +matcher: "import\\s+{[\\s\\S]*?[,\\s]redirectToSignIn[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md b/packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md index d7cfffb1b74..2a4e51151a8 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md +++ b/packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md @@ -1,6 +1,6 @@ --- title: '`redirectToSignUp` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]redirectToSignUp[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?[,\\s]redirectToSignUp[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md index 1e6b59986cb..13bd77f374d 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md @@ -1,6 +1,6 @@ --- title: '`signJwt` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md index 15074804a66..c1b7173a8eb 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md @@ -1,6 +1,6 @@ --- title: '`verifyJwt` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md index be89954572c..1728c66ca45 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md @@ -1,6 +1,6 @@ --- title: '`verifyToken` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?verifyToken[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)[\\s\\S]*?['\"]" +matcher: "import\\s+{[\\s\\S]*?verifyToken[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' From a2fd2ef92ce90a75c88a549ceab3727e884f5314 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 13 Mar 2024 12:56:33 -0400 Subject: [PATCH 119/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index e196e4cd7f0..f84c6b86259 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.4.1", + "version": "0.4.2", "license": "MIT", "type": "module", "main": "dist/cli.js", From f51b20572e0224575330eb2b89d4fbe086d5ee6f Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 13 Mar 2024 13:30:52 -0400 Subject: [PATCH 120/159] fix(upgrade): Fix line matching bug for import matchers --- .../source/versions/core-2/backend/buildrequesturl-removed.md | 2 +- packages/upgrade/source/versions/core-2/backend/clerk-import.md | 2 +- .../versions/core-2/backend/constants-import-path-move.md | 2 +- .../backend/createauthenticaterequest-import-path-move.md | 2 +- .../source/versions/core-2/backend/createemail-removed.md | 2 +- .../core-2/backend/createisomorphicrequest-import-path-move.md | 2 +- .../versions/core-2/backend/createisomorphicrequest-removed.md | 2 +- .../versions/core-2/backend/decodejwt-import-path-move.md | 2 +- .../source/versions/core-2/backend/redirect-import-path-move.md | 2 +- .../source/versions/core-2/backend/signjwt-import-path-move.md | 2 +- .../source/versions/core-2/backend/signjwterror-import-move.md | 2 +- .../core-2/backend/tokenverificationerror-import-move.md | 2 +- .../core-2/backend/tokenverificationerroraction-import-move.md | 2 +- .../core-2/backend/tokenverificationerrorcode-import-move.md | 2 +- .../core-2/backend/tokenverificationerrorreason-import-move.md | 2 +- .../versions/core-2/backend/verifyjwt-import-path-move.md | 2 +- .../versions/core-2/common/emaillinkerrorcode-import-change.md | 2 +- .../core-2/common/isclerkapiresponserror-import-change.md | 2 +- .../versions/core-2/common/isemaillinkerror-import-change.md | 2 +- .../source/versions/core-2/common/isknownerror-import-change.md | 2 +- .../versions/core-2/common/ismetamaskerror-import-change.md | 2 +- .../core-2/common/multisessionappsupport-import-change.md | 2 +- .../source/versions/core-2/common/withclerk-hof-removed.md | 2 +- .../upgrade/source/versions/core-2/common/withclerk-removed.md | 2 +- .../source/versions/core-2/common/withsession-hof-removed.md | 2 +- .../source/versions/core-2/common/withsession-removed.md | 2 +- .../source/versions/core-2/common/withuser-hof-removed.md | 2 +- .../upgrade/source/versions/core-2/common/withuser-removed-2.md | 2 +- .../source/versions/core-2/fastify/clerk-import-change.md | 2 +- .../source/versions/core-2/gatsby/api-url-value-change.md | 2 +- .../source/versions/core-2/gatsby/clerk-import-change.md | 2 +- .../upgrade/source/versions/core-2/nextjs/auth-import-change.md | 2 +- .../source/versions/core-2/nextjs/auth-middleware-deprecated.md | 2 +- .../versions/core-2/nextjs/authmiddleware-import-change.md | 2 +- .../versions/core-2/nextjs/buildclerkprops-import-change.md | 2 +- .../source/versions/core-2/nextjs/clerk-import-change.md | 2 +- .../source/versions/core-2/nextjs/constants-import-change.md | 2 +- .../core-2/nextjs/createauthenticaterequest-import-change.md | 2 +- .../core-2/nextjs/createisomorphicrequest-import-change.md | 2 +- .../source/versions/core-2/nextjs/currentuser-import-change.md | 2 +- .../source/versions/core-2/nextjs/decodejwt-import-change.md | 2 +- .../versions/core-2/nextjs/emaillinkerrorcode-import-change.md | 2 +- .../upgrade/source/versions/core-2/nextjs/import-api-url.md | 2 +- .../upgrade/source/versions/core-2/nextjs/import-api-version.md | 2 +- .../source/versions/core-2/nextjs/import-clerk-js-url.md | 2 +- .../source/versions/core-2/nextjs/import-clerk-js-version.md | 2 +- packages/upgrade/source/versions/core-2/nextjs/import-domain.md | 2 +- .../source/versions/core-2/nextjs/import-is-satellite.md | 2 +- .../upgrade/source/versions/core-2/nextjs/import-proxy-url.md | 2 +- .../source/versions/core-2/nextjs/import-publishable-key.md | 2 +- .../upgrade/source/versions/core-2/nextjs/import-secret-key.md | 2 +- .../upgrade/source/versions/core-2/nextjs/import-sign-in-url.md | 2 +- .../upgrade/source/versions/core-2/nextjs/import-sign-up-url.md | 2 +- .../core-2/nextjs/isclerkapiresponserror-import-change.md | 2 +- .../versions/core-2/nextjs/isemaillinkerror-import-change.md | 2 +- .../source/versions/core-2/nextjs/isknownerror-import-change.md | 2 +- .../core-2/nextjs/multisessionappsupport-import-change.md | 2 +- .../source/versions/core-2/nextjs/redirect-import-change.md | 2 +- .../versions/core-2/nextjs/redirecttosignin-import-path.md | 2 +- .../versions/core-2/nextjs/redirecttosignup-import-path.md | 2 +- .../source/versions/core-2/nextjs/signjwt-import-change.md | 2 +- .../source/versions/core-2/nextjs/verifyjwt-import-change.md | 2 +- .../source/versions/core-2/nextjs/verifytoken-import-change.md | 2 +- .../upgrade/source/versions/core-2/node/api-url-value-change.md | 2 +- .../upgrade/source/versions/core-2/node/clerk-import-change.md | 2 +- .../source/versions/core-2/react/api-url-value-change.md | 2 +- .../upgrade/source/versions/core-2/remix/clerk-import-change.md | 2 +- .../source/versions/core-2/remix/clerkerrorboundary-removed.md | 2 +- 68 files changed, 68 insertions(+), 68 deletions(-) diff --git a/packages/upgrade/source/versions/core-2/backend/buildrequesturl-removed.md b/packages/upgrade/source/versions/core-2/backend/buildrequesturl-removed.md index 3eb12f126d6..a30526271dc 100644 --- a/packages/upgrade/source/versions/core-2/backend/buildrequesturl-removed.md +++ b/packages/upgrade/source/versions/core-2/backend/buildrequesturl-removed.md @@ -1,6 +1,6 @@ --- title: '`buildRequestUrl` import removed' -matcher: "import\\s+{[\\s\\S]*?buildRequestUrl[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/backend['\"]" +matcher: "import\\s+{[^}]*?buildRequestUrl[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/backend['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/backend/clerk-import.md b/packages/upgrade/source/versions/core-2/backend/clerk-import.md index 40dfc042847..896231bdc09 100644 --- a/packages/upgrade/source/versions/core-2/backend/clerk-import.md +++ b/packages/upgrade/source/versions/core-2/backend/clerk-import.md @@ -1,6 +1,6 @@ --- title: '`Clerk` -> `createClerkClient`' -matcher: "import\\s+{[\\s\\S]*?Clerk[\\s\\S]*?}\\s+from\\s+['\"]@clerk/backend['\"]" +matcher: "import\\s+{[^}]*?Clerk[\\s\\S]*?}\\s+from\\s+['\"]@clerk/backend['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md index 7e4ff503a7d..9615c6a3ffe 100644 --- a/packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`constants` import moved to `@clerk/backend/internal`' -matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]" +matcher: "import\\s+{[^}]*?constants[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]" matcherFlags: 'm' replaceWithString: 'backend/internal' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/createauthenticaterequest-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/createauthenticaterequest-import-path-move.md index 22621410af2..40cc45bebc2 100644 --- a/packages/upgrade/source/versions/core-2/backend/createauthenticaterequest-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/createauthenticaterequest-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`createAuthenticateRequest` import moved to `@clerk/backend/internal`' -matcher: "import\\s+{[\\s\\S]*?createAuthenticateRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" +matcher: "import\\s+{[^}]*?createAuthenticateRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)['\"]" matcherFlags: 'm' replaceWithString: 'backend/internal' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/createemail-removed.md b/packages/upgrade/source/versions/core-2/backend/createemail-removed.md index 0dbdc27686e..5f238715931 100644 --- a/packages/upgrade/source/versions/core-2/backend/createemail-removed.md +++ b/packages/upgrade/source/versions/core-2/backend/createemail-removed.md @@ -1,6 +1,6 @@ --- title: '`createEmail` import removed' -matcher: "import\\s+{[\\s\\S]*?createEmail[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/backend['\"]" +matcher: "import\\s+{[^}]*?createEmail[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/backend['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md index 23861336fb7..9dd3ec22992 100644 --- a/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`createIsomorphicRequest` import moved to `@clerk/backend/internal`' -matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]" +matcher: "import\\s+{[^}]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]" matcherFlags: 'm' replaceWithString: 'backend/internal' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md b/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md index eff4b631351..650b7a6f5dc 100644 --- a/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md +++ b/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md @@ -1,6 +1,6 @@ --- title: '`createIsomorphicRequest` import moved to `/internal`' -matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/(backend)(?!\/internal)['\"]" +matcher: "import\\s+{[^}]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/(backend)(?!\/internal)['\"]" replaceWithString: 'backend/internal' matcherFlags: 'm' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md index 52bd2927962..232275496e1 100644 --- a/packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`decodeJwt` import moved to `@clerk/backend/tokens`' -matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]" +matcher: "import\\s+{[^}]*?decodeJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]" matcherFlags: 'm' replaceWithString: 'backend/tokens' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md index a7e1cc640d9..2e11ba73783 100644 --- a/packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`redirect` import moved to `@clerk/backend/internal`' -matcher: "import\\s+{[\\s\\S]*?redirect[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]" +matcher: "import\\s+{[^}]*?redirect[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]" matcherFlags: 'm' replaceWithString: 'backend/internal' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md index d0173ba60f9..3b09633ea33 100644 --- a/packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`signJwt` import moved to `@clerk/backend/tokens`' -matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]" +matcher: "import\\s+{[^}]*?signJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]" matcherFlags: 'm' replaceWithString: 'backend/tokens' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md b/packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md index 370d206b574..91a25a93148 100644 --- a/packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md +++ b/packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md @@ -1,6 +1,6 @@ --- title: '`SignJWTError` import moved to `@clerk/backend/errors`' -matcher: "import\\s+{[\\s\\S]*?SignJWTError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" +matcher: "import\\s+{[^}]*?SignJWTError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md index 90d982ee06f..97d6c677427 100644 --- a/packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md +++ b/packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md @@ -1,6 +1,6 @@ --- title: '`TokenVerificationError` import moved to `@clerk/backend/errors`' -matcher: "import\\s+{[\\s\\S]*?TokenVerificationError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" +matcher: "import\\s+{[^}]*?TokenVerificationError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md index 10730f54d0e..c4bf8047b56 100644 --- a/packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md +++ b/packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md @@ -1,6 +1,6 @@ --- title: '`TokenVerificationErrorAction` import moved to `@clerk/backend/errors`' -matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorAction[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" +matcher: "import\\s+{[^}]*?TokenVerificationErrorAction[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md index 1daf783e9a2..6c36937b803 100644 --- a/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md +++ b/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md @@ -1,6 +1,6 @@ --- title: '`TokenVerificationErrorCode` import moved to `@clerk/backend/errors`' -matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorCode[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" +matcher: "import\\s+{[^}]*?TokenVerificationErrorCode[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md b/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md index 684dd8f11e8..e38f7de39bd 100644 --- a/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md +++ b/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md @@ -1,6 +1,6 @@ --- title: '`TokenVerificationErrorReason` import moved to `@clerk/backend/errors`' -matcher: "import\\s+{[\\s\\S]*?TokenVerificationErrorReason[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" +matcher: "import\\s+{[^}]*?TokenVerificationErrorReason[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]" matcherFlags: 'm' replaceWithString: 'backend/errors' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md b/packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md index f90e5481ab9..cf72bd53483 100644 --- a/packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md +++ b/packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md @@ -1,6 +1,6 @@ --- title: '`verifyJwt` import moved to `@clerk/backend/tokens`' -matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]" +matcher: "import\\s+{[^}]*?verifyJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]" matcherFlags: 'm' replaceWithString: 'backend/tokens' category: 'import-paths' diff --git a/packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md index df4f69605b2..61bfae3fce2 100644 --- a/packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md @@ -1,6 +1,6 @@ --- title: '`EmailLinkErrorCode` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'error-imports' replaceWithString: 'clerk-react/errors' diff --git a/packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md index d593d46dcb6..9391d6966fe 100644 --- a/packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isClerkAPIResponseError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'error-imports' replaceWithString: 'clerk-react/errors' diff --git a/packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md index 8840d54e5f4..7f845cb22e6 100644 --- a/packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isEmailLinkError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'error-imports' replaceWithString: 'clerk-react/errors' diff --git a/packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md b/packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md index 30998e05a9e..ed248e7c40b 100644 --- a/packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isKnownError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'error-imports' replaceWithString: 'clerk-react/errors' diff --git a/packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md b/packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md index 729fe65f2a9..31109857bd4 100644 --- a/packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isMetamaskError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(react)(?!\/errors)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(react)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'error-imports' replaceWithString: 'react/errors' diff --git a/packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md index ed4693f936b..36cc3234756 100644 --- a/packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md +++ b/packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md @@ -1,6 +1,6 @@ --- title: '`MultisessionAppSupport` import moved to `/internal`' -matcher: "import\\s+{[\\s\\S]*?MutliSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/clerk-react(?!\/internal)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?MutliSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/clerk-react(?!\/internal)[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/common/withclerk-hof-removed.md b/packages/upgrade/source/versions/core-2/common/withclerk-hof-removed.md index 762382bfedc..a749b212ce8 100644 --- a/packages/upgrade/source/versions/core-2/common/withclerk-hof-removed.md +++ b/packages/upgrade/source/versions/core-2/common/withclerk-hof-removed.md @@ -1,6 +1,6 @@ --- title: '`withClerk` function removed' -matcher: "import\\s+{[\\s\\S]*?withClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?withClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/common/withclerk-removed.md b/packages/upgrade/source/versions/core-2/common/withclerk-removed.md index 5f197fe721b..b7fecd0dcb5 100644 --- a/packages/upgrade/source/versions/core-2/common/withclerk-removed.md +++ b/packages/upgrade/source/versions/core-2/common/withclerk-removed.md @@ -1,6 +1,6 @@ --- title: '`WithClerk` component removed' -matcher: "import\\s+{[\\s\\S]*?WithClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?WithClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/common/withsession-hof-removed.md b/packages/upgrade/source/versions/core-2/common/withsession-hof-removed.md index 61ad0ddf788..fd3574e338b 100644 --- a/packages/upgrade/source/versions/core-2/common/withsession-hof-removed.md +++ b/packages/upgrade/source/versions/core-2/common/withsession-hof-removed.md @@ -1,6 +1,6 @@ --- title: '`withSession` function removed' -matcher: "import\\s+{[\\s\\S]*?withSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?withSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/common/withsession-removed.md b/packages/upgrade/source/versions/core-2/common/withsession-removed.md index bc4a43677f8..0e2a3d07b35 100644 --- a/packages/upgrade/source/versions/core-2/common/withsession-removed.md +++ b/packages/upgrade/source/versions/core-2/common/withsession-removed.md @@ -1,6 +1,6 @@ --- title: '`WithSession` component removed' -matcher: "import\\s+{[\\s\\S]*?WithSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?WithSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/common/withuser-hof-removed.md b/packages/upgrade/source/versions/core-2/common/withuser-hof-removed.md index 4179944a073..b12e4967d7d 100644 --- a/packages/upgrade/source/versions/core-2/common/withuser-hof-removed.md +++ b/packages/upgrade/source/versions/core-2/common/withuser-hof-removed.md @@ -1,6 +1,6 @@ --- title: '`withUser` function removed' -matcher: "import\\s+{[\\s\\S]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/common/withuser-removed-2.md b/packages/upgrade/source/versions/core-2/common/withuser-removed-2.md index 4c3f5b40240..4311b5b3c03 100644 --- a/packages/upgrade/source/versions/core-2/common/withuser-removed-2.md +++ b/packages/upgrade/source/versions/core-2/common/withuser-removed-2.md @@ -1,6 +1,6 @@ --- title: '`WithUser` component removed' -matcher: "import\\s+{[\\s\\S]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]" category: 'hof-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/fastify/clerk-import-change.md b/packages/upgrade/source/versions/core-2/fastify/clerk-import-change.md index 30d3cbf3611..32d532b76af 100644 --- a/packages/upgrade/source/versions/core-2/fastify/clerk-import-change.md +++ b/packages/upgrade/source/versions/core-2/fastify/clerk-import-change.md @@ -1,6 +1,6 @@ --- title: '`Clerk` -> `{ createClerkClient }`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/fastify[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/fastify[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/gatsby/api-url-value-change.md b/packages/upgrade/source/versions/core-2/gatsby/api-url-value-change.md index bdda5fc39ce..1d4dec4b2cf 100644 --- a/packages/upgrade/source/versions/core-2/gatsby/api-url-value-change.md +++ b/packages/upgrade/source/versions/core-2/gatsby/api-url-value-change.md @@ -1,6 +1,6 @@ --- title: '`API_URL` value has changed' -matcher: "import\\s+{[\\s\\S]*?[,\\s]API_URL[,\\s][\\s\\S]*?from\\s+['\"]gatsby-plugin-clerk\\/constants[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]API_URL[,\\s][\\s\\S]*?from\\s+['\"]gatsby-plugin-clerk\\/constants[\\s\\S]*?['\"]" matcherFlags: 'm' warning: true --- diff --git a/packages/upgrade/source/versions/core-2/gatsby/clerk-import-change.md b/packages/upgrade/source/versions/core-2/gatsby/clerk-import-change.md index c2b69fe135d..01be4617f38 100644 --- a/packages/upgrade/source/versions/core-2/gatsby/clerk-import-change.md +++ b/packages/upgrade/source/versions/core-2/gatsby/clerk-import-change.md @@ -1,6 +1,6 @@ --- title: '`Clerk` -> `{ createClerkClient }`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]gatsby-plugin-clerk[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]gatsby-plugin-clerk[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md index 972086ddeb6..750882d5788 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md @@ -1,6 +1,6 @@ --- title: '`auth` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]auth[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]auth[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md b/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md index 72de5898dd8..a4f57b33d1f 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md +++ b/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md @@ -1,6 +1,6 @@ --- title: '`authMiddleware` deprecated' -matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?authMiddleware[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'middleware' matcherFlags: 'm' warning: true diff --git a/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md index 937e03dfa68..cb9f6f802b9 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md @@ -1,6 +1,6 @@ --- title: '`authMiddleware` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?authMiddleware[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?authMiddleware[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md index db9ae9f777d..d49434a4b87 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md @@ -1,6 +1,6 @@ --- title: '`buildClerkProps` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?buildClerkProps[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?buildClerkProps[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md index a5bbda68936..ab146fe80c9 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md @@ -1,6 +1,6 @@ --- title: '`Clerk` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/nextjs(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/nextjs(?!\/server)[\\s\\S]*?['\"]" category: 'top-level-imports' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md index c88350469e6..dea092bfdce 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md @@ -1,6 +1,6 @@ --- title: '`constants` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?constants[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?constants[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md index ea2738ce96b..89999098916 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md @@ -1,6 +1,6 @@ --- title: '`createAuthenticateRequest` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?createAuthenticateRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?createAuthenticateRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md index 1484c93b4a6..c9e74752ab2 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md @@ -1,6 +1,6 @@ --- title: '`createIsomorphicRequest` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?createIsomorphicRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?createIsomorphicRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md index 1bd9e6ff837..a0237faf329 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md @@ -1,6 +1,6 @@ --- title: '`currentUser` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?currentUser[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?currentUser[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md index 84d26db0e4f..660e4bac78d 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md @@ -1,6 +1,6 @@ --- title: '`decodeJwt` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?decodeJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?decodeJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md index 11906c675ae..7f4ec3d07d6 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md @@ -1,6 +1,6 @@ --- title: '`EmailLinkErrorCode` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/errors' diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-api-url.md b/packages/upgrade/source/versions/core-2/nextjs/import-api-url.md index 9fde625ea10..6613a016fa6 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/import-api-url.md +++ b/packages/upgrade/source/versions/core-2/nextjs/import-api-url.md @@ -1,6 +1,6 @@ --- title: '`API_URL` constant removed' -matcher: "import\\s+{[\\s\\S]*?API_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?API_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-api-version.md b/packages/upgrade/source/versions/core-2/nextjs/import-api-version.md index 171b8312ccc..a43511d465f 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/import-api-version.md +++ b/packages/upgrade/source/versions/core-2/nextjs/import-api-version.md @@ -1,6 +1,6 @@ --- title: '`API_VERSION` constant removed' -matcher: "import\\s+{[\\s\\S]*?API_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?API_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-url.md b/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-url.md index 2c3cf9a6f15..fd1fca555d0 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-url.md +++ b/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-url.md @@ -1,6 +1,6 @@ --- title: '`CLERK_JS_URL` constant removed' -matcher: "import\\s+{[\\s\\S]*?CLERK_JS_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?CLERK_JS_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-version.md b/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-version.md index 14a4333d126..e69e6e0437c 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-version.md +++ b/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-version.md @@ -1,6 +1,6 @@ --- title: '`CLERK_JS_VERSION` constant removed' -matcher: "import\\s+{[\\s\\S]*?CLERK_JS_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?CLERK_JS_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-domain.md b/packages/upgrade/source/versions/core-2/nextjs/import-domain.md index 9b6879d0fce..6dcd1e71cb2 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/import-domain.md +++ b/packages/upgrade/source/versions/core-2/nextjs/import-domain.md @@ -1,6 +1,6 @@ --- title: '`DOMAIN` constant removed' -matcher: "import\\s+{[\\s\\S]*?DOMAIN[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?DOMAIN[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-is-satellite.md b/packages/upgrade/source/versions/core-2/nextjs/import-is-satellite.md index a165650c9c6..e6dd26140b0 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/import-is-satellite.md +++ b/packages/upgrade/source/versions/core-2/nextjs/import-is-satellite.md @@ -1,6 +1,6 @@ --- title: '`IS_SATELLITE` constant removed' -matcher: "import\\s+{[\\s\\S]*?IS_SATELLITE[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?IS_SATELLITE[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-proxy-url.md b/packages/upgrade/source/versions/core-2/nextjs/import-proxy-url.md index 625c09641ad..2cfa0729ba5 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/import-proxy-url.md +++ b/packages/upgrade/source/versions/core-2/nextjs/import-proxy-url.md @@ -1,6 +1,6 @@ --- title: '`PROXY_URL` constant removed' -matcher: "import\\s+{[\\s\\S]*?PROXY_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?PROXY_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-publishable-key.md b/packages/upgrade/source/versions/core-2/nextjs/import-publishable-key.md index 698e96fd067..b5d9c6daea0 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/import-publishable-key.md +++ b/packages/upgrade/source/versions/core-2/nextjs/import-publishable-key.md @@ -1,6 +1,6 @@ --- title: '`PUBLISHABLE_KEY` constant removed' -matcher: "import\\s+{[\\s\\S]*?PUBLISHABLE_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?PUBLISHABLE_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-secret-key.md b/packages/upgrade/source/versions/core-2/nextjs/import-secret-key.md index 7e1f9b5fb77..c422aa0ad09 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/import-secret-key.md +++ b/packages/upgrade/source/versions/core-2/nextjs/import-secret-key.md @@ -1,6 +1,6 @@ --- title: '`SECRET_KEY` constant removed' -matcher: "import\\s+{[\\s\\S]*?SECRET_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?SECRET_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-sign-in-url.md b/packages/upgrade/source/versions/core-2/nextjs/import-sign-in-url.md index baee6fc24ad..bdd86ca1a34 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/import-sign-in-url.md +++ b/packages/upgrade/source/versions/core-2/nextjs/import-sign-in-url.md @@ -1,6 +1,6 @@ --- title: '`SIGN_IN_URL` constant removed' -matcher: "import\\s+{[\\s\\S]*?SIGN_IN_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?SIGN_IN_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-sign-up-url.md b/packages/upgrade/source/versions/core-2/nextjs/import-sign-up-url.md index 985d08829a8..80e43dc528f 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/import-sign-up-url.md +++ b/packages/upgrade/source/versions/core-2/nextjs/import-sign-up-url.md @@ -1,6 +1,6 @@ --- title: '`SIGN_UP_URL` constant removed' -matcher: "import\\s+{[\\s\\S]*?SIGN_UP_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?SIGN_UP_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md index cd9368f33f1..816f546d669 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isClerkAPIResponseError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/errors' diff --git a/packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md index 17001b00003..23d0a23ccc7 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isEmailLinkError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/errors' diff --git a/packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md index 76d26e2b5be..74d1619f776 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md @@ -1,6 +1,6 @@ --- title: '`isKnownError` import moved under `/errors`' -matcher: "import\\s+{[\\s\\S]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/errors' diff --git a/packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md index 43d8ab3e66b..f948d6b3096 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md @@ -1,6 +1,6 @@ --- title: '`MultiSessionAppSupport` import moved under `/internal`' -matcher: "import\\s+{[\\s\\S]*?MultiSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/internal)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?MultiSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/internal)[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' replaceWithString: 'nextjs/internal' diff --git a/packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md index e821b1e5b4f..9cd53151706 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md @@ -1,6 +1,6 @@ --- title: '`redirect` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]redirect[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]redirect[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md b/packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md index 9d7890041c0..b16bc412671 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md +++ b/packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md @@ -1,6 +1,6 @@ --- title: '`redirectToSignIn` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]redirectToSignIn[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]redirectToSignIn[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md b/packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md index 2a4e51151a8..14aa735e280 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md +++ b/packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md @@ -1,6 +1,6 @@ --- title: '`redirectToSignUp` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]redirectToSignUp[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]redirectToSignUp[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" category: 'top-level-imports' replaceWithString: 'nextjs/server' --- diff --git a/packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md index 13bd77f374d..2328f693259 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md @@ -1,6 +1,6 @@ --- title: '`signJwt` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?signJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?signJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md index c1b7173a8eb..eb973236370 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md @@ -1,6 +1,6 @@ --- title: '`verifyJwt` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?verifyJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?verifyJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md index 1728c66ca45..1820a079de8 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md @@ -1,6 +1,6 @@ --- title: '`verifyToken` import moved under `/server`' -matcher: "import\\s+{[\\s\\S]*?verifyToken[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?verifyToken[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]" matcherFlags: 'm' category: 'top-level-imports' replaceWithString: 'nextjs/server' diff --git a/packages/upgrade/source/versions/core-2/node/api-url-value-change.md b/packages/upgrade/source/versions/core-2/node/api-url-value-change.md index 1c8f12c98f5..3f28d76a90c 100644 --- a/packages/upgrade/source/versions/core-2/node/api-url-value-change.md +++ b/packages/upgrade/source/versions/core-2/node/api-url-value-change.md @@ -1,6 +1,6 @@ --- title: '`API_URL` value has changed' -matcher: "import\\s+{[\\s\\S]*?[,\\s]API_URL[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/clerk-sdk-node[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]API_URL[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/clerk-sdk-node[\\s\\S]*?['\"]" matcherFlags: 'm' warning: true --- diff --git a/packages/upgrade/source/versions/core-2/node/clerk-import-change.md b/packages/upgrade/source/versions/core-2/node/clerk-import-change.md index 69581539806..ffd41918e23 100644 --- a/packages/upgrade/source/versions/core-2/node/clerk-import-change.md +++ b/packages/upgrade/source/versions/core-2/node/clerk-import-change.md @@ -1,6 +1,6 @@ --- title: '`Clerk` -> `{ createClerkClient }`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/clerk-sdk-node[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/clerk-sdk-node[\\s\\S]*?['\"]" matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/react/api-url-value-change.md b/packages/upgrade/source/versions/core-2/react/api-url-value-change.md index ff1f8dea792..8b8fa16eacd 100644 --- a/packages/upgrade/source/versions/core-2/react/api-url-value-change.md +++ b/packages/upgrade/source/versions/core-2/react/api-url-value-change.md @@ -1,6 +1,6 @@ --- title: '`API_URL` value has changed' -matcher: "import\\s+{[\\s\\S]*?[,\\s]API_URL[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/clerk-react[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]API_URL[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/clerk-react[\\s\\S]*?['\"]" matcherFlags: 'm' warning: true --- diff --git a/packages/upgrade/source/versions/core-2/remix/clerk-import-change.md b/packages/upgrade/source/versions/core-2/remix/clerk-import-change.md index c1a2a5a5226..78f27bae1b3 100644 --- a/packages/upgrade/source/versions/core-2/remix/clerk-import-change.md +++ b/packages/upgrade/source/versions/core-2/remix/clerk-import-change.md @@ -1,6 +1,6 @@ --- title: '`Clerk` -> `{ createClerkClient }`' -matcher: "import\\s+{[\\s\\S]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/remix[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/remix[\\s\\S]*?['\"]" category: 'deprecation-removal' matcherFlags: 'm' --- diff --git a/packages/upgrade/source/versions/core-2/remix/clerkerrorboundary-removed.md b/packages/upgrade/source/versions/core-2/remix/clerkerrorboundary-removed.md index 0c426409999..2436d0662b5 100644 --- a/packages/upgrade/source/versions/core-2/remix/clerkerrorboundary-removed.md +++ b/packages/upgrade/source/versions/core-2/remix/clerkerrorboundary-removed.md @@ -1,6 +1,6 @@ --- title: '`ClerkErrorBoundary` removed' -matcher: "import\\s+{[\\s\\S]*?ClerkErrorBoundary[\\s\\S]*?from\\s+['\"]@clerk\\/remix[\\s\\S]*?['\"]" +matcher: "import\\s+{[^}]*?ClerkErrorBoundary[\\s\\S]*?from\\s+['\"]@clerk\\/remix[\\s\\S]*?['\"]" category: 'error-boundary-removed' matcherFlags: 'm' --- From 88c640d131bd1050724b1522b95b456f3c2e0e8c Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 13 Mar 2024 14:20:45 -0400 Subject: [PATCH 121/159] fix(upgrade): Fix a bug with app id generation --- packages/upgrade/source/util/guess-framework.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/source/util/guess-framework.js b/packages/upgrade/source/util/guess-framework.js index f9b5c358311..e51dd90f245 100644 --- a/packages/upgrade/source/util/guess-framework.js +++ b/packages/upgrade/source/util/guess-framework.js @@ -35,7 +35,7 @@ export default function guessFrameworks(dir, disableTelemetry) { } // if there is a package.json - const _uuid = md5(pkg); + const _uuid = md5(JSON.stringify(pkg)); // no guessing if there are no deps if (!pkg.dependencies && !pkg.devDependencies) return { guesses: [], _uuid }; From d28f3d504b2634a61b84b2440294a945c857f462 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 13 Mar 2024 14:28:06 -0400 Subject: [PATCH 122/159] feat(upgrade): Remove left/right borders on CLI boxes to make it easier to copy and paste --- .../upgrade/source/util/expandable-list.js | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/upgrade/source/util/expandable-list.js b/packages/upgrade/source/util/expandable-list.js index f6a9256f568..2d9c398a7b5 100644 --- a/packages/upgrade/source/util/expandable-list.js +++ b/packages/upgrade/source/util/expandable-list.js @@ -54,9 +54,31 @@ export default function ExpandableList({ items, numberVisible = 10 }) { instance => `${instance.file}:${instance.position.line}:${instance.position.column}`, ); + const singleBorderStyle = { + topLeft: ' ', + top: '─', + topRight: ' ', + left: '', + bottomLeft: ' ', + bottom: '─', + bottomRight: ' ', + right: '', + }; + + const doubleBorderStyle = { + topLeft: ' ', + top: '═', + topRight: ' ', + left: '', + bottomLeft: ' ', + bottom: '═', + bottomRight: ' ', + right: '', + }; + memo.push( Date: Wed, 13 Mar 2024 14:35:51 -0400 Subject: [PATCH 123/159] chore(upgrade): Add util script to pull all change item titles for analytics --- packages/upgrade/source/util/all-titles.js | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/upgrade/source/util/all-titles.js diff --git a/packages/upgrade/source/util/all-titles.js b/packages/upgrade/source/util/all-titles.js new file mode 100644 index 00000000000..2e1bb523687 --- /dev/null +++ b/packages/upgrade/source/util/all-titles.js @@ -0,0 +1,5 @@ +import sdks from '../versions/core-2/index.js'; + +const allChanges = new Set(); +Object.keys(sdks).map(keys => sdks[keys].map(change => allChanges.add(change.title))); +allChanges.forEach(val => console.log(val)); From f77e7374504abd34d5977547f23734e0c2a1f664 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 13 Mar 2024 14:36:14 -0400 Subject: [PATCH 124/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index f84c6b86259..e9924a39d29 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.4.2", + "version": "0.4.3", "license": "MIT", "type": "module", "main": "dist/cli.js", From f459c760716d1b417cc44407c8361f69a3b34bf0 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Wed, 13 Mar 2024 15:12:26 -0400 Subject: [PATCH 125/159] feat(upgrade): Add in some new changes from near the end of the alpha period --- .../core-2/backend/getclientlist-arguments.md | 16 ++++++++++++++++ ...rganizationmembershiplist-return-signature.md | 2 +- .../core-2/backend/getsessionlist-arguments.md | 16 ++++++++++++++++ .../core-2/backend/interstitial-removed.md | 6 ++++++ ...etallowlistidentifierlist-return-signature.md | 15 +++++++++++++++ .../common/getclientlist-return-signature.md | 15 +++++++++++++++ .../common/getinvitationlist-return-signature.md | 15 +++++++++++++++ ...rganizationinvitationlist-return-signature.md | 2 +- .../getorganizationlist-return-signature.md | 2 +- .../getredirecturllist-return-signature.md | 15 +++++++++++++++ .../common/getsessionlist-return-signature.md | 15 +++++++++++++++ .../common/getuserlist-return-signature.md | 15 +++++++++++++++ .../getuseroauthaccesstoken-return-signature.md | 15 +++++++++++++++ ...etorganizationmemberships-return-signature.md | 15 +++++++++++++++ packages/upgrade/source/versions/core-2/index.js | 10 ++++++++++ 15 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 packages/upgrade/source/versions/core-2/backend/getclientlist-arguments.md create mode 100644 packages/upgrade/source/versions/core-2/backend/getsessionlist-arguments.md create mode 100644 packages/upgrade/source/versions/core-2/backend/interstitial-removed.md create mode 100644 packages/upgrade/source/versions/core-2/common/getallowlistidentifierlist-return-signature.md create mode 100644 packages/upgrade/source/versions/core-2/common/getclientlist-return-signature.md create mode 100644 packages/upgrade/source/versions/core-2/common/getinvitationlist-return-signature.md create mode 100644 packages/upgrade/source/versions/core-2/common/getredirecturllist-return-signature.md create mode 100644 packages/upgrade/source/versions/core-2/common/getsessionlist-return-signature.md create mode 100644 packages/upgrade/source/versions/core-2/common/getuserlist-return-signature.md create mode 100644 packages/upgrade/source/versions/core-2/common/getuseroauthaccesstoken-return-signature.md create mode 100644 packages/upgrade/source/versions/core-2/common/user-getorganizationmemberships-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/backend/getclientlist-arguments.md b/packages/upgrade/source/versions/core-2/backend/getclientlist-arguments.md new file mode 100644 index 00000000000..93ccd198bb3 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/backend/getclientlist-arguments.md @@ -0,0 +1,16 @@ +--- +title: '`Clients.getClientList` arguments changed' +matcher: "\\.getClientList\\(" +category: 'pagination-args' +--- + +There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + +```diff + const { data } = await clients.getClientList({ +- limit: 10, ++ pageSize: 10, +- offset: 10, ++ initialPage: 2, + }) +``` diff --git a/packages/upgrade/source/versions/core-2/backend/getorganizationmembershiplist-return-signature.md b/packages/upgrade/source/versions/core-2/backend/getorganizationmembershiplist-return-signature.md index cf3ac26e1c3..279e8d044be 100644 --- a/packages/upgrade/source/versions/core-2/backend/getorganizationmembershiplist-return-signature.md +++ b/packages/upgrade/source/versions/core-2/backend/getorganizationmembershiplist-return-signature.md @@ -5,7 +5,7 @@ category: 'pagination-return' warning: true --- -The response payload of `Users.getOrganizationMembershipList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. +The response payload of `Users.getOrganizationMembershipList` was changed as part of the core 2 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. Here's an example of how the response shape would change with this modification: diff --git a/packages/upgrade/source/versions/core-2/backend/getsessionlist-arguments.md b/packages/upgrade/source/versions/core-2/backend/getsessionlist-arguments.md new file mode 100644 index 00000000000..1cfa39d8eb7 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/backend/getsessionlist-arguments.md @@ -0,0 +1,16 @@ +--- +title: '`Sessions.getSessionList` arguments changed' +matcher: "\\.getSessionList\\(" +category: 'pagination-args' +--- + +There have been a couple changes to the pagination arguments that can be passed into this function - `limit` has been renamed to `pageSize`, and `offset` has been renamed to `initialPage`. This will help to make it more clear and simple to reason about pagination control. Example of how changes might look below: + +```diff + const { data } = await sessions.getSessionList({ +- limit: 10, ++ pageSize: 10, +- offset: 10, ++ initialPage: 2, + }) +``` diff --git a/packages/upgrade/source/versions/core-2/backend/interstitial-removed.md b/packages/upgrade/source/versions/core-2/backend/interstitial-removed.md new file mode 100644 index 00000000000..73af491ab91 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/backend/interstitial-removed.md @@ -0,0 +1,6 @@ +--- +title: '`interstitial` api removed' +matcher: "loadInterstitialFromLocal\\(" +--- + +The interstitial has been replaced within Clerk internals entirely by a new mechanism called "handshake". If you were using the interstitial API in your logic, please reach out to [Clerk support](https://clerk.com/support) to connect with our team and discuss how to migrate your code to use the new handshake mechanism. diff --git a/packages/upgrade/source/versions/core-2/common/getallowlistidentifierlist-return-signature.md b/packages/upgrade/source/versions/core-2/common/getallowlistidentifierlist-return-signature.md new file mode 100644 index 00000000000..6f6766b7473 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/common/getallowlistidentifierlist-return-signature.md @@ -0,0 +1,15 @@ +--- +title: '`AllowlistIdentifiers.getAllowlistIdentifierList` return signature changed' +matcher: "\\.allowlistIdentifiers\\.getAllowlistIdentifierList\\(" +category: 'pagination-return' +warning: true +--- + +The response payload of `AllowlistIdentifiers.getAllowlistIdentifierList` was changed as part of the core 2 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.allowlistIdentifiers.getAllowlistIdentifierList() ++ const { data, totalCount } = await clerkClient.allowlistIdentifiers.getAllowlistIdentifierList() +``` diff --git a/packages/upgrade/source/versions/core-2/common/getclientlist-return-signature.md b/packages/upgrade/source/versions/core-2/common/getclientlist-return-signature.md new file mode 100644 index 00000000000..c4db50292a7 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/common/getclientlist-return-signature.md @@ -0,0 +1,15 @@ +--- +title: '`Clients.getClientList` return signature changed' +matcher: "\\.clients\\.getClientList\\(" +category: 'pagination-return' +warning: true +--- + +The response payload of `Clients.getClientList` was changed as part of the core 2 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.clients.getClientList() ++ const { data, totalCount } = await clerkClient.allowlistIdentifiers.getClientList() +``` diff --git a/packages/upgrade/source/versions/core-2/common/getinvitationlist-return-signature.md b/packages/upgrade/source/versions/core-2/common/getinvitationlist-return-signature.md new file mode 100644 index 00000000000..362d3ce9731 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/common/getinvitationlist-return-signature.md @@ -0,0 +1,15 @@ +--- +title: '`Invitations.getInvitationList` return signature changed' +matcher: "\\.invitations\\.getInvitationList\\(" +category: 'pagination-return' +warning: true +--- + +The response payload of `Invitations.getInvitationList` was changed as part of the core 2 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.invitations.getInvitationList() ++ const { data, totalCount } = await clerkClient.invitations.getInvitationList() +``` diff --git a/packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-signature.md b/packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-signature.md index a6c095cd86f..d7abfd4bfe0 100644 --- a/packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-signature.md +++ b/packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-signature.md @@ -5,7 +5,7 @@ category: 'pagination-return' warning: true --- -The response payload of `Users.getOrganizationInvitationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. +The response payload of `Users.getOrganizationInvitationList` was changed as part of the core 2 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. Here's an example of how the response shape would change with this modification: diff --git a/packages/upgrade/source/versions/core-2/common/getorganizationlist-return-signature.md b/packages/upgrade/source/versions/core-2/common/getorganizationlist-return-signature.md index a1e3fb3de09..2c76ab3c978 100644 --- a/packages/upgrade/source/versions/core-2/common/getorganizationlist-return-signature.md +++ b/packages/upgrade/source/versions/core-2/common/getorganizationlist-return-signature.md @@ -5,7 +5,7 @@ category: 'pagination-return' warning: true --- -The response payload of `Users.getOrganizationList` was changed as part of the v5 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. +The response payload of `Users.getOrganizationList` was changed as part of the core 2 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. Here's an example of how the response shape would change with this modification: diff --git a/packages/upgrade/source/versions/core-2/common/getredirecturllist-return-signature.md b/packages/upgrade/source/versions/core-2/common/getredirecturllist-return-signature.md new file mode 100644 index 00000000000..da4c59d81a6 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/common/getredirecturllist-return-signature.md @@ -0,0 +1,15 @@ +--- +title: '`RedirectUrls.getRedirectUrlList` return signature changed' +matcher: "\\.redirectUrls\\.getRedirectUrlList\\(" +category: 'pagination-return' +warning: true +--- + +The response payload of `RedirectUrls.getRedirectUrlList` was changed as part of the core 2 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.redirectUrls.getRedirectUrlList() ++ const { data, totalCount } = await clerkClient.redirectUrls.getRedirectUrlList() +``` diff --git a/packages/upgrade/source/versions/core-2/common/getsessionlist-return-signature.md b/packages/upgrade/source/versions/core-2/common/getsessionlist-return-signature.md new file mode 100644 index 00000000000..20a6bc092cf --- /dev/null +++ b/packages/upgrade/source/versions/core-2/common/getsessionlist-return-signature.md @@ -0,0 +1,15 @@ +--- +title: '`Sessions.getSessionList` return signature changed' +matcher: "\\.sessions\\.getSessionList\\(" +category: 'pagination-return' +warning: true +--- + +The response payload of `Sessions.getSessionList` was changed as part of the core 2 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.sessions.getSessionList() ++ const { data, totalCount } = await clerkClient.sessions.getSessionList() +``` diff --git a/packages/upgrade/source/versions/core-2/common/getuserlist-return-signature.md b/packages/upgrade/source/versions/core-2/common/getuserlist-return-signature.md new file mode 100644 index 00000000000..3a30703901f --- /dev/null +++ b/packages/upgrade/source/versions/core-2/common/getuserlist-return-signature.md @@ -0,0 +1,15 @@ +--- +title: '`Users.getUserList` return signature changed' +matcher: "\\.users\\.getUserList\\(" +category: 'pagination-return' +warning: true +--- + +The response payload of `Users.getUserList` was changed as part of the core 2 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.users.getUserList() ++ const { data, totalCount } = await clerkClient.users.getUserList() +``` diff --git a/packages/upgrade/source/versions/core-2/common/getuseroauthaccesstoken-return-signature.md b/packages/upgrade/source/versions/core-2/common/getuseroauthaccesstoken-return-signature.md new file mode 100644 index 00000000000..498d805ddec --- /dev/null +++ b/packages/upgrade/source/versions/core-2/common/getuseroauthaccesstoken-return-signature.md @@ -0,0 +1,15 @@ +--- +title: '`Users.getUserOauthAccessToken` return signature changed' +matcher: "\\.users\\.getUserOauthAccessToken\\(" +category: 'pagination-return' +warning: true +--- + +The response payload of `Users.getUserOauthAccessToken` was changed as part of the core 2 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.users.getUserOauthAccessToken() ++ const { data, totalCount } = await clerkClient.users.getUserOauthAccessToken() +``` diff --git a/packages/upgrade/source/versions/core-2/common/user-getorganizationmemberships-return-signature.md b/packages/upgrade/source/versions/core-2/common/user-getorganizationmemberships-return-signature.md new file mode 100644 index 00000000000..279e8d044be --- /dev/null +++ b/packages/upgrade/source/versions/core-2/common/user-getorganizationmemberships-return-signature.md @@ -0,0 +1,15 @@ +--- +title: '`Users.getOrganizationMembershipList` return signature changed' +matcher: "\\.users\\.getOrganizationMembershipList\\(" +category: 'pagination-return' +warning: true +--- + +The response payload of `Users.getOrganizationMembershipList` was changed as part of the core 2 release. Rather than directly returning ` data`, the return signature is now `{ data, totalCount }`. Since backend API responses are paginated, the `totalCount` property is helpful in determining the total number of items in the response easily, and this change in the backend SDK aligns the response shape with what the backend API returns directly. + +Here's an example of how the response shape would change with this modification: + +```diff +- const data = await clerkClient.users.getOrganizationMembershipList() ++ const { data, totalCount } = await clerkClient.users.getOrganizationMembershipList() +``` diff --git a/packages/upgrade/source/versions/core-2/index.js b/packages/upgrade/source/versions/core-2/index.js index 2df4c5cba5f..7c53a38862a 100644 --- a/packages/upgrade/source/versions/core-2/index.js +++ b/packages/upgrade/source/versions/core-2/index.js @@ -14,11 +14,19 @@ const changesAffectingAll = [ 'user-getorganizationinvitations-arguments-changed', 'user-getorganizationsuggestions-arguments-changed', 'user-getorganizationmemberships-arguments-changed', + 'user-getorganizationmemberships-return-signature', 'getorganizationinvitationlist-return-signature', 'getorganizationinvitationlist-return-type-change', 'getorganizationmembershiplist-return-type-change', 'getorganizationlist-return-signature', 'getorganizationlist-return-type-change', + 'getinvitationlist-return-signature', + 'getsessionlist-return-signature', + 'getuserlist-return-signature', + 'getallowlistidentifierlist-return-signature', + 'getclientlist-return-signature', + 'getredirecturllist-return-signature', + 'getuseroauthaccesstoken-return-signature', 'organization-logourl', 'user-profileimageurl', 'user-update-password', @@ -354,6 +362,8 @@ export default { 'getorganizationmembershiplist-return-signature', 'buildrequesturl-removed', 'createclerkclient-apikey', + 'getclientlist-arguments', + 'getsessionlist-arguments', ]), ), types: [], From 88152bc07fb176558e2196542f3b022e9b40102c Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 14 Mar 2024 13:50:15 -0400 Subject: [PATCH 126/159] chore(upgrade): Update middleware guide to remove route protection, clarify that files are generated --- .../core-2/nextjs/middleware-changes.mdx | 55 ++----------------- .../guide-generators/text-generation.js | 4 +- 2 files changed, 9 insertions(+), 50 deletions(-) diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx b/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx index 0c9f802ca3d..3a584dd11a3 100644 --- a/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx +++ b/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx @@ -2,54 +2,9 @@ User and customer feedback about `authMiddleware()` has been clear in that Middleware logic was a often friction point. As such, in v5 you will find a completely new Middleware helper called [`clerkMiddleware()`](/docs/references/nextjs/clerk-middleware) that should alleviate the issues folks had with `authMiddleware()`. -Additionally, there are now new helpers that enable controlling auth on a _per-page and/or per-layout basis_ when using App Router. While you can still configure which routes are protected via Middleware, the page-based protection strategy is what is now recommended, as the co-location of auth protection configuration with the code for the pages themselves results in a superior developer experience that adds clarity as you navigate your codebase. +The primary change from the previous `authMiddleware()` is that `clerkMiddleware()` does not protect any routes by default, instead requiring the developer to add routes they would like to be protected by auth. This is a substantial contrast to the previous `authMiddleware()`, which protected all routes by default, requiring the developer to add exceptions. The API was also substantially simplified, and it has become easier to combine with other Middleware helpers smoothly as well. -#### Per-route auth config - -Sometimes, code speaks louder than words. Let's get right into an example: - - - - ```ts filename="app/src/dashboard/layout.tsx" - import { auth } from '@clerk/nextjs/server' - - export default async function DashboardLayout({ children }) { - auth().protect(); - // 👆 This one line is all it takes - the layout and all its children - // will now redirect to your sign in page for un-authenticated users. - - return <>{children} - } - ``` - - - - ```ts filename="app/src/dashboard/page.tsx" - import { auth } from '@clerk/nextjs/server' - - export default async function DashboardPage() { - auth().protect(); - // 👆 This one line is all it takes - the layout and all its children - // will now redirect to your sign in page for un-authenticated users. - - return

This page is now protected!

- } - ``` - -
-
- -In this example, you add [`auth().protect()`](/docs/references/nextjs/auth#protect) to a layout and that layout and all of it's children will be gated by auth. The same logic can be applied for pages. - -For more details on route protection, check out the [route protection guide](/references/nextjs/route-protection). - -If you are using the pages router, per-route gating won't work. Instead, configure your auth gating via Middleware as described in the next section. - -#### Middleware auth config - -If you prefer to define your auth logic within the Middleware, you can still do this using the new `clerkMiddleware`. The primary change from the previous `authMiddleware()` is that `clerkMiddleware()` does not protect any routes by default, instead requiring the developer to add routes they would like to be protected by auth. This is a substantial contrast to the previous `authMiddleware()`, which protected all routes by default, requiring the developer to add exceptions. The API was also substantially simplified, and it has become easier to combine with other Middleware helpers smoothly as well. - -Here's an example that replicates the auth protection scheme above, but entirely inside the Middleware: +Here's an example that demonstrates route protection based on both authentication and authorization: ```ts filename="middleware.ts" import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'; @@ -74,7 +29,9 @@ A couple things to note here: - The `createRouteMatcher` helper makes it easy to define route groups that you can leverage inside the Middleware function and check in whichever order you'd like. Note that it can take an array of routes as well. - With `clerkMiddleware`, you're defining the routes you want **to be protected**, rather than the routes you don't want to be protected. -- You are able to use the same `auth().protect()` helpers that you can use within layouts/pages here in the Middleware. +- The [`auth().protect()`](https://clerk.com/docs/references/nextjs/auth#protect) helper is utilized heavily here, check out its docs for more info. + +See the [`clerkMiddleware()`](/docs/references/nextjs/clerk-middleware) docs for more information and detailed usage examples. #### Migrating to `clerkMiddleware()` @@ -94,7 +51,7 @@ The most basic migration will be updating the import and changing out the defaul } ``` -Of course, in most cases you'll have a more complicated setup than this. You can find some examples below for how to migrate a few common use cases. Be sure to review the [`clerkMiddleware()` documentation](/docs/references/nextjs/clerk-middleware) and [route protection guide](/docs/references/nextjs/route-protection) if your specific use case is not mentioned. +Of course, in most cases you'll have a more complicated setup than this. You can find some examples below for how to migrate a few common use cases. Be sure to review the [`clerkMiddleware()` documentation](/docs/references/nextjs/clerk-middleware) if your specific use case is not mentioned. diff --git a/packages/upgrade/source/guide-generators/text-generation.js b/packages/upgrade/source/guide-generators/text-generation.js index 09a116b6549..3f5af3a4315 100644 --- a/packages/upgrade/source/guide-generators/text-generation.js +++ b/packages/upgrade/source/guide-generators/text-generation.js @@ -25,7 +25,9 @@ export function frontmatter(obj) { ${Object.keys(obj) .map(k => `${k}: "${obj[k]}"`) .join('\n')} ----`; +--- + +{/* WARNING: This is a generated file and should not be edited directly. To update its contents, see the "upgrade" package in the clerk/javascript repo. */}`; } // Renders a markdown file, partial-style - will read out of shared if not found in sdk dir From 855d675ca3ed0b0cf5c5cb50bb31348aef8bbbaa Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 14 Mar 2024 13:59:46 -0400 Subject: [PATCH 127/159] chore(upgrade): Add AP design note to retheme --- .../upgrade/source/guide-generators/core-2/retheme/intro.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/upgrade/source/guide-generators/core-2/retheme/intro.mdx b/packages/upgrade/source/guide-generators/core-2/retheme/intro.mdx index b6b992d6f9c..844960a3f94 100644 --- a/packages/upgrade/source/guide-generators/core-2/retheme/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/retheme/intro.mdx @@ -7,3 +7,5 @@ The new version ships with improved design and UX across all of Clerk's [UI comp
The sections below contain more info on each change made to the customization ids and localization keys for reference. Regardless of how thoroughly you have reviewed the following information, we still recommend that you ensure that you have taken some time to manually look through each of your views to ensure that everything looks good still. + +Also worth noting - if you are using Clerk's account portal (hosted sign in page), and would like to enable the new design there, you can do so via the "customization" tab on the [account portal page](https://dashboard.clerk.com/last-active?path=account-portal) in your dashboard. Selecting "Core 2" from the "ClerkJS Components" dropdown will enable the new designs. From f37cdb4f7da00e139871e2e82002d597b57b4581 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 19 Mar 2024 17:24:03 -0400 Subject: [PATCH 128/159] fix(upgrade): Fix middleware docs links from CLI --- .../versions/core-2/nextjs/auth-middleware-deprecated.md | 4 ++-- .../versions/core-2/nextjs/authmiddleware-import-change.md | 2 +- .../versions/core-2/nextjs/with-clerk-middleware-removed.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md b/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md index a4f57b33d1f..c5833976b05 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md +++ b/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md @@ -6,9 +6,9 @@ matcherFlags: 'm' warning: true --- -The [`authMiddleware`](https://clerk.com/docs/references/nextjs/auth-middleware) API from `@clerk/nextjs` has been marked as deprecated. We highly recommend using [`clerkMiddleware`](https://clerk.com/docs/references/nextjs/clerk-middleware) going forward. `clerkMiddleware` protects no routes by default and you need to add your individual routes you want to opt into protection. Here's an example of having all routes public except for everything under `/dashboard`. +The [`authMiddleware`](https://clerk.com/docs/references/nextjs/auth-middleware) API from `@clerk/nextjs` has been marked as deprecated. We highly recommend using [`clerkMiddleware`](https://beta.clerk.com/docs/references/nextjs/clerk-middleware) going forward. `clerkMiddleware` protects no routes by default and you need to add your individual routes you want to opt into protection. Here's an example of having all routes public except for everything under `/dashboard`. -For more documentation on the new `clerkMiddleware` function, check out [our official docs](https://clerk.com/docs/references/nextjs/clerk-middleware)! +For more documentation on the new `clerkMiddleware` function, check out [our official docs](https://beta.clerk.com/docs/references/nextjs/clerk-middleware)! **Before:** diff --git a/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md index cb9f6f802b9..dbcf747a917 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md @@ -6,7 +6,7 @@ category: 'top-level-imports' replaceWithString: 'nextjs/server' --- -The `authMiddleware` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Note as well that `authMiddleware` is deprecated as of this release, and we recommend [using `clerkMiddleware` instead](https://clerk.com/docs/references/nextjs/clerk-middleware). Example below of the fix that needs to be made: +The `authMiddleware` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Note as well that `authMiddleware` is deprecated as of this release, and we recommend [using `clerkMiddleware` instead](https://beta.clerk.com/docs/references/nextjs/clerk-middleware). Example below of the fix that needs to be made: ```diff - import { authMiddleware } from "@clerk/nextjs" diff --git a/packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md b/packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md index eef3727f0e0..dd0ee956f35 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md +++ b/packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md @@ -4,7 +4,7 @@ category: 'middleware' matcher: "withClerkMiddleware\\(" --- -`withClerkMiddleware` has been deprecated and is now removed in v5. We recommend moving to `clerkMiddleware` instead. Please read the [clerkMiddleware guide](https://clerk.com/docs/references/nextjs/clerk-middleware) for more details. Here’s an example of how a simple middleware setup might look before and after. +`withClerkMiddleware` has been deprecated and is now removed in v5. We recommend moving to `clerkMiddleware` instead. Please read the [clerkMiddleware guide](https://beta.clerk.com/docs/references/nextjs/clerk-middleware) for more details. Here’s an example of how a simple middleware setup might look before and after. ```js // Before: using withClerkMiddleware From 72581e273879d339666afe1e1272666c8d81b724 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Tue, 19 Mar 2024 17:24:24 -0400 Subject: [PATCH 129/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index e9924a39d29..e7d35f0770a 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.4.3", + "version": "0.4.4", "license": "MIT", "type": "module", "main": "dist/cli.js", From 7e13aec05f021ba074abab118e5452eaf9b13685 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Apr 2024 14:50:52 -0400 Subject: [PATCH 130/159] feat(upgrade): Add aftersignxurl changes --- .../guide-generators/core-2/gatsby/index.js | 2 ++ .../guide-generators/core-2/js/index.js | 2 ++ .../guide-generators/core-2/nextjs/index.js | 2 ++ .../guide-generators/core-2/react/index.js | 1 + .../guide-generators/core-2/remix/index.js | 1 + .../core-2/shared/after-sign-x-handling.mdx | 2 +- .../core-2/common/aftersignxurl-changes.md | 35 +++++++++++++++++++ .../upgrade/source/versions/core-2/index.js | 1 + 8 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 packages/upgrade/source/versions/core-2/common/aftersignxurl-changes.md diff --git a/packages/upgrade/source/guide-generators/core-2/gatsby/index.js b/packages/upgrade/source/guide-generators/core-2/gatsby/index.js index 9089b2e1ef6..15b59659fad 100644 --- a/packages/upgrade/source/guide-generators/core-2/gatsby/index.js +++ b/packages/upgrade/source/guide-generators/core-2/gatsby/index.js @@ -6,6 +6,7 @@ import { loadVersionChangeData, markdown, markdownTemplate, + singleItem, writeToFile, } from '../../text-generation.js'; @@ -34,6 +35,7 @@ async function generate() { '## Breaking Changes', markdown('redesign-preview'), markdown('after-sign-x-handling'), + singleItem('aftersignxurl-changes'), markdown('orgs-claim'), markdownTemplate('path-routing', { packageName }), markdown('image-url'), diff --git a/packages/upgrade/source/guide-generators/core-2/js/index.js b/packages/upgrade/source/guide-generators/core-2/js/index.js index 69731447fa4..b03eee8502e 100644 --- a/packages/upgrade/source/guide-generators/core-2/js/index.js +++ b/packages/upgrade/source/guide-generators/core-2/js/index.js @@ -6,6 +6,7 @@ import { loadVersionChangeData, markdown, markdownTemplate, + singleItem, writeToFile, } from '../../text-generation.js'; @@ -32,6 +33,7 @@ async function generate() { '## Breaking Changes', markdown('redesign-preview'), markdown('after-sign-x-handling'), + singleItem('aftersignxurl-changes'), markdown('orgs-claim'), markdownTemplate('path-routing', { packageName }), markdown('image-url'), diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/index.js b/packages/upgrade/source/guide-generators/core-2/nextjs/index.js index 1b9f23174df..23c52e2b5de 100644 --- a/packages/upgrade/source/guide-generators/core-2/nextjs/index.js +++ b/packages/upgrade/source/guide-generators/core-2/nextjs/index.js @@ -6,6 +6,7 @@ import { loadVersionChangeData, markdown, markdownTemplate, + singleItem, writeToFile, } from '../../text-generation.js'; @@ -37,6 +38,7 @@ async function generate() { markdown('middleware-changes'), markdown('import-changes'), markdown('after-sign-x-handling'), + singleItem('aftersignxurl-changes'), markdown('orgs-claim'), markdownTemplate('path-routing', { packageName }), markdown('image-url'), diff --git a/packages/upgrade/source/guide-generators/core-2/react/index.js b/packages/upgrade/source/guide-generators/core-2/react/index.js index 88de6d4e66e..baec27cae58 100644 --- a/packages/upgrade/source/guide-generators/core-2/react/index.js +++ b/packages/upgrade/source/guide-generators/core-2/react/index.js @@ -35,6 +35,7 @@ async function generate() { '## Breaking Changes', markdown('redesign-preview'), markdown('after-sign-x-handling'), + singleItem('aftersignxurl-changes'), singleItem('navigate-to-routerpush-routerreplace'), markdown('orgs-claim'), markdownTemplate('path-routing', { packageName }), diff --git a/packages/upgrade/source/guide-generators/core-2/remix/index.js b/packages/upgrade/source/guide-generators/core-2/remix/index.js index 11001cade42..fd478336ece 100644 --- a/packages/upgrade/source/guide-generators/core-2/remix/index.js +++ b/packages/upgrade/source/guide-generators/core-2/remix/index.js @@ -36,6 +36,7 @@ async function generate() { singleItem('clerkerrorboundary-removed'), markdown('redesign-preview'), markdown('after-sign-x-handling'), + singleItem('aftersignxurl-changes'), markdown('orgs-claim'), markdownTemplate('path-routing', { packageName }), markdown('image-url'), diff --git a/packages/upgrade/source/guide-generators/core-2/shared/after-sign-x-handling.mdx b/packages/upgrade/source/guide-generators/core-2/shared/after-sign-x-handling.mdx index fe4b81cd2f0..a10a3ea97ae 100644 --- a/packages/upgrade/source/guide-generators/core-2/shared/after-sign-x-handling.mdx +++ b/packages/upgrade/source/guide-generators/core-2/shared/after-sign-x-handling.mdx @@ -1,4 +1,4 @@ -### After sign up/in/out URL handling +### After sign up/in/out default value change Defining redirect URLs for after sign up, in, and/or out via the Clerk dashboard has been removed in Core 2. In your Clerk dashboard, under "paths", there is a section called "Component paths", where URLs could be defined that had a deprecation warning. In Core 2, this functionality has been removed, and specifying redirect paths via the dashboard will no longer work. If you need to pass a redirect URL for after sign in/up/out, there are [a few different ways this can be done](https://clerk.com/docs/account-portal/custom-redirects), from environment variables to middleware to supplying them directly to the relevant components. diff --git a/packages/upgrade/source/versions/core-2/common/aftersignxurl-changes.md b/packages/upgrade/source/versions/core-2/common/aftersignxurl-changes.md new file mode 100644 index 00000000000..d96ad7d2913 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/common/aftersignxurl-changes.md @@ -0,0 +1,35 @@ +--- +title: '`afterSignXUrl` changes' +matcher: + - 'CLERK_AFTER_SIGN_IN_URL' + - 'CLERK_AFTER_SIGN_UP_URL' + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" +category: 'after-sign-x-url-changes' +matcherFlags: 'm' +--- + +Some changes are being made to the way that "after sign up/in url"s and redirect url props are handled as part of this new version, in order to make behavior more clear and predictable. + +> We will refer to these urls as `afterSignXUrl` where `X` could be `Up` or `In` depending on the context. + +Previously, setting `afterSignInUrl` or `afterSignOutUrl` would only actually redirect some of the time. If the user clicks on any form of link that takes them to a sign up/in page, Clerk automatically sets `redirect_url` in the querystring such that after the sign up or in, the user is returned back to the page they were on before. This is a common pattern for sign up/in flows, as it leads to the least interruption of the user's navigation through your app. When a `redirect_url` is present, any value passed to `afterSignInUrl` or `afterSignUpUrl` is ignored. However, if the user navigates directly to a sign up/in page, there’s no redirect url in the querystring and in this case the `afterSignInUrl` or `afterSignOutUrl` would take effect. This behavior was not intuitive and didn't give a way to force a redirect after sign up/in, so the behavior is changing to address both of these issues. + +All `afterSignXUrl` props and `CLERK_AFTER_SIGN_X_URL` environment variables have been removed, and should be replaced by one of the following options: + +- `signXForceRedirectUrl` / `CLERK_SIGN_X_FORCE_REDIRECT_URL` - if set, Clerk will always redirect to provided URL, regardless of what page the user was on before. Use this option with caution, as it will interrupt the user’s flow by taking them away from the page they were on before. +- `signXFallbackRedirectUrl` / `CLERK_SIGN_UP_FALLBACK_REDIRECT_URL` - if set, this will mirror the previous behavior, only redirecting to the provided URL if there is no `redirect_url` in the querystring. + +If neither value is set, Clerk will redirect to the `redirect_url` if present, otherwise it will redirect to `/`. If you'd like to retain the current behavior of your app without any changes, you can switch `afterSignXUrl` with `signXFallbackRedirectUrl` as such: + +```diff +- ++ +``` diff --git a/packages/upgrade/source/versions/core-2/index.js b/packages/upgrade/source/versions/core-2/index.js index 7c53a38862a..23b431f4285 100644 --- a/packages/upgrade/source/versions/core-2/index.js +++ b/packages/upgrade/source/versions/core-2/index.js @@ -38,6 +38,7 @@ const jsChanges = [ 'organization-getpendinginvitations', 'mfa-dropdown', 'appearance-variables-breaking-changes', + 'aftersignxurl-changes', ]; const reactChanges = [ From d078a7a25636fc72d134403c4f47d5b8b1f0f0aa Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Apr 2024 14:57:24 -0400 Subject: [PATCH 131/159] feat(upgrade): Add an extra example to middleware guide --- .../core-2/nextjs/middleware-changes.mdx | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx b/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx index 3a584dd11a3..f3b8bf260fe 100644 --- a/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx +++ b/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx @@ -53,7 +53,7 @@ The most basic migration will be updating the import and changing out the defaul Of course, in most cases you'll have a more complicated setup than this. You can find some examples below for how to migrate a few common use cases. Be sure to review the [`clerkMiddleware()` documentation](/docs/references/nextjs/clerk-middleware) if your specific use case is not mentioned. - + By default, `clerkMiddleware()` treats all pages as public unless explicitly protected. If you prefer for it to operate the other way around (all pages are protected unless explicitly made public), you can reverse the middleware logic in this way: @@ -183,4 +183,36 @@ Of course, in most cases you'll have a more complicated setup than this. You can ``` + + You can now access `redirectToSignIn` from the `auth()` object, rather than importing at the top level. + + Before: + + ```ts filename="middleware.ts" + import { authMiddleware, redirectToSignIn } from "@clerk/nextjs" + + export default authMiddleware({ + if (someCondition) redirectToSignIn() + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + After: + + ```ts filename="middleware.ts" + import { clerkMiddleware } from "@clerk/nextjs/server" + + export default clerkMiddleware((auth, req) => { + if (someCondition) auth().redirectToSignIn() + }) + + export const config = { + matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], + } + ``` + + From b605e76ae92945ac9a1b8fc238a8bead37ad2ebf Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Apr 2024 15:04:01 -0400 Subject: [PATCH 132/159] feat(upgrade): Add js clerk import change and backend members_count change --- .../source/versions/core-2/backend/members-count.md | 11 +++++++++++ packages/upgrade/source/versions/core-2/index.js | 2 ++ .../source/versions/core-2/js/clerk-import.md | 13 +++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 packages/upgrade/source/versions/core-2/backend/members-count.md create mode 100644 packages/upgrade/source/versions/core-2/js/clerk-import.md diff --git a/packages/upgrade/source/versions/core-2/backend/members-count.md b/packages/upgrade/source/versions/core-2/backend/members-count.md new file mode 100644 index 00000000000..d4db3894b57 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/backend/members-count.md @@ -0,0 +1,11 @@ +--- +title: "`Organization.members_count` -> `Organization.membersCount`" +matcher: "\.members_count" +--- + +The `members_count` attribute of the `Organization` resource has been renamed to `membersCount` to match the naming convention of other attributes. + +```diff +- organization.members_count ++ organization.membersCount +``` diff --git a/packages/upgrade/source/versions/core-2/index.js b/packages/upgrade/source/versions/core-2/index.js index 23b431f4285..f28f1d860ed 100644 --- a/packages/upgrade/source/versions/core-2/index.js +++ b/packages/upgrade/source/versions/core-2/index.js @@ -309,6 +309,7 @@ export default { 'signoutcallback-to-redirecturl', 'externalaccount-avatarurl', 'organizationmembershippublicuserdata-profileimageurl', + 'clerk-import', ]), ), shared: load('shared', [ @@ -365,6 +366,7 @@ export default { 'createclerkclient-apikey', 'getclientlist-arguments', 'getsessionlist-arguments', + 'members-count', ]), ), types: [], diff --git a/packages/upgrade/source/versions/core-2/js/clerk-import.md b/packages/upgrade/source/versions/core-2/js/clerk-import.md new file mode 100644 index 00000000000..14a30f4f963 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/js/clerk-import.md @@ -0,0 +1,13 @@ +--- +title: '`Clerk` import changed' +matcher: "import\\s+{[^}]*?(Clerk)[\\s\\S]*?}\\s+from\\s+['\"]@clerk/clerk-js['\"]" +matcherFlags: 'm' +replaceWithString: '{ Clerk }' +--- + +The top level `Clerk` import was changed to a named export, like `{ Clerk }`. This is just a name change and can be treated as a text replacement, no changes to the params or return types. + +```diff +- import Clerk from '@clerk/clerk-js'; ++ import { Clerk } from '@clerk/clerk-js'; +``` From 2cf6093a4af7e10a253d1ead14ea47b0bfd7a207 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Apr 2024 15:18:59 -0400 Subject: [PATCH 133/159] feat(upgrade): Add js import change, supported external accounts removal, sdk node publickey reqs --- packages/upgrade/source/versions/core-2/index.js | 3 +++ packages/upgrade/source/versions/core-2/js/clerk-import.md | 2 +- .../core-2/js/supported-external-accounts-type-removed.md | 7 +++++++ .../createclerkexpressrequireauth-public-key-required.md | 7 +++++++ .../node/createclerkexpresswithauth-publickey-required.md | 0 5 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 packages/upgrade/source/versions/core-2/js/supported-external-accounts-type-removed.md create mode 100644 packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md create mode 100644 packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-publickey-required.md diff --git a/packages/upgrade/source/versions/core-2/index.js b/packages/upgrade/source/versions/core-2/index.js index f28f1d860ed..b2d5fee4380 100644 --- a/packages/upgrade/source/versions/core-2/index.js +++ b/packages/upgrade/source/versions/core-2/index.js @@ -39,6 +39,7 @@ const jsChanges = [ 'mfa-dropdown', 'appearance-variables-breaking-changes', 'aftersignxurl-changes', + 'supported-external-accounts-type-removed', ]; const reactChanges = [ @@ -269,6 +270,8 @@ export default { 'clerk-import-change', 'organizationmembershippublicuserdata-profileimageurl', 'externalaccount-picture', + 'createclerkexpressrequireauth-public-key-required', + 'createclerkexpresswithauth-publickey-required', ]), ), react: load('react', dedupeMerge(changesAffectingAll, reactChanges, jsChanges)), diff --git a/packages/upgrade/source/versions/core-2/js/clerk-import.md b/packages/upgrade/source/versions/core-2/js/clerk-import.md index 14a30f4f963..a23febb3372 100644 --- a/packages/upgrade/source/versions/core-2/js/clerk-import.md +++ b/packages/upgrade/source/versions/core-2/js/clerk-import.md @@ -1,6 +1,6 @@ --- title: '`Clerk` import changed' -matcher: "import\\s+{[^}]*?(Clerk)[\\s\\S]*?}\\s+from\\s+['\"]@clerk/clerk-js['\"]" +matcher: "import\\s+{[^}]*?(Clerk)[\\s\\S]*?}\\s+from\\s+['\"]@clerk/clerk-js(?:\/headless)?['\"]" matcherFlags: 'm' replaceWithString: '{ Clerk }' --- diff --git a/packages/upgrade/source/versions/core-2/js/supported-external-accounts-type-removed.md b/packages/upgrade/source/versions/core-2/js/supported-external-accounts-type-removed.md new file mode 100644 index 00000000000..563c8a0a848 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/js/supported-external-accounts-type-removed.md @@ -0,0 +1,7 @@ +--- +title: '`SignIn.supported_external_accounts` property removed' +category: 'deprecation-removals' +matcher: "\\.supported_external_accounts" +--- + +The deprecated `SignIn.supported_external_accounts` property has been removed. diff --git a/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md b/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md new file mode 100644 index 00000000000..1e789376353 --- /dev/null +++ b/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md @@ -0,0 +1,7 @@ +--- +title: "`createClerkExpressRequireAuth` requires publishable key" +warning: true +matcher: `createClerkExpressRequireAuth` +--- + +The `createClerkExpressRequireAuth` method now requires a clerk public key in order to work correctly. It can be passed in as a parameter directly, or picked up via environment variable. An error will be thrown now if there's no public key provided, this was not previously the case. diff --git a/packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-publickey-required.md b/packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-publickey-required.md new file mode 100644 index 00000000000..e69de29bb2d From e87966b75acc9e59d3b05859f4c4c6995190f4b3 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Apr 2024 17:38:17 -0400 Subject: [PATCH 134/159] =?UTF-8?q?chore(upgrade):=20Version=201.0.0=20?= =?UTF-8?q?=F0=9F=A4=9E=20no=20bugs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index e7d35f0770a..09e898a086f 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "0.4.4", + "version": "1.0.0", "license": "MIT", "type": "module", "main": "dist/cli.js", From 8f5c3f00c108db37210e345553f7b0f273d6ebbb Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Apr 2024 17:39:40 -0400 Subject: [PATCH 135/159] chore(upgrade): Version patch --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 09e898a086f..db930e07d72 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "type": "module", "main": "dist/cli.js", From 4fd191168f482ccae24d27b0d06d1b91673dedf9 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Apr 2024 17:44:31 -0400 Subject: [PATCH 136/159] chore(upgrade): Fix some bugs --- .../upgrade/source/versions/core-2/backend/members-count.md | 4 ++-- .../supported-external-accounts-type-removed.md | 0 .../node/createclerkexpressrequireauth-public-key-required.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename packages/upgrade/source/versions/core-2/{js => common}/supported-external-accounts-type-removed.md (100%) diff --git a/packages/upgrade/source/versions/core-2/backend/members-count.md b/packages/upgrade/source/versions/core-2/backend/members-count.md index d4db3894b57..10912ab89c2 100644 --- a/packages/upgrade/source/versions/core-2/backend/members-count.md +++ b/packages/upgrade/source/versions/core-2/backend/members-count.md @@ -1,6 +1,6 @@ --- -title: "`Organization.members_count` -> `Organization.membersCount`" -matcher: "\.members_count" +title: '`Organization.members_count` -> `Organization.membersCount`' +matcher: "\\.members_count" --- The `members_count` attribute of the `Organization` resource has been renamed to `membersCount` to match the naming convention of other attributes. diff --git a/packages/upgrade/source/versions/core-2/js/supported-external-accounts-type-removed.md b/packages/upgrade/source/versions/core-2/common/supported-external-accounts-type-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/supported-external-accounts-type-removed.md rename to packages/upgrade/source/versions/core-2/common/supported-external-accounts-type-removed.md diff --git a/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md b/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md index 1e789376353..ab07782815a 100644 --- a/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md +++ b/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md @@ -1,7 +1,7 @@ --- -title: "`createClerkExpressRequireAuth` requires publishable key" +title: '`createClerkExpressRequireAuth` requires publishable key' warning: true -matcher: `createClerkExpressRequireAuth` +matcher: 'createClerkExpressRequireAuth' --- The `createClerkExpressRequireAuth` method now requires a clerk public key in order to work correctly. It can be passed in as a parameter directly, or picked up via environment variable. An error will be thrown now if there's no public key provided, this was not previously the case. From 5ba42d7cf8627be3b74e3425d7594e7c5e1fc7ac Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Apr 2024 17:57:54 -0400 Subject: [PATCH 137/159] chore(upgrade): Remove mentions of beta since we shippin --- .../source/guide-generators/core-2/overview/intro.mdx | 2 +- .../source/guide-generators/core-2/shared/prepare.mdx | 5 ----- .../guide-generators/core-2/shared/update-version.mdx | 10 +++++----- .../core-2/nextjs/auth-middleware-deprecated.md | 4 ++-- .../core-2/nextjs/authmiddleware-import-change.md | 2 +- .../core-2/nextjs/with-clerk-middleware-removed.md | 2 +- ...reateclerkexpressrequireauth-public-key-required.md | 2 +- .../createclerkexpresswithauth-publickey-required.md | 7 +++++++ playground/app-router/README.md | 2 +- 9 files changed, 19 insertions(+), 17 deletions(-) diff --git a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx index 2963cc3c17d..3d2b697361a 100644 --- a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx @@ -22,4 +22,4 @@ We expect upgrades to take less than 30 minutes, and are providing a CLI tool to - [JS](/js) - [Chrome Extension](/chrome-extension) -Note that the `Gastsby`, `Go`, and `Ruby` SDKs do not yet have a beta release ready - if you are using any of these SDKs there is nothing actionable right now. +Note that the `Gastsby`, `Go`, and `Ruby` SDKs do not yet have a core 2 release ready - if you are using any of these SDKs there is nothing actionable right now. diff --git a/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx b/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx index 134060cb3b8..a252392581b 100644 --- a/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx +++ b/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx @@ -2,9 +2,4 @@ Before uprading, it's highly recommended that you update your Clerk SDKs to the latest Core 1 version (`npm i <%= packageName %>@<%= parseInt(version.substring(1)) - 1 %>`). Some changes required for Core 2 SDKs can be applied incrementally to the <%= version %> release, which should contribute to a smoother upgrading experience. After updating, look out for deprecation messages in your terminal and browser console. By resolving these deprecations you'll be able to skip many breaking changes from Core 2. - - Note that Core 2 is currently in beta, while we field feedback and ensure stability. Deploying beta versions to - production is not recommended and should be done at your own risk. - - Additionally, some of the minumum version requirements for some base dependencies have been updated such that versions that are no longer supported or are at end-of-life are no longer guaranteed to work correctly with Clerk. diff --git a/packages/upgrade/source/guide-generators/core-2/shared/update-version.mdx b/packages/upgrade/source/guide-generators/core-2/shared/update-version.mdx index 38597779ec5..21151cc19b4 100644 --- a/packages/upgrade/source/guide-generators/core-2/shared/update-version.mdx +++ b/packages/upgrade/source/guide-generators/core-2/shared/update-version.mdx @@ -1,18 +1,18 @@ -## Updating to Core 2 Beta +## Updating to Core 2 -Whenever you feel ready, go ahead and install the latest beta version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. The commands below demonstrate how to install the latest beta. +Whenever you feel ready, go ahead and install the latest version of any Clerk SDKs you are using. Make sure that you are prepared to patch some breaking changes before your app will work properly, however. The commands below demonstrate how to install the latest version. ```bash filename="terminal" - npm install <%= packageName %>@beta + npm install <%= packageName %> ``` ```bash filename="terminal" - yarn add <%= packageName %>@beta + yarn add <%= packageName %> ``` ```bash filename="terminal" - pnpm add <%= packageName %>@beta + pnpm add <%= packageName %> ``` diff --git a/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md b/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md index c5833976b05..a4f57b33d1f 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md +++ b/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md @@ -6,9 +6,9 @@ matcherFlags: 'm' warning: true --- -The [`authMiddleware`](https://clerk.com/docs/references/nextjs/auth-middleware) API from `@clerk/nextjs` has been marked as deprecated. We highly recommend using [`clerkMiddleware`](https://beta.clerk.com/docs/references/nextjs/clerk-middleware) going forward. `clerkMiddleware` protects no routes by default and you need to add your individual routes you want to opt into protection. Here's an example of having all routes public except for everything under `/dashboard`. +The [`authMiddleware`](https://clerk.com/docs/references/nextjs/auth-middleware) API from `@clerk/nextjs` has been marked as deprecated. We highly recommend using [`clerkMiddleware`](https://clerk.com/docs/references/nextjs/clerk-middleware) going forward. `clerkMiddleware` protects no routes by default and you need to add your individual routes you want to opt into protection. Here's an example of having all routes public except for everything under `/dashboard`. -For more documentation on the new `clerkMiddleware` function, check out [our official docs](https://beta.clerk.com/docs/references/nextjs/clerk-middleware)! +For more documentation on the new `clerkMiddleware` function, check out [our official docs](https://clerk.com/docs/references/nextjs/clerk-middleware)! **Before:** diff --git a/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md b/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md index dbcf747a917..cb9f6f802b9 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md +++ b/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md @@ -6,7 +6,7 @@ category: 'top-level-imports' replaceWithString: 'nextjs/server' --- -The `authMiddleware` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Note as well that `authMiddleware` is deprecated as of this release, and we recommend [using `clerkMiddleware` instead](https://beta.clerk.com/docs/references/nextjs/clerk-middleware). Example below of the fix that needs to be made: +The `authMiddleware` import path has changed from `@clerk/nextjs` to `@clerk/nextjs/server`, as this is a helper that should be only used on the server side. You must update your import path in order for it to work correctly. Note as well that `authMiddleware` is deprecated as of this release, and we recommend [using `clerkMiddleware` instead](https://clerk.com/docs/references/nextjs/clerk-middleware). Example below of the fix that needs to be made: ```diff - import { authMiddleware } from "@clerk/nextjs" diff --git a/packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md b/packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md index dd0ee956f35..eef3727f0e0 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md +++ b/packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md @@ -4,7 +4,7 @@ category: 'middleware' matcher: "withClerkMiddleware\\(" --- -`withClerkMiddleware` has been deprecated and is now removed in v5. We recommend moving to `clerkMiddleware` instead. Please read the [clerkMiddleware guide](https://beta.clerk.com/docs/references/nextjs/clerk-middleware) for more details. Here’s an example of how a simple middleware setup might look before and after. +`withClerkMiddleware` has been deprecated and is now removed in v5. We recommend moving to `clerkMiddleware` instead. Please read the [clerkMiddleware guide](https://clerk.com/docs/references/nextjs/clerk-middleware) for more details. Here’s an example of how a simple middleware setup might look before and after. ```js // Before: using withClerkMiddleware diff --git a/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md b/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md index ab07782815a..4395b49f6eb 100644 --- a/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md +++ b/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md @@ -1,7 +1,7 @@ --- title: '`createClerkExpressRequireAuth` requires publishable key' -warning: true matcher: 'createClerkExpressRequireAuth' +warning: true --- The `createClerkExpressRequireAuth` method now requires a clerk public key in order to work correctly. It can be passed in as a parameter directly, or picked up via environment variable. An error will be thrown now if there's no public key provided, this was not previously the case. diff --git a/packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-publickey-required.md b/packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-publickey-required.md index e69de29bb2d..b2f9ea1bbb3 100644 --- a/packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-publickey-required.md +++ b/packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-publickey-required.md @@ -0,0 +1,7 @@ +--- +title: '`createClerkExpressWithAuth` requires publishable key' +warning: true +matcher: 'createClerkExpressWithAuth' +--- + +The `createClerkExpressWithAuth` method now requires a clerk public key in order to work correctly. It can be passed in as a parameter directly, or picked up via environment variable. An error will be thrown now if there's no public key provided, this was not previously the case. diff --git a/playground/app-router/README.md b/playground/app-router/README.md index abae422255f..cde9c0cde80 100644 --- a/playground/app-router/README.md +++ b/playground/app-router/README.md @@ -16,7 +16,7 @@ Open [http://localhost:3000](http://localhost:3000) with your browser to see the You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. -[http://localhost:3000/api/hello](http://localhost:3000/api/hello) is an endpoint that uses [Route Handlers](https://beta.nextjs.org/docs/routing/route-handlers). This endpoint can be edited in `app/api/hello/route.ts`. +[http://localhost:3000/api/hello](http://localhost:3000/api/hello) is an endpoint that uses [Route Handlers](https://nextjs.org/docs/routing/route-handlers). This endpoint can be edited in `app/api/hello/route.ts`. This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. From e73b70d04d581c4fe90d139c519dd93e282d44ad Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Thu, 18 Apr 2024 18:01:18 -0400 Subject: [PATCH 138/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index db930e07d72..b3c3b3dd4cf 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "1.0.1", + "version": "1.0.2", "license": "MIT", "type": "module", "main": "dist/cli.js", From 68ddd8e1212c6e6c3398b778dc00c652d5c7349f Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Fri, 19 Apr 2024 10:56:12 +0300 Subject: [PATCH 139/159] fix(upgrade): Fix aftersignxurl-changes.md example --- .../source/versions/core-2/common/aftersignxurl-changes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/upgrade/source/versions/core-2/common/aftersignxurl-changes.md b/packages/upgrade/source/versions/core-2/common/aftersignxurl-changes.md index d96ad7d2913..3193b21dd91 100644 --- a/packages/upgrade/source/versions/core-2/common/aftersignxurl-changes.md +++ b/packages/upgrade/source/versions/core-2/common/aftersignxurl-changes.md @@ -30,6 +30,6 @@ All `afterSignXUrl` props and `CLERK_AFTER_SIGN_X_URL` environment variables hav If neither value is set, Clerk will redirect to the `redirect_url` if present, otherwise it will redirect to `/`. If you'd like to retain the current behavior of your app without any changes, you can switch `afterSignXUrl` with `signXFallbackRedirectUrl` as such: ```diff -- -+ +- ++ ``` From 939cb699a1e8b2d7f06ad66e27bec9836c8de88c Mon Sep 17 00:00:00 2001 From: Lennart Date: Fri, 19 Apr 2024 11:37:42 +0100 Subject: [PATCH 140/159] update core-2 overview page --- .../upgrade/source/guide-generators/core-2/overview/intro.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx index 3d2b697361a..31f18dfa3df 100644 --- a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx @@ -1,6 +1,6 @@ # Upgrading to Clerk Core 2 -In Febrary 2024, [we updated](https://clerk.com/changelog/2024-01-16) Clerk's SDKs to include Core 2. This new core includes: +In April 2024, [we updated](https://clerk.com/changelog/2024-04-19) Clerk's SDKs to include Core 2. This new core includes: - 💅 Redesigned and improved component UIs. - 🔪 The 401 & "flash of white page" that was visible sometimes when syncing auth state was eliminated. @@ -22,4 +22,4 @@ We expect upgrades to take less than 30 minutes, and are providing a CLI tool to - [JS](/js) - [Chrome Extension](/chrome-extension) -Note that the `Gastsby`, `Go`, and `Ruby` SDKs do not yet have a core 2 release ready - if you are using any of these SDKs there is nothing actionable right now. +Note that the `Gatsby`, `Go`, and `Ruby` SDKs do not yet have a Core 2 release ready - if you are using any of these SDKs there is nothing actionable right now. From 1023e8719e8f3f20931a905419a76e308f5b39df Mon Sep 17 00:00:00 2001 From: Lennart Date: Fri, 19 Apr 2024 11:43:50 +0100 Subject: [PATCH 141/159] fix links to individual guides --- .../guide-generators/core-2/overview/intro.mdx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx index 31f18dfa3df..daaf103e3a1 100644 --- a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx @@ -12,14 +12,14 @@ In April 2024, [we updated](https://clerk.com/changelog/2024-04-19) Clerk's SDKs Core 2 brings both UI changes and breaking code changes, so each SDK has been updated to a new major version. We expect upgrades to take less than 30 minutes, and are providing a CLI tool to assist with the process. Please select your SDK below to get started: -- [Next.js](/nextjs) -- [Remix](/remix) -- [Expo](/expo) -- [Node](/node) -- [Fastify](/fastify) -- [React](/react) -- [Backend](/backend) -- [JS](/js) -- [Chrome Extension](/chrome-extension) +- [Next.js](/docs/upgrade-guides/core-2/nextjs) +- [Remix](/docs/upgrade-guides/core-2/remix) +- [Expo](/docs/upgrade-guides/core-2/expo) +- [Node](/docs/upgrade-guides/core-2/node) +- [Fastify](/docs/upgrade-guides/core-2/fastify) +- [React](/docs/upgrade-guides/core-2/react) +- [Backend](/docs/upgrade-guides/core-2/backend) +- [JS](/docs/upgrade-guides/core-2/js) +- [Chrome Extension](/docs/upgrade-guides/core-2/chrome-extension) Note that the `Gatsby`, `Go`, and `Ruby` SDKs do not yet have a Core 2 release ready - if you are using any of these SDKs there is nothing actionable right now. From c3f9a5710055f4c7a4b51623bbe5d9176f5dc584 Mon Sep 17 00:00:00 2001 From: Lennart Date: Fri, 19 Apr 2024 11:47:58 +0100 Subject: [PATCH 142/159] Update intro.mdx --- .../upgrade/source/guide-generators/core-2/overview/intro.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx index daaf103e3a1..1f1d7f15a24 100644 --- a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx +++ b/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx @@ -1,6 +1,6 @@ # Upgrading to Clerk Core 2 -In April 2024, [we updated](https://clerk.com/changelog/2024-04-19) Clerk's SDKs to include Core 2. This new core includes: +In April 2024, we updated Clerk's SDKs to include Core 2. This new core includes: - 💅 Redesigned and improved component UIs. - 🔪 The 401 & "flash of white page" that was visible sometimes when syncing auth state was eliminated. @@ -19,7 +19,7 @@ We expect upgrades to take less than 30 minutes, and are providing a CLI tool to - [Fastify](/docs/upgrade-guides/core-2/fastify) - [React](/docs/upgrade-guides/core-2/react) - [Backend](/docs/upgrade-guides/core-2/backend) -- [JS](/docs/upgrade-guides/core-2/js) +- [JS](/docs/upgrade-guides/core-2/javascript) - [Chrome Extension](/docs/upgrade-guides/core-2/chrome-extension) Note that the `Gatsby`, `Go`, and `Ruby` SDKs do not yet have a Core 2 release ready - if you are using any of these SDKs there is nothing actionable right now. From 879347b274398883c186984da381031ad64fb12a Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 19 Apr 2024 16:12:02 -0400 Subject: [PATCH 143/159] fix(upgrade): Attempt an odd path fix --- ...s-type-removed.md => supported-external-accounts-removed.md} | 0 packages/upgrade/source/versions/core-2/index.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/upgrade/source/versions/core-2/common/{supported-external-accounts-type-removed.md => supported-external-accounts-removed.md} (100%) diff --git a/packages/upgrade/source/versions/core-2/common/supported-external-accounts-type-removed.md b/packages/upgrade/source/versions/core-2/common/supported-external-accounts-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/supported-external-accounts-type-removed.md rename to packages/upgrade/source/versions/core-2/common/supported-external-accounts-removed.md diff --git a/packages/upgrade/source/versions/core-2/index.js b/packages/upgrade/source/versions/core-2/index.js index b2d5fee4380..a4d17cb37d1 100644 --- a/packages/upgrade/source/versions/core-2/index.js +++ b/packages/upgrade/source/versions/core-2/index.js @@ -39,7 +39,7 @@ const jsChanges = [ 'mfa-dropdown', 'appearance-variables-breaking-changes', 'aftersignxurl-changes', - 'supported-external-accounts-type-removed', + 'supported-external-accounts-removed', ]; const reactChanges = [ From e93a45d324031959b707f3f29b6411f4ab4bca81 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 19 Apr 2024 16:15:44 -0400 Subject: [PATCH 144/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index b3c3b3dd4cf..cf186f14392 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "1.0.2", + "version": "1.0.3", "license": "MIT", "type": "module", "main": "dist/cli.js", From 5546a3cb62cb6e55ae317d722c737237d1505119 Mon Sep 17 00:00:00 2001 From: LekoArts Date: Wed, 24 Apr 2024 12:11:34 +0200 Subject: [PATCH 145/159] fix(upgrade): Pass ignore from CLI + Improve ignore placeholder --- packages/upgrade/source/app.js | 2 +- packages/upgrade/source/cli.js | 2 ++ packages/upgrade/source/scan.js | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index fa402f630b6..02b9cd0ce7f 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -197,7 +197,7 @@ export default function App({ (globstar syntax supported) { setIgnore(val.includes(',') ? val.split(/\s*,\s*/) : [].concat(val)); diff --git a/packages/upgrade/source/cli.js b/packages/upgrade/source/cli.js index 59177fc314a..7054218efe0 100644 --- a/packages/upgrade/source/cli.js +++ b/packages/upgrade/source/cli.js @@ -22,6 +22,7 @@ const cli = meow( Examples $ clerk-upgrade --sdk=nextjs --dir=src/** + $ clerk-upgrade --ignore=**/public/** --ignore=**/dist/** `, { importMeta: import.meta, @@ -44,6 +45,7 @@ render( _toVersion={cli.flags.to} _sdk={cli.flags.sdk} _dir={cli.flags.dir} + _ignore={cli.flags.ignore} _yolo={cli.flags.yolo} noWarnings={cli.flags.noWarnings} disableTelemetry={cli.flags.disableTelemetry} diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/source/scan.js index 33213d5e94f..56a9e09eb09 100644 --- a/packages/upgrade/source/scan.js +++ b/packages/upgrade/source/scan.js @@ -1,6 +1,6 @@ import { ProgressBar } from '@inkjs/ui'; import fs from 'fs/promises'; -import { globby } from 'globby'; +import { convertPathToPattern, globby } from 'globby'; import indexToPosition from 'index-to-position'; import { Newline, Text } from 'ink'; import path from 'path'; @@ -59,7 +59,7 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarn '**/*.(png|webp|svg|gif|jpg|jpeg)+', // common image files '**/*.(mp4|mkv|wmv|m4v|mov|avi|flv|webm|flac|mka|m4a|aac|ogg)+', // common video files ); - globby(path.resolve(dir), { ignore: [...ignore.filter(x => x)] }).then(files => { + globby(convertPathToPattern(path.resolve(dir)), { ignore: ignore.filter(Boolean) }).then(files => { setFiles(files); }); }, [dir, ignore]); From b55dd91707ee3391f3069d36b4d184b9b288b3e8 Mon Sep 17 00:00:00 2001 From: LekoArts Date: Wed, 24 Apr 2024 12:12:09 +0200 Subject: [PATCH 146/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index cf186f14392..63359eb5a02 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "1.0.3", + "version": "1.0.4", "license": "MIT", "type": "module", "main": "dist/cli.js", From e659f92f418bd0d09cef7fae2c9b7bd47a716708 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Fri, 26 Apr 2024 11:12:25 +0300 Subject: [PATCH 147/159] chore(repo): Bump upgrade to 1.0.5 --- package-lock.json | 2 +- packages/upgrade/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 56fc9c8eda8..e0d9bd58764 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41070,7 +41070,7 @@ }, "packages/upgrade": { "name": "@clerk/upgrade", - "version": "1.0.3", + "version": "1.0.5", "license": "MIT", "dependencies": { "@inkjs/ui": "^1.0.0", diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 63359eb5a02..7e4212e6d97 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "1.0.4", + "version": "1.0.5", "license": "MIT", "type": "module", "main": "dist/cli.js", From 0f7390c376349c46ea4364faa2a9561698b2fe58 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Mon, 29 Apr 2024 12:34:16 -0400 Subject: [PATCH 148/159] fix(upgrade): Fix middeware matcher in CLI item --- .../versions/core-2/nextjs/auth-middleware-deprecated.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md b/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md index a4f57b33d1f..788c6f41652 100644 --- a/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md +++ b/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md @@ -22,7 +22,7 @@ export default authMiddleware({ }); export const config = { - matcher: ['/((?!.+\\.[\\w]+$|_next)._)', '/', '/(api|trpc)(._)'], + matcher: ['/((?!.+\\.[\\w]+$|_next).*)', '/', '/(api|trpc)(.*)'], }; ``` @@ -45,6 +45,6 @@ export default clerkMiddleware((auth, request) => { }); export const config = { - matcher: ['/((?!.+\\.[\\w]+$|_next)._)', '/', '/(api|trpc)(._)'], + matcher: ['/((?!.*\\..*|_next).*)', '/', '/(api|trpc)(.*)'], }; ``` From c54efdaec3c33da8c3d658988abe63b5c0418e01 Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Mon, 29 Apr 2024 12:40:42 -0400 Subject: [PATCH 149/159] chore(upgrade): Version --- packages/upgrade/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 7e4212e6d97..53181b5545e 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "1.0.5", + "version": "1.0.6", "license": "MIT", "type": "module", "main": "dist/cli.js", From 47f1277aed8ff277668fc822ebbe00db026b65bd Mon Sep 17 00:00:00 2001 From: Lennart Date: Tue, 21 May 2024 09:35:58 +0200 Subject: [PATCH 150/159] fix: Typo --- packages/upgrade/source/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/source/app.js b/packages/upgrade/source/app.js index 02b9cd0ce7f..c7c189dc3a4 100644 --- a/packages/upgrade/source/app.js +++ b/packages/upgrade/source/app.js @@ -197,7 +197,7 @@ export default function App({ (globstar syntax supported) { setIgnore(val.includes(',') ? val.split(/\s*,\s*/) : [].concat(val)); From 19b13d6724368b84bc507efae17657e8391ce4c3 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Tue, 21 May 2024 13:11:02 +0300 Subject: [PATCH 151/159] chore(upgrade): Bump version --- package-lock.json | 2 +- packages/upgrade/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0d9bd58764..ea049ad6e0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41070,7 +41070,7 @@ }, "packages/upgrade": { "name": "@clerk/upgrade", - "version": "1.0.5", + "version": "1.0.7", "license": "MIT", "dependencies": { "@inkjs/ui": "^1.0.0", diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 53181b5545e..ed2711ef44d 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/upgrade", - "version": "1.0.6", + "version": "1.0.7", "license": "MIT", "type": "module", "main": "dist/cli.js", From a9727377ab64bde19ebbca895175dd8c11b05f44 Mon Sep 17 00:00:00 2001 From: LekoArts Date: Mon, 17 Jun 2024 09:49:24 +0200 Subject: [PATCH 152/159] update packages in range --- package-lock.json | 95 +++++++++++++++++++++++++++++++++-- packages/upgrade/package.json | 15 +++--- 2 files changed, 99 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index ace48e900dc..b6ca2cf7750 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46821,7 +46821,7 @@ "@inkjs/ui": "^1.0.0", "@jescalan/ink-markdown": "^2.0.0", "ejs": "3.1.9", - "globby": "^14.0.0", + "globby": "^14.0.1", "gray-matter": "^4.0.3", "index-to-position": "^0.1.2", "ink": "^4.4.1", @@ -46831,7 +46831,7 @@ "marked": "^11.1.1", "md5": "^2.3.0", "meow": "^11.0.0", - "react": "^18.2.0", + "react": "^18.3.1", "read-pkg": "^9.0.1", "semver-regex": "^4.0.5", "temp-dir": "^3.0.0" @@ -46840,9 +46840,9 @@ "clerk-upgrade": "dist/cli.js" }, "devDependencies": { - "@babel/cli": "^7.21.0", - "@babel/preset-react": "^7.18.6", - "chalk": "^5.2.0", + "@babel/cli": "^7.24.7", + "@babel/preset-react": "^7.24.7", + "chalk": "^5.3.0", "del-cli": "^5.1.0", "eslint-config-custom": "*" }, @@ -46850,6 +46850,91 @@ "node": ">=18.17.0" } }, + "packages/upgrade/node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/upgrade/node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", + "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/upgrade/node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/upgrade/node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", + "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "packages/upgrade/node_modules/@babel/preset-react": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", + "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.24.7", + "@babel/plugin-transform-react-jsx-development": "^7.24.7", + "@babel/plugin-transform-react-pure-annotations": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "packages/upgrade/node_modules/camelcase": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index ed2711ef44d..47bf07d93e9 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -13,7 +13,10 @@ "scripts": { "build": "npm run clean && NODE_ENV=production babel --out-dir=dist source --copy-files", "clean": "del-cli dist/*", - "dev": "babel --out-dir=dist --watch source --copy-files" + "dev": "babel --out-dir=dist --watch source --copy-files", + "lint": "eslint src/", + "lint:attw": "attw --pack .", + "lint:publint": "publint" }, "babel": { "presets": [ @@ -24,7 +27,7 @@ "@inkjs/ui": "^1.0.0", "@jescalan/ink-markdown": "^2.0.0", "ejs": "3.1.9", - "globby": "^14.0.0", + "globby": "^14.0.1", "gray-matter": "^4.0.3", "index-to-position": "^0.1.2", "ink": "^4.4.1", @@ -34,15 +37,15 @@ "marked": "^11.1.1", "md5": "^2.3.0", "meow": "^11.0.0", - "react": "^18.2.0", + "react": "^18.3.1", "read-pkg": "^9.0.1", "semver-regex": "^4.0.5", "temp-dir": "^3.0.0" }, "devDependencies": { - "@babel/cli": "^7.21.0", - "@babel/preset-react": "^7.18.6", - "chalk": "^5.2.0", + "@babel/cli": "^7.24.7", + "@babel/preset-react": "^7.24.7", + "chalk": "^5.3.0", "del-cli": "^5.1.0", "eslint-config-custom": "*" }, From a1b0a6d30b10f8d26a395fc8fe8b6d44d3431b4f Mon Sep 17 00:00:00 2001 From: LekoArts Date: Mon, 17 Jun 2024 09:49:32 +0200 Subject: [PATCH 153/159] update ignore files --- .eslintignore | 1 - packages/upgrade/.gitignore | 67 +++++++++++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/.eslintignore b/.eslintignore index 2a23663f874..ae11d7aefc6 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,7 +2,6 @@ **/node_modules/** packages/*/dist/** packages/eslint-config-custom/** -packages/upgrade **/dist/* **/build/* **/.turbo/* diff --git a/packages/upgrade/.gitignore b/packages/upgrade/.gitignore index 19c7b136f34..241ac01f46f 100644 --- a/packages/upgrade/.gitignore +++ b/packages/upgrade/.gitignore @@ -1,3 +1,66 @@ -node_modules -dist +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env.local + +# Distribution directories +dist/ + +# Mac OSX files +.DS_Store + __output.mdx \ No newline at end of file From f2b9aaa28d7ecc36ee400ef595deb6ffee9a578a Mon Sep 17 00:00:00 2001 From: LekoArts Date: Mon, 17 Jun 2024 09:52:11 +0200 Subject: [PATCH 154/159] rename source to src --- packages/upgrade/package.json | 4 ++-- packages/upgrade/{source => src}/app.js | 0 packages/upgrade/{source => src}/cli.js | 0 packages/upgrade/{source => src}/constants/sdks.js | 0 .../upgrade/{source => src}/constants/versions.js | 0 .../core-2/backend/import-paths.mdx | 0 .../guide-generators/core-2/backend/index.js | 0 .../guide-generators/core-2/backend/intro.mdx | 0 .../core-2/chrome-extension/index.js | 0 .../core-2/chrome-extension/intro.mdx | 0 .../guide-generators/core-2/expo/index.js | 0 .../guide-generators/core-2/expo/intro.mdx | 0 .../guide-generators/core-2/fastify/index.js | 0 .../guide-generators/core-2/fastify/intro.mdx | 0 .../guide-generators/core-2/gatsby/index.js | 0 .../guide-generators/core-2/gatsby/intro.mdx | 0 .../guide-generators/core-2/generate-all.sh | 0 .../guide-generators/core-2/js/index.js | 0 .../guide-generators/core-2/js/intro.mdx | 0 .../core-2/nextjs/import-changes.mdx | 0 .../guide-generators/core-2/nextjs/index.js | 0 .../guide-generators/core-2/nextjs/intro.mdx | 0 .../core-2/nextjs/middleware-changes.mdx | 0 .../core-2/nextjs/nextjs-version.mdx | 0 .../guide-generators/core-2/node/index.js | 0 .../guide-generators/core-2/node/intro.mdx | 0 .../core-2/node/node-setters-removals.mdx | 0 .../guide-generators/core-2/overview/index.js | 0 .../guide-generators/core-2/overview/intro.mdx | 0 .../guide-generators/core-2/react/hof-removals.mdx | 0 .../guide-generators/core-2/react/index.js | 0 .../guide-generators/core-2/react/intro.mdx | 0 .../guide-generators/core-2/remix/index.js | 0 .../guide-generators/core-2/remix/intro.mdx | 0 .../guide-generators/core-2/retheme/index.js | 0 .../guide-generators/core-2/retheme/intro.mdx | 0 .../core-2/shared/after-sign-x-handling.mdx | 0 .../guide-generators/core-2/shared/cli.mdx | 0 .../core-2/shared/deprecation-removals.mdx | 0 .../guide-generators/core-2/shared/image-url.mdx | 0 .../guide-generators/core-2/shared/node-version.mdx | 0 .../guide-generators/core-2/shared/orgs-claim.mdx | 0 .../core-2/shared/pagination-args.mdx | 0 .../core-2/shared/pagination-return.mdx | 0 .../guide-generators/core-2/shared/path-routing.mdx | 0 .../guide-generators/core-2/shared/prepare.mdx | 0 .../core-2/shared/react-version.mdx | 0 .../core-2/shared/redesign-preview.mdx | 0 .../core-2/shared/update-version.mdx | 0 .../guide-generators/text-generation.js | 0 .../img/alternativemethods-backlink.png | Bin ...ganizationlistcreateorganizationactionbutton.png | Bin .../img/connected-accounts-dropdown.png | Bin .../upgrade/{source => src}/img/mfa-dropdown.png | Bin .../img/organizationprofile-settings.png | Bin .../img/remove-identitypreview-avatar.png | Bin .../img/remove-socialbuttonsblockbuttonarrow.png | Bin .../userbuttonpopoveractionbuttontext-removed.png | Bin .../{source => src}/img/userprofile-security.png | Bin packages/upgrade/{source => src}/scan.js | 0 packages/upgrade/{source => src}/util/all-titles.js | 0 .../upgrade/{source => src}/util/expandable-list.js | 0 .../{source => src}/util/generate-changelog.js | 0 .../{source => src}/util/get-clerk-version.js | 0 .../upgrade/{source => src}/util/guess-framework.js | 0 .../upgrade/{source => src}/util/load-change.js | 0 .../core-2/backend/api-url-value-changed.md | 0 .../backend/authenticaterequest-params-change.md | 0 .../core-2/backend/buildrequesturl-removed.md | 0 .../versions/core-2/backend/clerk-import.md | 0 .../backend/client-unstableoptions-removed.md | 0 .../versions/core-2/backend/clockskewinseconds.md | 0 .../core-2/backend/constants-import-path-move.md | 0 .../createauthenticaterequest-import-path-move.md | 0 .../core-2/backend/createclerkclient-apikey.md | 0 .../core-2/backend/createclerkclient-frontendapi.md | 0 .../versions/core-2/backend/createemail-removed.md | 0 .../createisomorphicrequest-import-path-move.md | 0 .../backend/createisomorphicrequest-removed.md | 0 .../core-2/backend/decodejwt-import-path-move.md | 0 .../core-2/backend/getclientlist-arguments.md | 0 ...etorganizationmembershiplist-return-signature.md | 0 .../backend/getpendingorganizationinvitationlist.md | 0 .../core-2/backend/getsessionlist-arguments.md | 0 .../versions/core-2/backend/httpoptions-removed.md | 0 .../versions/core-2/backend/interstitial-removed.md | 0 .../versions/core-2/backend/members-count.md | 0 .../versions/core-2/backend/membershiprole.md | 0 .../core-2/backend/organizationjson-logourl.md | 0 ...nmembershippublicuserdatajson-profileimageurl.md | 0 .../versions/core-2/backend/pkgversion.md | 0 .../core-2/backend/redirect-import-path-move.md | 0 .../core-2/backend/signjwt-import-path-move.md | 0 .../core-2/backend/signjwterror-import-move.md | 0 .../backend/tokenverificationerror-import-move.md | 0 .../tokenverificationerroraction-import-move.md | 0 .../tokenverificationerrorcode-import-move.md | 0 .../tokenverificationerrorreason-import-move.md | 0 .../core-2/backend/userjson-profileimageurl.md | 0 .../core-2/backend/verifyjwt-import-path-move.md | 0 .../chrome-extension/clerkprovider-tokencache.md | 0 .../versions/core-2/common/aftersignxurl-changes.md | 0 .../core-2/common/afterswitchorganizationurl.md | 0 .../core-2/common/alternativemethods-backlink.md | 0 .../versions/core-2/common/api-key-to-secret-key.md | 0 ...ance-organizationpreview-organizationswitcher.md | 0 .../common/appearance-variables-breaking-changes.md | 0 ...rganizationlistcreateorganizationactionbutton.md | 0 .../versions/core-2/common/card-changes.md | 0 .../core-2/common/changed-localization-keys.md | 0 .../core-2/common/clerkprovider-frontendapi-2.md | 0 .../common/clerkprovideroptionswrapper-dropped.md | 0 .../core-2/common/connected-accounts-dropdown.md | 0 .../common/emaillinkerrorcode-import-change.md | 0 .../core-2/common/externalaccount-avatarurl.md | 0 .../core-2/common/externalaccount-picture.md | 0 .../core-2/common/externalaccountjson-avatarurl.md | 0 .../common/frontend-api-to-publishable-key.md | 0 .../getallowlistidentifierlist-return-signature.md | 0 .../core-2/common/getclientlist-return-signature.md | 0 .../common/getinvitationlist-return-signature.md | 0 ...etorganizationinvitationlist-return-signature.md | 0 ...organizationinvitationlist-return-type-change.md | 0 .../common/getorganizationlist-return-signature.md | 0 .../getorganizationlist-return-type-change.md | 0 ...organizationmembershiplist-return-type-change.md | 0 .../common/getredirecturllist-return-signature.md | 0 .../common/getsessionlist-return-signature.md | 0 .../core-2/common/getuserlist-return-signature.md | 0 .../getuseroauthaccesstoken-return-signature.md | 0 .../core-2/common/handlemagiclinkverification.md | 0 .../common/isclerkapiresponserror-import-change.md | 0 .../core-2/common/isemaillinkerror-import-change.md | 0 .../core-2/common/isknownerror-import-change.md | 0 .../versions/core-2/common/ismagiclinkerror.md | 0 .../core-2/common/ismetamaskerror-import-change.md | 0 .../versions/core-2/common/magiclinkerror.md | 0 .../versions/core-2/common/magiclinkerrorcode.md | 0 .../versions/core-2/common/mfa-dropdown.md | 0 .../versions/core-2/common/min-react-version.md | 0 .../common/multisessionappsupport-import-change.md | 0 .../common/navigate-to-routerpush-routerreplace.md | 0 .../versions/core-2/common/new-localization-keys.md | 0 .../core-2/common/organization-create-string.md | 0 .../organization-getdomains-arguments-change.md | 0 ...organization-getinvitations-arguments-changed.md | 0 ...ation-getmembershiprequests-arguments-changed.md | 0 ...organization-getmemberships-arguments-changed.md | 0 .../common/organization-getpendinginvitations.md | 0 .../organization-getroles-arguments-changed.md | 0 .../versions/core-2/common/organization-logourl.md | 0 ...ationmembershippublicuserdata-profileimageurl.md | 0 .../core-2/common/organizationprofile-settings.md | 0 ...zationswitcherpopoveractionbuttontext-removed.md | 0 .../core-2/common/remove-identitypreview-avatar.md | 0 .../common/remove-socialbuttonsblockbuttonarrow.md | 0 .../core-2/common/removed-localization-keys.md | 0 .../versions/core-2/common/setsession.md | 0 .../core-2/common/signoutcallback-to-redirecturl.md | 0 .../common/supported-external-accounts-removed.md | 0 .../versions/core-2/common/usemagiclink.md | 0 .../core-2/common/useorganization-invitationlist.md | 0 .../core-2/common/useorganization-membershiplist.md | 0 .../versions/core-2/common/useorganizations.md | 0 ...-getorganizationinvitations-arguments-changed.md | 0 ...-getorganizationmemberships-arguments-changed.md | 0 ...r-getorganizationmemberships-return-signature.md | 0 ...-getorganizationsuggestions-arguments-changed.md | 0 .../versions/core-2/common/user-profileimageurl.md | 0 .../versions/core-2/common/user-update-password.md | 0 .../userbuttonpopoveractionbuttontext-removed.md | 0 .../userbuttontrigger-userbuttonbox-invert.md | 0 .../versions/core-2/common/userprofile-prop.md | 0 .../versions/core-2/common/userprofile-security.md | 0 .../versions/core-2/common/withclerk-hof-removed.md | 0 .../versions/core-2/common/withclerk-removed.md | 0 .../core-2/common/withsession-hof-removed.md | 0 .../versions/core-2/common/withsession-removed.md | 0 .../versions/core-2/common/withuser-hof-removed.md | 0 .../versions/core-2/common/withuser-removed-2.md | 0 .../core-2/expo/apikey-to-publishable-key.md | 0 .../core-2/expo/clerkprovider-frontendapi.md | 0 .../versions/core-2/fastify/api-url-value-change.md | 0 .../versions/core-2/fastify/clerk-import-change.md | 0 .../core-2/fastify/clerkplugin-frontendapi.md | 0 .../core-2/fastify/createclerkclient-apikey.md | 0 .../core-2/fastify/createclerkclient-frontendapi.md | 0 .../versions/core-2/gatsby/api-url-value-change.md | 0 .../core-2/gatsby/apikey-to-publishable-key.md | 0 .../versions/core-2/gatsby/clerk-import-change.md | 0 .../core-2/gatsby/createclerkclient-apikey.md | 0 .../core-2/gatsby/createclerkclient-frontendapi.md | 0 .../core-2/gatsby/withserverauth-return-type.md | 0 .../{source => src}/versions/core-2/index.js | 0 .../versions/core-2/js/clerk-import.md | 0 .../versions/core-2/js/clerk-isready-removed.md | 0 .../core-2/js/experimental-canusecaptcha.md | 0 .../core-2/js/experimental-captchasitekey.md | 0 .../versions/core-2/js/experimental-captchaurl.md | 0 .../core-2/js/getorganizationmemberships.md | 0 .../core-2/js/lastorganizationinvitation-member.md | 0 .../versions/core-2/js/redirecttohome.md | 0 ...emptweb3walletverification-generatedsignature.md | 0 .../versions/core-2/js/unstable-invitationupdate.md | 0 .../versions/core-2/js/unstable-membershipupdate.md | 0 .../js/user-createexternalaccount-redirecturl.md | 0 .../core-2/js/user-orgpublicdata-profileimageurl.md | 0 .../versions/core-2/nextjs/api-url-value-change.md | 0 .../versions/core-2/nextjs/auth-import-change.md | 0 .../core-2/nextjs/auth-middleware-deprecated.md | 0 .../versions/core-2/nextjs/authmiddleware-apikey.md | 0 .../core-2/nextjs/authmiddleware-frontendapi.md | 0 .../core-2/nextjs/authmiddleware-import-change.md | 0 .../core-2/nextjs/buildclerkprops-import-change.md | 0 .../versions/core-2/nextjs/clerk-import-change.md | 0 .../core-2/nextjs/clerk-js-version-next-public.md | 0 .../core-2/nextjs/constants-import-change.md | 0 .../createauthenticaterequest-import-change.md | 0 .../core-2/nextjs/createclerkclient-apikey.md | 0 .../core-2/nextjs/createclerkclient-frontendapi.md | 0 .../nextjs/createisomorphicrequest-import-change.md | 0 .../core-2/nextjs/currentuser-import-change.md | 0 .../core-2/nextjs/decodejwt-import-change.md | 0 .../nextjs/emaillinkerrorcode-import-change.md | 0 .../versions/core-2/nextjs/getauth-apikey.md | 0 .../versions/core-2/nextjs/import-api-url.md | 0 .../versions/core-2/nextjs/import-api-version.md | 0 .../versions/core-2/nextjs/import-clerk-js-url.md | 0 .../core-2/nextjs/import-clerk-js-version.md | 0 .../versions/core-2/nextjs/import-domain.md | 0 .../versions/core-2/nextjs/import-is-satellite.md | 0 .../versions/core-2/nextjs/import-nextjs-api.md | 0 .../core-2/nextjs/import-nextjs-app-beta.md | 0 .../core-2/nextjs/import-nextjs-edge-middleware.md | 0 .../nextjs/import-nextjs-edge-middlewarefiles.md | 0 .../versions/core-2/nextjs/import-nextjs-ssr.md | 0 .../versions/core-2/nextjs/import-proxy-url.md | 0 .../core-2/nextjs/import-publishable-key.md | 0 .../versions/core-2/nextjs/import-secret-key.md | 0 .../versions/core-2/nextjs/import-sign-in-url.md | 0 .../versions/core-2/nextjs/import-sign-up-url.md | 0 .../nextjs/isclerkapiresponserror-import-change.md | 0 .../core-2/nextjs/isemaillinkerror-import-change.md | 0 .../core-2/nextjs/isknownerror-import-change.md | 0 .../versions/core-2/nextjs/min-nextjs-version.md | 0 .../nextjs/multisessionappsupport-import-change.md | 0 .../core-2/nextjs/next-public-clerk-js-url.md | 0 .../core-2/nextjs/redirect-import-change.md | 0 .../core-2/nextjs/redirecttosignin-import-path.md | 0 .../core-2/nextjs/redirecttosignup-import-path.md | 0 .../versions/core-2/nextjs/signjwt-import-change.md | 0 .../core-2/nextjs/verifyjwt-import-change.md | 0 .../core-2/nextjs/verifytoken-import-change.md | 0 .../core-2/nextjs/with-clerk-middleware-removed.md | 0 .../versions/core-2/node/api-url-value-change.md | 0 .../versions/core-2/node/cjs-esm-instance.md | 0 .../versions/core-2/node/clerk-import-change.md | 0 .../core-2/node/clerkexpressrequireauth-apikey.md | 0 .../node/clerkexpressrequireauth-frontendapi.md | 0 .../core-2/node/clerkexpresswithauth-apikey.md | 0 .../core-2/node/clerkexpresswithauth-frontendapi.md | 0 .../core-2/node/createclerkclient-apikey.md | 0 .../core-2/node/createclerkclient-frontendapi.md | 0 .../node/createclerkexpressrequireauth-apikey.md | 0 .../createclerkexpressrequireauth-frontendapi.md | 0 ...teclerkexpressrequireauth-public-key-required.md | 0 .../node/createclerkexpresswithauth-apikey.md | 0 .../node/createclerkexpresswithauth-frontendapi.md | 0 ...createclerkexpresswithauth-publickey-required.md | 0 .../core-2/node/legacyauthobject-removed.md | 0 .../versions/core-2/node/setclerkapikey.md | 0 .../versions/core-2/node/setclerkapiversion.md | 0 .../versions/core-2/node/setclerkhttpoptions.md | 0 .../versions/core-2/node/setclerkserverapiurl.md | 0 .../versions/core-2/react/api-url-value-change.md | 0 .../versions/core-2/remix/clerk-import-change.md | 0 .../core-2/remix/clerkerrorboundary-removed.md | 0 .../core-2/remix/createclerkclient-apikey.md | 0 .../versions/core-2/remix/getauth-apikey.md | 0 .../versions/core-2/remix/rootauthloader-apikey.md | 0 .../core-2/remix/rootauthloader-frontendapi.md | 0 .../versions/core-2/shared/getrequesturl.md | 0 .../versions/core-2/shared/organizationcontext.md | 0 .../shared/useorganizationlist-organizationlist.md | 0 284 files changed, 2 insertions(+), 2 deletions(-) rename packages/upgrade/{source => src}/app.js (100%) rename packages/upgrade/{source => src}/cli.js (100%) rename packages/upgrade/{source => src}/constants/sdks.js (100%) rename packages/upgrade/{source => src}/constants/versions.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/backend/import-paths.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/backend/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/backend/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/chrome-extension/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/chrome-extension/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/expo/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/expo/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/fastify/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/fastify/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/gatsby/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/gatsby/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/generate-all.sh (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/js/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/js/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/nextjs/import-changes.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/nextjs/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/nextjs/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/nextjs/middleware-changes.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/nextjs/nextjs-version.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/node/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/node/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/node/node-setters-removals.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/overview/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/overview/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/react/hof-removals.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/react/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/react/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/remix/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/remix/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/retheme/index.js (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/retheme/intro.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/after-sign-x-handling.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/cli.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/deprecation-removals.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/image-url.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/node-version.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/orgs-claim.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/pagination-args.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/pagination-return.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/path-routing.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/prepare.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/react-version.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/redesign-preview.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/core-2/shared/update-version.mdx (100%) rename packages/upgrade/{source => src}/guide-generators/text-generation.js (100%) rename packages/upgrade/{source => src}/img/alternativemethods-backlink.png (100%) rename packages/upgrade/{source => src}/img/button-to-organizationlistcreateorganizationactionbutton.png (100%) rename packages/upgrade/{source => src}/img/connected-accounts-dropdown.png (100%) rename packages/upgrade/{source => src}/img/mfa-dropdown.png (100%) rename packages/upgrade/{source => src}/img/organizationprofile-settings.png (100%) rename packages/upgrade/{source => src}/img/remove-identitypreview-avatar.png (100%) rename packages/upgrade/{source => src}/img/remove-socialbuttonsblockbuttonarrow.png (100%) rename packages/upgrade/{source => src}/img/userbuttonpopoveractionbuttontext-removed.png (100%) rename packages/upgrade/{source => src}/img/userprofile-security.png (100%) rename packages/upgrade/{source => src}/scan.js (100%) rename packages/upgrade/{source => src}/util/all-titles.js (100%) rename packages/upgrade/{source => src}/util/expandable-list.js (100%) rename packages/upgrade/{source => src}/util/generate-changelog.js (100%) rename packages/upgrade/{source => src}/util/get-clerk-version.js (100%) rename packages/upgrade/{source => src}/util/guess-framework.js (100%) rename packages/upgrade/{source => src}/util/load-change.js (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/api-url-value-changed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/authenticaterequest-params-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/buildrequesturl-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/clerk-import.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/client-unstableoptions-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/clockskewinseconds.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/constants-import-path-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/createauthenticaterequest-import-path-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/createclerkclient-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/createclerkclient-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/createemail-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/createisomorphicrequest-import-path-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/createisomorphicrequest-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/decodejwt-import-path-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/getclientlist-arguments.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/getorganizationmembershiplist-return-signature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/getpendingorganizationinvitationlist.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/getsessionlist-arguments.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/httpoptions-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/interstitial-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/members-count.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/membershiprole.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/organizationjson-logourl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/organizationmembershippublicuserdatajson-profileimageurl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/pkgversion.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/redirect-import-path-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/signjwt-import-path-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/signjwterror-import-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/tokenverificationerror-import-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/tokenverificationerroraction-import-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/tokenverificationerrorcode-import-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/tokenverificationerrorreason-import-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/userjson-profileimageurl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/backend/verifyjwt-import-path-move.md (100%) rename packages/upgrade/{source => src}/versions/core-2/chrome-extension/clerkprovider-tokencache.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/aftersignxurl-changes.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/afterswitchorganizationurl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/alternativemethods-backlink.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/api-key-to-secret-key.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/appearance-organizationpreview-organizationswitcher.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/appearance-variables-breaking-changes.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/button-to-organizationlistcreateorganizationactionbutton.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/card-changes.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/changed-localization-keys.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/clerkprovider-frontendapi-2.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/clerkprovideroptionswrapper-dropped.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/connected-accounts-dropdown.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/emaillinkerrorcode-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/externalaccount-avatarurl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/externalaccount-picture.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/externalaccountjson-avatarurl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/frontend-api-to-publishable-key.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getallowlistidentifierlist-return-signature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getclientlist-return-signature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getinvitationlist-return-signature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getorganizationinvitationlist-return-signature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getorganizationinvitationlist-return-type-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getorganizationlist-return-signature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getorganizationlist-return-type-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getorganizationmembershiplist-return-type-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getredirecturllist-return-signature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getsessionlist-return-signature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getuserlist-return-signature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/getuseroauthaccesstoken-return-signature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/handlemagiclinkverification.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/isclerkapiresponserror-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/isemaillinkerror-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/isknownerror-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/ismagiclinkerror.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/ismetamaskerror-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/magiclinkerror.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/magiclinkerrorcode.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/mfa-dropdown.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/min-react-version.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/multisessionappsupport-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/navigate-to-routerpush-routerreplace.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/new-localization-keys.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/organization-create-string.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/organization-getdomains-arguments-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/organization-getinvitations-arguments-changed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/organization-getmembershiprequests-arguments-changed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/organization-getmemberships-arguments-changed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/organization-getpendinginvitations.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/organization-getroles-arguments-changed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/organization-logourl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/organizationmembershippublicuserdata-profileimageurl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/organizationprofile-settings.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/organizationswitcherpopoveractionbuttontext-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/remove-identitypreview-avatar.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/remove-socialbuttonsblockbuttonarrow.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/removed-localization-keys.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/setsession.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/signoutcallback-to-redirecturl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/supported-external-accounts-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/usemagiclink.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/useorganization-invitationlist.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/useorganization-membershiplist.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/useorganizations.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/user-getorganizationinvitations-arguments-changed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/user-getorganizationmemberships-arguments-changed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/user-getorganizationmemberships-return-signature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/user-getorganizationsuggestions-arguments-changed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/user-profileimageurl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/user-update-password.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/userbuttonpopoveractionbuttontext-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/userbuttontrigger-userbuttonbox-invert.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/userprofile-prop.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/userprofile-security.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/withclerk-hof-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/withclerk-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/withsession-hof-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/withsession-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/withuser-hof-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/common/withuser-removed-2.md (100%) rename packages/upgrade/{source => src}/versions/core-2/expo/apikey-to-publishable-key.md (100%) rename packages/upgrade/{source => src}/versions/core-2/expo/clerkprovider-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/fastify/api-url-value-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/fastify/clerk-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/fastify/clerkplugin-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/fastify/createclerkclient-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/fastify/createclerkclient-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/gatsby/api-url-value-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/gatsby/apikey-to-publishable-key.md (100%) rename packages/upgrade/{source => src}/versions/core-2/gatsby/clerk-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/gatsby/createclerkclient-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/gatsby/createclerkclient-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/gatsby/withserverauth-return-type.md (100%) rename packages/upgrade/{source => src}/versions/core-2/index.js (100%) rename packages/upgrade/{source => src}/versions/core-2/js/clerk-import.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/clerk-isready-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/experimental-canusecaptcha.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/experimental-captchasitekey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/experimental-captchaurl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/getorganizationmemberships.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/lastorganizationinvitation-member.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/redirecttohome.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/signup-attemptweb3walletverification-generatedsignature.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/unstable-invitationupdate.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/unstable-membershipupdate.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/user-createexternalaccount-redirecturl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/js/user-orgpublicdata-profileimageurl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/api-url-value-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/auth-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/auth-middleware-deprecated.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/authmiddleware-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/authmiddleware-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/authmiddleware-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/buildclerkprops-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/clerk-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/clerk-js-version-next-public.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/constants-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/createauthenticaterequest-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/createclerkclient-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/createclerkclient-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/createisomorphicrequest-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/currentuser-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/decodejwt-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/emaillinkerrorcode-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/getauth-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-api-url.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-api-version.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-clerk-js-url.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-clerk-js-version.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-domain.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-is-satellite.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-nextjs-api.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-nextjs-app-beta.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-nextjs-edge-middleware.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-nextjs-edge-middlewarefiles.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-nextjs-ssr.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-proxy-url.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-publishable-key.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-secret-key.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-sign-in-url.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/import-sign-up-url.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/isclerkapiresponserror-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/isemaillinkerror-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/isknownerror-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/min-nextjs-version.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/multisessionappsupport-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/next-public-clerk-js-url.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/redirect-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/redirecttosignin-import-path.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/redirecttosignup-import-path.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/signjwt-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/verifyjwt-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/verifytoken-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/nextjs/with-clerk-middleware-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/api-url-value-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/cjs-esm-instance.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/clerk-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/clerkexpressrequireauth-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/clerkexpressrequireauth-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/clerkexpresswithauth-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/clerkexpresswithauth-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/createclerkclient-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/createclerkclient-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/createclerkexpressrequireauth-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/createclerkexpressrequireauth-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/createclerkexpresswithauth-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/createclerkexpresswithauth-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/createclerkexpresswithauth-publickey-required.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/legacyauthobject-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/setclerkapikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/setclerkapiversion.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/setclerkhttpoptions.md (100%) rename packages/upgrade/{source => src}/versions/core-2/node/setclerkserverapiurl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/react/api-url-value-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/remix/clerk-import-change.md (100%) rename packages/upgrade/{source => src}/versions/core-2/remix/clerkerrorboundary-removed.md (100%) rename packages/upgrade/{source => src}/versions/core-2/remix/createclerkclient-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/remix/getauth-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/remix/rootauthloader-apikey.md (100%) rename packages/upgrade/{source => src}/versions/core-2/remix/rootauthloader-frontendapi.md (100%) rename packages/upgrade/{source => src}/versions/core-2/shared/getrequesturl.md (100%) rename packages/upgrade/{source => src}/versions/core-2/shared/organizationcontext.md (100%) rename packages/upgrade/{source => src}/versions/core-2/shared/useorganizationlist-organizationlist.md (100%) diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 47bf07d93e9..6f08b1eab69 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -11,9 +11,9 @@ "dist" ], "scripts": { - "build": "npm run clean && NODE_ENV=production babel --out-dir=dist source --copy-files", + "build": "npm run clean && NODE_ENV=production babel --out-dir=dist src --copy-files", "clean": "del-cli dist/*", - "dev": "babel --out-dir=dist --watch source --copy-files", + "dev": "babel --out-dir=dist --watch src --copy-files", "lint": "eslint src/", "lint:attw": "attw --pack .", "lint:publint": "publint" diff --git a/packages/upgrade/source/app.js b/packages/upgrade/src/app.js similarity index 100% rename from packages/upgrade/source/app.js rename to packages/upgrade/src/app.js diff --git a/packages/upgrade/source/cli.js b/packages/upgrade/src/cli.js similarity index 100% rename from packages/upgrade/source/cli.js rename to packages/upgrade/src/cli.js diff --git a/packages/upgrade/source/constants/sdks.js b/packages/upgrade/src/constants/sdks.js similarity index 100% rename from packages/upgrade/source/constants/sdks.js rename to packages/upgrade/src/constants/sdks.js diff --git a/packages/upgrade/source/constants/versions.js b/packages/upgrade/src/constants/versions.js similarity index 100% rename from packages/upgrade/source/constants/versions.js rename to packages/upgrade/src/constants/versions.js diff --git a/packages/upgrade/source/guide-generators/core-2/backend/import-paths.mdx b/packages/upgrade/src/guide-generators/core-2/backend/import-paths.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/backend/import-paths.mdx rename to packages/upgrade/src/guide-generators/core-2/backend/import-paths.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/backend/index.js b/packages/upgrade/src/guide-generators/core-2/backend/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/backend/index.js rename to packages/upgrade/src/guide-generators/core-2/backend/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/backend/intro.mdx b/packages/upgrade/src/guide-generators/core-2/backend/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/backend/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/backend/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/chrome-extension/index.js b/packages/upgrade/src/guide-generators/core-2/chrome-extension/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/chrome-extension/index.js rename to packages/upgrade/src/guide-generators/core-2/chrome-extension/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/chrome-extension/intro.mdx b/packages/upgrade/src/guide-generators/core-2/chrome-extension/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/chrome-extension/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/chrome-extension/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/expo/index.js b/packages/upgrade/src/guide-generators/core-2/expo/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/expo/index.js rename to packages/upgrade/src/guide-generators/core-2/expo/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/expo/intro.mdx b/packages/upgrade/src/guide-generators/core-2/expo/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/expo/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/expo/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/fastify/index.js b/packages/upgrade/src/guide-generators/core-2/fastify/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/fastify/index.js rename to packages/upgrade/src/guide-generators/core-2/fastify/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/fastify/intro.mdx b/packages/upgrade/src/guide-generators/core-2/fastify/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/fastify/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/fastify/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/gatsby/index.js b/packages/upgrade/src/guide-generators/core-2/gatsby/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/gatsby/index.js rename to packages/upgrade/src/guide-generators/core-2/gatsby/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/gatsby/intro.mdx b/packages/upgrade/src/guide-generators/core-2/gatsby/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/gatsby/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/gatsby/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/generate-all.sh b/packages/upgrade/src/guide-generators/core-2/generate-all.sh similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/generate-all.sh rename to packages/upgrade/src/guide-generators/core-2/generate-all.sh diff --git a/packages/upgrade/source/guide-generators/core-2/js/index.js b/packages/upgrade/src/guide-generators/core-2/js/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/js/index.js rename to packages/upgrade/src/guide-generators/core-2/js/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/js/intro.mdx b/packages/upgrade/src/guide-generators/core-2/js/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/js/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/js/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/import-changes.mdx b/packages/upgrade/src/guide-generators/core-2/nextjs/import-changes.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/nextjs/import-changes.mdx rename to packages/upgrade/src/guide-generators/core-2/nextjs/import-changes.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/index.js b/packages/upgrade/src/guide-generators/core-2/nextjs/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/nextjs/index.js rename to packages/upgrade/src/guide-generators/core-2/nextjs/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/intro.mdx b/packages/upgrade/src/guide-generators/core-2/nextjs/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/nextjs/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/nextjs/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx b/packages/upgrade/src/guide-generators/core-2/nextjs/middleware-changes.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/nextjs/middleware-changes.mdx rename to packages/upgrade/src/guide-generators/core-2/nextjs/middleware-changes.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/nextjs/nextjs-version.mdx b/packages/upgrade/src/guide-generators/core-2/nextjs/nextjs-version.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/nextjs/nextjs-version.mdx rename to packages/upgrade/src/guide-generators/core-2/nextjs/nextjs-version.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/node/index.js b/packages/upgrade/src/guide-generators/core-2/node/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/node/index.js rename to packages/upgrade/src/guide-generators/core-2/node/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/node/intro.mdx b/packages/upgrade/src/guide-generators/core-2/node/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/node/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/node/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/node/node-setters-removals.mdx b/packages/upgrade/src/guide-generators/core-2/node/node-setters-removals.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/node/node-setters-removals.mdx rename to packages/upgrade/src/guide-generators/core-2/node/node-setters-removals.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/overview/index.js b/packages/upgrade/src/guide-generators/core-2/overview/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/overview/index.js rename to packages/upgrade/src/guide-generators/core-2/overview/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/overview/intro.mdx b/packages/upgrade/src/guide-generators/core-2/overview/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/overview/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/overview/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/react/hof-removals.mdx b/packages/upgrade/src/guide-generators/core-2/react/hof-removals.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/react/hof-removals.mdx rename to packages/upgrade/src/guide-generators/core-2/react/hof-removals.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/react/index.js b/packages/upgrade/src/guide-generators/core-2/react/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/react/index.js rename to packages/upgrade/src/guide-generators/core-2/react/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/react/intro.mdx b/packages/upgrade/src/guide-generators/core-2/react/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/react/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/react/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/remix/index.js b/packages/upgrade/src/guide-generators/core-2/remix/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/remix/index.js rename to packages/upgrade/src/guide-generators/core-2/remix/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/remix/intro.mdx b/packages/upgrade/src/guide-generators/core-2/remix/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/remix/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/remix/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/retheme/index.js b/packages/upgrade/src/guide-generators/core-2/retheme/index.js similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/retheme/index.js rename to packages/upgrade/src/guide-generators/core-2/retheme/index.js diff --git a/packages/upgrade/source/guide-generators/core-2/retheme/intro.mdx b/packages/upgrade/src/guide-generators/core-2/retheme/intro.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/retheme/intro.mdx rename to packages/upgrade/src/guide-generators/core-2/retheme/intro.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/after-sign-x-handling.mdx b/packages/upgrade/src/guide-generators/core-2/shared/after-sign-x-handling.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/after-sign-x-handling.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/after-sign-x-handling.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/cli.mdx b/packages/upgrade/src/guide-generators/core-2/shared/cli.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/cli.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/cli.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/deprecation-removals.mdx b/packages/upgrade/src/guide-generators/core-2/shared/deprecation-removals.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/deprecation-removals.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/deprecation-removals.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/image-url.mdx b/packages/upgrade/src/guide-generators/core-2/shared/image-url.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/image-url.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/image-url.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/node-version.mdx b/packages/upgrade/src/guide-generators/core-2/shared/node-version.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/node-version.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/node-version.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/orgs-claim.mdx b/packages/upgrade/src/guide-generators/core-2/shared/orgs-claim.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/orgs-claim.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/orgs-claim.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/pagination-args.mdx b/packages/upgrade/src/guide-generators/core-2/shared/pagination-args.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/pagination-args.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/pagination-args.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/pagination-return.mdx b/packages/upgrade/src/guide-generators/core-2/shared/pagination-return.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/pagination-return.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/pagination-return.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/path-routing.mdx b/packages/upgrade/src/guide-generators/core-2/shared/path-routing.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/path-routing.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/path-routing.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx b/packages/upgrade/src/guide-generators/core-2/shared/prepare.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/prepare.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/prepare.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/react-version.mdx b/packages/upgrade/src/guide-generators/core-2/shared/react-version.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/react-version.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/react-version.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/redesign-preview.mdx b/packages/upgrade/src/guide-generators/core-2/shared/redesign-preview.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/redesign-preview.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/redesign-preview.mdx diff --git a/packages/upgrade/source/guide-generators/core-2/shared/update-version.mdx b/packages/upgrade/src/guide-generators/core-2/shared/update-version.mdx similarity index 100% rename from packages/upgrade/source/guide-generators/core-2/shared/update-version.mdx rename to packages/upgrade/src/guide-generators/core-2/shared/update-version.mdx diff --git a/packages/upgrade/source/guide-generators/text-generation.js b/packages/upgrade/src/guide-generators/text-generation.js similarity index 100% rename from packages/upgrade/source/guide-generators/text-generation.js rename to packages/upgrade/src/guide-generators/text-generation.js diff --git a/packages/upgrade/source/img/alternativemethods-backlink.png b/packages/upgrade/src/img/alternativemethods-backlink.png similarity index 100% rename from packages/upgrade/source/img/alternativemethods-backlink.png rename to packages/upgrade/src/img/alternativemethods-backlink.png diff --git a/packages/upgrade/source/img/button-to-organizationlistcreateorganizationactionbutton.png b/packages/upgrade/src/img/button-to-organizationlistcreateorganizationactionbutton.png similarity index 100% rename from packages/upgrade/source/img/button-to-organizationlistcreateorganizationactionbutton.png rename to packages/upgrade/src/img/button-to-organizationlistcreateorganizationactionbutton.png diff --git a/packages/upgrade/source/img/connected-accounts-dropdown.png b/packages/upgrade/src/img/connected-accounts-dropdown.png similarity index 100% rename from packages/upgrade/source/img/connected-accounts-dropdown.png rename to packages/upgrade/src/img/connected-accounts-dropdown.png diff --git a/packages/upgrade/source/img/mfa-dropdown.png b/packages/upgrade/src/img/mfa-dropdown.png similarity index 100% rename from packages/upgrade/source/img/mfa-dropdown.png rename to packages/upgrade/src/img/mfa-dropdown.png diff --git a/packages/upgrade/source/img/organizationprofile-settings.png b/packages/upgrade/src/img/organizationprofile-settings.png similarity index 100% rename from packages/upgrade/source/img/organizationprofile-settings.png rename to packages/upgrade/src/img/organizationprofile-settings.png diff --git a/packages/upgrade/source/img/remove-identitypreview-avatar.png b/packages/upgrade/src/img/remove-identitypreview-avatar.png similarity index 100% rename from packages/upgrade/source/img/remove-identitypreview-avatar.png rename to packages/upgrade/src/img/remove-identitypreview-avatar.png diff --git a/packages/upgrade/source/img/remove-socialbuttonsblockbuttonarrow.png b/packages/upgrade/src/img/remove-socialbuttonsblockbuttonarrow.png similarity index 100% rename from packages/upgrade/source/img/remove-socialbuttonsblockbuttonarrow.png rename to packages/upgrade/src/img/remove-socialbuttonsblockbuttonarrow.png diff --git a/packages/upgrade/source/img/userbuttonpopoveractionbuttontext-removed.png b/packages/upgrade/src/img/userbuttonpopoveractionbuttontext-removed.png similarity index 100% rename from packages/upgrade/source/img/userbuttonpopoveractionbuttontext-removed.png rename to packages/upgrade/src/img/userbuttonpopoveractionbuttontext-removed.png diff --git a/packages/upgrade/source/img/userprofile-security.png b/packages/upgrade/src/img/userprofile-security.png similarity index 100% rename from packages/upgrade/source/img/userprofile-security.png rename to packages/upgrade/src/img/userprofile-security.png diff --git a/packages/upgrade/source/scan.js b/packages/upgrade/src/scan.js similarity index 100% rename from packages/upgrade/source/scan.js rename to packages/upgrade/src/scan.js diff --git a/packages/upgrade/source/util/all-titles.js b/packages/upgrade/src/util/all-titles.js similarity index 100% rename from packages/upgrade/source/util/all-titles.js rename to packages/upgrade/src/util/all-titles.js diff --git a/packages/upgrade/source/util/expandable-list.js b/packages/upgrade/src/util/expandable-list.js similarity index 100% rename from packages/upgrade/source/util/expandable-list.js rename to packages/upgrade/src/util/expandable-list.js diff --git a/packages/upgrade/source/util/generate-changelog.js b/packages/upgrade/src/util/generate-changelog.js similarity index 100% rename from packages/upgrade/source/util/generate-changelog.js rename to packages/upgrade/src/util/generate-changelog.js diff --git a/packages/upgrade/source/util/get-clerk-version.js b/packages/upgrade/src/util/get-clerk-version.js similarity index 100% rename from packages/upgrade/source/util/get-clerk-version.js rename to packages/upgrade/src/util/get-clerk-version.js diff --git a/packages/upgrade/source/util/guess-framework.js b/packages/upgrade/src/util/guess-framework.js similarity index 100% rename from packages/upgrade/source/util/guess-framework.js rename to packages/upgrade/src/util/guess-framework.js diff --git a/packages/upgrade/source/util/load-change.js b/packages/upgrade/src/util/load-change.js similarity index 100% rename from packages/upgrade/source/util/load-change.js rename to packages/upgrade/src/util/load-change.js diff --git a/packages/upgrade/source/versions/core-2/backend/api-url-value-changed.md b/packages/upgrade/src/versions/core-2/backend/api-url-value-changed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/api-url-value-changed.md rename to packages/upgrade/src/versions/core-2/backend/api-url-value-changed.md diff --git a/packages/upgrade/source/versions/core-2/backend/authenticaterequest-params-change.md b/packages/upgrade/src/versions/core-2/backend/authenticaterequest-params-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/authenticaterequest-params-change.md rename to packages/upgrade/src/versions/core-2/backend/authenticaterequest-params-change.md diff --git a/packages/upgrade/source/versions/core-2/backend/buildrequesturl-removed.md b/packages/upgrade/src/versions/core-2/backend/buildrequesturl-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/buildrequesturl-removed.md rename to packages/upgrade/src/versions/core-2/backend/buildrequesturl-removed.md diff --git a/packages/upgrade/source/versions/core-2/backend/clerk-import.md b/packages/upgrade/src/versions/core-2/backend/clerk-import.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/clerk-import.md rename to packages/upgrade/src/versions/core-2/backend/clerk-import.md diff --git a/packages/upgrade/source/versions/core-2/backend/client-unstableoptions-removed.md b/packages/upgrade/src/versions/core-2/backend/client-unstableoptions-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/client-unstableoptions-removed.md rename to packages/upgrade/src/versions/core-2/backend/client-unstableoptions-removed.md diff --git a/packages/upgrade/source/versions/core-2/backend/clockskewinseconds.md b/packages/upgrade/src/versions/core-2/backend/clockskewinseconds.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/clockskewinseconds.md rename to packages/upgrade/src/versions/core-2/backend/clockskewinseconds.md diff --git a/packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/constants-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/constants-import-path-move.md rename to packages/upgrade/src/versions/core-2/backend/constants-import-path-move.md diff --git a/packages/upgrade/source/versions/core-2/backend/createauthenticaterequest-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/createauthenticaterequest-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/createauthenticaterequest-import-path-move.md rename to packages/upgrade/src/versions/core-2/backend/createauthenticaterequest-import-path-move.md diff --git a/packages/upgrade/source/versions/core-2/backend/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/backend/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/createclerkclient-apikey.md rename to packages/upgrade/src/versions/core-2/backend/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/core-2/backend/createclerkclient-frontendapi.md b/packages/upgrade/src/versions/core-2/backend/createclerkclient-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/createclerkclient-frontendapi.md rename to packages/upgrade/src/versions/core-2/backend/createclerkclient-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/backend/createemail-removed.md b/packages/upgrade/src/versions/core-2/backend/createemail-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/createemail-removed.md rename to packages/upgrade/src/versions/core-2/backend/createemail-removed.md diff --git a/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/createisomorphicrequest-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-import-path-move.md rename to packages/upgrade/src/versions/core-2/backend/createisomorphicrequest-import-path-move.md diff --git a/packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md b/packages/upgrade/src/versions/core-2/backend/createisomorphicrequest-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/createisomorphicrequest-removed.md rename to packages/upgrade/src/versions/core-2/backend/createisomorphicrequest-removed.md diff --git a/packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/decodejwt-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/decodejwt-import-path-move.md rename to packages/upgrade/src/versions/core-2/backend/decodejwt-import-path-move.md diff --git a/packages/upgrade/source/versions/core-2/backend/getclientlist-arguments.md b/packages/upgrade/src/versions/core-2/backend/getclientlist-arguments.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/getclientlist-arguments.md rename to packages/upgrade/src/versions/core-2/backend/getclientlist-arguments.md diff --git a/packages/upgrade/source/versions/core-2/backend/getorganizationmembershiplist-return-signature.md b/packages/upgrade/src/versions/core-2/backend/getorganizationmembershiplist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/getorganizationmembershiplist-return-signature.md rename to packages/upgrade/src/versions/core-2/backend/getorganizationmembershiplist-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/backend/getpendingorganizationinvitationlist.md b/packages/upgrade/src/versions/core-2/backend/getpendingorganizationinvitationlist.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/getpendingorganizationinvitationlist.md rename to packages/upgrade/src/versions/core-2/backend/getpendingorganizationinvitationlist.md diff --git a/packages/upgrade/source/versions/core-2/backend/getsessionlist-arguments.md b/packages/upgrade/src/versions/core-2/backend/getsessionlist-arguments.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/getsessionlist-arguments.md rename to packages/upgrade/src/versions/core-2/backend/getsessionlist-arguments.md diff --git a/packages/upgrade/source/versions/core-2/backend/httpoptions-removed.md b/packages/upgrade/src/versions/core-2/backend/httpoptions-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/httpoptions-removed.md rename to packages/upgrade/src/versions/core-2/backend/httpoptions-removed.md diff --git a/packages/upgrade/source/versions/core-2/backend/interstitial-removed.md b/packages/upgrade/src/versions/core-2/backend/interstitial-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/interstitial-removed.md rename to packages/upgrade/src/versions/core-2/backend/interstitial-removed.md diff --git a/packages/upgrade/source/versions/core-2/backend/members-count.md b/packages/upgrade/src/versions/core-2/backend/members-count.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/members-count.md rename to packages/upgrade/src/versions/core-2/backend/members-count.md diff --git a/packages/upgrade/source/versions/core-2/backend/membershiprole.md b/packages/upgrade/src/versions/core-2/backend/membershiprole.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/membershiprole.md rename to packages/upgrade/src/versions/core-2/backend/membershiprole.md diff --git a/packages/upgrade/source/versions/core-2/backend/organizationjson-logourl.md b/packages/upgrade/src/versions/core-2/backend/organizationjson-logourl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/organizationjson-logourl.md rename to packages/upgrade/src/versions/core-2/backend/organizationjson-logourl.md diff --git a/packages/upgrade/source/versions/core-2/backend/organizationmembershippublicuserdatajson-profileimageurl.md b/packages/upgrade/src/versions/core-2/backend/organizationmembershippublicuserdatajson-profileimageurl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/organizationmembershippublicuserdatajson-profileimageurl.md rename to packages/upgrade/src/versions/core-2/backend/organizationmembershippublicuserdatajson-profileimageurl.md diff --git a/packages/upgrade/source/versions/core-2/backend/pkgversion.md b/packages/upgrade/src/versions/core-2/backend/pkgversion.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/pkgversion.md rename to packages/upgrade/src/versions/core-2/backend/pkgversion.md diff --git a/packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/redirect-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/redirect-import-path-move.md rename to packages/upgrade/src/versions/core-2/backend/redirect-import-path-move.md diff --git a/packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/signjwt-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/signjwt-import-path-move.md rename to packages/upgrade/src/versions/core-2/backend/signjwt-import-path-move.md diff --git a/packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md b/packages/upgrade/src/versions/core-2/backend/signjwterror-import-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/signjwterror-import-move.md rename to packages/upgrade/src/versions/core-2/backend/signjwterror-import-move.md diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md b/packages/upgrade/src/versions/core-2/backend/tokenverificationerror-import-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/tokenverificationerror-import-move.md rename to packages/upgrade/src/versions/core-2/backend/tokenverificationerror-import-move.md diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md b/packages/upgrade/src/versions/core-2/backend/tokenverificationerroraction-import-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/tokenverificationerroraction-import-move.md rename to packages/upgrade/src/versions/core-2/backend/tokenverificationerroraction-import-move.md diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md b/packages/upgrade/src/versions/core-2/backend/tokenverificationerrorcode-import-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/tokenverificationerrorcode-import-move.md rename to packages/upgrade/src/versions/core-2/backend/tokenverificationerrorcode-import-move.md diff --git a/packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md b/packages/upgrade/src/versions/core-2/backend/tokenverificationerrorreason-import-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/tokenverificationerrorreason-import-move.md rename to packages/upgrade/src/versions/core-2/backend/tokenverificationerrorreason-import-move.md diff --git a/packages/upgrade/source/versions/core-2/backend/userjson-profileimageurl.md b/packages/upgrade/src/versions/core-2/backend/userjson-profileimageurl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/userjson-profileimageurl.md rename to packages/upgrade/src/versions/core-2/backend/userjson-profileimageurl.md diff --git a/packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/verifyjwt-import-path-move.md similarity index 100% rename from packages/upgrade/source/versions/core-2/backend/verifyjwt-import-path-move.md rename to packages/upgrade/src/versions/core-2/backend/verifyjwt-import-path-move.md diff --git a/packages/upgrade/source/versions/core-2/chrome-extension/clerkprovider-tokencache.md b/packages/upgrade/src/versions/core-2/chrome-extension/clerkprovider-tokencache.md similarity index 100% rename from packages/upgrade/source/versions/core-2/chrome-extension/clerkprovider-tokencache.md rename to packages/upgrade/src/versions/core-2/chrome-extension/clerkprovider-tokencache.md diff --git a/packages/upgrade/source/versions/core-2/common/aftersignxurl-changes.md b/packages/upgrade/src/versions/core-2/common/aftersignxurl-changes.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/aftersignxurl-changes.md rename to packages/upgrade/src/versions/core-2/common/aftersignxurl-changes.md diff --git a/packages/upgrade/source/versions/core-2/common/afterswitchorganizationurl.md b/packages/upgrade/src/versions/core-2/common/afterswitchorganizationurl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/afterswitchorganizationurl.md rename to packages/upgrade/src/versions/core-2/common/afterswitchorganizationurl.md diff --git a/packages/upgrade/source/versions/core-2/common/alternativemethods-backlink.md b/packages/upgrade/src/versions/core-2/common/alternativemethods-backlink.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/alternativemethods-backlink.md rename to packages/upgrade/src/versions/core-2/common/alternativemethods-backlink.md diff --git a/packages/upgrade/source/versions/core-2/common/api-key-to-secret-key.md b/packages/upgrade/src/versions/core-2/common/api-key-to-secret-key.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/api-key-to-secret-key.md rename to packages/upgrade/src/versions/core-2/common/api-key-to-secret-key.md diff --git a/packages/upgrade/source/versions/core-2/common/appearance-organizationpreview-organizationswitcher.md b/packages/upgrade/src/versions/core-2/common/appearance-organizationpreview-organizationswitcher.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/appearance-organizationpreview-organizationswitcher.md rename to packages/upgrade/src/versions/core-2/common/appearance-organizationpreview-organizationswitcher.md diff --git a/packages/upgrade/source/versions/core-2/common/appearance-variables-breaking-changes.md b/packages/upgrade/src/versions/core-2/common/appearance-variables-breaking-changes.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/appearance-variables-breaking-changes.md rename to packages/upgrade/src/versions/core-2/common/appearance-variables-breaking-changes.md diff --git a/packages/upgrade/source/versions/core-2/common/button-to-organizationlistcreateorganizationactionbutton.md b/packages/upgrade/src/versions/core-2/common/button-to-organizationlistcreateorganizationactionbutton.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/button-to-organizationlistcreateorganizationactionbutton.md rename to packages/upgrade/src/versions/core-2/common/button-to-organizationlistcreateorganizationactionbutton.md diff --git a/packages/upgrade/source/versions/core-2/common/card-changes.md b/packages/upgrade/src/versions/core-2/common/card-changes.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/card-changes.md rename to packages/upgrade/src/versions/core-2/common/card-changes.md diff --git a/packages/upgrade/source/versions/core-2/common/changed-localization-keys.md b/packages/upgrade/src/versions/core-2/common/changed-localization-keys.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/changed-localization-keys.md rename to packages/upgrade/src/versions/core-2/common/changed-localization-keys.md diff --git a/packages/upgrade/source/versions/core-2/common/clerkprovider-frontendapi-2.md b/packages/upgrade/src/versions/core-2/common/clerkprovider-frontendapi-2.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/clerkprovider-frontendapi-2.md rename to packages/upgrade/src/versions/core-2/common/clerkprovider-frontendapi-2.md diff --git a/packages/upgrade/source/versions/core-2/common/clerkprovideroptionswrapper-dropped.md b/packages/upgrade/src/versions/core-2/common/clerkprovideroptionswrapper-dropped.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/clerkprovideroptionswrapper-dropped.md rename to packages/upgrade/src/versions/core-2/common/clerkprovideroptionswrapper-dropped.md diff --git a/packages/upgrade/source/versions/core-2/common/connected-accounts-dropdown.md b/packages/upgrade/src/versions/core-2/common/connected-accounts-dropdown.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/connected-accounts-dropdown.md rename to packages/upgrade/src/versions/core-2/common/connected-accounts-dropdown.md diff --git a/packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md b/packages/upgrade/src/versions/core-2/common/emaillinkerrorcode-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/emaillinkerrorcode-import-change.md rename to packages/upgrade/src/versions/core-2/common/emaillinkerrorcode-import-change.md diff --git a/packages/upgrade/source/versions/core-2/common/externalaccount-avatarurl.md b/packages/upgrade/src/versions/core-2/common/externalaccount-avatarurl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/externalaccount-avatarurl.md rename to packages/upgrade/src/versions/core-2/common/externalaccount-avatarurl.md diff --git a/packages/upgrade/source/versions/core-2/common/externalaccount-picture.md b/packages/upgrade/src/versions/core-2/common/externalaccount-picture.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/externalaccount-picture.md rename to packages/upgrade/src/versions/core-2/common/externalaccount-picture.md diff --git a/packages/upgrade/source/versions/core-2/common/externalaccountjson-avatarurl.md b/packages/upgrade/src/versions/core-2/common/externalaccountjson-avatarurl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/externalaccountjson-avatarurl.md rename to packages/upgrade/src/versions/core-2/common/externalaccountjson-avatarurl.md diff --git a/packages/upgrade/source/versions/core-2/common/frontend-api-to-publishable-key.md b/packages/upgrade/src/versions/core-2/common/frontend-api-to-publishable-key.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/frontend-api-to-publishable-key.md rename to packages/upgrade/src/versions/core-2/common/frontend-api-to-publishable-key.md diff --git a/packages/upgrade/source/versions/core-2/common/getallowlistidentifierlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getallowlistidentifierlist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getallowlistidentifierlist-return-signature.md rename to packages/upgrade/src/versions/core-2/common/getallowlistidentifierlist-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/common/getclientlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getclientlist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getclientlist-return-signature.md rename to packages/upgrade/src/versions/core-2/common/getclientlist-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/common/getinvitationlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getinvitationlist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getinvitationlist-return-signature.md rename to packages/upgrade/src/versions/core-2/common/getinvitationlist-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getorganizationinvitationlist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-signature.md rename to packages/upgrade/src/versions/core-2/common/getorganizationinvitationlist-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-type-change.md b/packages/upgrade/src/versions/core-2/common/getorganizationinvitationlist-return-type-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getorganizationinvitationlist-return-type-change.md rename to packages/upgrade/src/versions/core-2/common/getorganizationinvitationlist-return-type-change.md diff --git a/packages/upgrade/source/versions/core-2/common/getorganizationlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getorganizationlist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getorganizationlist-return-signature.md rename to packages/upgrade/src/versions/core-2/common/getorganizationlist-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/common/getorganizationlist-return-type-change.md b/packages/upgrade/src/versions/core-2/common/getorganizationlist-return-type-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getorganizationlist-return-type-change.md rename to packages/upgrade/src/versions/core-2/common/getorganizationlist-return-type-change.md diff --git a/packages/upgrade/source/versions/core-2/common/getorganizationmembershiplist-return-type-change.md b/packages/upgrade/src/versions/core-2/common/getorganizationmembershiplist-return-type-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getorganizationmembershiplist-return-type-change.md rename to packages/upgrade/src/versions/core-2/common/getorganizationmembershiplist-return-type-change.md diff --git a/packages/upgrade/source/versions/core-2/common/getredirecturllist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getredirecturllist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getredirecturllist-return-signature.md rename to packages/upgrade/src/versions/core-2/common/getredirecturllist-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/common/getsessionlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getsessionlist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getsessionlist-return-signature.md rename to packages/upgrade/src/versions/core-2/common/getsessionlist-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/common/getuserlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getuserlist-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getuserlist-return-signature.md rename to packages/upgrade/src/versions/core-2/common/getuserlist-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/common/getuseroauthaccesstoken-return-signature.md b/packages/upgrade/src/versions/core-2/common/getuseroauthaccesstoken-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/getuseroauthaccesstoken-return-signature.md rename to packages/upgrade/src/versions/core-2/common/getuseroauthaccesstoken-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/common/handlemagiclinkverification.md b/packages/upgrade/src/versions/core-2/common/handlemagiclinkverification.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/handlemagiclinkverification.md rename to packages/upgrade/src/versions/core-2/common/handlemagiclinkverification.md diff --git a/packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md b/packages/upgrade/src/versions/core-2/common/isclerkapiresponserror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/isclerkapiresponserror-import-change.md rename to packages/upgrade/src/versions/core-2/common/isclerkapiresponserror-import-change.md diff --git a/packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md b/packages/upgrade/src/versions/core-2/common/isemaillinkerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/isemaillinkerror-import-change.md rename to packages/upgrade/src/versions/core-2/common/isemaillinkerror-import-change.md diff --git a/packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md b/packages/upgrade/src/versions/core-2/common/isknownerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/isknownerror-import-change.md rename to packages/upgrade/src/versions/core-2/common/isknownerror-import-change.md diff --git a/packages/upgrade/source/versions/core-2/common/ismagiclinkerror.md b/packages/upgrade/src/versions/core-2/common/ismagiclinkerror.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/ismagiclinkerror.md rename to packages/upgrade/src/versions/core-2/common/ismagiclinkerror.md diff --git a/packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md b/packages/upgrade/src/versions/core-2/common/ismetamaskerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/ismetamaskerror-import-change.md rename to packages/upgrade/src/versions/core-2/common/ismetamaskerror-import-change.md diff --git a/packages/upgrade/source/versions/core-2/common/magiclinkerror.md b/packages/upgrade/src/versions/core-2/common/magiclinkerror.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/magiclinkerror.md rename to packages/upgrade/src/versions/core-2/common/magiclinkerror.md diff --git a/packages/upgrade/source/versions/core-2/common/magiclinkerrorcode.md b/packages/upgrade/src/versions/core-2/common/magiclinkerrorcode.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/magiclinkerrorcode.md rename to packages/upgrade/src/versions/core-2/common/magiclinkerrorcode.md diff --git a/packages/upgrade/source/versions/core-2/common/mfa-dropdown.md b/packages/upgrade/src/versions/core-2/common/mfa-dropdown.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/mfa-dropdown.md rename to packages/upgrade/src/versions/core-2/common/mfa-dropdown.md diff --git a/packages/upgrade/source/versions/core-2/common/min-react-version.md b/packages/upgrade/src/versions/core-2/common/min-react-version.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/min-react-version.md rename to packages/upgrade/src/versions/core-2/common/min-react-version.md diff --git a/packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md b/packages/upgrade/src/versions/core-2/common/multisessionappsupport-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/multisessionappsupport-import-change.md rename to packages/upgrade/src/versions/core-2/common/multisessionappsupport-import-change.md diff --git a/packages/upgrade/source/versions/core-2/common/navigate-to-routerpush-routerreplace.md b/packages/upgrade/src/versions/core-2/common/navigate-to-routerpush-routerreplace.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/navigate-to-routerpush-routerreplace.md rename to packages/upgrade/src/versions/core-2/common/navigate-to-routerpush-routerreplace.md diff --git a/packages/upgrade/source/versions/core-2/common/new-localization-keys.md b/packages/upgrade/src/versions/core-2/common/new-localization-keys.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/new-localization-keys.md rename to packages/upgrade/src/versions/core-2/common/new-localization-keys.md diff --git a/packages/upgrade/source/versions/core-2/common/organization-create-string.md b/packages/upgrade/src/versions/core-2/common/organization-create-string.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/organization-create-string.md rename to packages/upgrade/src/versions/core-2/common/organization-create-string.md diff --git a/packages/upgrade/source/versions/core-2/common/organization-getdomains-arguments-change.md b/packages/upgrade/src/versions/core-2/common/organization-getdomains-arguments-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/organization-getdomains-arguments-change.md rename to packages/upgrade/src/versions/core-2/common/organization-getdomains-arguments-change.md diff --git a/packages/upgrade/source/versions/core-2/common/organization-getinvitations-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/organization-getinvitations-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/organization-getinvitations-arguments-changed.md rename to packages/upgrade/src/versions/core-2/common/organization-getinvitations-arguments-changed.md diff --git a/packages/upgrade/source/versions/core-2/common/organization-getmembershiprequests-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/organization-getmembershiprequests-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/organization-getmembershiprequests-arguments-changed.md rename to packages/upgrade/src/versions/core-2/common/organization-getmembershiprequests-arguments-changed.md diff --git a/packages/upgrade/source/versions/core-2/common/organization-getmemberships-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/organization-getmemberships-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/organization-getmemberships-arguments-changed.md rename to packages/upgrade/src/versions/core-2/common/organization-getmemberships-arguments-changed.md diff --git a/packages/upgrade/source/versions/core-2/common/organization-getpendinginvitations.md b/packages/upgrade/src/versions/core-2/common/organization-getpendinginvitations.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/organization-getpendinginvitations.md rename to packages/upgrade/src/versions/core-2/common/organization-getpendinginvitations.md diff --git a/packages/upgrade/source/versions/core-2/common/organization-getroles-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/organization-getroles-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/organization-getroles-arguments-changed.md rename to packages/upgrade/src/versions/core-2/common/organization-getroles-arguments-changed.md diff --git a/packages/upgrade/source/versions/core-2/common/organization-logourl.md b/packages/upgrade/src/versions/core-2/common/organization-logourl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/organization-logourl.md rename to packages/upgrade/src/versions/core-2/common/organization-logourl.md diff --git a/packages/upgrade/source/versions/core-2/common/organizationmembershippublicuserdata-profileimageurl.md b/packages/upgrade/src/versions/core-2/common/organizationmembershippublicuserdata-profileimageurl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/organizationmembershippublicuserdata-profileimageurl.md rename to packages/upgrade/src/versions/core-2/common/organizationmembershippublicuserdata-profileimageurl.md diff --git a/packages/upgrade/source/versions/core-2/common/organizationprofile-settings.md b/packages/upgrade/src/versions/core-2/common/organizationprofile-settings.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/organizationprofile-settings.md rename to packages/upgrade/src/versions/core-2/common/organizationprofile-settings.md diff --git a/packages/upgrade/source/versions/core-2/common/organizationswitcherpopoveractionbuttontext-removed.md b/packages/upgrade/src/versions/core-2/common/organizationswitcherpopoveractionbuttontext-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/organizationswitcherpopoveractionbuttontext-removed.md rename to packages/upgrade/src/versions/core-2/common/organizationswitcherpopoveractionbuttontext-removed.md diff --git a/packages/upgrade/source/versions/core-2/common/remove-identitypreview-avatar.md b/packages/upgrade/src/versions/core-2/common/remove-identitypreview-avatar.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/remove-identitypreview-avatar.md rename to packages/upgrade/src/versions/core-2/common/remove-identitypreview-avatar.md diff --git a/packages/upgrade/source/versions/core-2/common/remove-socialbuttonsblockbuttonarrow.md b/packages/upgrade/src/versions/core-2/common/remove-socialbuttonsblockbuttonarrow.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/remove-socialbuttonsblockbuttonarrow.md rename to packages/upgrade/src/versions/core-2/common/remove-socialbuttonsblockbuttonarrow.md diff --git a/packages/upgrade/source/versions/core-2/common/removed-localization-keys.md b/packages/upgrade/src/versions/core-2/common/removed-localization-keys.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/removed-localization-keys.md rename to packages/upgrade/src/versions/core-2/common/removed-localization-keys.md diff --git a/packages/upgrade/source/versions/core-2/common/setsession.md b/packages/upgrade/src/versions/core-2/common/setsession.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/setsession.md rename to packages/upgrade/src/versions/core-2/common/setsession.md diff --git a/packages/upgrade/source/versions/core-2/common/signoutcallback-to-redirecturl.md b/packages/upgrade/src/versions/core-2/common/signoutcallback-to-redirecturl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/signoutcallback-to-redirecturl.md rename to packages/upgrade/src/versions/core-2/common/signoutcallback-to-redirecturl.md diff --git a/packages/upgrade/source/versions/core-2/common/supported-external-accounts-removed.md b/packages/upgrade/src/versions/core-2/common/supported-external-accounts-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/supported-external-accounts-removed.md rename to packages/upgrade/src/versions/core-2/common/supported-external-accounts-removed.md diff --git a/packages/upgrade/source/versions/core-2/common/usemagiclink.md b/packages/upgrade/src/versions/core-2/common/usemagiclink.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/usemagiclink.md rename to packages/upgrade/src/versions/core-2/common/usemagiclink.md diff --git a/packages/upgrade/source/versions/core-2/common/useorganization-invitationlist.md b/packages/upgrade/src/versions/core-2/common/useorganization-invitationlist.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/useorganization-invitationlist.md rename to packages/upgrade/src/versions/core-2/common/useorganization-invitationlist.md diff --git a/packages/upgrade/source/versions/core-2/common/useorganization-membershiplist.md b/packages/upgrade/src/versions/core-2/common/useorganization-membershiplist.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/useorganization-membershiplist.md rename to packages/upgrade/src/versions/core-2/common/useorganization-membershiplist.md diff --git a/packages/upgrade/source/versions/core-2/common/useorganizations.md b/packages/upgrade/src/versions/core-2/common/useorganizations.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/useorganizations.md rename to packages/upgrade/src/versions/core-2/common/useorganizations.md diff --git a/packages/upgrade/source/versions/core-2/common/user-getorganizationinvitations-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/user-getorganizationinvitations-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/user-getorganizationinvitations-arguments-changed.md rename to packages/upgrade/src/versions/core-2/common/user-getorganizationinvitations-arguments-changed.md diff --git a/packages/upgrade/source/versions/core-2/common/user-getorganizationmemberships-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/user-getorganizationmemberships-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/user-getorganizationmemberships-arguments-changed.md rename to packages/upgrade/src/versions/core-2/common/user-getorganizationmemberships-arguments-changed.md diff --git a/packages/upgrade/source/versions/core-2/common/user-getorganizationmemberships-return-signature.md b/packages/upgrade/src/versions/core-2/common/user-getorganizationmemberships-return-signature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/user-getorganizationmemberships-return-signature.md rename to packages/upgrade/src/versions/core-2/common/user-getorganizationmemberships-return-signature.md diff --git a/packages/upgrade/source/versions/core-2/common/user-getorganizationsuggestions-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/user-getorganizationsuggestions-arguments-changed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/user-getorganizationsuggestions-arguments-changed.md rename to packages/upgrade/src/versions/core-2/common/user-getorganizationsuggestions-arguments-changed.md diff --git a/packages/upgrade/source/versions/core-2/common/user-profileimageurl.md b/packages/upgrade/src/versions/core-2/common/user-profileimageurl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/user-profileimageurl.md rename to packages/upgrade/src/versions/core-2/common/user-profileimageurl.md diff --git a/packages/upgrade/source/versions/core-2/common/user-update-password.md b/packages/upgrade/src/versions/core-2/common/user-update-password.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/user-update-password.md rename to packages/upgrade/src/versions/core-2/common/user-update-password.md diff --git a/packages/upgrade/source/versions/core-2/common/userbuttonpopoveractionbuttontext-removed.md b/packages/upgrade/src/versions/core-2/common/userbuttonpopoveractionbuttontext-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/userbuttonpopoveractionbuttontext-removed.md rename to packages/upgrade/src/versions/core-2/common/userbuttonpopoveractionbuttontext-removed.md diff --git a/packages/upgrade/source/versions/core-2/common/userbuttontrigger-userbuttonbox-invert.md b/packages/upgrade/src/versions/core-2/common/userbuttontrigger-userbuttonbox-invert.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/userbuttontrigger-userbuttonbox-invert.md rename to packages/upgrade/src/versions/core-2/common/userbuttontrigger-userbuttonbox-invert.md diff --git a/packages/upgrade/source/versions/core-2/common/userprofile-prop.md b/packages/upgrade/src/versions/core-2/common/userprofile-prop.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/userprofile-prop.md rename to packages/upgrade/src/versions/core-2/common/userprofile-prop.md diff --git a/packages/upgrade/source/versions/core-2/common/userprofile-security.md b/packages/upgrade/src/versions/core-2/common/userprofile-security.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/userprofile-security.md rename to packages/upgrade/src/versions/core-2/common/userprofile-security.md diff --git a/packages/upgrade/source/versions/core-2/common/withclerk-hof-removed.md b/packages/upgrade/src/versions/core-2/common/withclerk-hof-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/withclerk-hof-removed.md rename to packages/upgrade/src/versions/core-2/common/withclerk-hof-removed.md diff --git a/packages/upgrade/source/versions/core-2/common/withclerk-removed.md b/packages/upgrade/src/versions/core-2/common/withclerk-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/withclerk-removed.md rename to packages/upgrade/src/versions/core-2/common/withclerk-removed.md diff --git a/packages/upgrade/source/versions/core-2/common/withsession-hof-removed.md b/packages/upgrade/src/versions/core-2/common/withsession-hof-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/withsession-hof-removed.md rename to packages/upgrade/src/versions/core-2/common/withsession-hof-removed.md diff --git a/packages/upgrade/source/versions/core-2/common/withsession-removed.md b/packages/upgrade/src/versions/core-2/common/withsession-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/withsession-removed.md rename to packages/upgrade/src/versions/core-2/common/withsession-removed.md diff --git a/packages/upgrade/source/versions/core-2/common/withuser-hof-removed.md b/packages/upgrade/src/versions/core-2/common/withuser-hof-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/withuser-hof-removed.md rename to packages/upgrade/src/versions/core-2/common/withuser-hof-removed.md diff --git a/packages/upgrade/source/versions/core-2/common/withuser-removed-2.md b/packages/upgrade/src/versions/core-2/common/withuser-removed-2.md similarity index 100% rename from packages/upgrade/source/versions/core-2/common/withuser-removed-2.md rename to packages/upgrade/src/versions/core-2/common/withuser-removed-2.md diff --git a/packages/upgrade/source/versions/core-2/expo/apikey-to-publishable-key.md b/packages/upgrade/src/versions/core-2/expo/apikey-to-publishable-key.md similarity index 100% rename from packages/upgrade/source/versions/core-2/expo/apikey-to-publishable-key.md rename to packages/upgrade/src/versions/core-2/expo/apikey-to-publishable-key.md diff --git a/packages/upgrade/source/versions/core-2/expo/clerkprovider-frontendapi.md b/packages/upgrade/src/versions/core-2/expo/clerkprovider-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/expo/clerkprovider-frontendapi.md rename to packages/upgrade/src/versions/core-2/expo/clerkprovider-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/fastify/api-url-value-change.md b/packages/upgrade/src/versions/core-2/fastify/api-url-value-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/fastify/api-url-value-change.md rename to packages/upgrade/src/versions/core-2/fastify/api-url-value-change.md diff --git a/packages/upgrade/source/versions/core-2/fastify/clerk-import-change.md b/packages/upgrade/src/versions/core-2/fastify/clerk-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/fastify/clerk-import-change.md rename to packages/upgrade/src/versions/core-2/fastify/clerk-import-change.md diff --git a/packages/upgrade/source/versions/core-2/fastify/clerkplugin-frontendapi.md b/packages/upgrade/src/versions/core-2/fastify/clerkplugin-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/fastify/clerkplugin-frontendapi.md rename to packages/upgrade/src/versions/core-2/fastify/clerkplugin-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/fastify/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/fastify/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/fastify/createclerkclient-apikey.md rename to packages/upgrade/src/versions/core-2/fastify/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/core-2/fastify/createclerkclient-frontendapi.md b/packages/upgrade/src/versions/core-2/fastify/createclerkclient-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/fastify/createclerkclient-frontendapi.md rename to packages/upgrade/src/versions/core-2/fastify/createclerkclient-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/gatsby/api-url-value-change.md b/packages/upgrade/src/versions/core-2/gatsby/api-url-value-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/gatsby/api-url-value-change.md rename to packages/upgrade/src/versions/core-2/gatsby/api-url-value-change.md diff --git a/packages/upgrade/source/versions/core-2/gatsby/apikey-to-publishable-key.md b/packages/upgrade/src/versions/core-2/gatsby/apikey-to-publishable-key.md similarity index 100% rename from packages/upgrade/source/versions/core-2/gatsby/apikey-to-publishable-key.md rename to packages/upgrade/src/versions/core-2/gatsby/apikey-to-publishable-key.md diff --git a/packages/upgrade/source/versions/core-2/gatsby/clerk-import-change.md b/packages/upgrade/src/versions/core-2/gatsby/clerk-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/gatsby/clerk-import-change.md rename to packages/upgrade/src/versions/core-2/gatsby/clerk-import-change.md diff --git a/packages/upgrade/source/versions/core-2/gatsby/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/gatsby/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/gatsby/createclerkclient-apikey.md rename to packages/upgrade/src/versions/core-2/gatsby/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/core-2/gatsby/createclerkclient-frontendapi.md b/packages/upgrade/src/versions/core-2/gatsby/createclerkclient-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/gatsby/createclerkclient-frontendapi.md rename to packages/upgrade/src/versions/core-2/gatsby/createclerkclient-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/gatsby/withserverauth-return-type.md b/packages/upgrade/src/versions/core-2/gatsby/withserverauth-return-type.md similarity index 100% rename from packages/upgrade/source/versions/core-2/gatsby/withserverauth-return-type.md rename to packages/upgrade/src/versions/core-2/gatsby/withserverauth-return-type.md diff --git a/packages/upgrade/source/versions/core-2/index.js b/packages/upgrade/src/versions/core-2/index.js similarity index 100% rename from packages/upgrade/source/versions/core-2/index.js rename to packages/upgrade/src/versions/core-2/index.js diff --git a/packages/upgrade/source/versions/core-2/js/clerk-import.md b/packages/upgrade/src/versions/core-2/js/clerk-import.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/clerk-import.md rename to packages/upgrade/src/versions/core-2/js/clerk-import.md diff --git a/packages/upgrade/source/versions/core-2/js/clerk-isready-removed.md b/packages/upgrade/src/versions/core-2/js/clerk-isready-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/clerk-isready-removed.md rename to packages/upgrade/src/versions/core-2/js/clerk-isready-removed.md diff --git a/packages/upgrade/source/versions/core-2/js/experimental-canusecaptcha.md b/packages/upgrade/src/versions/core-2/js/experimental-canusecaptcha.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/experimental-canusecaptcha.md rename to packages/upgrade/src/versions/core-2/js/experimental-canusecaptcha.md diff --git a/packages/upgrade/source/versions/core-2/js/experimental-captchasitekey.md b/packages/upgrade/src/versions/core-2/js/experimental-captchasitekey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/experimental-captchasitekey.md rename to packages/upgrade/src/versions/core-2/js/experimental-captchasitekey.md diff --git a/packages/upgrade/source/versions/core-2/js/experimental-captchaurl.md b/packages/upgrade/src/versions/core-2/js/experimental-captchaurl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/experimental-captchaurl.md rename to packages/upgrade/src/versions/core-2/js/experimental-captchaurl.md diff --git a/packages/upgrade/source/versions/core-2/js/getorganizationmemberships.md b/packages/upgrade/src/versions/core-2/js/getorganizationmemberships.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/getorganizationmemberships.md rename to packages/upgrade/src/versions/core-2/js/getorganizationmemberships.md diff --git a/packages/upgrade/source/versions/core-2/js/lastorganizationinvitation-member.md b/packages/upgrade/src/versions/core-2/js/lastorganizationinvitation-member.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/lastorganizationinvitation-member.md rename to packages/upgrade/src/versions/core-2/js/lastorganizationinvitation-member.md diff --git a/packages/upgrade/source/versions/core-2/js/redirecttohome.md b/packages/upgrade/src/versions/core-2/js/redirecttohome.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/redirecttohome.md rename to packages/upgrade/src/versions/core-2/js/redirecttohome.md diff --git a/packages/upgrade/source/versions/core-2/js/signup-attemptweb3walletverification-generatedsignature.md b/packages/upgrade/src/versions/core-2/js/signup-attemptweb3walletverification-generatedsignature.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/signup-attemptweb3walletverification-generatedsignature.md rename to packages/upgrade/src/versions/core-2/js/signup-attemptweb3walletverification-generatedsignature.md diff --git a/packages/upgrade/source/versions/core-2/js/unstable-invitationupdate.md b/packages/upgrade/src/versions/core-2/js/unstable-invitationupdate.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/unstable-invitationupdate.md rename to packages/upgrade/src/versions/core-2/js/unstable-invitationupdate.md diff --git a/packages/upgrade/source/versions/core-2/js/unstable-membershipupdate.md b/packages/upgrade/src/versions/core-2/js/unstable-membershipupdate.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/unstable-membershipupdate.md rename to packages/upgrade/src/versions/core-2/js/unstable-membershipupdate.md diff --git a/packages/upgrade/source/versions/core-2/js/user-createexternalaccount-redirecturl.md b/packages/upgrade/src/versions/core-2/js/user-createexternalaccount-redirecturl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/user-createexternalaccount-redirecturl.md rename to packages/upgrade/src/versions/core-2/js/user-createexternalaccount-redirecturl.md diff --git a/packages/upgrade/source/versions/core-2/js/user-orgpublicdata-profileimageurl.md b/packages/upgrade/src/versions/core-2/js/user-orgpublicdata-profileimageurl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/js/user-orgpublicdata-profileimageurl.md rename to packages/upgrade/src/versions/core-2/js/user-orgpublicdata-profileimageurl.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/api-url-value-change.md b/packages/upgrade/src/versions/core-2/nextjs/api-url-value-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/api-url-value-change.md rename to packages/upgrade/src/versions/core-2/nextjs/api-url-value-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/auth-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/auth-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/auth-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md b/packages/upgrade/src/versions/core-2/nextjs/auth-middleware-deprecated.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/auth-middleware-deprecated.md rename to packages/upgrade/src/versions/core-2/nextjs/auth-middleware-deprecated.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-apikey.md b/packages/upgrade/src/versions/core-2/nextjs/authmiddleware-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/authmiddleware-apikey.md rename to packages/upgrade/src/versions/core-2/nextjs/authmiddleware-apikey.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-frontendapi.md b/packages/upgrade/src/versions/core-2/nextjs/authmiddleware-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/authmiddleware-frontendapi.md rename to packages/upgrade/src/versions/core-2/nextjs/authmiddleware-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/authmiddleware-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/authmiddleware-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/authmiddleware-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/buildclerkprops-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/buildclerkprops-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/buildclerkprops-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/clerk-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/clerk-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/clerk-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/clerk-js-version-next-public.md b/packages/upgrade/src/versions/core-2/nextjs/clerk-js-version-next-public.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/clerk-js-version-next-public.md rename to packages/upgrade/src/versions/core-2/nextjs/clerk-js-version-next-public.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/constants-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/constants-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/constants-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/createauthenticaterequest-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/createauthenticaterequest-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/createauthenticaterequest-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/nextjs/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/createclerkclient-apikey.md rename to packages/upgrade/src/versions/core-2/nextjs/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/createclerkclient-frontendapi.md b/packages/upgrade/src/versions/core-2/nextjs/createclerkclient-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/createclerkclient-frontendapi.md rename to packages/upgrade/src/versions/core-2/nextjs/createclerkclient-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/createisomorphicrequest-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/createisomorphicrequest-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/createisomorphicrequest-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/currentuser-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/currentuser-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/currentuser-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/decodejwt-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/decodejwt-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/decodejwt-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/emaillinkerrorcode-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/emaillinkerrorcode-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/emaillinkerrorcode-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/getauth-apikey.md b/packages/upgrade/src/versions/core-2/nextjs/getauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/getauth-apikey.md rename to packages/upgrade/src/versions/core-2/nextjs/getauth-apikey.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-api-url.md b/packages/upgrade/src/versions/core-2/nextjs/import-api-url.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-api-url.md rename to packages/upgrade/src/versions/core-2/nextjs/import-api-url.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-api-version.md b/packages/upgrade/src/versions/core-2/nextjs/import-api-version.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-api-version.md rename to packages/upgrade/src/versions/core-2/nextjs/import-api-version.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-url.md b/packages/upgrade/src/versions/core-2/nextjs/import-clerk-js-url.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-url.md rename to packages/upgrade/src/versions/core-2/nextjs/import-clerk-js-url.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-version.md b/packages/upgrade/src/versions/core-2/nextjs/import-clerk-js-version.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-clerk-js-version.md rename to packages/upgrade/src/versions/core-2/nextjs/import-clerk-js-version.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-domain.md b/packages/upgrade/src/versions/core-2/nextjs/import-domain.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-domain.md rename to packages/upgrade/src/versions/core-2/nextjs/import-domain.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-is-satellite.md b/packages/upgrade/src/versions/core-2/nextjs/import-is-satellite.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-is-satellite.md rename to packages/upgrade/src/versions/core-2/nextjs/import-is-satellite.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-nextjs-api.md b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-api.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-nextjs-api.md rename to packages/upgrade/src/versions/core-2/nextjs/import-nextjs-api.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-nextjs-app-beta.md b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-app-beta.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-nextjs-app-beta.md rename to packages/upgrade/src/versions/core-2/nextjs/import-nextjs-app-beta.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-nextjs-edge-middleware.md b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-edge-middleware.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-nextjs-edge-middleware.md rename to packages/upgrade/src/versions/core-2/nextjs/import-nextjs-edge-middleware.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-nextjs-edge-middlewarefiles.md b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-edge-middlewarefiles.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-nextjs-edge-middlewarefiles.md rename to packages/upgrade/src/versions/core-2/nextjs/import-nextjs-edge-middlewarefiles.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-nextjs-ssr.md b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-ssr.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-nextjs-ssr.md rename to packages/upgrade/src/versions/core-2/nextjs/import-nextjs-ssr.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-proxy-url.md b/packages/upgrade/src/versions/core-2/nextjs/import-proxy-url.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-proxy-url.md rename to packages/upgrade/src/versions/core-2/nextjs/import-proxy-url.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-publishable-key.md b/packages/upgrade/src/versions/core-2/nextjs/import-publishable-key.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-publishable-key.md rename to packages/upgrade/src/versions/core-2/nextjs/import-publishable-key.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-secret-key.md b/packages/upgrade/src/versions/core-2/nextjs/import-secret-key.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-secret-key.md rename to packages/upgrade/src/versions/core-2/nextjs/import-secret-key.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-sign-in-url.md b/packages/upgrade/src/versions/core-2/nextjs/import-sign-in-url.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-sign-in-url.md rename to packages/upgrade/src/versions/core-2/nextjs/import-sign-in-url.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/import-sign-up-url.md b/packages/upgrade/src/versions/core-2/nextjs/import-sign-up-url.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/import-sign-up-url.md rename to packages/upgrade/src/versions/core-2/nextjs/import-sign-up-url.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/isclerkapiresponserror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/isclerkapiresponserror-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/isclerkapiresponserror-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/isemaillinkerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/isemaillinkerror-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/isemaillinkerror-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/isknownerror-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/isknownerror-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/isknownerror-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/min-nextjs-version.md b/packages/upgrade/src/versions/core-2/nextjs/min-nextjs-version.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/min-nextjs-version.md rename to packages/upgrade/src/versions/core-2/nextjs/min-nextjs-version.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/multisessionappsupport-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/multisessionappsupport-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/multisessionappsupport-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/next-public-clerk-js-url.md b/packages/upgrade/src/versions/core-2/nextjs/next-public-clerk-js-url.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/next-public-clerk-js-url.md rename to packages/upgrade/src/versions/core-2/nextjs/next-public-clerk-js-url.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/redirect-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/redirect-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/redirect-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md b/packages/upgrade/src/versions/core-2/nextjs/redirecttosignin-import-path.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/redirecttosignin-import-path.md rename to packages/upgrade/src/versions/core-2/nextjs/redirecttosignin-import-path.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md b/packages/upgrade/src/versions/core-2/nextjs/redirecttosignup-import-path.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/redirecttosignup-import-path.md rename to packages/upgrade/src/versions/core-2/nextjs/redirecttosignup-import-path.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/signjwt-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/signjwt-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/signjwt-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/verifyjwt-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/verifyjwt-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/verifyjwt-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/verifytoken-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/verifytoken-import-change.md rename to packages/upgrade/src/versions/core-2/nextjs/verifytoken-import-change.md diff --git a/packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md b/packages/upgrade/src/versions/core-2/nextjs/with-clerk-middleware-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/nextjs/with-clerk-middleware-removed.md rename to packages/upgrade/src/versions/core-2/nextjs/with-clerk-middleware-removed.md diff --git a/packages/upgrade/source/versions/core-2/node/api-url-value-change.md b/packages/upgrade/src/versions/core-2/node/api-url-value-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/api-url-value-change.md rename to packages/upgrade/src/versions/core-2/node/api-url-value-change.md diff --git a/packages/upgrade/source/versions/core-2/node/cjs-esm-instance.md b/packages/upgrade/src/versions/core-2/node/cjs-esm-instance.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/cjs-esm-instance.md rename to packages/upgrade/src/versions/core-2/node/cjs-esm-instance.md diff --git a/packages/upgrade/source/versions/core-2/node/clerk-import-change.md b/packages/upgrade/src/versions/core-2/node/clerk-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/clerk-import-change.md rename to packages/upgrade/src/versions/core-2/node/clerk-import-change.md diff --git a/packages/upgrade/source/versions/core-2/node/clerkexpressrequireauth-apikey.md b/packages/upgrade/src/versions/core-2/node/clerkexpressrequireauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/clerkexpressrequireauth-apikey.md rename to packages/upgrade/src/versions/core-2/node/clerkexpressrequireauth-apikey.md diff --git a/packages/upgrade/source/versions/core-2/node/clerkexpressrequireauth-frontendapi.md b/packages/upgrade/src/versions/core-2/node/clerkexpressrequireauth-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/clerkexpressrequireauth-frontendapi.md rename to packages/upgrade/src/versions/core-2/node/clerkexpressrequireauth-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/node/clerkexpresswithauth-apikey.md b/packages/upgrade/src/versions/core-2/node/clerkexpresswithauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/clerkexpresswithauth-apikey.md rename to packages/upgrade/src/versions/core-2/node/clerkexpresswithauth-apikey.md diff --git a/packages/upgrade/source/versions/core-2/node/clerkexpresswithauth-frontendapi.md b/packages/upgrade/src/versions/core-2/node/clerkexpresswithauth-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/clerkexpresswithauth-frontendapi.md rename to packages/upgrade/src/versions/core-2/node/clerkexpresswithauth-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/node/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/node/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/createclerkclient-apikey.md rename to packages/upgrade/src/versions/core-2/node/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/core-2/node/createclerkclient-frontendapi.md b/packages/upgrade/src/versions/core-2/node/createclerkclient-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/createclerkclient-frontendapi.md rename to packages/upgrade/src/versions/core-2/node/createclerkclient-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-apikey.md b/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-apikey.md rename to packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-apikey.md diff --git a/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-frontendapi.md b/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-frontendapi.md rename to packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md b/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md rename to packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md diff --git a/packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-apikey.md b/packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-apikey.md rename to packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-apikey.md diff --git a/packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-frontendapi.md b/packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-frontendapi.md rename to packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-publickey-required.md b/packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-publickey-required.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/createclerkexpresswithauth-publickey-required.md rename to packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-publickey-required.md diff --git a/packages/upgrade/source/versions/core-2/node/legacyauthobject-removed.md b/packages/upgrade/src/versions/core-2/node/legacyauthobject-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/legacyauthobject-removed.md rename to packages/upgrade/src/versions/core-2/node/legacyauthobject-removed.md diff --git a/packages/upgrade/source/versions/core-2/node/setclerkapikey.md b/packages/upgrade/src/versions/core-2/node/setclerkapikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/setclerkapikey.md rename to packages/upgrade/src/versions/core-2/node/setclerkapikey.md diff --git a/packages/upgrade/source/versions/core-2/node/setclerkapiversion.md b/packages/upgrade/src/versions/core-2/node/setclerkapiversion.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/setclerkapiversion.md rename to packages/upgrade/src/versions/core-2/node/setclerkapiversion.md diff --git a/packages/upgrade/source/versions/core-2/node/setclerkhttpoptions.md b/packages/upgrade/src/versions/core-2/node/setclerkhttpoptions.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/setclerkhttpoptions.md rename to packages/upgrade/src/versions/core-2/node/setclerkhttpoptions.md diff --git a/packages/upgrade/source/versions/core-2/node/setclerkserverapiurl.md b/packages/upgrade/src/versions/core-2/node/setclerkserverapiurl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/node/setclerkserverapiurl.md rename to packages/upgrade/src/versions/core-2/node/setclerkserverapiurl.md diff --git a/packages/upgrade/source/versions/core-2/react/api-url-value-change.md b/packages/upgrade/src/versions/core-2/react/api-url-value-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/react/api-url-value-change.md rename to packages/upgrade/src/versions/core-2/react/api-url-value-change.md diff --git a/packages/upgrade/source/versions/core-2/remix/clerk-import-change.md b/packages/upgrade/src/versions/core-2/remix/clerk-import-change.md similarity index 100% rename from packages/upgrade/source/versions/core-2/remix/clerk-import-change.md rename to packages/upgrade/src/versions/core-2/remix/clerk-import-change.md diff --git a/packages/upgrade/source/versions/core-2/remix/clerkerrorboundary-removed.md b/packages/upgrade/src/versions/core-2/remix/clerkerrorboundary-removed.md similarity index 100% rename from packages/upgrade/source/versions/core-2/remix/clerkerrorboundary-removed.md rename to packages/upgrade/src/versions/core-2/remix/clerkerrorboundary-removed.md diff --git a/packages/upgrade/source/versions/core-2/remix/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/remix/createclerkclient-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/remix/createclerkclient-apikey.md rename to packages/upgrade/src/versions/core-2/remix/createclerkclient-apikey.md diff --git a/packages/upgrade/source/versions/core-2/remix/getauth-apikey.md b/packages/upgrade/src/versions/core-2/remix/getauth-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/remix/getauth-apikey.md rename to packages/upgrade/src/versions/core-2/remix/getauth-apikey.md diff --git a/packages/upgrade/source/versions/core-2/remix/rootauthloader-apikey.md b/packages/upgrade/src/versions/core-2/remix/rootauthloader-apikey.md similarity index 100% rename from packages/upgrade/source/versions/core-2/remix/rootauthloader-apikey.md rename to packages/upgrade/src/versions/core-2/remix/rootauthloader-apikey.md diff --git a/packages/upgrade/source/versions/core-2/remix/rootauthloader-frontendapi.md b/packages/upgrade/src/versions/core-2/remix/rootauthloader-frontendapi.md similarity index 100% rename from packages/upgrade/source/versions/core-2/remix/rootauthloader-frontendapi.md rename to packages/upgrade/src/versions/core-2/remix/rootauthloader-frontendapi.md diff --git a/packages/upgrade/source/versions/core-2/shared/getrequesturl.md b/packages/upgrade/src/versions/core-2/shared/getrequesturl.md similarity index 100% rename from packages/upgrade/source/versions/core-2/shared/getrequesturl.md rename to packages/upgrade/src/versions/core-2/shared/getrequesturl.md diff --git a/packages/upgrade/source/versions/core-2/shared/organizationcontext.md b/packages/upgrade/src/versions/core-2/shared/organizationcontext.md similarity index 100% rename from packages/upgrade/source/versions/core-2/shared/organizationcontext.md rename to packages/upgrade/src/versions/core-2/shared/organizationcontext.md diff --git a/packages/upgrade/source/versions/core-2/shared/useorganizationlist-organizationlist.md b/packages/upgrade/src/versions/core-2/shared/useorganizationlist-organizationlist.md similarity index 100% rename from packages/upgrade/source/versions/core-2/shared/useorganizationlist-organizationlist.md rename to packages/upgrade/src/versions/core-2/shared/useorganizationlist-organizationlist.md From 44add1a4dec58b16cadd65d31f0939340681baf6 Mon Sep 17 00:00:00 2001 From: LekoArts Date: Mon, 17 Jun 2024 10:03:36 +0200 Subject: [PATCH 155/159] add files --- packages/upgrade/CHANGELOG.md | 1 + packages/upgrade/LICENSE | 21 +++++++++++ packages/upgrade/README.md | 70 +++++++++++++++++++++++++++++++++-- packages/upgrade/package.json | 1 - 4 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 packages/upgrade/CHANGELOG.md create mode 100644 packages/upgrade/LICENSE diff --git a/packages/upgrade/CHANGELOG.md b/packages/upgrade/CHANGELOG.md new file mode 100644 index 00000000000..17910666864 --- /dev/null +++ b/packages/upgrade/CHANGELOG.md @@ -0,0 +1 @@ +# @clerk/upgrade diff --git a/packages/upgrade/LICENSE b/packages/upgrade/LICENSE new file mode 100644 index 00000000000..5713d0938b3 --- /dev/null +++ b/packages/upgrade/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Clerk, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/upgrade/README.md b/packages/upgrade/README.md index 4fd9ec2e3f3..23df9f0b989 100644 --- a/packages/upgrade/README.md +++ b/packages/upgrade/README.md @@ -1,10 +1,46 @@ +

+ + + + + + +
+

+ # @clerk/upgrade +
+ +[![Chat on Discord](https://img.shields.io/discord/856971667393609759.svg?logo=discord)](https://clerk.com/discord) +[![Clerk documentation](https://img.shields.io/badge/documentation-clerk-green.svg)](https://clerk.com/docs?utm_source=github&utm_medium=clerk_upgrade) +[![Follow on Twitter](https://img.shields.io/twitter/follow/ClerkDev?style=social)](https://twitter.com/intent/follow?screen_name=ClerkDev) + +[Changelog](https://github.com/clerk/javascript/blob/main/packages/upgrade/CHANGELOG.md) +· +[Report a Bug](https://github.com/clerk/javascript/issues/new?assignees=&labels=needs-triage&projects=&template=BUG_REPORT.yml) +· +[Request a Feature](https://feedback.clerk.com/roadmap) +· +[Ask a Question](https://github.com/clerk/javascript/discussions) + +
+ +--- + +## Overview + A tool that helps with upgrading major versions of Clerk's SDKs. -## Usage +## Getting Started + +### Prerequisites + +- Node.js `>=18.17.0` or later -```bash +### Usage + +```sh npx @clerk/upgrade ``` @@ -12,7 +48,7 @@ npx @clerk/upgrade This tool uses regular expressions to scan for patterns that match breaking changes. This makes it run substantially faster and makes it more accessible for us at Clerk to author matchers for each breaking change, however it means that _we cannot gurarantee 100% accuracy of the results_. As such, it's important to treat this as a tool that can help you to complete your major version upgrades, rather than an automatic fix to all issues. -The main thing that this tool will miss is cases where _unusual import patterns_ are used in your codebase.As an example, if we made a breaking change to the `getAuth` function exported from `@clerk/nextjs`, we would likely look for something like `import { getAuth } from "@clerk/nextjs"` in order to detect whether you need to make some changes. If you were running your imports like `import * as ClerkNext from "@clerk/nextjs"`, you could use `getAuth` without us detecting it with our matcher. +The main thing that this tool will miss is cases where _unusual import patterns_ are used in your codebase. As an example, if Clerk made a breaking change to the `getAuth` function exported from `@clerk/nextjs`, `@clerk/upgrade` would likely look for something like `import { getAuth } from "@clerk/nextjs"` in order to detect whether you need to make some changes. If you were using your imports like `import * as ClerkNext from "@clerk/nextjs"`, you could use `getAuth` without it detecting it with its matcher. It will also be very likely to miss if you bind a method on an object to a separate variable and call it from there, or pass a bound method through a function param. For example, something like this: @@ -22,4 +58,30 @@ const updateUser = user.update.bind(user); updateUser({ username: 'foo' }); ``` -Overall, there's a very good chance that this tool catches everything, but it's not a guarantee, so make sure that you also test your app before deploying, and that you have good e2e test coverage, which are good practices normally anyway, rather than blindly trusting that since the clerk upgrade tool was run, you are for sure covered. +Overall, there's a very good chance that this tool catches everything, but it's not a guarantee. Make sure that you also test your app before deploying, and that you have good E2E test coverage. + +## Support + +You can get in touch with us in any of the following ways: + +- Join our official community [Discord server](https://clerk.com/discord) +- Create a [GitHub Discussion](https://github.com/clerk/javascript/discussions) +- Contact options listed on [our Support page](https://clerk.com/support?utm_source=github&utm_medium=clerk_upgrade) + +## Contributing + +We're open to all community contributions! If you'd like to contribute in any way, please read [our contribution guidelines](https://github.com/clerk/javascript/blob/main/docs/CONTRIBUTING.md). + +## Security + +`@clerk/upgrade` follows good practices of security, but 100% security cannot be assured. + +`@clerk/upgrade` is provided **"as is"** without any **warranty**. Use at your own risk. + +_For more information and to report security issues, please refer to our [security documentation](https://github.com/clerk/javascript/blob/main/docs/SECURITY.md)._ + +## License + +This project is licensed under the **MIT license**. + +See [LICENSE](https://github.com/clerk/javascript/blob/main/packages/upgrade/LICENSE) for more information. diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 6f08b1eab69..27ffa98d34d 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -15,7 +15,6 @@ "clean": "del-cli dist/*", "dev": "babel --out-dir=dist --watch src --copy-files", "lint": "eslint src/", - "lint:attw": "attw --pack .", "lint:publint": "publint" }, "babel": { From 06160c3fa8c163ebd122cf128a36f19c6130f70c Mon Sep 17 00:00:00 2001 From: LekoArts Date: Mon, 17 Jun 2024 10:18:31 +0200 Subject: [PATCH 156/159] replace md5 pkg with native impl --- package-lock.json | 7 ++++++- packages/upgrade/package.json | 1 - packages/upgrade/src/app.js | 1 + packages/upgrade/src/util/guess-framework.js | 7 +++++-- .../versions/core-2/gatsby/apikey-to-publishable-key.md | 2 +- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b6ca2cf7750..9defee9c14e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18234,7 +18234,9 @@ }, "node_modules/charenc": { "version": "0.0.2", + "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": "*" } @@ -19927,7 +19929,9 @@ }, "node_modules/crypt": { "version": "0.0.2", + "dev": true, "license": "BSD-3-Clause", + "peer": true, "engines": { "node": "*" } @@ -32983,7 +32987,9 @@ }, "node_modules/md5": { "version": "2.3.0", + "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", @@ -46829,7 +46835,6 @@ "ink-gradient": "^3.0.0", "ink-link": "^3.0.0", "marked": "^11.1.1", - "md5": "^2.3.0", "meow": "^11.0.0", "react": "^18.3.1", "read-pkg": "^9.0.1", diff --git a/packages/upgrade/package.json b/packages/upgrade/package.json index 27ffa98d34d..8da5d2a4a88 100644 --- a/packages/upgrade/package.json +++ b/packages/upgrade/package.json @@ -34,7 +34,6 @@ "ink-gradient": "^3.0.0", "ink-link": "^3.0.0", "marked": "^11.1.1", - "md5": "^2.3.0", "meow": "^11.0.0", "react": "^18.3.1", "read-pkg": "^9.0.1", diff --git a/packages/upgrade/src/app.js b/packages/upgrade/src/app.js index c7c189dc3a4..711ac4beffb 100644 --- a/packages/upgrade/src/app.js +++ b/packages/upgrade/src/app.js @@ -43,6 +43,7 @@ export default function App({ if (isEmpty(sdks) && isEmpty(sdkGuesses) && !sdkGuessAttempted) { if (!dir) return setDir(process.cwd()); const { guesses, _uuid } = guessFrameworks(dir, disableTelemetry); + console.log({ guesses, _uuid }) setUuid(_uuid); setSdkGuesses(guesses); setSdkGuessAttempted(true); diff --git a/packages/upgrade/src/util/guess-framework.js b/packages/upgrade/src/util/guess-framework.js index e51dd90f245..d5bfaedf388 100644 --- a/packages/upgrade/src/util/guess-framework.js +++ b/packages/upgrade/src/util/guess-framework.js @@ -1,12 +1,15 @@ -import { randomUUID } from 'crypto'; +import { randomUUID, createHash } from 'crypto'; import fs from 'fs'; -import md5 from 'md5'; import path from 'path'; import { readPackageSync } from 'read-pkg'; import tempDir from 'temp-dir'; import SDKS from '../constants/sdks.js'; +function md5(data) { + return createHash('md5').update(data).digest('hex'); +} + // Telemetry Note // -------------- // We collect fully anonymous telemetry as part of this tool. The only data we send is which diff --git a/packages/upgrade/src/versions/core-2/gatsby/apikey-to-publishable-key.md b/packages/upgrade/src/versions/core-2/gatsby/apikey-to-publishable-key.md index 9efe60bef02..b0bf7e1845d 100644 --- a/packages/upgrade/src/versions/core-2/gatsby/apikey-to-publishable-key.md +++ b/packages/upgrade/src/versions/core-2/gatsby/apikey-to-publishable-key.md @@ -1,5 +1,5 @@ --- -title: '`GASTBY_CLERK_FRONTEND_API` replaced by `GATSBY_CLERK_PUBLISHABLE_KEY`' +title: '`GATSBY_CLERK_FRONTEND_API` replaced by `GATSBY_CLERK_PUBLISHABLE_KEY`' category: 'deprecation-removal' matcher: 'GATSBY_CLERK_FRONTEND_API' --- From 5964b950571c86ea6bac8b0901b183773953c16c Mon Sep 17 00:00:00 2001 From: LekoArts Date: Mon, 17 Jun 2024 10:49:56 +0200 Subject: [PATCH 157/159] fix eslint errors --- packages/upgrade/.eslintrc.cjs | 9 ++++++++- packages/upgrade/src/app.js | 13 +++++++++--- .../src/guide-generators/text-generation.js | 4 +++- packages/upgrade/src/scan.js | 20 +++++++++++++------ packages/upgrade/src/util/expandable-list.js | 4 +++- packages/upgrade/src/util/guess-framework.js | 10 +++++++--- 6 files changed, 45 insertions(+), 15 deletions(-) diff --git a/packages/upgrade/.eslintrc.cjs b/packages/upgrade/.eslintrc.cjs index dd635d5e282..aecddd410f5 100644 --- a/packages/upgrade/.eslintrc.cjs +++ b/packages/upgrade/.eslintrc.cjs @@ -1,5 +1,12 @@ module.exports = { root: true, - extends: ['custom/node', 'custom/react'], + extends: ['@clerk/custom/node', '@clerk/custom/react'], rules: { 'react/no-unescaped-entities': 0, 'import/no-unresolved': 0 }, + parserOptions: { + babelOptions: { + parserOpts: { + plugins: ['jsx'] + } + } + } }; diff --git a/packages/upgrade/src/app.js b/packages/upgrade/src/app.js index 711ac4beffb..332530a2dc8 100644 --- a/packages/upgrade/src/app.js +++ b/packages/upgrade/src/app.js @@ -24,8 +24,11 @@ export default function App({ const [sdkGuesses, setSdkGuesses] = useState([]); const [sdkGuessConfirmed, setSdkGuessConfirmed] = useState(false); const [sdkGuessAttempted, setSdkGuessAttempted] = useState(false); + // See comments below, can be enabled on next major + // eslint-disable-next-line no-unused-vars const [fromVersion, setFromVersion] = useState(_fromVersion); const [fromVersionGuessAttempted, setFromVersionGuessAttempted] = useState(false); + // eslint-disable-next-line no-unused-vars const [toVersion, setToVersion] = useState(_toVersion); const [dir, setDir] = useState(_dir); const [ignore, setIgnore] = useState(_ignore); @@ -41,9 +44,11 @@ export default function App({ // We try to guess which SDK they are using if (isEmpty(sdks) && isEmpty(sdkGuesses) && !sdkGuessAttempted) { - if (!dir) return setDir(process.cwd()); + if (!dir) { + return setDir(process.cwd()); + } const { guesses, _uuid } = guessFrameworks(dir, disableTelemetry); - console.log({ guesses, _uuid }) + console.log({ guesses, _uuid }); setUuid(_uuid); setSdkGuesses(guesses); setSdkGuessAttempted(true); @@ -113,7 +118,9 @@ export default function App({ onChange={item => { setSdkGuessConfirmed(true); // if true, we were right so we set the sdk - if (item === 'yes') setSdks(sdkGuesses.map(guess => guess.value)); + if (item === 'yes') { + setSdks(sdkGuesses.map(guess => guess.value)); + } }} /> diff --git a/packages/upgrade/src/guide-generators/text-generation.js b/packages/upgrade/src/guide-generators/text-generation.js index 3f5af3a4315..8f447d1ffb2 100644 --- a/packages/upgrade/src/guide-generators/text-generation.js +++ b/packages/upgrade/src/guide-generators/text-generation.js @@ -64,7 +64,9 @@ export const accordionForCategory = partial((categories, options, { data }) => { const items = filterCategories(data, categories); options ||= {}; - if (options.additionalItems) items.push(...[].concat(options.additionalItems)); + if (options.additionalItems) { + items.push(...[].concat(options.additionalItems)); + } return ` `"${parseInline(i.title)}"`).join(', ')}]}> ${items.map(i => ` ${indent('\n' + i.content.trim(), 4)}\n `).join('\n')} diff --git a/packages/upgrade/src/scan.js b/packages/upgrade/src/scan.js index 56a9e09eb09..100317ff631 100644 --- a/packages/upgrade/src/scan.js +++ b/packages/upgrade/src/scan.js @@ -68,7 +68,9 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarn // --------------------------- // result = `results` set to format useEffect(() => { - if (!matchers || !files) return; + if (!matchers || !files) { + return; + } const allResults = {}; Promise.all( @@ -90,15 +92,20 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarn } else { matches = Array.from(content.matchAll(matcherConfig.matcher)); } - if (matches.length < 1) return; + if (matches.length < 1) { + return; + } // for each match, add to `instances` array matches.map(match => { - if (noWarnings && matcherConfig.warning) return; + if (noWarnings && matcherConfig.warning) { + return; + } // create if not exists - if (!allResults[matcherConfig.title]) + if (!allResults[matcherConfig.title]) { allResults[matcherConfig.title] = { instances: [], ...matcherConfig }; + } const position = indexToPosition(content, match.index, { oneBased: true }); const fileRelative = path.relative(process.cwd(), file); @@ -112,8 +119,9 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarn i.file === fileRelative ); }).length > 0 - ) + ) { return; + } allResults[matcherConfig.title].instances.push({ sdk, @@ -176,7 +184,7 @@ export default function Scan({ fromVersion, toVersion, sdks, dir, ignore, noWarn .catch(err => { console.error(err); }); - }, [matchers, files, noWarnings]); + }, [matchers, files, noWarnings, disableTelemetry]); return complete ? ( <> diff --git a/packages/upgrade/src/util/expandable-list.js b/packages/upgrade/src/util/expandable-list.js index 2d9c398a7b5..c960163af79 100644 --- a/packages/upgrade/src/util/expandable-list.js +++ b/packages/upgrade/src/util/expandable-list.js @@ -48,7 +48,9 @@ export default function ExpandableList({ items, numberVisible = 10 }) { {state.all.reduce((memo, item, idx) => { - if (idx < state.visible[0] || idx >= state.visible[1]) return memo; + if (idx < state.visible[0] || idx >= state.visible[1]) { + return memo; + } const locations = item.instances.map( instance => `${instance.file}:${instance.position.line}:${instance.position.column}`, diff --git a/packages/upgrade/src/util/guess-framework.js b/packages/upgrade/src/util/guess-framework.js index d5bfaedf388..a2332b63c8b 100644 --- a/packages/upgrade/src/util/guess-framework.js +++ b/packages/upgrade/src/util/guess-framework.js @@ -1,4 +1,4 @@ -import { randomUUID, createHash } from 'crypto'; +import { createHash, randomUUID } from 'crypto'; import fs from 'fs'; import path from 'path'; import { readPackageSync } from 'read-pkg'; @@ -41,14 +41,18 @@ export default function guessFrameworks(dir, disableTelemetry) { const _uuid = md5(JSON.stringify(pkg)); // no guessing if there are no deps - if (!pkg.dependencies && !pkg.devDependencies) return { guesses: [], _uuid }; + if (!pkg.dependencies && !pkg.devDependencies) { + return { guesses: [], _uuid }; + } const deps = pkg.dependencies ? Object.keys(pkg.dependencies) : []; const devDeps = pkg.devDependencies ? Object.keys(pkg.devDependencies) : []; return { _uuid, guesses: SDKS.reduce((m, { label, value }) => { - if (deps.includes(label) || devDeps.includes(label)) m.push({ label, value }); + if (deps.includes(label) || devDeps.includes(label)) { + m.push({ label, value }); + } return m; }, []), }; From e80845a38124050d512253fecd0586dc1890eaf9 Mon Sep 17 00:00:00 2001 From: LekoArts Date: Mon, 17 Jun 2024 10:52:58 +0200 Subject: [PATCH 158/159] update changeset --- .changeset/strange-paws-sparkle.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.changeset/strange-paws-sparkle.md b/.changeset/strange-paws-sparkle.md index a845151cc84..a8094224f5c 100644 --- a/.changeset/strange-paws-sparkle.md +++ b/.changeset/strange-paws-sparkle.md @@ -1,2 +1,5 @@ --- +'@clerk/upgrade': patch --- + +Bring `@clerk/upgrade` into the monorepo and publish from CI. No changes in behavior. From 234e5865d708ebfd3e82abc2d1dc797f80b16954 Mon Sep 17 00:00:00 2001 From: LekoArts Date: Mon, 17 Jun 2024 13:13:58 +0200 Subject: [PATCH 159/159] fix formatting --- packages/upgrade/.eslintrc.cjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/upgrade/.eslintrc.cjs b/packages/upgrade/.eslintrc.cjs index aecddd410f5..ace73617f09 100644 --- a/packages/upgrade/.eslintrc.cjs +++ b/packages/upgrade/.eslintrc.cjs @@ -5,8 +5,8 @@ module.exports = { parserOptions: { babelOptions: { parserOpts: { - plugins: ['jsx'] - } - } - } + plugins: ['jsx'], + }, + }, + }, };