diff --git a/.changeset/strange-paws-sparkle.md b/.changeset/strange-paws-sparkle.md
new file mode 100644
index 00000000000..a8094224f5c
--- /dev/null
+++ b/.changeset/strange-paws-sparkle.md
@@ -0,0 +1,5 @@
+---
+'@clerk/upgrade': patch
+---
+
+Bring `@clerk/upgrade` into the monorepo and publish from CI. No changes in behavior.
diff --git a/package-lock.json b/package-lock.json
index bb2f869e5e0..9defee9c14e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -107,6 +107,29 @@
"dev": true,
"license": "MIT"
},
+ "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/@alcalzone/ansi-tokenize/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/@alloc/quick-lru": {
"version": "5.2.0",
"license": "MIT",
@@ -410,6 +433,111 @@
"node": ">=14.17"
}
},
+ "node_modules/@babel/cli": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.7.tgz",
+ "integrity": "sha512-8dfPprJgV4O14WTx+AQyEA+opgUKPrsIXX/MdL50J1n06EQJ6m1T+CdsJe0qEC0B/Xl85i+Un5KVAxd/PACX9A==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "commander": "^6.2.0",
+ "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/cli/node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@babel/cli/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/@babel/cli/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "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/@babel/cli/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/@babel/cli/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/@babel/cli/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/@babel/cli/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/@babel/code-frame": {
"version": "7.24.7",
"license": "MIT",
@@ -2655,9 +2783,8 @@
},
"node_modules/@changesets/apply-release-plan/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,
+ "license": "MIT",
"bin": {
"prettier": "bin-prettier.js"
},
@@ -2997,9 +3124,8 @@
},
"node_modules/@changesets/write/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,
+ "license": "MIT",
"bin": {
"prettier": "bin-prettier.js"
},
@@ -3098,6 +3224,10 @@
"resolved": "packages/ui",
"link": true
},
+ "node_modules/@clerk/upgrade": {
+ "resolved": "packages/upgrade",
+ "link": true
+ },
"node_modules/@cloudflare/kv-asset-handler": {
"version": "0.3.2",
"license": "MIT OR Apache-2.0",
@@ -3130,7 +3260,6 @@
},
"node_modules/@colors/colors": {
"version": "1.5.0",
- "dev": true,
"license": "MIT",
"optional": true,
"engines": {
@@ -6543,6 +6672,71 @@
"dev": true,
"license": "ISC"
},
+ "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/@inkjs/ui/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/@inkjs/ui/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/@inkjs/ui/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/@inkjs/ui/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/@internationalized/date": {
"version": "3.5.4",
"license": "Apache-2.0",
@@ -6756,6 +6950,30 @@
"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/marked": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz",
+ "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
"node_modules/@jest/console": {
"version": "29.7.0",
"devOptional": true,
@@ -8117,6 +8335,13 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "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/@nicolo-ribaudo/eslint-scope-5-internals": {
"version": "5.1.1-v1",
"license": "MIT",
@@ -12626,7 +12851,6 @@
},
"node_modules/@sindresorhus/is": {
"version": "4.6.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
@@ -13842,6 +14066,14 @@
"@types/node": "*"
}
},
+ "node_modules/@types/gradient-string": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@types/gradient-string/-/gradient-string-1.1.6.tgz",
+ "integrity": "sha512-LkaYxluY4G5wR1M4AKQUal2q61Di1yVVCw42ImFTuaIoQVgmV0WP1xUaLB8zwb47mp82vWTpePI9JmrjEnJ7nQ==",
+ "dependencies": {
+ "@types/tinycolor2": "*"
+ }
+ },
"node_modules/@types/har-format": {
"version": "1.2.11",
"dev": true,
@@ -13994,7 +14226,6 @@
},
"node_modules/@types/minimist": {
"version": "1.2.2",
- "dev": true,
"license": "MIT"
},
"node_modules/@types/mkdirp": {
@@ -14035,8 +14266,9 @@
}
},
"node_modules/@types/normalize-package-data": {
- "version": "2.4.1",
- "license": "MIT"
+ "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/@types/parse-json": {
"version": "4.0.0",
@@ -14211,6 +14443,11 @@
"@types/jest": "*"
}
},
+ "node_modules/@types/tinycolor2": {
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz",
+ "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw=="
+ },
"node_modules/@types/tmp": {
"version": "0.0.33",
"dev": true,
@@ -14548,11 +14785,33 @@
"resolve": "^1.10.0"
}
},
+ "node_modules/@verdaccio/auth": {
+ "version": "7.0.0-next-7.16",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@verdaccio/config": "7.0.0-next-7.16",
+ "@verdaccio/core": "7.0.0-next-7.16",
+ "@verdaccio/loaders": "7.0.0-next-7.16",
+ "@verdaccio/logger": "7.0.0-next-7.16",
+ "@verdaccio/signature": "7.0.0-next-7.5",
+ "@verdaccio/utils": "7.0.0-next-7.16",
+ "debug": "4.3.4",
+ "lodash": "4.17.21",
+ "verdaccio-htpasswd": "12.0.0-next-7.16"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/verdaccio"
+ }
+ },
"node_modules/@verdaccio/commons-api": {
"version": "10.2.0",
- "resolved": "https://registry.npmjs.org/@verdaccio/commons-api/-/commons-api-10.2.0.tgz",
- "integrity": "sha512-F/YZANu4DmpcEV0jronzI7v2fGVWkQ5Mwi+bVmV+ACJ+EzR0c9Jbhtbe5QyLUuzR97t8R5E/Xe53O0cc2LukdQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"http-errors": "2.0.0",
"http-status-codes": "2.2.0"
@@ -14567,18 +14826,16 @@
},
"node_modules/@verdaccio/commons-api/node_modules/http-status-codes": {
"version": "2.2.0",
- "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.2.0.tgz",
- "integrity": "sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@verdaccio/config": {
- "version": "7.0.0-next-7.10",
- "resolved": "https://registry.npmjs.org/@verdaccio/config/-/config-7.0.0-next-7.10.tgz",
- "integrity": "sha512-mB3qaf8wW4sUgS0h3Z4TXYH/V9spjjFA33kNqWl78IMJHipBddbyBvdmfh/vo/NGtfju8DrDbRZlhKCl6293Qg==",
+ "version": "7.0.0-next-7.16",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@verdaccio/core": "7.0.0-next-7.10",
- "@verdaccio/utils": "7.0.0-next-7.10",
+ "@verdaccio/core": "7.0.0-next-7.16",
+ "@verdaccio/utils": "7.0.0-next-7.16",
"debug": "4.3.4",
"js-yaml": "4.1.0",
"lodash": "4.17.21",
@@ -14595,24 +14852,21 @@
},
"node_modules/@verdaccio/config/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
+ "dev": true,
+ "license": "Python-2.0"
},
"node_modules/@verdaccio/config/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==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/@verdaccio/config/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,
+ "license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
@@ -14622,9 +14876,8 @@
},
"node_modules/@verdaccio/config/node_modules/minimatch": {
"version": "7.4.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz",
- "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -14636,17 +14889,16 @@
}
},
"node_modules/@verdaccio/core": {
- "version": "7.0.0-next-7.10",
- "resolved": "https://registry.npmjs.org/@verdaccio/core/-/core-7.0.0-next-7.10.tgz",
- "integrity": "sha512-kS7/x5y9knbkSksHeawRV5Af8p/g0qk9GgQOZjuvOtv08kMFSttYk/eDglE9++SbvqP34+sDraUIMB/C3tZ2fw==",
+ "version": "7.0.0-next-7.16",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ajv": "8.12.0",
"core-js": "3.35.0",
"http-errors": "2.0.0",
"http-status-codes": "2.3.0",
"process-warning": "1.0.0",
- "semver": "7.5.4"
+ "semver": "7.6.0"
},
"engines": {
"node": ">=12"
@@ -14658,9 +14910,8 @@
},
"node_modules/@verdaccio/core/node_modules/ajv": {
"version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
@@ -14674,10 +14925,9 @@
},
"node_modules/@verdaccio/core/node_modules/core-js": {
"version": "3.35.0",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz",
- "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
@@ -14685,70 +14935,50 @@
},
"node_modules/@verdaccio/core/node_modules/json-schema-traverse": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "node_modules/@verdaccio/core/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"
- }
+ "license": "MIT"
},
"node_modules/@verdaccio/core/node_modules/process-warning": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz",
- "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/@verdaccio/core/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==",
+ "node_modules/@verdaccio/file-locking": {
+ "version": "10.3.1",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
+ "lockfile": "1.0.4"
},
"engines": {
- "node": ">=10"
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/verdaccio"
}
},
- "node_modules/@verdaccio/core/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/@verdaccio/file-locking": {
- "version": "10.3.1",
- "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-10.3.1.tgz",
- "integrity": "sha512-oqYLfv3Yg3mAgw9qhASBpjD50osj2AX4IwbkUtyuhhKGyoFU9eZdrbeW6tpnqUnj6yBMtAPm2eGD4BwQuX400g==",
+ "node_modules/@verdaccio/loaders": {
+ "version": "7.0.0-next-7.16",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "lockfile": "1.0.4"
+ "@verdaccio/logger": "7.0.0-next-7.16",
+ "debug": "4.3.4",
+ "lodash": "4.17.21"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/verdaccio"
}
},
- "node_modules/@verdaccio/local-storage": {
- "version": "10.3.3",
- "resolved": "https://registry.npmjs.org/@verdaccio/local-storage/-/local-storage-10.3.3.tgz",
- "integrity": "sha512-/n0FH+1hxVg80YhYBfJuW7F2AuvLY2fra8/DTCilWDll9Y5yZDxwntZfcKHJLerCA4atrbJtvaqpWkoV3Q9x8w==",
+ "node_modules/@verdaccio/local-storage-legacy": {
+ "version": "11.0.2",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@verdaccio/commons-api": "10.2.0",
"@verdaccio/file-locking": "10.3.1",
@@ -14760,24 +14990,22 @@
"mkdirp": "1.0.4"
},
"engines": {
- "node": ">=8"
+ "node": ">=12"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/verdaccio"
}
},
- "node_modules/@verdaccio/local-storage/node_modules/async": {
+ "node_modules/@verdaccio/local-storage-legacy/node_modules/async": {
"version": "3.2.4",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
- "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/@verdaccio/local-storage/node_modules/mkdirp": {
+ "node_modules/@verdaccio/local-storage-legacy/node_modules/mkdirp": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"dev": true,
+ "license": "MIT",
"bin": {
"mkdirp": "bin/cmd.js"
},
@@ -14785,13 +15013,28 @@
"node": ">=10"
}
},
+ "node_modules/@verdaccio/logger": {
+ "version": "7.0.0-next-7.16",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@verdaccio/logger-commons": "7.0.0-next-7.16",
+ "pino": "8.17.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/verdaccio"
+ }
+ },
"node_modules/@verdaccio/logger-7": {
- "version": "7.0.0-next-7.10",
- "resolved": "https://registry.npmjs.org/@verdaccio/logger-7/-/logger-7-7.0.0-next-7.10.tgz",
- "integrity": "sha512-UgbZnnapLmvcVMz7HzJhsyMTFLhVcAKTwKW/5dtaSwD2XrP721YawdTwJEPZnhcNrTcD9dUvRGfW4Dr/5QzJcg==",
+ "version": "7.0.0-next-7.16",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@verdaccio/logger-commons": "7.0.0-next-7.10",
+ "@verdaccio/logger-commons": "7.0.0-next-7.16",
"pino": "7.11.0"
},
"engines": {
@@ -14802,17 +15045,26 @@
"url": "https://opencollective.com/verdaccio"
}
},
+ "node_modules/@verdaccio/logger-7/node_modules/duplexify": {
+ "version": "4.1.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.4.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1",
+ "stream-shift": "^1.0.2"
+ }
+ },
"node_modules/@verdaccio/logger-7/node_modules/on-exit-leak-free": {
"version": "0.2.0",
- "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz",
- "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@verdaccio/logger-7/node_modules/pino": {
"version": "7.11.0",
- "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz",
- "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"atomic-sleep": "^1.0.0",
"fast-redact": "^3.0.0",
@@ -14832,9 +15084,8 @@
},
"node_modules/@verdaccio/logger-7/node_modules/pino-abstract-transport": {
"version": "0.5.0",
- "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz",
- "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"duplexify": "^4.1.2",
"split2": "^4.0.0"
@@ -14842,51 +15093,58 @@
},
"node_modules/@verdaccio/logger-7/node_modules/pino-std-serializers": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz",
- "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@verdaccio/logger-7/node_modules/process-warning": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz",
- "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@verdaccio/logger-7/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
},
"node_modules/@verdaccio/logger-7/node_modules/real-require": {
"version": "0.1.0",
- "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz",
- "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 12.13.0"
}
},
"node_modules/@verdaccio/logger-7/node_modules/sonic-boom": {
"version": "2.8.0",
- "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz",
- "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"atomic-sleep": "^1.0.0"
}
},
"node_modules/@verdaccio/logger-7/node_modules/thread-stream": {
"version": "0.15.2",
- "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz",
- "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"real-require": "^0.1.0"
}
},
"node_modules/@verdaccio/logger-commons": {
- "version": "7.0.0-next-7.10",
- "resolved": "https://registry.npmjs.org/@verdaccio/logger-commons/-/logger-commons-7.0.0-next-7.10.tgz",
- "integrity": "sha512-RTA4K6KvoCrgqA1aVP4n8IDZfUQtaza2FcPjEsBShLQg0rHFJi/5/yQg+J4MpOvYlKbrusOy9pwN86h9pCe+CA==",
+ "version": "7.0.0-next-7.16",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@verdaccio/core": "7.0.0-next-7.10",
- "@verdaccio/logger-prettify": "7.0.0-next.1",
+ "@verdaccio/core": "7.0.0-next-7.16",
+ "@verdaccio/logger-prettify": "7.0.0-next-7.3",
"colorette": "2.0.20",
"debug": "4.3.4"
},
@@ -14899,16 +15157,15 @@
}
},
"node_modules/@verdaccio/logger-prettify": {
- "version": "7.0.0-next.1",
- "resolved": "https://registry.npmjs.org/@verdaccio/logger-prettify/-/logger-prettify-7.0.0-next.1.tgz",
- "integrity": "sha512-ZF71AS2k0OiSnKVT05+NUWARZ+yn0keGAlpkgNWU7SHiYeFS1ZDVpapi9PXR23gJ5U756fyPKaqvlRcYgEpsgA==",
+ "version": "7.0.0-next-7.3",
"dev": true,
+ "license": "MIT",
"dependencies": {
"colorette": "2.0.20",
- "dayjs": "1.11.7",
+ "dayjs": "1.11.10",
"lodash": "4.17.21",
- "pino-abstract-transport": "1.0.0",
- "sonic-boom": "3.3.0"
+ "pino-abstract-transport": "1.1.0",
+ "sonic-boom": "3.8.0"
},
"engines": {
"node": ">=12"
@@ -14918,92 +15175,17 @@
"url": "https://opencollective.com/verdaccio"
}
},
- "node_modules/@verdaccio/logger-prettify/node_modules/buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "dev": true,
- "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": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
- "node_modules/@verdaccio/logger-prettify/node_modules/dayjs": {
- "version": "1.11.7",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
- "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==",
- "dev": true
- },
- "node_modules/@verdaccio/logger-prettify/node_modules/pino-abstract-transport": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz",
- "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==",
- "dev": true,
- "dependencies": {
- "readable-stream": "^4.0.0",
- "split2": "^4.0.0"
- }
- },
- "node_modules/@verdaccio/logger-prettify/node_modules/readable-stream": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
- "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==",
- "dev": true,
- "dependencies": {
- "abort-controller": "^3.0.0",
- "buffer": "^6.0.3",
- "events": "^3.3.0",
- "process": "^0.11.10",
- "string_decoder": "^1.3.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/@verdaccio/logger-prettify/node_modules/sonic-boom": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz",
- "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==",
- "dev": true,
- "dependencies": {
- "atomic-sleep": "^1.0.0"
- }
- },
- "node_modules/@verdaccio/logger-prettify/node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
"node_modules/@verdaccio/middleware": {
- "version": "7.0.0-next-7.10",
- "resolved": "https://registry.npmjs.org/@verdaccio/middleware/-/middleware-7.0.0-next-7.10.tgz",
- "integrity": "sha512-NBQxi6ag2zSIoUUmnQn/n0YwJDnnHqqtyV5c73YTdQV5RSPn5i2YKz+8DSA+iJYa2ff8G4fx8hOdJR+QZZQ24w==",
+ "version": "7.0.0-next-7.16",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@verdaccio/config": "7.0.0-next-7.10",
- "@verdaccio/core": "7.0.0-next-7.10",
- "@verdaccio/url": "12.0.0-next-7.10",
- "@verdaccio/utils": "7.0.0-next-7.10",
+ "@verdaccio/config": "7.0.0-next-7.16",
+ "@verdaccio/core": "7.0.0-next-7.16",
+ "@verdaccio/url": "12.0.0-next-7.16",
+ "@verdaccio/utils": "7.0.0-next-7.16",
"debug": "4.3.4",
- "express": "4.18.2",
+ "express": "4.19.2",
"express-rate-limit": "5.5.1",
"lodash": "4.17.21",
"lru-cache": "7.18.3",
@@ -15017,98 +15199,18 @@
"url": "https://opencollective.com/verdaccio"
}
},
- "node_modules/@verdaccio/middleware/node_modules/express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "dev": true,
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/@verdaccio/middleware/node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/@verdaccio/middleware/node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dev": true,
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/@verdaccio/middleware/node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
"node_modules/@verdaccio/middleware/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==",
"dev": true,
+ "license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/@verdaccio/middleware/node_modules/mime": {
"version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
- "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
"dev": true,
+ "license": "MIT",
"bin": {
"mime": "cli.js"
},
@@ -15116,32 +15218,10 @@
"node": ">=4.0.0"
}
},
- "node_modules/@verdaccio/middleware/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
- },
- "node_modules/@verdaccio/middleware/node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
- "dev": true
- },
- "node_modules/@verdaccio/middleware/node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/@verdaccio/search": {
- "version": "7.0.0-next.2",
- "resolved": "https://registry.npmjs.org/@verdaccio/search/-/search-7.0.0-next.2.tgz",
- "integrity": "sha512-NoGSpubKB+SB4gRMIoEl3E3NkoKE5f0DnANghB3SnMtVxpJGdwZgylosqDxt8swhQ80+16hYdAp6g44uhjVE6Q==",
+ "node_modules/@verdaccio/search-indexer": {
+ "version": "7.0.0-next-7.2",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -15151,16 +15231,15 @@
}
},
"node_modules/@verdaccio/signature": {
- "version": "7.0.0-next.3",
- "resolved": "https://registry.npmjs.org/@verdaccio/signature/-/signature-7.0.0-next.3.tgz",
- "integrity": "sha512-egs1VmEe+COUUZ83I6gzDy79Jo3b/AExPvp9EDuJHkmwxJj+9gb231Rv4wk+UoNPrQRNLljUepQwVrDmbqP5DQ==",
+ "version": "7.0.0-next-7.5",
"dev": true,
+ "license": "MIT",
"dependencies": {
"debug": "4.3.4",
"jsonwebtoken": "9.0.2"
},
"engines": {
- "node": ">=12"
+ "node": ">=14"
},
"funding": {
"type": "opencollective",
@@ -15169,9 +15248,8 @@
},
"node_modules/@verdaccio/streams": {
"version": "10.2.1",
- "resolved": "https://registry.npmjs.org/@verdaccio/streams/-/streams-10.2.1.tgz",
- "integrity": "sha512-OojIG/f7UYKxC4dYX8x5ax8QhRx1b8OYUAMz82rUottCuzrssX/4nn5QE7Ank0DUSX3C9l/HPthc4d9uKRJqJQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12",
"npm": ">=5"
@@ -15182,16 +15260,17 @@
}
},
"node_modules/@verdaccio/tarball": {
- "version": "12.0.0-next-7.10",
- "resolved": "https://registry.npmjs.org/@verdaccio/tarball/-/tarball-12.0.0-next-7.10.tgz",
- "integrity": "sha512-kxctkPREUpe0oRDsTelKcLsWGv2llRBcK2AlyCAX7UENKGWvVqITTk81PkVpzlwXOpcRWdLJQmEE+dtXGwLr6Q==",
+ "version": "12.0.0-next-7.16",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@verdaccio/core": "7.0.0-next-7.10",
- "@verdaccio/url": "12.0.0-next-7.10",
- "@verdaccio/utils": "7.0.0-next-7.10",
+ "@verdaccio/core": "7.0.0-next-7.16",
+ "@verdaccio/url": "12.0.0-next-7.16",
+ "@verdaccio/utils": "7.0.0-next-7.16",
"debug": "4.3.4",
- "lodash": "4.17.21"
+ "gunzip-maybe": "^1.4.2",
+ "lodash": "4.17.21",
+ "tar-stream": "^3.1.7"
},
"engines": {
"node": ">=12"
@@ -15202,18 +15281,16 @@
}
},
"node_modules/@verdaccio/ui-theme": {
- "version": "7.0.0-next-7.10",
- "resolved": "https://registry.npmjs.org/@verdaccio/ui-theme/-/ui-theme-7.0.0-next-7.10.tgz",
- "integrity": "sha512-I1War/XBg3WzzAojXDtEDjZw/1qPKW0d8EIsJD3h6Xi5Atzvz/xBTbHjgbwApjmISyDWQ8Vevp8zOtGO33zLSw==",
- "dev": true
+ "version": "7.0.0-next-7.16",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@verdaccio/url": {
- "version": "12.0.0-next-7.10",
- "resolved": "https://registry.npmjs.org/@verdaccio/url/-/url-12.0.0-next-7.10.tgz",
- "integrity": "sha512-AiFG+W/H1iD+iXkh4b6zm3AsZdGdI7tiAPCHymN7jSV6dAvWTuhIEK30mmFyCSmOE0iwyn8ZN4xqsf9Qcu1emw==",
+ "version": "12.0.0-next-7.16",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@verdaccio/core": "7.0.0-next-7.10",
+ "@verdaccio/core": "7.0.0-next-7.16",
"debug": "4.3.4",
"lodash": "4.17.21",
"validator": "13.11.0"
@@ -15226,16 +15303,23 @@
"url": "https://opencollective.com/verdaccio"
}
},
+ "node_modules/@verdaccio/url/node_modules/validator": {
+ "version": "13.11.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/@verdaccio/utils": {
- "version": "7.0.0-next-7.10",
- "resolved": "https://registry.npmjs.org/@verdaccio/utils/-/utils-7.0.0-next-7.10.tgz",
- "integrity": "sha512-3sGyBj0leN3RjwPJPDkdsD9j1ahzQccHPj86IlIJqUJFhAcOT/nD6z9+W3sBAiro6Q2psWyWHxBJ8H3LhtlLeA==",
+ "version": "7.0.0-next-7.16",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@verdaccio/core": "7.0.0-next-7.10",
+ "@verdaccio/core": "7.0.0-next-7.16",
"lodash": "4.17.21",
"minimatch": "7.4.6",
- "semver": "7.5.4"
+ "semver": "7.6.0"
},
"engines": {
"node": ">=12"
@@ -15247,30 +15331,16 @@
},
"node_modules/@verdaccio/utils/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==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
- "node_modules/@verdaccio/utils/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/@verdaccio/utils/node_modules/minimatch": {
"version": "7.4.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz",
- "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -15281,27 +15351,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@verdaccio/utils/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/@verdaccio/utils/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/@vinxi/listhen": {
"version": "1.5.6",
"license": "MIT",
@@ -15960,11 +16009,6 @@
"node": ">=4"
}
},
- "node_modules/ansicolors": {
- "version": "0.3.2",
- "dev": true,
- "license": "MIT"
- },
"node_modules/any-eslint-parser": {
"version": "1.0.1",
"license": "MIT",
@@ -15989,9 +16033,8 @@
},
"node_modules/apache-md5": {
"version": "1.1.8",
- "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.8.tgz",
- "integrity": "sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -16236,7 +16279,6 @@
},
"node_modules/argparse": {
"version": "1.0.10",
- "devOptional": true,
"license": "MIT",
"dependencies": {
"sprintf-js": "~1.0.2"
@@ -17143,9 +17185,8 @@
},
"node_modules/bcryptjs": {
"version": "2.4.3",
- "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
- "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/before-after-hook": {
"version": "2.2.3",
@@ -17439,6 +17480,14 @@
"lodash": ">=4.17.21"
}
},
+ "node_modules/browserify-zlib": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pako": "~0.2.0"
+ }
+ },
"node_modules/browserslist": {
"version": "4.23.0",
"funding": [
@@ -17536,9 +17585,8 @@
},
"node_modules/buffer-equal-constant-time": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
- "dev": true
+ "dev": true,
+ "license": "BSD-3-Clause"
},
"node_modules/buffer-fill": {
"version": "1.0.0",
@@ -18048,22 +18096,47 @@
"upper-case-first": "^2.0.2"
}
},
- "node_modules/cardinal": {
- "version": "2.1.1",
+ "node_modules/caseless": {
+ "version": "0.12.0",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0"
+ },
+ "node_modules/cfonts": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/cfonts/-/cfonts-3.3.0.tgz",
+ "integrity": "sha512-RlVxeEw2FXWI5Bs9LD0/Ef3bsQIc9m6lK/DINN20HIW0Y0YHUO2jjy88cot9YKZITiRTCdWzTfLmTyx47HeSLA==",
"dependencies": {
- "ansicolors": "~0.3.2",
- "redeyed": "~2.1.0"
+ "supports-color": "^8",
+ "window-size": "^1"
},
"bin": {
- "cdl": "bin/cdl.js"
+ "cfonts": "bin/index.js"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/caseless": {
- "version": "0.12.0",
- "dev": true,
- "license": "Apache-2.0"
+ "node_modules/cfonts/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/cfonts/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
},
"node_modules/chai": {
"version": "4.4.1",
@@ -18149,7 +18222,6 @@
},
"node_modules/char-regex": {
"version": "1.0.2",
- "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=10"
@@ -18406,11 +18478,114 @@
"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/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/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",
- "dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=6"
},
@@ -18420,7 +18595,6 @@
},
"node_modules/cli-table3": {
"version": "0.6.3",
- "dev": true,
"license": "MIT",
"dependencies": {
"string-width": "^4.2.0"
@@ -18434,7 +18608,6 @@
},
"node_modules/cli-truncate": {
"version": "3.1.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"slice-ansi": "^5.0.0",
@@ -18449,7 +18622,6 @@
},
"node_modules/cli-truncate/node_modules/ansi-regex": {
"version": "6.0.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -18460,7 +18632,6 @@
},
"node_modules/cli-truncate/node_modules/string-width": {
"version": "5.1.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"eastasianwidth": "^0.2.0",
@@ -18476,7 +18647,6 @@
},
"node_modules/cli-truncate/node_modules/strip-ansi": {
"version": "7.1.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.0.1"
@@ -18702,6 +18872,17 @@
"node": ">= 0.12.0"
}
},
+ "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/code-point-at": {
"version": "1.1.0",
"dev": true,
@@ -19310,6 +19491,14 @@
"version": "1.9.0",
"license": "MIT"
},
+ "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/cookie": {
"version": "0.5.0",
"license": "MIT",
@@ -20624,7 +20813,6 @@
},
"node_modules/decamelize": {
"version": "1.2.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -20632,7 +20820,6 @@
},
"node_modules/decamelize-keys": {
"version": "1.1.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"decamelize": "^1.1.0",
@@ -20647,7 +20834,6 @@
},
"node_modules/decamelize-keys/node_modules/map-obj": {
"version": "1.0.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -20755,8 +20941,9 @@
"license": "MIT"
},
"node_modules/deepmerge": {
- "version": "4.2.2",
- "license": "MIT",
+ "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"
}
@@ -20962,6 +21149,17 @@
"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/defu": {
"version": "6.1.4",
"license": "MIT"
@@ -20988,6 +21186,360 @@
"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/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/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "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/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/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/del-cli/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,
+ "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/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/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"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/del-cli/node_modules/redent": {
+ "version": "4.0.0",
+ "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"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/del-cli/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/del-cli/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/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": {
+ "min-indent": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/del/node_modules/aggregate-error": {
"version": "3.1.0",
"dev": true,
@@ -21492,29 +22044,14 @@
"license": "MIT"
},
"node_modules/duplexify": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
- "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
- "dev": true,
- "dependencies": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.2"
- }
- },
- "node_modules/duplexify/node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "version": "3.7.1",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
}
},
"node_modules/eastasianwidth": {
@@ -21532,9 +22069,8 @@
},
"node_modules/ecdsa-sig-formatter": {
"version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
}
@@ -21565,6 +22101,20 @@
"version": "1.1.1",
"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.795",
"license": "ISC"
@@ -21586,7 +22136,6 @@
},
"node_modules/emojilib": {
"version": "2.4.0",
- "dev": true,
"license": "MIT"
},
"node_modules/emojis-list": {
@@ -22222,6 +22771,283 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/eslint-config-custom": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-custom/-/eslint-config-custom-0.0.0.tgz",
+ "integrity": "sha512-kwCw78yisbgKdJBJ5qooPmpBYDphDfM2oxSROmtfOwBXBwXuRiSV3suO01W3mVLEFpmQZxMWd/qajKpJhkKSug==",
+ "dev": true,
+ "dependencies": {
+ "eslint-config-next": "^12.0.8",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-react": "7.28.0"
+ }
+ },
+ "node_modules/eslint-config-custom/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-config-custom/node_modules/eslint-config-prettier": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz",
+ "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-config-custom/node_modules/eslint-plugin-react": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz",
+ "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.4",
+ "array.prototype.flatmap": "^1.2.5",
+ "doctrine": "^2.1.0",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.0.4",
+ "object.entries": "^1.1.5",
+ "object.fromentries": "^2.0.5",
+ "object.hasown": "^1.1.0",
+ "object.values": "^1.1.5",
+ "prop-types": "^15.7.2",
+ "resolve": "^2.0.0-next.3",
+ "semver": "^6.3.0",
+ "string.prototype.matchall": "^4.0.6"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-config-custom/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/eslint-config-custom/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/eslint-config-next": {
+ "version": "12.3.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-12.3.4.tgz",
+ "integrity": "sha512-WuT3gvgi7Bwz00AOmKGhOeqnyA5P29Cdyr0iVjLyfDbk+FANQKcOjFUTZIdyYfe5Tq1x4TGcmoe4CwctGvFjHQ==",
+ "dev": true,
+ "dependencies": {
+ "@next/eslint-plugin-next": "12.3.4",
+ "@rushstack/eslint-patch": "^1.1.3",
+ "@typescript-eslint/parser": "^5.21.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^2.7.1",
+ "eslint-plugin-import": "^2.26.0",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.31.7",
+ "eslint-plugin-react-hooks": "^4.5.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.23.0 || ^8.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz",
+ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-config-next/node_modules/eslint-import-resolver-typescript": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz",
+ "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "glob": "^7.2.0",
+ "is-glob": "^4.0.3",
+ "resolve": "^1.22.0",
+ "tsconfig-paths": "^3.14.1"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*"
+ }
+ },
+ "node_modules/eslint-config-next/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "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/eslint-config-next/node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/eslint-config-prettier": {
"version": "9.0.0",
"license": "MIT",
@@ -23500,9 +24326,8 @@
},
"node_modules/express-rate-limit": {
"version": "5.5.1",
- "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.5.1.tgz",
- "integrity": "sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/express/node_modules/body-parser": {
"version": "1.20.2",
@@ -23586,9 +24411,8 @@
},
"node_modules/express/node_modules/statuses": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -23606,6 +24430,17 @@
"dev": true,
"license": "MIT"
},
+ "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/extendable-error": {
"version": "0.1.7",
"dev": true,
@@ -23975,6 +24810,33 @@
"version": "1.0.0",
"license": "MIT"
},
+ "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,
@@ -24545,6 +25407,12 @@
"dev": true,
"license": "Unlicense"
},
+ "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",
"license": "ISC"
@@ -25586,14 +26454,6 @@
"url": "https://opencollective.com/core-js"
}
},
- "node_modules/gatsby/node_modules/deepmerge": {
- "version": "4.3.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/gatsby/node_modules/dotenv": {
"version": "8.6.0",
"dev": true,
@@ -26347,6 +27207,63 @@
"version": "4.2.11",
"license": "ISC"
},
+ "node_modules/gradient-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-2.0.2.tgz",
+ "integrity": "sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==",
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "tinygradient": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gradient-string/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/gradient-string/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/gradient-string/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/gradient-string/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/grapheme-splitter": {
"version": "1.0.4",
"dev": true,
@@ -26408,6 +27325,36 @@
"graphql": ">=0.8.0"
}
},
+ "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/gunzip-maybe": {
+ "version": "1.4.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserify-zlib": "^0.1.4",
+ "is-deflate": "^1.0.0",
+ "is-gzip": "^1.0.0",
+ "peek-stream": "^1.1.0",
+ "pumpify": "^1.3.3",
+ "through2": "^2.0.3"
+ },
+ "bin": {
+ "gunzip-maybe": "bin.js"
+ }
+ },
"node_modules/gzip-size": {
"version": "6.0.0",
"dev": true,
@@ -26493,7 +27440,6 @@
},
"node_modules/hard-rejection": {
"version": "2.1.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -26633,6 +27579,14 @@
"node": ">=8"
}
},
+ "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",
@@ -26760,8 +27714,7 @@
},
"node_modules/http-errors/node_modules/statuses": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -26936,9 +27889,8 @@
},
"node_modules/http-status-codes": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz",
- "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/http2-wrapper": {
"version": "1.0.3",
@@ -27172,6 +28124,17 @@
"node": ">=8"
}
},
+ "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/infer-owner": {
"version": "1.0.4",
"dev": true,
@@ -27195,6 +28158,393 @@
"dev": true,
"license": "ISC"
},
+ "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-big-text": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ink-big-text/-/ink-big-text-2.0.0.tgz",
+ "integrity": "sha512-Juzqv+rIOLGuhMJiE50VtS6dg6olWfzFdL7wsU/EARSL5Eaa5JNXMogMBm9AkjgzO2Y3UwWCOh87jbhSn8aNdw==",
+ "dependencies": {
+ "cfonts": "^3.1.1",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ },
+ "peerDependencies": {
+ "ink": ">=4",
+ "react": ">=18"
+ }
+ },
+ "node_modules/ink-gradient": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ink-gradient/-/ink-gradient-3.0.0.tgz",
+ "integrity": "sha512-OVyPBovBxE1tFcBhSamb+P1puqDP6pG3xFe2W9NiLgwUZd9RbcjBeR7twLbliUT9navrUstEf1ZcPKKvx71BsQ==",
+ "dependencies": {
+ "@types/gradient-string": "^1.1.2",
+ "gradient-string": "^2.0.2",
+ "prop-types": "^15.8.1",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ },
+ "peerDependencies": {
+ "ink": ">=4"
+ }
+ },
+ "node_modules/ink-gradient/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/ink-gradient/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/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-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/ink-link/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-link/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/ink-link/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/ink-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/ink/node_modules/ansi-escapes": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz",
+ "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ink/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/ink/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/ink/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/ink/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/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/ink/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/ink/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/ink/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/ink/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/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/ink/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/ink/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/ink/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/ink/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/ink/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/inline-style-parser": {
"version": "0.1.1",
"dev": true,
@@ -27383,6 +28733,17 @@
"node": ">=8"
}
},
+ "node_modules/is-accessor-descriptor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
+ "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/is-arguments": {
"version": "1.1.1",
"license": "MIT",
@@ -27464,9 +28825,7 @@
},
"node_modules/is-buffer": {
"version": "1.1.6",
- "dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/is-builtin-module": {
"version": "3.2.1",
@@ -27493,7 +28852,6 @@
},
"node_modules/is-ci": {
"version": "3.0.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"ci-info": "^3.2.0"
@@ -27512,6 +28870,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-data-descriptor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
+ "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/is-data-view": {
"version": "1.0.1",
"license": "MIT",
@@ -27538,6 +28907,23 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-deflate": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-descriptor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
+ "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/is-docker": {
"version": "2.2.1",
"license": "MIT",
@@ -27551,6 +28937,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "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",
"license": "MIT",
@@ -27570,7 +28964,6 @@
},
"node_modules/is-fullwidth-code-point": {
"version": "4.0.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -27610,6 +29003,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-gzip": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-inside-container": {
"version": "1.0.0",
"license": "MIT",
@@ -27708,7 +29109,6 @@
},
"node_modules/is-lower-case": {
"version": "2.0.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"tslib": "^2.0.3"
@@ -27781,7 +29181,6 @@
},
"node_modules/is-plain-obj": {
"version": "1.1.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -27994,7 +29393,6 @@
},
"node_modules/is-upper-case": {
"version": "2.0.2",
- "dev": true,
"license": "MIT",
"dependencies": {
"tslib": "^2.0.3"
@@ -28237,6 +29635,73 @@
"@pkgjs/parseargs": "^0.11.0"
}
},
+ "node_modules/jake": {
+ "version": "10.9.1",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz",
+ "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==",
+ "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/javascript-stringify": {
"version": "2.1.0",
"dev": true,
@@ -29888,7 +31353,6 @@
},
"node_modules/js-yaml": {
"version": "3.14.1",
- "devOptional": true,
"license": "MIT",
"dependencies": {
"argparse": "^1.0.7",
@@ -30189,9 +31653,8 @@
},
"node_modules/jsonwebtoken": {
"version": "9.0.2",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
- "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"jws": "^3.2.2",
"lodash.includes": "^4.3.0",
@@ -30252,9 +31715,8 @@
},
"node_modules/jwa": {
"version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
- "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"buffer-equal-constant-time": "1.0.1",
"ecdsa-sig-formatter": "1.0.11",
@@ -30263,9 +31725,8 @@
},
"node_modules/jws": {
"version": "3.2.2",
- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
- "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"jwa": "^1.4.1",
"safe-buffer": "^5.0.1"
@@ -30291,7 +31752,6 @@
},
"node_modules/kind-of": {
"version": "6.0.3",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -30928,18 +32388,16 @@
},
"node_modules/lockfile": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz",
- "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"signal-exit": "^3.0.2"
}
},
"node_modules/lockfile/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==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/lodash": {
"version": "4.17.21",
@@ -30947,9 +32405,8 @@
},
"node_modules/lodash-es": {
"version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
- "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/lodash.camelcase": {
"version": "4.3.0",
@@ -31004,9 +32461,8 @@
},
"node_modules/lodash.includes": {
"version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
- "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/lodash.isarguments": {
"version": "3.1.0",
@@ -31014,21 +32470,18 @@
},
"node_modules/lodash.isboolean": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
- "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/lodash.isinteger": {
"version": "4.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
- "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/lodash.isnumber": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
- "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
@@ -31037,9 +32490,8 @@
},
"node_modules/lodash.isstring": {
"version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/lodash.kebabcase": {
"version": "4.1.1",
@@ -31282,9 +32734,8 @@
},
"node_modules/lowdb": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz",
- "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"graceful-fs": "^4.1.3",
"is-promise": "^2.1.0",
@@ -31470,7 +32921,6 @@
},
"node_modules/marked": {
"version": "9.1.6",
- "dev": true,
"license": "MIT",
"bin": {
"marked": "bin/marked.js"
@@ -31481,12 +32931,12 @@
},
"node_modules/marked-terminal": {
"version": "6.2.0",
- "dev": true,
+ "resolved": "git+ssh://git@github.com/jescalan/marked-terminal.git#44f5ab42076e16937f56d645d3d7264675558ea1",
"license": "MIT",
"dependencies": {
"ansi-escapes": "^6.2.0",
- "cardinal": "^2.1.1",
"chalk": "^5.3.0",
+ "cli-highlight": "^2.1.11",
"cli-table3": "^0.6.3",
"node-emoji": "^2.1.3",
"supports-hyperlinks": "^3.0.0"
@@ -31500,7 +32950,6 @@
},
"node_modules/marked-terminal/node_modules/ansi-escapes": {
"version": "6.2.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=14.16"
@@ -31511,7 +32960,6 @@
},
"node_modules/marked-terminal/node_modules/chalk": {
"version": "5.3.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
@@ -31750,7 +33198,6 @@
},
"node_modules/mimic-fn": {
"version": "2.1.0",
- "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -31815,7 +33262,6 @@
},
"node_modules/minimist-options": {
"version": "4.1.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"arrify": "^1.0.1",
@@ -31828,7 +33274,6 @@
},
"node_modules/minimist-options/node_modules/arrify": {
"version": "1.0.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -32154,9 +33599,8 @@
},
"node_modules/nanoclone": {
"version": "0.2.1",
- "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
- "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/nanoid": {
"version": "3.3.7",
@@ -32328,7 +33772,6 @@
},
"node_modules/node-emoji": {
"version": "2.1.3",
- "dev": true,
"license": "MIT",
"dependencies": {
"@sindresorhus/is": "^4.6.0",
@@ -33185,7 +34628,6 @@
},
"node_modules/onetime": {
"version": "5.1.2",
- "devOptional": true,
"license": "MIT",
"dependencies": {
"mimic-fn": "^2.1.0"
@@ -33720,6 +35162,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/pako": {
+ "version": "0.2.9",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/param-case": {
"version": "3.0.4",
"dev": true,
@@ -33820,6 +35267,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",
"license": "MIT",
@@ -33864,6 +35324,14 @@
"cross-spawn": "^7.0.3"
}
},
+ "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-case": {
"version": "3.0.4",
"dev": true,
@@ -33984,6 +35452,16 @@
"url": "https://github.com/sponsors/Borewit"
}
},
+ "node_modules/peek-stream": {
+ "version": "1.1.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "duplexify": "^3.5.0",
+ "through2": "^2.0.3"
+ }
+ },
"node_modules/pend": {
"version": "1.2.0",
"dev": true,
@@ -35040,9 +36518,8 @@
},
"node_modules/prettier": {
"version": "3.3.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz",
- "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==",
"devOptional": true,
+ "license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -35071,9 +36548,8 @@
},
"node_modules/prettier-plugin-tailwindcss": {
"version": "0.6.3",
- "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.3.tgz",
- "integrity": "sha512-GeJ9bqXN4APAP0V5T2a1J/o6a50MWevEUCPWxijpdXFDQkBCoAfz4pQfv+YMXSqZ5GXLMDYio0mUOfrYL7gf4w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=14.21.3"
},
@@ -35297,9 +36773,8 @@
},
"node_modules/property-expr": {
"version": "2.0.6",
- "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz",
- "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/proto-list": {
"version": "1.2.4",
@@ -35379,6 +36854,25 @@
"once": "^1.3.1"
}
},
+ "node_modules/pumpify": {
+ "version": "1.5.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "duplexify": "^3.6.0",
+ "inherits": "^2.0.3",
+ "pump": "^2.0.0"
+ }
+ },
+ "node_modules/pumpify/node_modules/pump": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
"node_modules/punycode": {
"version": "2.3.0",
"license": "MIT",
@@ -35833,6 +37327,21 @@
"react-native": "*"
}
},
+ "node_modules/react-reconciler": {
+ "version": "0.29.2",
+ "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz",
+ "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
"node_modules/react-refresh": {
"version": "0.14.0",
"dev": true,
@@ -36304,14 +37813,6 @@
"node": ">=8"
}
},
- "node_modules/redeyed": {
- "version": "2.1.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "esprima": "~4.0.0"
- }
- },
"node_modules/redis-commands": {
"version": "1.7.0",
"dev": true,
@@ -37130,6 +38631,18 @@
"version": "1.3.0",
"license": "MIT"
},
+ "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/secure-compare": {
"version": "3.0.1",
"dev": true,
@@ -37181,6 +38694,17 @@
"dev": true,
"license": "MIT"
},
+ "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/semver/node_modules/lru-cache": {
"version": "6.0.0",
"license": "ISC",
@@ -37244,8 +38768,7 @@
},
"node_modules/send/node_modules/statuses": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -37624,7 +39147,6 @@
},
"node_modules/skin-tone": {
"version": "2.0.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"unicode-emoji-modifier-base": "^1.0.0"
@@ -37642,7 +39164,6 @@
},
"node_modules/slice-ansi": {
"version": "5.0.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.0.0",
@@ -37657,7 +39178,6 @@
},
"node_modules/slice-ansi/node_modules/ansi-styles": {
"version": "6.2.1",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -38227,7 +39747,6 @@
},
"node_modules/sprintf-js": {
"version": "1.0.3",
- "devOptional": true,
"license": "BSD-3-Clause"
},
"node_modules/sshpk": {
@@ -38277,7 +39796,6 @@
},
"node_modules/stack-utils": {
"version": "2.0.6",
- "devOptional": true,
"license": "MIT",
"dependencies": {
"escape-string-regexp": "^2.0.0"
@@ -38288,7 +39806,6 @@
},
"node_modules/stack-utils/node_modules/escape-string-regexp": {
"version": "2.0.0",
- "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -38326,9 +39843,8 @@
},
"node_modules/statuses": {
"version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -38339,9 +39855,8 @@
},
"node_modules/steno": {
"version": "0.4.4",
- "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz",
- "integrity": "sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"graceful-fs": "^4.1.3"
}
@@ -38374,9 +39889,8 @@
},
"node_modules/stream-shift": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
- "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/stream-transform": {
"version": "2.1.3",
@@ -38621,6 +40135,14 @@
"node": ">=8"
}
},
+ "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-eof": {
"version": "1.0.0",
"dev": true,
@@ -38935,7 +40457,6 @@
},
"node_modules/supports-hyperlinks": {
"version": "3.0.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0",
@@ -38947,7 +40468,6 @@
},
"node_modules/supports-hyperlinks/node_modules/has-flag": {
"version": "4.0.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -39185,8 +40705,6 @@
},
"node_modules/tar": {
"version": "6.2.1",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
- "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
"license": "ISC",
"dependencies": {
"chownr": "^2.0.0",
@@ -39576,6 +41094,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/through2": {
+ "version": "2.0.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
"node_modules/thunky": {
"version": "1.1.0",
"dev": true,
@@ -39632,6 +41159,20 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/tinycolor2": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
+ },
+ "node_modules/tinygradient": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/tinygradient/-/tinygradient-1.1.5.tgz",
+ "integrity": "sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==",
+ "dependencies": {
+ "@types/tinycolor2": "^1.4.0",
+ "tinycolor2": "^1.0.0"
+ }
+ },
"node_modules/title-case": {
"version": "3.0.3",
"dev": true,
@@ -39699,9 +41240,8 @@
},
"node_modules/toposort": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
- "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/totalist": {
"version": "3.0.1",
@@ -40612,7 +42152,6 @@
},
"node_modules/unicode-emoji-modifier-base": {
"version": "1.0.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
@@ -40744,9 +42283,8 @@
},
"node_modules/unix-crypt-td-js": {
"version": "1.1.4",
- "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz",
- "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==",
- "dev": true
+ "dev": true,
+ "license": "BSD-3-Clause"
},
"node_modules/unixify": {
"version": "1.0.0",
@@ -41186,10 +42724,9 @@
}
},
"node_modules/validator": {
- "version": "13.11.0",
- "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz",
- "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==",
+ "version": "13.12.0",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.10"
}
@@ -41211,32 +42748,31 @@
}
},
"node_modules/verdaccio": {
- "version": "5.29.2",
- "resolved": "https://registry.npmjs.org/verdaccio/-/verdaccio-5.29.2.tgz",
- "integrity": "sha512-Ra9Bv8mMsGaFnvFJl80gSNg6yhHRFUYATA03xpVrfqC1Z1IDZt/f0jZ94tPnfyaY1ljUS5jKsZsj6ihN/ZSVbQ==",
+ "version": "5.31.1",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@cypress/request": "3.0.1",
- "@verdaccio/config": "7.0.0-next-7.10",
- "@verdaccio/core": "7.0.0-next-7.10",
- "@verdaccio/local-storage": "10.3.3",
- "@verdaccio/logger-7": "7.0.0-next-7.10",
- "@verdaccio/middleware": "7.0.0-next-7.10",
- "@verdaccio/search": "7.0.0-next.2",
- "@verdaccio/signature": "7.0.0-next.3",
+ "@verdaccio/auth": "7.0.0-next-7.16",
+ "@verdaccio/config": "7.0.0-next-7.16",
+ "@verdaccio/core": "7.0.0-next-7.16",
+ "@verdaccio/local-storage-legacy": "11.0.2",
+ "@verdaccio/logger-7": "7.0.0-next-7.16",
+ "@verdaccio/middleware": "7.0.0-next-7.16",
+ "@verdaccio/search-indexer": "7.0.0-next-7.2",
+ "@verdaccio/signature": "7.0.0-next-7.5",
"@verdaccio/streams": "10.2.1",
- "@verdaccio/tarball": "12.0.0-next-7.10",
- "@verdaccio/ui-theme": "7.0.0-next-7.10",
- "@verdaccio/url": "12.0.0-next-7.10",
- "@verdaccio/utils": "7.0.0-next-7.10",
+ "@verdaccio/tarball": "12.0.0-next-7.16",
+ "@verdaccio/ui-theme": "7.0.0-next-7.16",
+ "@verdaccio/url": "12.0.0-next-7.16",
+ "@verdaccio/utils": "7.0.0-next-7.16",
"async": "3.2.5",
"clipanion": "3.2.1",
"compression": "1.7.4",
- "cookies": "0.9.1",
"cors": "2.8.5",
"debug": "^4.3.4",
- "envinfo": "7.11.0",
- "express": "4.18.2",
+ "envinfo": "7.13.0",
+ "express": "4.19.2",
"express-rate-limit": "5.5.1",
"fast-safe-stringify": "2.1.1",
"handlebars": "4.7.8",
@@ -41250,16 +42786,16 @@
"mkdirp": "1.0.4",
"mv": "2.1.1",
"pkginfo": "0.4.1",
- "semver": "7.5.4",
- "validator": "13.11.0",
- "verdaccio-audit": "12.0.0-next-7.10",
- "verdaccio-htpasswd": "12.0.0-next-7.10"
+ "semver": "7.6.2",
+ "validator": "13.12.0",
+ "verdaccio-audit": "12.0.0-next-7.16",
+ "verdaccio-htpasswd": "12.0.0-next-7.16"
},
"bin": {
"verdaccio": "bin/verdaccio"
},
"engines": {
- "node": ">=12.18"
+ "node": ">=14"
},
"funding": {
"type": "opencollective",
@@ -41267,14 +42803,13 @@
}
},
"node_modules/verdaccio-audit": {
- "version": "12.0.0-next-7.10",
- "resolved": "https://registry.npmjs.org/verdaccio-audit/-/verdaccio-audit-12.0.0-next-7.10.tgz",
- "integrity": "sha512-inL8J7c4y9BpFIkqLsw9yrdh8/CBKWbBrREiQHQ9ZnD7jLkHxTWsWW8jt4aUt9t2azc6eO5rUIqdo1W6VsYKeA==",
+ "version": "12.0.0-next-7.16",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@verdaccio/config": "7.0.0-next-7.10",
- "@verdaccio/core": "7.0.0-next-7.10",
- "express": "4.18.2",
+ "@verdaccio/config": "7.0.0-next-7.16",
+ "@verdaccio/core": "7.0.0-next-7.16",
+ "express": "4.19.2",
"https-proxy-agent": "5.0.1",
"node-fetch": "cjs"
},
@@ -41286,81 +42821,6 @@
"url": "https://opencollective.com/verdaccio"
}
},
- "node_modules/verdaccio-audit/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/verdaccio-audit/node_modules/express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "dev": true,
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/verdaccio-audit/node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dev": true,
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/verdaccio-audit/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
- },
"node_modules/verdaccio-audit/node_modules/node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@@ -41381,50 +42841,31 @@
}
}
},
- "node_modules/verdaccio-audit/node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
- "dev": true
- },
- "node_modules/verdaccio-audit/node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/verdaccio-audit/node_modules/tr46": {
"version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/verdaccio-audit/node_modules/webidl-conversions": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true
+ "dev": true,
+ "license": "BSD-2-Clause"
},
"node_modules/verdaccio-audit/node_modules/whatwg-url": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"node_modules/verdaccio-htpasswd": {
- "version": "12.0.0-next-7.10",
- "resolved": "https://registry.npmjs.org/verdaccio-htpasswd/-/verdaccio-htpasswd-12.0.0-next-7.10.tgz",
- "integrity": "sha512-+P7kxWgWSxRyTlP+IFySwgvQjt529zXTetNmupUgYtu09qCZMffdZ74aGASuCvWa4Vcqavmytzg8McqCNheFiA==",
+ "version": "12.0.0-next-7.16",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@verdaccio/core": "7.0.0-next-7.10",
+ "@verdaccio/core": "7.0.0-next-7.16",
"@verdaccio/file-locking": "12.0.0-next.1",
"apache-md5": "1.1.8",
"bcryptjs": "2.4.3",
@@ -41443,9 +42884,8 @@
},
"node_modules/verdaccio-htpasswd/node_modules/@verdaccio/file-locking": {
"version": "12.0.0-next.1",
- "resolved": "https://registry.npmjs.org/@verdaccio/file-locking/-/file-locking-12.0.0-next.1.tgz",
- "integrity": "sha512-Zb5G2HEhVRB0jCq4z7QA4dqTdRv/2kIsw2Nkm3j2HqC1OeJRxas3MJAF/OxzbAb1IN32lbg1zycMSk6NcbQkgQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"lockfile": "1.0.4"
},
@@ -41459,10 +42899,9 @@
},
"node_modules/verdaccio-htpasswd/node_modules/core-js": {
"version": "3.35.0",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz",
- "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
@@ -41478,109 +42917,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/verdaccio/node_modules/cookies": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz",
- "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==",
- "dev": true,
- "dependencies": {
- "depd": "~2.0.0",
- "keygrip": "~1.1.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/verdaccio/node_modules/envinfo": {
- "version": "7.11.0",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz",
- "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==",
- "dev": true,
- "bin": {
- "envinfo": "dist/cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/verdaccio/node_modules/express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "dev": true,
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/verdaccio/node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/verdaccio/node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dev": true,
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/verdaccio/node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
"node_modules/verdaccio/node_modules/js-yaml": {
"version": "4.1.0",
"dev": true,
@@ -41611,26 +42947,10 @@
"node": ">=10"
}
},
- "node_modules/verdaccio/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
- },
- "node_modules/verdaccio/node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
- "dev": true
- },
"node_modules/verdaccio/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==",
+ "version": "7.6.2",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -41638,33 +42958,6 @@
"node": ">=10"
}
},
- "node_modules/verdaccio/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==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/verdaccio/node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/verdaccio/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/verror": {
"version": "1.10.0",
"dev": true,
@@ -42147,13 +43440,13 @@
}
},
"node_modules/vinxi/node_modules/slash": {
- "name": "cross-spawn",
"version": "5.1.0",
"license": "MIT",
- "dependencies": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/vinxi/node_modules/string-width": {
@@ -43100,6 +44393,43 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/window-size": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-1.1.1.tgz",
+ "integrity": "sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA==",
+ "dependencies": {
+ "define-property": "^1.0.0",
+ "is-number": "^3.0.0"
+ },
+ "bin": {
+ "window-size": "cli.js"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/window-size/node_modules/is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/window-size/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/wonka": {
"version": "4.0.15",
"dev": true,
@@ -43245,7 +44575,6 @@
},
"node_modules/ws": {
"version": "8.13.0",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@@ -43482,11 +44811,15 @@
"node": ">=8"
}
},
+ "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=="
+ },
"node_modules/yup": {
"version": "0.32.11",
- "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz",
- "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.15.4",
"@types/lodash": "^4.14.175",
@@ -45172,9 +46505,8 @@
},
"packages/sdk-node/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,
+ "license": "MIT",
"bin": {
"prettier": "bin-prettier.js"
},
@@ -45437,8 +46769,6 @@
},
"packages/ui/node_modules/@clerk/elements": {
"version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@clerk/elements/-/elements-0.6.0.tgz",
- "integrity": "sha512-Re0dVYuSfhl9OqyxhWpIq9Si0j03XlpsdLpBeI6+fA5L3ODoppNcHbjb4CRHlm+LPL06Vp7KduS0miUT49pIFw==",
"license": "MIT",
"dependencies": {
"@clerk/types": "^4.6.0",
@@ -45466,8 +46796,6 @@
},
"packages/ui/node_modules/@xstate/react": {
"version": "4.1.1",
- "resolved": "https://registry.npmjs.org/@xstate/react/-/react-4.1.1.tgz",
- "integrity": "sha512-pFp/Y+bnczfaZ0V8B4LOhx3d6Gd71YKAPbzerGqydC2nsYN/mp7RZu3q/w6/kvI2hwR/jeDeetM7xc3JFZH2NA==",
"license": "MIT",
"dependencies": {
"use-isomorphic-layout-effect": "^1.1.2",
@@ -45485,13 +46813,660 @@
},
"packages/ui/node_modules/xstate": {
"version": "5.13.2",
- "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.13.2.tgz",
- "integrity": "sha512-cFbFJUuK7n8NGe9rsT9G8QjK/8KQO5WaxCkpl1GxnvSDb9oXM/+cbZbEtLT/YaAjDfaGA2nzOKyw5oev2LuNRw==",
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/xstate"
}
+ },
+ "packages/upgrade": {
+ "name": "@clerk/upgrade",
+ "version": "1.0.7",
+ "license": "MIT",
+ "dependencies": {
+ "@inkjs/ui": "^1.0.0",
+ "@jescalan/ink-markdown": "^2.0.0",
+ "ejs": "3.1.9",
+ "globby": "^14.0.1",
+ "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.3.1",
+ "read-pkg": "^9.0.1",
+ "semver-regex": "^4.0.5",
+ "temp-dir": "^3.0.0"
+ },
+ "bin": {
+ "clerk-upgrade": "dist/cli.js"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.24.7",
+ "@babel/preset-react": "^7.24.7",
+ "chalk": "^5.3.0",
+ "del-cli": "^5.1.0",
+ "eslint-config-custom": "*"
+ },
+ "engines": {
+ "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",
+ "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/node_modules/chalk": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+ "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+ "dev": true,
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/node_modules/globby": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz",
+ "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==",
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^2.1.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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/node_modules/marked": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz",
+ "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/node_modules/parse-json/node_modules/type-fest": {
+ "version": "4.20.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz",
+ "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/node_modules/read-pkg-up/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/node_modules/read-pkg/node_modules/hosted-git-info": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
+ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
+ "dependencies": {
+ "lru-cache": "^10.0.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "packages/upgrade/node_modules/read-pkg/node_modules/lru-cache": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+ "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+ "engines": {
+ "node": "14 || >=16.14"
+ }
+ },
+ "packages/upgrade/node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz",
+ "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==",
+ "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"
+ }
+ },
+ "packages/upgrade/node_modules/read-pkg/node_modules/type-fest": {
+ "version": "4.20.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz",
+ "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "packages/upgrade/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"
+ }
+ },
+ "packages/upgrade/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"
+ }
}
}
}
diff --git a/packages/upgrade/.eslintrc.cjs b/packages/upgrade/.eslintrc.cjs
new file mode 100644
index 00000000000..ace73617f09
--- /dev/null
+++ b/packages/upgrade/.eslintrc.cjs
@@ -0,0 +1,12 @@
+module.exports = {
+ root: true,
+ 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/.gitignore b/packages/upgrade/.gitignore
new file mode 100644
index 00000000000..241ac01f46f
--- /dev/null
+++ b/packages/upgrade/.gitignore
@@ -0,0 +1,66 @@
+# 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
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
new file mode 100644
index 00000000000..23df9f0b989
--- /dev/null
+++ b/packages/upgrade/README.md
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+# @clerk/upgrade
+
+
+
+[](https://clerk.com/discord)
+[](https://clerk.com/docs?utm_source=github&utm_medium=clerk_upgrade)
+[](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.
+
+## Getting Started
+
+### Prerequisites
+
+- Node.js `>=18.17.0` or later
+
+### Usage
+
+```sh
+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 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:
+
+```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. 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
new file mode 100644
index 00000000000..8da5d2a4a88
--- /dev/null
+++ b/packages/upgrade/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "@clerk/upgrade",
+ "version": "1.0.7",
+ "license": "MIT",
+ "type": "module",
+ "main": "dist/cli.js",
+ "bin": {
+ "clerk-upgrade": "dist/cli.js"
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "build": "npm run clean && NODE_ENV=production babel --out-dir=dist src --copy-files",
+ "clean": "del-cli dist/*",
+ "dev": "babel --out-dir=dist --watch src --copy-files",
+ "lint": "eslint src/",
+ "lint:publint": "publint"
+ },
+ "babel": {
+ "presets": [
+ "@babel/preset-react"
+ ]
+ },
+ "dependencies": {
+ "@inkjs/ui": "^1.0.0",
+ "@jescalan/ink-markdown": "^2.0.0",
+ "ejs": "3.1.9",
+ "globby": "^14.0.1",
+ "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.3.1",
+ "read-pkg": "^9.0.1",
+ "semver-regex": "^4.0.5",
+ "temp-dir": "^3.0.0"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.24.7",
+ "@babel/preset-react": "^7.24.7",
+ "chalk": "^5.3.0",
+ "del-cli": "^5.1.0",
+ "eslint-config-custom": "*"
+ },
+ "engines": {
+ "node": ">=18.17.0"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/upgrade/src/app.js b/packages/upgrade/src/app.js
new file mode 100644
index 00000000000..332530a2dc8
--- /dev/null
+++ b/packages/upgrade/src/app.js
@@ -0,0 +1,270 @@
+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 SDKS from './constants/sdks.js';
+import Scan from './scan.js';
+import getClerkMajorVersion from './util/get-clerk-version.js';
+import guessFrameworks from './util/guess-framework.js';
+
+export default function App({
+ _fromVersion,
+ _toVersion,
+ _sdk,
+ _dir = false,
+ _ignore = [],
+ _yolo = false,
+ noWarnings = false,
+ disableTelemetry = 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);
+ // 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);
+ const [configComplete, setConfigComplete] = useState(false);
+ const [configVerified, setConfigVerified] = useState(false);
+ const [uuid, setUuid] = useState();
+ 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());
+ }
+ const { guesses, _uuid } = guessFrameworks(dir, disableTelemetry);
+ console.log({ guesses, _uuid });
+ setUuid(_uuid);
+ setSdkGuesses(guesses);
+ 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 ${fromVersion}` : ''}
+ {toVersion ? ` to ${toVersion}` : ''}. Before we get started, a couple questions...
+
+
+ >
+ )}
+
+ {/* 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?
+
+ )}
+
+ {
+ 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 && (
+ <>
+
+ It looks like you currently are using version {fromVersionGuess} of
+ the {sdk} SDK. Is that correct?
+
+ {
+ 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:
+
+ setFromVersion(item.value)}
+ />
+ >
+ )} */}
+ {/* 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:
+
+ 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 && 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
+ {fromVersion}
+ to
+ {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;
+}
diff --git a/packages/upgrade/src/cli.js b/packages/upgrade/src/cli.js
new file mode 100644
index 00000000000..7054218efe0
--- /dev/null
+++ b/packages/upgrade/src/cli.js
@@ -0,0 +1,55 @@
+#!/usr/bin/env node
+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
+
+ 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
+ --disableTelemetry Do not send anonymous usage telemetry
+
+ Examples
+ $ clerk-upgrade --sdk=nextjs --dir=src/**
+ $ clerk-upgrade --ignore=**/public/** --ignore=**/dist/**
+ `,
+ {
+ importMeta: import.meta,
+ flags: {
+ 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 },
+ yolo: { type: 'boolean' },
+ noWarnings: { type: 'boolean' },
+ disableTelemetry: { type: 'boolean' },
+ },
+ },
+);
+
+render(
+ ,
+ // if having issues with errors being swallowed, uncomment this
+ // { debug: true },
+);
diff --git a/packages/upgrade/src/constants/sdks.js b/packages/upgrade/src/constants/sdks.js
new file mode 100644
index 00000000000..502fa900c49
--- /dev/null
+++ b/packages/upgrade/src/constants/sdks.js
@@ -0,0 +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: 'chrome-extension' },
+];
diff --git a/packages/upgrade/src/constants/versions.js b/packages/upgrade/src/constants/versions.js
new file mode 100644
index 00000000000..3e32d88b991
--- /dev/null
+++ b/packages/upgrade/src/constants/versions.js
@@ -0,0 +1,4 @@
+export default [
+ { label: 'Core 2', value: 'core-2' },
+ { label: 'Core 1', value: 'core-1' },
+];
diff --git a/packages/upgrade/src/guide-generators/core-2/backend/import-paths.mdx b/packages/upgrade/src/guide-generators/core-2/backend/import-paths.mdx
new file mode 100644
index 00000000000..58dcb04463c
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/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/src/guide-generators/core-2/backend/index.js b/packages/upgrade/src/guide-generators/core-2/backend/index.js
new file mode 100644
index 00000000000..7c8fb025632
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/backend/index.js
@@ -0,0 +1,50 @@
+import {
+ accordionForCategory,
+ assembleContent,
+ deprecationRemovalsAndHousekeeping,
+ frontmatter,
+ loadVersionChangeData,
+ markdown,
+ markdownTemplate,
+ singleItem,
+ writeToFile,
+} from '../../text-generation.js';
+
+const version = 'core-2';
+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} to Core 2`,
+ description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`,
+ }),
+ `# Upgrading \`${packageName}\` to Core 2`,
+ markdown('intro'),
+ markdownTemplate('prepare', { version: 'v1', packageName }),
+ markdown('node-version'),
+ markdownTemplate('update-version', { 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/src/guide-generators/core-2/backend/intro.mdx b/packages/upgrade/src/guide-generators/core-2/backend/intro.mdx
new file mode 100644
index 00000000000..0ae93fe5bff
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/backend/intro.mdx
@@ -0,0 +1,3 @@
+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/src/guide-generators/core-2/chrome-extension/index.js b/packages/upgrade/src/guide-generators/core-2/chrome-extension/index.js
new file mode 100644
index 00000000000..1de0d8420ba
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/chrome-extension/index.js
@@ -0,0 +1,46 @@
+import {
+ accordionForCategory,
+ assembleContent,
+ deprecationRemovalsAndHousekeeping,
+ frontmatter,
+ loadVersionChangeData,
+ markdown,
+ markdownTemplate,
+ singleItem,
+ writeToFile,
+} from '../../text-generation.js';
+
+const version = 'core-2';
+const name = 'chrome-extension';
+const properName = 'Chrome Extension';
+const packageName = '@clerk/chrome-extension';
+const cwd = `${version}/${name}`;
+
+async function generate() {
+ const data = await loadVersionChangeData(version, name);
+
+ return assembleContent({ data, cwd }, [
+ frontmatter({
+ title: `Upgrading ${properName} SDK to Core 2`,
+ description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`,
+ }),
+ `# Upgrading \`${packageName}\` to Core 2`,
+ markdown('intro'),
+ markdownTemplate('prepare', { version: 'v1', packageName }),
+ markdown('node-version'),
+ markdown('react-version'),
+ markdownTemplate('update-version', { packageName }),
+ markdown('cli'),
+ '## Breaking Changes',
+ singleItem('clerkprovider-tokencache'),
+ markdown('redesign-preview'),
+ markdown('after-sign-x-handling'),
+ markdown('orgs-claim'),
+ markdownTemplate('path-routing', { packageName }),
+ markdown('image-url'),
+ accordionForCategory('image-url'),
+ deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']),
+ ]);
+}
+
+generate().then(writeToFile(cwd));
diff --git a/packages/upgrade/src/guide-generators/core-2/chrome-extension/intro.mdx b/packages/upgrade/src/guide-generators/core-2/chrome-extension/intro.mdx
new file mode 100644
index 00000000000..6ba5a6a0bb0
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/chrome-extension/intro.mdx
@@ -0,0 +1,3 @@
+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/src/guide-generators/core-2/expo/index.js b/packages/upgrade/src/guide-generators/core-2/expo/index.js
new file mode 100644
index 00000000000..ee1f8d6bc7e
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/expo/index.js
@@ -0,0 +1,45 @@
+import {
+ accordionForCategory,
+ assembleContent,
+ deprecationRemovalsAndHousekeeping,
+ frontmatter,
+ loadVersionChangeData,
+ markdown,
+ markdownTemplate,
+ writeToFile,
+} from '../../text-generation.js';
+
+const version = 'core-2';
+const semverVersion = 'v1';
+const name = 'expo';
+const properName = 'Expo';
+const packageName = '@clerk/clerk-expo';
+const cwd = `${version}/${name}`;
+
+async function generate() {
+ const data = await loadVersionChangeData(version, name);
+
+ return assembleContent({ data, cwd }, [
+ frontmatter({
+ title: `Upgrading ${properName} to Core 2`,
+ description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`,
+ }),
+ `# Upgrading \`${packageName}\` to Core 2`,
+ markdown('intro'),
+ markdownTemplate('prepare', { version: semverVersion, packageName }),
+ markdown('node-version'),
+ markdown('react-version'),
+ markdownTemplate('update-version', { packageName }),
+ markdown('cli'),
+ '## Breaking Changes',
+ markdown('redesign-preview'),
+ markdown('after-sign-x-handling'),
+ markdown('orgs-claim'),
+ markdownTemplate('path-routing', { packageName }),
+ markdown('image-url'),
+ accordionForCategory('image-url'),
+ deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']),
+ ]);
+}
+
+generate().then(writeToFile(cwd));
diff --git a/packages/upgrade/src/guide-generators/core-2/expo/intro.mdx b/packages/upgrade/src/guide-generators/core-2/expo/intro.mdx
new file mode 100644
index 00000000000..97d967e3ba1
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/expo/intro.mdx
@@ -0,0 +1,3 @@
+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/src/guide-generators/core-2/fastify/index.js b/packages/upgrade/src/guide-generators/core-2/fastify/index.js
new file mode 100644
index 00000000000..4fcd6907c84
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/fastify/index.js
@@ -0,0 +1,41 @@
+import {
+ accordionForCategory,
+ assembleContent,
+ deprecationRemovalsAndHousekeeping,
+ frontmatter,
+ loadVersionChangeData,
+ markdown,
+ markdownTemplate,
+ writeToFile,
+} from '../../text-generation.js';
+
+const version = 'core-2';
+const semverVersion = 'v1';
+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} to Core 2`,
+ description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`,
+ }),
+ `# Upgrading \`${packageName}\` to Core 2`,
+ markdown('intro'),
+ markdownTemplate('prepare', { version: semverVersion, packageName }),
+ markdown('node-version'),
+ markdownTemplate('update-version', { 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/src/guide-generators/core-2/fastify/intro.mdx b/packages/upgrade/src/guide-generators/core-2/fastify/intro.mdx
new file mode 100644
index 00000000000..b5f31c35ee0
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/fastify/intro.mdx
@@ -0,0 +1,3 @@
+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/src/guide-generators/core-2/gatsby/index.js b/packages/upgrade/src/guide-generators/core-2/gatsby/index.js
new file mode 100644
index 00000000000..15b59659fad
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/gatsby/index.js
@@ -0,0 +1,47 @@
+import {
+ accordionForCategory,
+ assembleContent,
+ deprecationRemovalsAndHousekeeping,
+ frontmatter,
+ loadVersionChangeData,
+ markdown,
+ markdownTemplate,
+ singleItem,
+ writeToFile,
+} from '../../text-generation.js';
+
+const version = 'core-2';
+const semverVersion = 'v5';
+const name = 'gatsby';
+const properName = 'Gatsby';
+const packageName = 'gatsby-plugin-clerk';
+const cwd = `${version}/${name}`;
+
+async function generate() {
+ const data = await loadVersionChangeData(version, name);
+
+ return assembleContent({ data, cwd }, [
+ frontmatter({
+ title: `Upgrading ${properName} to Core 2`,
+ description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version`,
+ }),
+ `# Upgrading \`${packageName}\` to Core 2`,
+ markdown('intro'),
+ markdownTemplate('prepare', { version: semverVersion, packageName }),
+ markdown('node-version'),
+ markdown('react-version'),
+ markdownTemplate('update-version', { packageName: 'gatsby-plugin-clerk' }),
+ markdown('cli'),
+ '## Breaking Changes',
+ markdown('redesign-preview'),
+ markdown('after-sign-x-handling'),
+ singleItem('aftersignxurl-changes'),
+ markdown('orgs-claim'),
+ markdownTemplate('path-routing', { packageName }),
+ markdown('image-url'),
+ accordionForCategory('image-url'),
+ deprecationRemovalsAndHousekeeping(),
+ ]);
+}
+
+generate().then(writeToFile(cwd));
diff --git a/packages/upgrade/src/guide-generators/core-2/gatsby/intro.mdx b/packages/upgrade/src/guide-generators/core-2/gatsby/intro.mdx
new file mode 100644
index 00000000000..76909cb1f22
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/gatsby/intro.mdx
@@ -0,0 +1,3 @@
+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/src/guide-generators/core-2/generate-all.sh b/packages/upgrade/src/guide-generators/core-2/generate-all.sh
new file mode 100755
index 00000000000..e9978f30d8e
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/generate-all.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+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/chrome-extension/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/src/guide-generators/core-2/js/index.js b/packages/upgrade/src/guide-generators/core-2/js/index.js
new file mode 100644
index 00000000000..b03eee8502e
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/js/index.js
@@ -0,0 +1,51 @@
+import {
+ accordionForCategory,
+ assembleContent,
+ deprecationRemovalsAndHousekeeping,
+ frontmatter,
+ loadVersionChangeData,
+ markdown,
+ markdownTemplate,
+ singleItem,
+ writeToFile,
+} from '../../text-generation.js';
+
+const version = 'core-2';
+const semverVersion = '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} to Core 2`,
+ description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`,
+ }),
+ `# Upgrading \`${packageName}\` to Core 2`,
+ markdown('intro'),
+ markdownTemplate('prepare', { version: semverVersion, packageName }),
+ markdownTemplate('update-version', { packageName }),
+ markdown('cli'),
+ '## Breaking Changes',
+ markdown('redesign-preview'),
+ markdown('after-sign-x-handling'),
+ singleItem('aftersignxurl-changes'),
+ markdown('orgs-claim'),
+ markdownTemplate('path-routing', { packageName }),
+ 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/src/guide-generators/core-2/js/intro.mdx b/packages/upgrade/src/guide-generators/core-2/js/intro.mdx
new file mode 100644
index 00000000000..f344da4a610
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/js/intro.mdx
@@ -0,0 +1,3 @@
+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/src/guide-generators/core-2/nextjs/import-changes.mdx b/packages/upgrade/src/guide-generators/core-2/nextjs/import-changes.mdx
new file mode 100644
index 00000000000..56747e93f9c
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/nextjs/import-changes.mdx
@@ -0,0 +1,98 @@
+### 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](#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. 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 {
+ 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/src/guide-generators/core-2/nextjs/index.js b/packages/upgrade/src/guide-generators/core-2/nextjs/index.js
new file mode 100644
index 00000000000..23c52e2b5de
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/nextjs/index.js
@@ -0,0 +1,50 @@
+import {
+ accordionForCategory,
+ assembleContent,
+ deprecationRemovalsAndHousekeeping,
+ frontmatter,
+ loadVersionChangeData,
+ markdown,
+ markdownTemplate,
+ singleItem,
+ writeToFile,
+} from '../../text-generation.js';
+
+const version = 'core-2';
+const semverVersion = 'v5';
+const name = 'nextjs';
+const properName = 'Next.js';
+const packageName = '@clerk/nextjs';
+const cwd = `${version}/${name}`;
+
+async function generate() {
+ const data = await loadVersionChangeData(version, name);
+
+ return assembleContent({ data, cwd }, [
+ frontmatter({
+ title: `Upgrading ${properName} to Core 2`,
+ description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`,
+ }),
+ `# Upgrading \`${packageName}\` to Core 2`,
+ markdown('intro'),
+ markdownTemplate('prepare', { version: semverVersion, packageName }),
+ markdown('node-version'),
+ markdown('react-version'),
+ markdown('nextjs-version'),
+ markdownTemplate('update-version', { packageName }),
+ markdown('cli'),
+ '## Breaking Changes',
+ markdown('redesign-preview'),
+ markdown('middleware-changes'),
+ markdown('import-changes'),
+ markdown('after-sign-x-handling'),
+ singleItem('aftersignxurl-changes'),
+ markdown('orgs-claim'),
+ markdownTemplate('path-routing', { packageName }),
+ markdown('image-url'),
+ accordionForCategory('image-url'),
+ deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']),
+ ]);
+}
+
+generate().then(writeToFile(cwd));
diff --git a/packages/upgrade/src/guide-generators/core-2/nextjs/intro.mdx b/packages/upgrade/src/guide-generators/core-2/nextjs/intro.mdx
new file mode 100644
index 00000000000..b31974ebd0f
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/nextjs/intro.mdx
@@ -0,0 +1,3 @@
+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/src/guide-generators/core-2/nextjs/middleware-changes.mdx b/packages/upgrade/src/guide-generators/core-2/nextjs/middleware-changes.mdx
new file mode 100644
index 00000000000..f3b8bf260fe
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/nextjs/middleware-changes.mdx
@@ -0,0 +1,218 @@
+### 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 should alleviate the issues folks had with `authMiddleware()`.
+
+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 demonstrates route protection based on both authentication and authorization:
+
+```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.
+- 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()`
+
+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, 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((auth) => auth().protect())
+
+ 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) 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:
+
+ Before:
+
+ ```ts filename="middleware.ts"
+ import { authMiddleware } from "@clerk/nextjs"
+
+ export default authMiddleware({
+ publicRoutes: ["/", "/contact"],
+ })
+
+ export const config = {
+ matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"],
+ }
+ ```
+
+ After:
+
+ ```ts filename="middleware.ts"
+ import {
+ clerkMiddleware,
+ createRouteMatcher
+ } from "@clerk/nextjs/server"
+
+ 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)(.*)"],
+ }
+ ```
+
+
+
+ An example can be seen below of code that ensures that all routes are 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)(.*)"],
+ }
+ ```
+
+
+
+ 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)(.*)"],
+ }
+ ```
+
+
+
diff --git a/packages/upgrade/src/guide-generators/core-2/nextjs/nextjs-version.mdx b/packages/upgrade/src/guide-generators/core-2/nextjs/nextjs-version.mdx
new file mode 100644
index 00000000000..fd543e128b3
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/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/src/guide-generators/core-2/node/index.js b/packages/upgrade/src/guide-generators/core-2/node/index.js
new file mode 100644
index 00000000000..63bf1cc7d10
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/node/index.js
@@ -0,0 +1,44 @@
+import {
+ accordionForCategory,
+ assembleContent,
+ deprecationRemovalsAndHousekeeping,
+ frontmatter,
+ loadVersionChangeData,
+ markdown,
+ markdownTemplate,
+ singleItem,
+ writeToFile,
+} from '../../text-generation.js';
+
+const version = 'core-2';
+const semverVersion = 'v5';
+const name = 'node';
+const properName = 'Node';
+const packageName = '@clerk/clerk-sdk-node';
+const cwd = `${version}/${name}`;
+
+async function generate() {
+ const data = await loadVersionChangeData(version, name);
+
+ return assembleContent({ data, cwd }, [
+ frontmatter({
+ title: `Upgrading ${properName} to Core 2`,
+ description: `Learn how to upgrade Clerk's ${properName} SDK to the lastest version.`,
+ }),
+ `# Upgrading \`${packageName}\` to Core 2`,
+ markdown('intro'),
+ markdownTemplate('prepare', { version: semverVersion, packageName }),
+ markdown('node-version'),
+ 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(['pagination-return', 'pagination-args', 'error-imports']),
+ ]);
+}
+
+generate().then(writeToFile(cwd));
diff --git a/packages/upgrade/src/guide-generators/core-2/node/intro.mdx b/packages/upgrade/src/guide-generators/core-2/node/intro.mdx
new file mode 100644
index 00000000000..0050ad792c9
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/node/intro.mdx
@@ -0,0 +1,3 @@
+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/src/guide-generators/core-2/node/node-setters-removals.mdx b/packages/upgrade/src/guide-generators/core-2/node/node-setters-removals.mdx
new file mode 100644
index 00000000000..b5d9d4f1a64
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/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/src/guide-generators/core-2/overview/index.js b/packages/upgrade/src/guide-generators/core-2/overview/index.js
new file mode 100644
index 00000000000..9655397f444
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/overview/index.js
@@ -0,0 +1,15 @@
+import { assembleContent, frontmatter, markdown, writeToFile } from '../../text-generation.js';
+
+const cwd = 'core-2/overview';
+
+async function generate() {
+ return assembleContent({ data: {}, cwd }, [
+ frontmatter({
+ title: `Upgrading to Clerk Core 2`,
+ description: `Learn how to upgrade to the latest version of Clerk's SDKs`,
+ }),
+ markdown('intro'),
+ ]);
+}
+
+generate().then(writeToFile(cwd));
diff --git a/packages/upgrade/src/guide-generators/core-2/overview/intro.mdx b/packages/upgrade/src/guide-generators/core-2/overview/intro.mdx
new file mode 100644
index 00000000000..1f1d7f15a24
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/overview/intro.mdx
@@ -0,0 +1,25 @@
+# Upgrading to Clerk Core 2
+
+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.
+- 🧹 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)
+
+## SDK Guides
+
+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](/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/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.
diff --git a/packages/upgrade/src/guide-generators/core-2/react/hof-removals.mdx b/packages/upgrade/src/guide-generators/core-2/react/hof-removals.mdx
new file mode 100644
index 00000000000..3500c38803b
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/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/src/guide-generators/core-2/react/index.js b/packages/upgrade/src/guide-generators/core-2/react/index.js
new file mode 100644
index 00000000000..baec27cae58
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/react/index.js
@@ -0,0 +1,48 @@
+import {
+ accordionForCategory,
+ assembleContent,
+ deprecationRemovalsAndHousekeeping,
+ frontmatter,
+ loadVersionChangeData,
+ markdown,
+ markdownTemplate,
+ singleItem,
+ writeToFile,
+} from '../../text-generation.js';
+
+const version = 'core-2';
+const semverVersion = 'v5';
+const name = 'react';
+const properName = 'React';
+const packageName = '@clerk/clerk-react';
+const cwd = `${version}/${name}`;
+
+async function generate() {
+ const data = await loadVersionChangeData(version, name);
+
+ return assembleContent({ data, cwd }, [
+ frontmatter({
+ title: `Upgrading ${properName} to Core 2`,
+ description: `Learn how to upgrade Clerk's ${properName} SDK to the latest version.`,
+ }),
+ `# Upgrading \`${packageName}\` to Core 2`,
+ markdown('intro'),
+ markdownTemplate('prepare', { packageName, version: semverVersion }),
+ markdown('node-version'),
+ markdown('react-version'),
+ markdownTemplate('update-version', { packageName }),
+ markdown('cli'),
+ '## 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 }),
+ markdown('image-url'),
+ accordionForCategory('image-url'),
+ deprecationRemovalsAndHousekeeping(['hof-removal', 'pagination-return', 'pagination-args', 'error-imports']),
+ ]);
+}
+
+generate().then(writeToFile(cwd));
diff --git a/packages/upgrade/src/guide-generators/core-2/react/intro.mdx b/packages/upgrade/src/guide-generators/core-2/react/intro.mdx
new file mode 100644
index 00000000000..e1e96689124
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/react/intro.mdx
@@ -0,0 +1,3 @@
+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/src/guide-generators/core-2/remix/index.js b/packages/upgrade/src/guide-generators/core-2/remix/index.js
new file mode 100644
index 00000000000..fd478336ece
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/remix/index.js
@@ -0,0 +1,48 @@
+import {
+ accordionForCategory,
+ assembleContent,
+ deprecationRemovalsAndHousekeeping,
+ frontmatter,
+ loadVersionChangeData,
+ markdown,
+ markdownTemplate,
+ singleItem,
+ writeToFile,
+} from '../../text-generation.js';
+
+const version = 'core-2';
+const semverVersion = 'v4';
+const name = 'remix';
+const properName = 'Remix';
+const packageName = '@clerk/remix';
+const cwd = `${version}/${name}`;
+
+async function generate() {
+ const data = await loadVersionChangeData(version, name);
+
+ return assembleContent({ data: data, cwd }, [
+ frontmatter({
+ title: `Upgrading ${properName} to Core 2`,
+ description: `Learn how to upgrade from the Clerk ${properName} SDK to the latest version.`,
+ }),
+ `# Upgrading \`${packageName}\` to Core 2`,
+ markdown('intro'),
+ markdownTemplate('prepare', { version: semverVersion, packageName }),
+ markdown('node-version'),
+ markdown('react-version'),
+ markdownTemplate('update-version', { packageName }),
+ markdown('cli'),
+ '## Breaking Changes',
+ singleItem('clerkerrorboundary-removed'),
+ markdown('redesign-preview'),
+ markdown('after-sign-x-handling'),
+ singleItem('aftersignxurl-changes'),
+ markdown('orgs-claim'),
+ markdownTemplate('path-routing', { packageName }),
+ markdown('image-url'),
+ accordionForCategory('image-url'),
+ deprecationRemovalsAndHousekeeping(),
+ ]);
+}
+
+generate().then(writeToFile(cwd));
diff --git a/packages/upgrade/src/guide-generators/core-2/remix/intro.mdx b/packages/upgrade/src/guide-generators/core-2/remix/intro.mdx
new file mode 100644
index 00000000000..d1ec70ce1a2
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/remix/intro.mdx
@@ -0,0 +1,3 @@
+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/src/guide-generators/core-2/retheme/index.js b/packages/upgrade/src/guide-generators/core-2/retheme/index.js
new file mode 100644
index 00000000000..3db473d47ca
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/retheme/index.js
@@ -0,0 +1,38 @@
+import {
+ accordionForCategory,
+ assembleContent,
+ frontmatter,
+ loadVersionChangeData,
+ markdown,
+ writeToFile,
+} from '../../text-generation.js';
+
+const cwd = 'core-2/retheme';
+
+async function generate() {
+ const data = await loadVersionChangeData('core-2', '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, semibold: 600, bold: 700 }\`.\n`,
+ };
+
+ return assembleContent({ data: data, cwd }, [
+ frontmatter({
+ 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 Core 2',
+ markdown('intro'),
+ '## Appearance Changes',
+ accordionForCategory('appearance', { additionalItems: [defaultsChangeItem] }),
+ '## Localization Changes',
+ accordionForCategory('localization'),
+ ]);
+}
+
+generate().then(writeToFile(cwd));
diff --git a/packages/upgrade/src/guide-generators/core-2/retheme/intro.mdx b/packages/upgrade/src/guide-generators/core-2/retheme/intro.mdx
new file mode 100644
index 00000000000..844960a3f94
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/retheme/intro.mdx
@@ -0,0 +1,11 @@
+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.
+
+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.
diff --git a/packages/upgrade/src/guide-generators/core-2/shared/after-sign-x-handling.mdx b/packages/upgrade/src/guide-generators/core-2/shared/after-sign-x-handling.mdx
new file mode 100644
index 00000000000..a10a3ea97ae
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/shared/after-sign-x-handling.mdx
@@ -0,0 +1,10 @@
+### 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.
+
+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/src/guide-generators/core-2/shared/cli.mdx b/packages/upgrade/src/guide-generators/core-2/shared/cli.mdx
new file mode 100644
index 00000000000..d96574add0b
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/shared/cli.mdx
@@ -0,0 +1,22 @@
+## CLI upgrade helper
+
+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:
+
+
+ ```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/src/guide-generators/core-2/shared/deprecation-removals.mdx b/packages/upgrade/src/guide-generators/core-2/shared/deprecation-removals.mdx
new file mode 100644
index 00000000000..c42d92131a9
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/shared/deprecation-removals.mdx
@@ -0,0 +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`). 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/src/guide-generators/core-2/shared/image-url.mdx b/packages/upgrade/src/guide-generators/core-2/shared/image-url.mdx
new file mode 100644
index 00000000000..56a484fe021
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/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/src/guide-generators/core-2/shared/node-version.mdx b/packages/upgrade/src/guide-generators/core-2/shared/node-version.mdx
new file mode 100644
index 00000000000..54815ce7100
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/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 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/src/guide-generators/core-2/shared/orgs-claim.mdx b/packages/upgrade/src/guide-generators/core-2/shared/orgs-claim.mdx
new file mode 100644
index 00000000000..a2bfc9590dc
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/shared/orgs-claim.mdx
@@ -0,0 +1,50 @@
+### Removed: `orgs` claim on JWT
+
+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.
+
+
+
+ ```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/src/guide-generators/core-2/shared/pagination-args.mdx b/packages/upgrade/src/guide-generators/core-2/shared/pagination-args.mdx
new file mode 100644
index 00000000000..3d8468f3884
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/shared/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/src/guide-generators/core-2/shared/pagination-return.mdx b/packages/upgrade/src/guide-generators/core-2/shared/pagination-return.mdx
new file mode 100644
index 00000000000..4867faf3dbf
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/shared/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/src/guide-generators/core-2/shared/path-routing.mdx b/packages/upgrade/src/guide-generators/core-2/shared/path-routing.mdx
new file mode 100644
index 00000000000..e36dee9c0b3
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/shared/path-routing.mdx
@@ -0,0 +1,57 @@
+### 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
+
+
+```
+
+<% 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
+```
+
+<% } %>
+
+If you have defined both environment variables, you're able to use the ` ` and ` ` components without any props, as such:
+
+```jsx
+
+
+```
+
+<% } %>
diff --git a/packages/upgrade/src/guide-generators/core-2/shared/prepare.mdx b/packages/upgrade/src/guide-generators/core-2/shared/prepare.mdx
new file mode 100644
index 00000000000..a252392581b
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/shared/prepare.mdx
@@ -0,0 +1,5 @@
+## 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 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.
+
+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/src/guide-generators/core-2/shared/react-version.mdx b/packages/upgrade/src/guide-generators/core-2/shared/react-version.mdx
new file mode 100644
index 00000000000..5a97275214f
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/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/src/guide-generators/core-2/shared/redesign-preview.mdx b/packages/upgrade/src/guide-generators/core-2/shared/redesign-preview.mdx
new file mode 100644
index 00000000000..4f127e11b8b
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/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 »](component-redesign)
diff --git a/packages/upgrade/src/guide-generators/core-2/shared/update-version.mdx b/packages/upgrade/src/guide-generators/core-2/shared/update-version.mdx
new file mode 100644
index 00000000000..21151cc19b4
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/core-2/shared/update-version.mdx
@@ -0,0 +1,18 @@
+## Updating to Core 2
+
+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 %>
+ ```
+
+ ```bash filename="terminal"
+ yarn add <%= packageName %>
+ ```
+
+ ```bash filename="terminal"
+ pnpm add <%= packageName %>
+ ```
+
+
diff --git a/packages/upgrade/src/guide-generators/text-generation.js b/packages/upgrade/src/guide-generators/text-generation.js
new file mode 100644
index 00000000000..8f447d1ffb2
--- /dev/null
+++ b/packages/upgrade/src/guide-generators/text-generation.js
@@ -0,0 +1,122 @@
+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')}
+---
+
+{/* 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
+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 = filterCategories(data, categories);
+ 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 ||= [];
+
+ const hasDeprecations = filterCategories(opts.data, 'deprecation-removal').length;
+ const hasOtherChanges = filterCategories(opts.data, [undefined, ...includeCategories]).length;
+
+ const content = ['### Deprecation removals & housekeeping', markdown('deprecation-removals')];
+
+ 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
+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
+ .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/src/img/alternativemethods-backlink.png b/packages/upgrade/src/img/alternativemethods-backlink.png
new file mode 100644
index 00000000000..8ea85bf42c2
Binary files /dev/null and b/packages/upgrade/src/img/alternativemethods-backlink.png differ
diff --git a/packages/upgrade/src/img/button-to-organizationlistcreateorganizationactionbutton.png b/packages/upgrade/src/img/button-to-organizationlistcreateorganizationactionbutton.png
new file mode 100644
index 00000000000..695c6002cfc
Binary files /dev/null and b/packages/upgrade/src/img/button-to-organizationlistcreateorganizationactionbutton.png differ
diff --git a/packages/upgrade/src/img/connected-accounts-dropdown.png b/packages/upgrade/src/img/connected-accounts-dropdown.png
new file mode 100644
index 00000000000..a280d13b8cf
Binary files /dev/null and b/packages/upgrade/src/img/connected-accounts-dropdown.png differ
diff --git a/packages/upgrade/src/img/mfa-dropdown.png b/packages/upgrade/src/img/mfa-dropdown.png
new file mode 100644
index 00000000000..2aa70fd9871
Binary files /dev/null and b/packages/upgrade/src/img/mfa-dropdown.png differ
diff --git a/packages/upgrade/src/img/organizationprofile-settings.png b/packages/upgrade/src/img/organizationprofile-settings.png
new file mode 100644
index 00000000000..a7fe9541103
Binary files /dev/null and b/packages/upgrade/src/img/organizationprofile-settings.png differ
diff --git a/packages/upgrade/src/img/remove-identitypreview-avatar.png b/packages/upgrade/src/img/remove-identitypreview-avatar.png
new file mode 100644
index 00000000000..7f7c7d898cb
Binary files /dev/null and b/packages/upgrade/src/img/remove-identitypreview-avatar.png differ
diff --git a/packages/upgrade/src/img/remove-socialbuttonsblockbuttonarrow.png b/packages/upgrade/src/img/remove-socialbuttonsblockbuttonarrow.png
new file mode 100644
index 00000000000..0f43eed7496
Binary files /dev/null and b/packages/upgrade/src/img/remove-socialbuttonsblockbuttonarrow.png differ
diff --git a/packages/upgrade/src/img/userbuttonpopoveractionbuttontext-removed.png b/packages/upgrade/src/img/userbuttonpopoveractionbuttontext-removed.png
new file mode 100644
index 00000000000..377b16b8613
Binary files /dev/null and b/packages/upgrade/src/img/userbuttonpopoveractionbuttontext-removed.png differ
diff --git a/packages/upgrade/src/img/userprofile-security.png b/packages/upgrade/src/img/userprofile-security.png
new file mode 100644
index 00000000000..212b7dee9a7
Binary files /dev/null and b/packages/upgrade/src/img/userprofile-security.png differ
diff --git a/packages/upgrade/src/scan.js b/packages/upgrade/src/scan.js
new file mode 100644
index 00000000000..100317ff631
--- /dev/null
+++ b/packages/upgrade/src/scan.js
@@ -0,0 +1,201 @@
+import { ProgressBar } from '@inkjs/ui';
+import fs from 'fs/promises';
+import { convertPathToPattern, 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, 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
+ // 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 ${toVersion} migration`);
+ import(`./versions/${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(convertPathToPattern(path.resolve(dir)), { ignore: ignore.filter(Boolean) }).then(files => {
+ setFiles(files);
+ });
+ }, [dir, ignore]);
+
+ // Read files and scan regexes
+ // ---------------------------
+ // result = `results` set to format
+ useEffect(() => {
+ if (!matchers || !files) {
+ return;
+ }
+ const allResults = {};
+
+ Promise.all(
+ // first we read all the files
+ files.map(async (file, idx) => {
+ const content = await fs.readFile(file, 'utf8');
+
+ // 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;
+ }
+
+ // for each match, add to `instances` array
+ matches.map(match => {
+ if (noWarnings && matcherConfig.warning) {
+ return;
+ }
+
+ // create if not exists
+ if (!allResults[matcherConfig.title]) {
+ allResults[matcherConfig.title] = { instances: [], ...matcherConfig };
+ }
+
+ const position = indexToPosition(content, match.index, { oneBased: true });
+ const fileRelative = path.relative(process.cwd(), file);
+
+ // 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;
+ }
+
+ allResults[matcherConfig.title].instances.push({
+ sdk,
+ position,
+ file: fileRelative,
+ });
+ });
+ });
+ }
+
+ setStatus(`Scanning ${file}`);
+ setProgress(Math.ceil((idx / files.length) * 100));
+ }),
+ )
+ .then(() => {
+ 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}`,
+ surface: 'Clerk Migration Tool',
+ location: 'CLI',
+ title: item.title,
+ instances: item.instances.length,
+ fromVersion,
+ toVersion,
+ },
+ timestamp: new Date().toISOString(),
+ };
+ }),
+ }),
+ });
+ }
+
+ 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, disableTelemetry]);
+
+ return complete ? (
+ <>
+ ✓ {status}
+
+ {!!results.length && }
+ >
+ ) : (
+ <>
+
+ {status}
+ >
+ );
+}
diff --git a/packages/upgrade/src/util/all-titles.js b/packages/upgrade/src/util/all-titles.js
new file mode 100644
index 00000000000..2e1bb523687
--- /dev/null
+++ b/packages/upgrade/src/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));
diff --git a/packages/upgrade/src/util/expandable-list.js b/packages/upgrade/src/util/expandable-list.js
new file mode 100644
index 00000000000..c960163af79
--- /dev/null
+++ b/packages/upgrade/src/util/expandable-list.js
@@ -0,0 +1,227 @@
+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}`,
+ );
+
+ const singleBorderStyle = {
+ topLeft: ' ',
+ top: '─',
+ topRight: ' ',
+ left: '',
+ bottomLeft: ' ',
+ bottom: '─',
+ bottomRight: ' ',
+ right: '',
+ };
+
+ const doubleBorderStyle = {
+ topLeft: ' ',
+ top: '═',
+ topRight: ' ',
+ left: '',
+ bottomLeft: ' ',
+ bottom: '═',
+ bottomRight: ' ',
+ right: '',
+ };
+
+ 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}
+
+ )}
+ >
+ );
+}
+
+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 };
+ }
+}
diff --git a/packages/upgrade/src/util/generate-changelog.js b/packages/upgrade/src/util/generate-changelog.js
new file mode 100644
index 00000000000..2e1301aabea
--- /dev/null
+++ b/packages/upgrade/src/util/generate-changelog.js
@@ -0,0 +1,35 @@
+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 += `
+${parseInline(entry.title)}
+
+Regex matcher: \`${entry.matcher}\`
+
+${entry.content}
+ \n\n`;
+ });
+ }
+
+ return output;
+}
+
+generate().then(console.log);
+
+function getSdkName(val) {
+ return SDKS.find(sdk => val === sdk.value).label;
+}
diff --git a/packages/upgrade/src/util/get-clerk-version.js b/packages/upgrade/src/util/get-clerk-version.js
new file mode 100644
index 00000000000..98baeddc9fc
--- /dev/null
+++ b/packages/upgrade/src/util/get-clerk-version.js
@@ -0,0 +1,8 @@
+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;
+}
diff --git a/packages/upgrade/src/util/guess-framework.js b/packages/upgrade/src/util/guess-framework.js
new file mode 100644
index 00000000000..a2332b63c8b
--- /dev/null
+++ b/packages/upgrade/src/util/guess-framework.js
@@ -0,0 +1,59 @@
+import { createHash, randomUUID } from 'crypto';
+import fs from 'fs';
+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
+// 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) {
+ 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(JSON.stringify(pkg));
+
+ // no guessing if there are no deps
+ 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 });
+ }
+ return m;
+ }, []),
+ };
+}
diff --git a/packages/upgrade/src/util/load-change.js b/packages/upgrade/src/util/load-change.js
new file mode 100644
index 00000000000..42e1e22c84b
--- /dev/null
+++ b/packages/upgrade/src/util/load-change.js
@@ -0,0 +1,36 @@
+import fs from 'fs';
+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', `${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');
+ 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,
+ category: fm.category,
+ link: `${baseUrl}#${slug}`,
+ };
+ });
+ };
+}
diff --git a/packages/upgrade/src/versions/core-2/backend/api-url-value-changed.md b/packages/upgrade/src/versions/core-2/backend/api-url-value-changed.md
new file mode 100644
index 00000000000..2471b007078
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/api-url-value-changed.md
@@ -0,0 +1,8 @@
+---
+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/src/versions/core-2/backend/authenticaterequest-params-change.md b/packages/upgrade/src/versions/core-2/backend/authenticaterequest-params-change.md
new file mode 100644
index 00000000000..dcd97698a4b
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/authenticaterequest-params-change.md
@@ -0,0 +1,13 @@
+---
+title: '`request` separated from `options` as params to `authenticateRequest`'
+warning: true
+category: 'skip'
+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/src/versions/core-2/backend/buildrequesturl-removed.md b/packages/upgrade/src/versions/core-2/backend/buildrequesturl-removed.md
new file mode 100644
index 00000000000..a30526271dc
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/buildrequesturl-removed.md
@@ -0,0 +1,7 @@
+---
+title: '`buildRequestUrl` import removed'
+matcher: "import\\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 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/src/versions/core-2/backend/clerk-import.md b/packages/upgrade/src/versions/core-2/backend/clerk-import.md
new file mode 100644
index 00000000000..896231bdc09
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/clerk-import.md
@@ -0,0 +1,15 @@
+---
+title: '`Clerk` -> `createClerkClient`'
+matcher: "import\\s+{[^}]*?Clerk[\\s\\S]*?}\\s+from\\s+['\"]@clerk/backend['\"]"
+matcherFlags: 'm'
+---
+
+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';
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/client-unstableoptions-removed.md b/packages/upgrade/src/versions/core-2/backend/client-unstableoptions-removed.md
new file mode 100644
index 00000000000..24653ab7981
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/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/src/versions/core-2/backend/clockskewinseconds.md b/packages/upgrade/src/versions/core-2/backend/clockskewinseconds.md
new file mode 100644
index 00000000000..92343ef2330
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/clockskewinseconds.md
@@ -0,0 +1,16 @@
+---
+title: '`clockSkewInSeconds` -> `clockSkewInMs`'
+matcher:
+ - "verifyJwt\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?\\)"
+ - "verifyToken\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?\\)"
+ - "authenticateRequest\\([\\s\\S]*?(clockSkewInSeconds):[\\s\\S]*?\\)"
+matcherFlags: 'm'
+category: 'skip'
+replaceWithString: '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`
diff --git a/packages/upgrade/src/versions/core-2/backend/constants-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/constants-import-path-move.md
new file mode 100644
index 00000000000..9615c6a3ffe
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/constants-import-path-move.md
@@ -0,0 +1,14 @@
+---
+title: '`constants` import moved to `@clerk/backend/internal`'
+matcher: "import\\s+{[^}]*?constants[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]"
+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
+- import { constants } from "@clerk/backend"
++ import { constants } from "@clerk/backend/internal"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/createauthenticaterequest-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/createauthenticaterequest-import-path-move.md
new file mode 100644
index 00000000000..40cc45bebc2
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/createauthenticaterequest-import-path-move.md
@@ -0,0 +1,14 @@
+---
+title: '`createAuthenticateRequest` import moved to `@clerk/backend/internal`'
+matcher: "import\\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
+- import { createAuthenticateRequest } from "@clerk/backend"
++ import { createAuthenticateRequest } from "@clerk/backend/internal"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/backend/createclerkclient-apikey.md
new file mode 100644
index 00000000000..49493d5f63e
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/createclerkclient-apikey.md
@@ -0,0 +1,19 @@
+---
+title: '`apiKey` -> `secretKey` as param to createClerkClient'
+matcher: "(?:createClerkClient|Clerk)\\(\\s*{[\\s\\S]*?frontendApi:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+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.
+
+```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: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/createclerkclient-frontendapi.md b/packages/upgrade/src/versions/core-2/backend/createclerkclient-frontendapi.md
new file mode 100644
index 00000000000..18c6704faca
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/createclerkclient-frontendapi.md
@@ -0,0 +1,19 @@
+---
+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
+- import { Clerk } from '@clerk/backend';
++ import { createClerkClient } from '@clerk/backend';
+
+- const clerkClient = Clerk({ frontendApi: '...' });
++ const clerkClient = createClerkClient({ publishableKey: '...' });
+
+- clerkClient.authenticateRequest({ frontendApi: '...' });
++ clerkClient.authenticateRequest({ publishableKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/createemail-removed.md b/packages/upgrade/src/versions/core-2/backend/createemail-removed.md
new file mode 100644
index 00000000000..5f238715931
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/createemail-removed.md
@@ -0,0 +1,7 @@
+---
+title: '`createEmail` import removed'
+matcher: "import\\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/src/versions/core-2/backend/createisomorphicrequest-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/createisomorphicrequest-import-path-move.md
new file mode 100644
index 00000000000..9dd3ec22992
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/createisomorphicrequest-import-path-move.md
@@ -0,0 +1,14 @@
+---
+title: '`createIsomorphicRequest` import moved to `@clerk/backend/internal`'
+matcher: "import\\s+{[^}]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]"
+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
+- import { createIsomorphicRequest } from "@clerk/backend"
++ import { createIsomorphicRequest } from "@clerk/backend/internal"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/createisomorphicrequest-removed.md b/packages/upgrade/src/versions/core-2/backend/createisomorphicrequest-removed.md
new file mode 100644
index 00000000000..650b7a6f5dc
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/createisomorphicrequest-removed.md
@@ -0,0 +1,14 @@
+---
+title: '`createIsomorphicRequest` import moved to `/internal`'
+matcher: "import\\s+{[^}]*?createIsomorphicRequest[\\s\\S]*?}\\s+from\\s+['\"]@clerk\/(backend)(?!\/internal)['\"]"
+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
+- import { createIsomorphicRequest } from "@clerk/backend"
++ import { createIsomorphicRequest } from "@clerk/backend/internal"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/decodejwt-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/decodejwt-import-path-move.md
new file mode 100644
index 00000000000..232275496e1
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/decodejwt-import-path-move.md
@@ -0,0 +1,14 @@
+---
+title: '`decodeJwt` import moved to `@clerk/backend/tokens`'
+matcher: "import\\s+{[^}]*?decodeJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]"
+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
+- import { decodeJwt } from "@clerk/backend"
++ import { decodeJwt } from "@clerk/backend/tokens"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/getclientlist-arguments.md b/packages/upgrade/src/versions/core-2/backend/getclientlist-arguments.md
new file mode 100644
index 00000000000..93ccd198bb3
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/backend/getorganizationmembershiplist-return-signature.md b/packages/upgrade/src/versions/core-2/backend/getorganizationmembershiplist-return-signature.md
new file mode 100644
index 00000000000..279e8d044be
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/getorganizationmembershiplist-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/src/versions/core-2/backend/getpendingorganizationinvitationlist.md b/packages/upgrade/src/versions/core-2/backend/getpendingorganizationinvitationlist.md
new file mode 100644
index 00000000000..33db69fd7b7
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/getpendingorganizationinvitationlist.md
@@ -0,0 +1,12 @@
+---
+title: '`Organizations.getPendingOrganizationInvitationList` -> `getOrganizationInvitationList`'
+matcher: "\\.(getPendingOrganizationInvitationList)\\("
+replaceWithString: 'getOrganizationInvitationList'
+---
+
+The `Organizations.getPendingOrganizationInvitationList` method has been removed. To match the same functionality, use `Organizations.getOrganizationInvitationList` and pass in `status` option as "pending" instead.
+
+```diff
+- clerkClient.organizations.getPendingOrganizationInvitationList()
++ clerkClient.organizations.getOrganizationInvitationList({ status: "pending" })
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/getsessionlist-arguments.md b/packages/upgrade/src/versions/core-2/backend/getsessionlist-arguments.md
new file mode 100644
index 00000000000..1cfa39d8eb7
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/backend/httpoptions-removed.md b/packages/upgrade/src/versions/core-2/backend/httpoptions-removed.md
new file mode 100644
index 00000000000..933f048e861
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/httpoptions-removed.md
@@ -0,0 +1,16 @@
+---
+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.
+
+The internal change looks like this:
+
+```diff
+- const r = buildRequest({ httpOptions: { headers: {} }})
++ const request = buildRequest()
++ request({ headerParams: {} })
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/interstitial-removed.md b/packages/upgrade/src/versions/core-2/backend/interstitial-removed.md
new file mode 100644
index 00000000000..73af491ab91
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/backend/members-count.md b/packages/upgrade/src/versions/core-2/backend/members-count.md
new file mode 100644
index 00000000000..10912ab89c2
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/backend/membershiprole.md b/packages/upgrade/src/versions/core-2/backend/membershiprole.md
new file mode 100644
index 00000000000..9fdb2cf408c
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/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/src/versions/core-2/backend/organizationjson-logourl.md b/packages/upgrade/src/versions/core-2/backend/organizationjson-logourl.md
new file mode 100644
index 00000000000..bc2b076a7b3
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/organizationjson-logourl.md
@@ -0,0 +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/src/versions/core-2/backend/organizationmembershippublicuserdatajson-profileimageurl.md b/packages/upgrade/src/versions/core-2/backend/organizationmembershippublicuserdatajson-profileimageurl.md
new file mode 100644
index 00000000000..0661dc8151f
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/organizationmembershippublicuserdatajson-profileimageurl.md
@@ -0,0 +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/src/versions/core-2/backend/pkgversion.md b/packages/upgrade/src/versions/core-2/backend/pkgversion.md
new file mode 100644
index 00000000000..ce5a7554705
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/pkgversion.md
@@ -0,0 +1,15 @@
+---
+title: '`pkgVersion` -> `clerkJSVersion`'
+matcher:
+ - "loadInterstitialFromLocal\\([\\s\\S]*?pkgVersion:[\\s\\S]*?\\)"
+ - "loadInterstitialFromBAPI\\([\\s\\S]*?pkgVersion:[\\s\\S]*?\\)"
+ - "buildPublicInterstitialUrl\\([\\s\\S]*?pkgVersion:[\\s\\S]*?\\)"
+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/src/versions/core-2/backend/redirect-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/redirect-import-path-move.md
new file mode 100644
index 00000000000..2e11ba73783
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/redirect-import-path-move.md
@@ -0,0 +1,14 @@
+---
+title: '`redirect` import moved to `@clerk/backend/internal`'
+matcher: "import\\s+{[^}]*?redirect[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/internal)['\"]"
+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
+- import { redirect } from "@clerk/backend"
++ import { redirect } from "@clerk/backend/internal"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/signjwt-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/signjwt-import-path-move.md
new file mode 100644
index 00000000000..3b09633ea33
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/signjwt-import-path-move.md
@@ -0,0 +1,14 @@
+---
+title: '`signJwt` import moved to `@clerk/backend/tokens`'
+matcher: "import\\s+{[^}]*?signJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]"
+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
+- import { signJwt } from "@clerk/backend"
++ import { signJwt } from "@clerk/backend/tokens"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/signjwterror-import-move.md b/packages/upgrade/src/versions/core-2/backend/signjwterror-import-move.md
new file mode 100644
index 00000000000..91a25a93148
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/signjwterror-import-move.md
@@ -0,0 +1,14 @@
+---
+title: '`SignJWTError` import moved to `@clerk/backend/errors`'
+matcher: "import\\s+{[^}]*?SignJWTError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]"
+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
+- import { SignJWTError } from "@clerk/backend"
++ import { SignJWTError } from "@clerk/backend/errors"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/tokenverificationerror-import-move.md b/packages/upgrade/src/versions/core-2/backend/tokenverificationerror-import-move.md
new file mode 100644
index 00000000000..97d6c677427
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/tokenverificationerror-import-move.md
@@ -0,0 +1,14 @@
+---
+title: '`TokenVerificationError` import moved to `@clerk/backend/errors`'
+matcher: "import\\s+{[^}]*?TokenVerificationError[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]"
+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
+- import { TokenVerificationError } from "@clerk/backend"
++ import { TokenVerificationError } from "@clerk/backend/errors"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/tokenverificationerroraction-import-move.md b/packages/upgrade/src/versions/core-2/backend/tokenverificationerroraction-import-move.md
new file mode 100644
index 00000000000..c4bf8047b56
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/tokenverificationerroraction-import-move.md
@@ -0,0 +1,14 @@
+---
+title: '`TokenVerificationErrorAction` import moved to `@clerk/backend/errors`'
+matcher: "import\\s+{[^}]*?TokenVerificationErrorAction[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]"
+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
+- import { TokenVerificationErrorAction } from "@clerk/backend"
++ import { TokenVerificationErrorAction } from "@clerk/backend/errors"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/tokenverificationerrorcode-import-move.md b/packages/upgrade/src/versions/core-2/backend/tokenverificationerrorcode-import-move.md
new file mode 100644
index 00000000000..6c36937b803
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/tokenverificationerrorcode-import-move.md
@@ -0,0 +1,14 @@
+---
+title: '`TokenVerificationErrorCode` import moved to `@clerk/backend/errors`'
+matcher: "import\\s+{[^}]*?TokenVerificationErrorCode[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]"
+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
+- import { TokenVerificationErrorCode } from "@clerk/backend"
++ import { TokenVerificationErrorCode } from "@clerk/backend/errors"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/tokenverificationerrorreason-import-move.md b/packages/upgrade/src/versions/core-2/backend/tokenverificationerrorreason-import-move.md
new file mode 100644
index 00000000000..e38f7de39bd
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/tokenverificationerrorreason-import-move.md
@@ -0,0 +1,14 @@
+---
+title: '`TokenVerificationErrorReason` import moved to `@clerk/backend/errors`'
+matcher: "import\\s+{[^}]*?TokenVerificationErrorReason[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/errors)['\"]"
+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
+- import { TokenVerificationErrorReason } from "@clerk/backend"
++ import { TokenVerificationErrorReason } from "@clerk/backend/errors"
+```
diff --git a/packages/upgrade/src/versions/core-2/backend/userjson-profileimageurl.md b/packages/upgrade/src/versions/core-2/backend/userjson-profileimageurl.md
new file mode 100644
index 00000000000..10b4b98d75a
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/userjson-profileimageurl.md
@@ -0,0 +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/src/versions/core-2/backend/verifyjwt-import-path-move.md b/packages/upgrade/src/versions/core-2/backend/verifyjwt-import-path-move.md
new file mode 100644
index 00000000000..cf72bd53483
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/backend/verifyjwt-import-path-move.md
@@ -0,0 +1,14 @@
+---
+title: '`verifyJwt` import moved to `@clerk/backend/tokens`'
+matcher: "import\\s+{[^}]*?verifyJwt[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/(backend)(?!\/tokens)['\"]"
+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
+- import { verifyJwt } from "@clerk/backend"
++ import { verifyJwt } from "@clerk/backend/tokens"
+```
diff --git a/packages/upgrade/src/versions/core-2/chrome-extension/clerkprovider-tokencache.md b/packages/upgrade/src/versions/core-2/chrome-extension/clerkprovider-tokencache.md
new file mode 100644
index 00000000000..035f2e10fa0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/chrome-extension/clerkprovider-tokencache.md
@@ -0,0 +1,24 @@
+---
+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:
+
+```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
+-
++
+```
diff --git a/packages/upgrade/src/versions/core-2/common/aftersignxurl-changes.md b/packages/upgrade/src/versions/core-2/common/aftersignxurl-changes.md
new file mode 100644
index 00000000000..3193b21dd91
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/common/afterswitchorganizationurl.md b/packages/upgrade/src/versions/core-2/common/afterswitchorganizationurl.md
new file mode 100644
index 00000000000..e2f094842a2
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/afterswitchorganizationurl.md
@@ -0,0 +1,14 @@
+---
+title: '`afterSwitchOrganizationUrl` -> `afterSelectOrganizationUrl` in `OrganizationSwitcher`'
+matcher: ""
+category: 'deprecation-removal'
+matcherFlags: 'm'
+replaceWithString: 'afterSelectOrganizationUrl'
+---
+
+The `afterSwitchOrganizationUrl` prop on the ` ` component has been renamed to `afterSelectOrganizationUrl`. This is a quick and simple rename.
+
+```diff
+-
++
+```
diff --git a/packages/upgrade/src/versions/core-2/common/alternativemethods-backlink.md b/packages/upgrade/src/versions/core-2/common/alternativemethods-backlink.md
new file mode 100644
index 00000000000..c4c64bae4af
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/alternativemethods-backlink.md
@@ -0,0 +1,19 @@
+---
+title: 'Back button customization ids change on alternative 2fa methods page'
+category: 'appearance'
+image: true
+matcherFlags: 'm'
+matcher:
+ - "\\.cl-headerBackIcon"
+ - "\\.cl-headerBackRow"
+ - "\\.cl-headerBackLink"
+ - "elements:\\s+{[\\s\\S]*?headerBackIcon:[\\s\\S]*?}"
+ - "elements:\\s+{[\\s\\S]*?headerBackRow:[\\s\\S]*?}"
+ - "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 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
diff --git a/packages/upgrade/src/versions/core-2/common/api-key-to-secret-key.md b/packages/upgrade/src/versions/core-2/common/api-key-to-secret-key.md
new file mode 100644
index 00000000000..6d2d0e1ba4c
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/api-key-to-secret-key.md
@@ -0,0 +1,7 @@
+---
+title: '`CLERK_API_KEY` replaced by `CLERK_SECRET_KEY`'
+category: 'deprecation-removal'
+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/src/versions/core-2/common/appearance-organizationpreview-organizationswitcher.md b/packages/upgrade/src/versions/core-2/common/appearance-organizationpreview-organizationswitcher.md
new file mode 100644
index 00000000000..396e0b5d76d
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/appearance-organizationpreview-organizationswitcher.md
@@ -0,0 +1,9 @@
+---
+title: '`elements.organizationPreview__organizationSwitcher` -> `elements.organizationPreview__organizationSwitcherTrigger` in ` ` appearance prop'
+matcher: ""
+matcherFlags: 'm'
+category: 'appearance'
+replaceWithString: 'organizationPreview__organizationSwitcherTrigger'
+---
+
+If you are using `organizationPreview__organizationSwitcher` as an [appearance prop](https://clerk.com/docs/components/customization/overview#appearance-prop) value to the [` ` component](https://clerk.com/docs/references/javascript/clerk/organization-switcher#organization-switcher-component), it must be updated to `organizationPreview__organizationSwitcherTrigger` instead. This is a simple text replacement. However, it should be noted that component designs have been updated as part of v5, so you may need to make adjustments to any appearance prop customizations that have been implemented as a whole.
diff --git a/packages/upgrade/src/versions/core-2/common/appearance-variables-breaking-changes.md b/packages/upgrade/src/versions/core-2/common/appearance-variables-breaking-changes.md
new file mode 100644
index 00000000000..1fbdc48aebc
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/appearance-variables-breaking-changes.md
@@ -0,0 +1,15 @@
+---
+title: 'Breaking Changes to appearance variables'
+matcherFlags: 'm'
+category: 'appearance'
+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/src/versions/core-2/common/button-to-organizationlistcreateorganizationactionbutton.md b/packages/upgrade/src/versions/core-2/common/button-to-organizationlistcreateorganizationactionbutton.md
new file mode 100644
index 00000000000..c3039f5b54a
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/button-to-organizationlistcreateorganizationactionbutton.md
@@ -0,0 +1,12 @@
+---
+title: '`button` -> `organizationListCreateOrganizationActionButton` customization id'
+image: true
+replaceWithString: 'organizationListCreateOrganizationActionButton'
+category: 'appearance'
+matcherFlags: 'm'
+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/src/versions/core-2/common/card-changes.md b/packages/upgrade/src/versions/core-2/common/card-changes.md
new file mode 100644
index 00000000000..987de398add
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/card-changes.md
@@ -0,0 +1,15 @@
+---
+title: 'Changes to the `card` customization id'
+warning: true
+category: 'appearance'
+matcherFlags: 'm'
+matcher:
+ - "\\.cl-card"
+ - "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, 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`.
diff --git a/packages/upgrade/src/versions/core-2/common/changed-localization-keys.md b/packages/upgrade/src/versions/core-2/common/changed-localization-keys.md
new file mode 100644
index 00000000000..cff4bb8c844
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/changed-localization-keys.md
@@ -0,0 +1,180 @@
+---
+title: 'Localization keys changed'
+matcherFlags: 'm'
+category: 'localization'
+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]*?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]*?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]*?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: {
+ start: {
+ headerTitle__account: 'Profile details',
+ emailAddressesSection: {
+ primaryButton: 'Add email address',
+ detailsAction__unverified: 'Verify',
+ destructiveAction: 'Remove email',
+ },
+ phoneNumbersSection: {
+ primaryButton: 'Add phone number',
+ },
+ mfaSection: {
+ phoneCode: {
+ destructiveActionLabel: 'Remove',
+ },
+ backupCodes: {
+ actionLabel__regenerate: 'Regenerate',
+ },
+ },
+ dangerSection: {
+ title: 'Delete account',
+ deleteAccountButton: 'Delete account',
+ },
+ },
+ profilePage: {
+ imageFormSubtitle: 'Upload',
+ imageFormDestructiveActionSubtitle: 'Remove',
+ fileDropAreaHint: 'Recommended size 1:1, up to 10MB.',
+ },
+ phoneNumberPage: {
+ infoText:
+ '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.",
+ },
+ },
+ organizationSwitcher: {
+ action__createOrganization: 'Create organization',
+ action__manageOrganization: 'Manage',
+ },
+ organizationProfile: {
+ profilePage: {
+ title: 'Update profile',
+ dangerSection: {
+ 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/src/versions/core-2/common/clerkprovider-frontendapi-2.md b/packages/upgrade/src/versions/core-2/common/clerkprovider-frontendapi-2.md
new file mode 100644
index 00000000000..33238534760
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/clerkprovider-frontendapi-2.md
@@ -0,0 +1,8 @@
+---
+title: '`frontendApi` -> `publishableKey` as prop to `ClerkProvider`'
+matcher: ""
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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).
diff --git a/packages/upgrade/src/versions/core-2/common/clerkprovideroptionswrapper-dropped.md b/packages/upgrade/src/versions/core-2/common/clerkprovideroptionswrapper-dropped.md
new file mode 100644
index 00000000000..6adf44078df
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/clerkprovideroptionswrapper-dropped.md
@@ -0,0 +1,7 @@
+---
+title: '`ClerkProviderOptionsWrapper` type removed'
+category: 'deprecation-removal'
+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/src/versions/core-2/common/connected-accounts-dropdown.md b/packages/upgrade/src/versions/core-2/common/connected-accounts-dropdown.md
new file mode 100644
index 00000000000..79000633c9d
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/connected-accounts-dropdown.md
@@ -0,0 +1,16 @@
+---
+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/src/versions/core-2/common/emaillinkerrorcode-import-change.md b/packages/upgrade/src/versions/core-2/common/emaillinkerrorcode-import-change.md
new file mode 100644
index 00000000000..61bfae3fce2
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/emaillinkerrorcode-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`EmailLinkErrorCode` import moved under `/errors`'
+matcher: "import\\s+{[^}]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'error-imports'
+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/src/versions/core-2/common/externalaccount-avatarurl.md b/packages/upgrade/src/versions/core-2/common/externalaccount-avatarurl.md
new file mode 100644
index 00000000000..1b6dc981355
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/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/src/versions/core-2/common/externalaccount-picture.md b/packages/upgrade/src/versions/core-2/common/externalaccount-picture.md
new file mode 100644
index 00000000000..d3e295c7ead
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/externalaccount-picture.md
@@ -0,0 +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/src/versions/core-2/common/externalaccountjson-avatarurl.md b/packages/upgrade/src/versions/core-2/common/externalaccountjson-avatarurl.md
new file mode 100644
index 00000000000..8626e22e0b0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/externalaccountjson-avatarurl.md
@@ -0,0 +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/src/versions/core-2/common/frontend-api-to-publishable-key.md b/packages/upgrade/src/versions/core-2/common/frontend-api-to-publishable-key.md
new file mode 100644
index 00000000000..b1d8ba648d2
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/frontend-api-to-publishable-key.md
@@ -0,0 +1,7 @@
+---
+title: '`CLERK_FRONTEND_API` replaced by `CLERK_PUBLISHABLE_KEY`'
+category: 'deprecation-removal'
+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/src/versions/core-2/common/getallowlistidentifierlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getallowlistidentifierlist-return-signature.md
new file mode 100644
index 00000000000..6f6766b7473
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/common/getclientlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getclientlist-return-signature.md
new file mode 100644
index 00000000000..c4db50292a7
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/common/getinvitationlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getinvitationlist-return-signature.md
new file mode 100644
index 00000000000..362d3ce9731
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/common/getorganizationinvitationlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getorganizationinvitationlist-return-signature.md
new file mode 100644
index 00000000000..d7abfd4bfe0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/getorganizationinvitationlist-return-signature.md
@@ -0,0 +1,15 @@
+---
+title: '`Users.getOrganizationInvitationList` return signature changed'
+matcher: "\\.users\\.getOrganizationInvitationList\\("
+category: 'pagination-return'
+warning: true
+---
+
+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
+- const data = await clerkClient.users.getOrganizationInvitationList()
++ const { data, totalCount } = await clerkClient.users.getOrganizationInvitationList()
+```
diff --git a/packages/upgrade/src/versions/core-2/common/getorganizationinvitationlist-return-type-change.md b/packages/upgrade/src/versions/core-2/common/getorganizationinvitationlist-return-type-change.md
new file mode 100644
index 00000000000..b3023397793
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/getorganizationinvitationlist-return-type-change.md
@@ -0,0 +1,17 @@
+---
+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 data = await clerkClient.organizations.getOrganizationInvitationList({
+ organizationId: "...",
+ })
+
+- data.forEach(() => {})
++ data.data.forEach(() => {})
+```
diff --git a/packages/upgrade/src/versions/core-2/common/getorganizationlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getorganizationlist-return-signature.md
new file mode 100644
index 00000000000..2c76ab3c978
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/getorganizationlist-return-signature.md
@@ -0,0 +1,15 @@
+---
+title: '`Users.getOrganizationList` return signature changed'
+matcher: "\\.users\\.getOrganizationList\\("
+category: 'pagination-return'
+warning: true
+---
+
+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
+- const data = await clerkClient.users.getOrganizationList()
++ const { data, totalCount } = await clerkClient.users.getOrganizationList()
+```
diff --git a/packages/upgrade/src/versions/core-2/common/getorganizationlist-return-type-change.md b/packages/upgrade/src/versions/core-2/common/getorganizationlist-return-type-change.md
new file mode 100644
index 00000000000..ba83a4c30d5
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/getorganizationlist-return-type-change.md
@@ -0,0 +1,15 @@
+---
+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
+ const { organization } = useOrganization()
+ const orgList = organization.getOrganizationList()
+
+- orgList.forEach(() => {})
++ orgList.data.forEach(() => {})
+```
diff --git a/packages/upgrade/src/versions/core-2/common/getorganizationmembershiplist-return-type-change.md b/packages/upgrade/src/versions/core-2/common/getorganizationmembershiplist-return-type-change.md
new file mode 100644
index 00000000000..8682037cbf7
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/getorganizationmembershiplist-return-type-change.md
@@ -0,0 +1,15 @@
+---
+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
+ const { user } = useUser()
+ const membershipList = user.getOrganizationMembershipList()
+
+- membershipList.forEach(() => {})
++ membershipList.data.forEach(() => {})
+```
diff --git a/packages/upgrade/src/versions/core-2/common/getredirecturllist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getredirecturllist-return-signature.md
new file mode 100644
index 00000000000..da4c59d81a6
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/common/getsessionlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getsessionlist-return-signature.md
new file mode 100644
index 00000000000..20a6bc092cf
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/common/getuserlist-return-signature.md b/packages/upgrade/src/versions/core-2/common/getuserlist-return-signature.md
new file mode 100644
index 00000000000..3a30703901f
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/common/getuseroauthaccesstoken-return-signature.md b/packages/upgrade/src/versions/core-2/common/getuseroauthaccesstoken-return-signature.md
new file mode 100644
index 00000000000..498d805ddec
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/common/handlemagiclinkverification.md b/packages/upgrade/src/versions/core-2/common/handlemagiclinkverification.md
new file mode 100644
index 00000000000..08eb93e7ca7
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/handlemagiclinkverification.md
@@ -0,0 +1,7 @@
+---
+title: '`handleMagicLinkVerification` -> `handleEmailLinkVerification`'
+matcher: 'handleMagicLinkVerification'
+replaceWithString: 'handleMagicLinkVerification'
+---
+
+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/src/versions/core-2/common/isclerkapiresponserror-import-change.md b/packages/upgrade/src/versions/core-2/common/isclerkapiresponserror-import-change.md
new file mode 100644
index 00000000000..9391d6966fe
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/isclerkapiresponserror-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`isClerkAPIResponseError` import moved under `/errors`'
+matcher: "import\\s+{[^}]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'error-imports'
+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/src/versions/core-2/common/isemaillinkerror-import-change.md b/packages/upgrade/src/versions/core-2/common/isemaillinkerror-import-change.md
new file mode 100644
index 00000000000..7f845cb22e6
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/isemaillinkerror-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`isEmailLinkError` import moved under `/errors`'
+matcher: "import\\s+{[^}]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'error-imports'
+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/src/versions/core-2/common/isknownerror-import-change.md b/packages/upgrade/src/versions/core-2/common/isknownerror-import-change.md
new file mode 100644
index 00000000000..ed248e7c40b
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/isknownerror-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`isKnownError` import moved under `/errors`'
+matcher: "import\\s+{[^}]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(clerk-react)(?!\/errors)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'error-imports'
+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/src/versions/core-2/common/ismagiclinkerror.md b/packages/upgrade/src/versions/core-2/common/ismagiclinkerror.md
new file mode 100644
index 00000000000..5d2b9d936e0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/ismagiclinkerror.md
@@ -0,0 +1,7 @@
+---
+title: '`isMagicLinkError` -> `isEmailLinkError`'
+matcher: 'isMagicLinkError'
+replaceWithString: 'isEmailLinkError'
+---
+
+Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality.
diff --git a/packages/upgrade/src/versions/core-2/common/ismetamaskerror-import-change.md b/packages/upgrade/src/versions/core-2/common/ismetamaskerror-import-change.md
new file mode 100644
index 00000000000..31109857bd4
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/ismetamaskerror-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`isMetamaskError` import moved under `/errors`'
+matcher: "import\\s+{[^}]*?isMetamaskError[\\s\\S]*?from\\s+['\"]@clerk\\/(react)(?!\/errors)[\\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/src/versions/core-2/common/magiclinkerror.md b/packages/upgrade/src/versions/core-2/common/magiclinkerror.md
new file mode 100644
index 00000000000..3efda4029d2
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/magiclinkerror.md
@@ -0,0 +1,7 @@
+---
+title: '`MagicLinkError` -> `EmailLinkError`'
+matcher: 'MagicLinkError'
+replaceWithString: 'EmailLinkError'
+---
+
+Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality.
diff --git a/packages/upgrade/src/versions/core-2/common/magiclinkerrorcode.md b/packages/upgrade/src/versions/core-2/common/magiclinkerrorcode.md
new file mode 100644
index 00000000000..9302265d023
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/magiclinkerrorcode.md
@@ -0,0 +1,7 @@
+---
+title: '`MagicLinkErrorCode` -> `EmailLinkErrorCode`'
+matcher: 'MagicLinkErrorCode'
+replaceWithString: 'EmailLinkErrorCode'
+---
+
+Across Clerk's documentation and codebases the term "magic link" was changed to "email link" as it more accurately reflects the functionality.
diff --git a/packages/upgrade/src/versions/core-2/common/mfa-dropdown.md b/packages/upgrade/src/versions/core-2/common/mfa-dropdown.md
new file mode 100644
index 00000000000..783e92d01dd
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/mfa-dropdown.md
@@ -0,0 +1,12 @@
+---
+title: 'Within ` `, 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/src/versions/core-2/common/min-react-version.md b/packages/upgrade/src/versions/core-2/common/min-react-version.md
new file mode 100644
index 00000000000..3faf5a818bf
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/min-react-version.md
@@ -0,0 +1,8 @@
+---
+title: 'Upgrade react to v18 or higher'
+category: 'version'
+matcher: "dependencies\":\\s*{[\\s\\S]*?\"react\":\\s*\"(?:^|~|>|=|\\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/src/versions/core-2/common/multisessionappsupport-import-change.md b/packages/upgrade/src/versions/core-2/common/multisessionappsupport-import-change.md
new file mode 100644
index 00000000000..36cc3234756
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/multisessionappsupport-import-change.md
@@ -0,0 +1,12 @@
+---
+title: '`MultisessionAppSupport` import moved to `/internal`'
+matcher: "import\\s+{[^}]*?MutliSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/clerk-react(?!\/internal)[\\s\\S]*?['\"]"
+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.
+
+```diff
+- import { MultiSessionAppSupport } from '@clerk/clerk-react'
++ import { MultiSessionAppSupport } from '@clerk/clerk-react/internal'
+```
diff --git a/packages/upgrade/src/versions/core-2/common/navigate-to-routerpush-routerreplace.md b/packages/upgrade/src/versions/core-2/common/navigate-to-routerpush-routerreplace.md
new file mode 100644
index 00000000000..f2896a39ccf
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/navigate-to-routerpush-routerreplace.md
@@ -0,0 +1,19 @@
+---
+title: '`navigate` prop to `ClerkProvider` replaced by `routerPush` and `routerReplace`'
+matcher: ""
+category: 'routerpush-replace'
+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.
diff --git a/packages/upgrade/src/versions/core-2/common/new-localization-keys.md b/packages/upgrade/src/versions/core-2/common/new-localization-keys.md
new file mode 100644
index 00000000000..c3342545318
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/new-localization-keys.md
@@ -0,0 +1,115 @@
+---
+title: 'New localization keys added'
+matcher: ""
+matcherFlags: 'm'
+category: 'localization'
+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 = {
+ formButtonPrimary__verify: 'Verify',
+ formFieldInputPlaceholder__confirmDeletionUserAccount: 'Delete account',
+ organizationProfile: {
+ invitePage: {
+ selectDropdown__role: 'Select role',
+ },
+ navbar: {
+ description: 'Manage your organization.',
+ general: 'General',
+ members: 'Members',
+ title: 'Organization',
+ },
+ profilePage: {
+ domainSection: {
+ menuAction__manage: 'Manage',
+ menuAction__remove: 'Delete',
+ menuAction__verify: 'Verify',
+ },
+ },
+ start: {
+ headerTitle__general: 'General',
+ profileSection: {
+ primaryButton: 'Update profile',
+ title: 'Organization Profile',
+ uploadAction__title: 'Logo',
+ },
+ },
+ verifiedDomainPage: {
+ title: 'Update {{domain}}',
+ },
+ },
+ 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',
+ },
+ alternativeMethods: {
+ actionText: 'Don’t have any of these?',
+ subtitle: 'Facing issues? You can use any of these methods to sign in.',
+ },
+ 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: {
+ emailAddressPage: {
+ verifyTitle: 'Verify email address',
+ },
+ formButtonPrimary__add: 'Add',
+ formButtonPrimary__remove: 'Remove',
+ formButtonPrimary__save: 'Save',
+ mfaPhoneCodePage: {
+ 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',
+ },
+ 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: 'Update profile',
+ },
+ usernameSection: {
+ primaryButton__updateUsername: 'Update username',
+ },
+ },
+ usernamePage: {
+ title__set: 'Set username',
+ title__update: 'Update username',
+ },
+ },
+};
+```
diff --git a/packages/upgrade/src/versions/core-2/common/organization-create-string.md b/packages/upgrade/src/versions/core-2/common/organization-create-string.md
new file mode 100644
index 00000000000..4370da02a35
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/organization-create-string.md
@@ -0,0 +1,12 @@
+---
+title: "`Organization.create('x')` -> `Organization.create({ name: 'x' })`"
+matcher: "Organization\\.create\\(\\s*[\"']"
+matcherFlags: 'm'
+---
+
+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: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/common/organization-getdomains-arguments-change.md b/packages/upgrade/src/versions/core-2/common/organization-getdomains-arguments-change.md
new file mode 100644
index 00000000000..339e453debf
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/organization-getdomains-arguments-change.md
@@ -0,0 +1,16 @@
+---
+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
+ const { data } = await organization.getDomains({
+- limit: 10,
++ pageSize: 10,
+- offset: 10,
++ initialPage: 2,
+ })
+```
diff --git a/packages/upgrade/src/versions/core-2/common/organization-getinvitations-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/organization-getinvitations-arguments-changed.md
new file mode 100644
index 00000000000..b7d0943d7f6
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/organization-getinvitations-arguments-changed.md
@@ -0,0 +1,16 @@
+---
+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
+ const { data } = await organization.getInvitations({
+- limit: 10,
++ pageSize: 10,
+- offset: 10,
++ initialPage: 2,
+ })
+```
diff --git a/packages/upgrade/src/versions/core-2/common/organization-getmembershiprequests-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/organization-getmembershiprequests-arguments-changed.md
new file mode 100644
index 00000000000..d24a9656e50
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/organization-getmembershiprequests-arguments-changed.md
@@ -0,0 +1,16 @@
+---
+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
+ const { data } = await organization.getMembershipRequests({
+- limit: 10,
++ pageSize: 10,
+- offset: 10,
++ initialPage: 2,
+ })
+```
diff --git a/packages/upgrade/src/versions/core-2/common/organization-getmemberships-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/organization-getmemberships-arguments-changed.md
new file mode 100644
index 00000000000..665edb8797f
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/organization-getmemberships-arguments-changed.md
@@ -0,0 +1,16 @@
+---
+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
+ const { data } = await organization.getMemberships({
+- limit: 10,
++ pageSize: 10,
+- offset: 10,
++ initialPage: 2,
+ })
+```
diff --git a/packages/upgrade/src/versions/core-2/common/organization-getpendinginvitations.md b/packages/upgrade/src/versions/core-2/common/organization-getpendinginvitations.md
new file mode 100644
index 00000000000..84bbffcaf56
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/organization-getpendinginvitations.md
@@ -0,0 +1,11 @@
+---
+title: "`Organization.getPendingInvitations()` -> `Organization.getInvitations({ status: 'pending' })`"
+matcher: "\\.getPendingInvitations\\("
+---
+
+The `Organization.getPendingInvitations()` method has been removed. You can use `Organization.getInvitations` instead.
+
+```diff
+- Organization.getPendingInvitations();
++ Organization.getInvitations({ status: 'pending' });
+```
diff --git a/packages/upgrade/src/versions/core-2/common/organization-getroles-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/organization-getroles-arguments-changed.md
new file mode 100644
index 00000000000..54058f6e7f1
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/organization-getroles-arguments-changed.md
@@ -0,0 +1,16 @@
+---
+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
+ const { data } = await organization.getRoles({
+- limit: 10,
++ pageSize: 10,
+- offset: 10,
++ initialPage: 2,
+ })
+```
diff --git a/packages/upgrade/src/versions/core-2/common/organization-logourl.md b/packages/upgrade/src/versions/core-2/common/organization-logourl.md
new file mode 100644
index 00000000000..5bda1347d47
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/organization-logourl.md
@@ -0,0 +1,8 @@
+---
+title: '`Organization.logoUrl` -> `Organization.imageUrl`'
+matcher: "\\.logoUrl"
+category: 'image-url'
+replaceWithString: '.imageUrl'
+---
+
+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/src/versions/core-2/common/organizationmembershippublicuserdata-profileimageurl.md b/packages/upgrade/src/versions/core-2/common/organizationmembershippublicuserdata-profileimageurl.md
new file mode 100644
index 00000000000..3e8fbf5db52
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/organizationmembershippublicuserdata-profileimageurl.md
@@ -0,0 +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/src/versions/core-2/common/organizationprofile-settings.md b/packages/upgrade/src/versions/core-2/common/organizationprofile-settings.md
new file mode 100644
index 00000000000..a7ab28199b0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/organizationprofile-settings.md
@@ -0,0 +1,13 @@
+---
+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/src/versions/core-2/common/organizationswitcherpopoveractionbuttontext-removed.md b/packages/upgrade/src/versions/core-2/common/organizationswitcherpopoveractionbuttontext-removed.md
new file mode 100644
index 00000000000..e14884d72e0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/organizationswitcherpopoveractionbuttontext-removed.md
@@ -0,0 +1,15 @@
+---
+title: '`organizationSwitcherPopoverActionButtonText` customization id removed'
+image: true
+matcherFlags: 'm'
+category: 'appearance'
+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 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/src/versions/core-2/common/remove-identitypreview-avatar.md b/packages/upgrade/src/versions/core-2/common/remove-identitypreview-avatar.md
new file mode 100644
index 00000000000..0f7b19fb6bd
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/remove-identitypreview-avatar.md
@@ -0,0 +1,13 @@
+---
+title: 'Identity preview avatar customization ids removed'
+image: true
+matcherFlags: 'm'
+category: 'appearance'
+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/src/versions/core-2/common/remove-socialbuttonsblockbuttonarrow.md b/packages/upgrade/src/versions/core-2/common/remove-socialbuttonsblockbuttonarrow.md
new file mode 100644
index 00000000000..1b26a5cde11
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/remove-socialbuttonsblockbuttonarrow.md
@@ -0,0 +1,11 @@
+---
+title: '`socialButtonsBlockButtonArrow` customization id removed'
+image: true
+matcherFlags: 'm'
+category: 'appearance'
+matcher:
+ - "\\.cl-socialButtonsBlockButtonArrow"
+ - "elements:\\s+{[\\s\\S]*?socialButtonsBlockButtonArrow:[\\s\\S]*?}"
+---
+
+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.
diff --git a/packages/upgrade/src/versions/core-2/common/removed-localization-keys.md b/packages/upgrade/src/versions/core-2/common/removed-localization-keys.md
new file mode 100644
index 00000000000..5b03ef27d59
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/removed-localization-keys.md
@@ -0,0 +1,191 @@
+---
+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:"
+ - "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]*?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:"
+ - "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]*?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:"
+ - "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:"
+ - "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]*?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:"
+ - "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]*?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:"
+ - "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',
+ 'signIn.forgotPassword.formSubtitle_phone',
+ 'signIn.emailCode.formSubtitle',
+ 'signIn.phoneCode.formSubtitle',
+ 'signIn.phoneCodeMfa.formSubtitle',
+ 'signIn.totpMfa.formSubtitle',
+ 'signIn.backupCodeMfa.formTitle',
+ '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',
+ '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.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',
+ '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.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',
+ 'organizationProfile.start.headerSubtitle__settings',
+ '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',
+ 'organizationProfile.membersPage.invitationsTab.manualInvitations.headerSubtitle',
+ 'organizationProfile.membersPage.requestsTab.requests.headerTitle',
+ 'organizationProfile.membersPage.requestsTab.requests.headerSubtitle',
+ 'createOrganization.subtitle',
+];
+```
+
+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/src/versions/core-2/common/setsession.md b/packages/upgrade/src/versions/core-2/common/setsession.md
new file mode 100644
index 00000000000..00f1e5c87e9
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/setsession.md
@@ -0,0 +1,33 @@
+---
+title: '`setSession` -> `setActive`'
+matcher: 'setSession'
+---
+
+`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
+})
+```
diff --git a/packages/upgrade/src/versions/core-2/common/signoutcallback-to-redirecturl.md b/packages/upgrade/src/versions/core-2/common/signoutcallback-to-redirecturl.md
new file mode 100644
index 00000000000..f191fe95b29
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/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"
+ >
+ Sign Out
+
+ )
+ }
+```
diff --git a/packages/upgrade/src/versions/core-2/common/supported-external-accounts-removed.md b/packages/upgrade/src/versions/core-2/common/supported-external-accounts-removed.md
new file mode 100644
index 00000000000..563c8a0a848
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/supported-external-accounts-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/src/versions/core-2/common/usemagiclink.md b/packages/upgrade/src/versions/core-2/common/usemagiclink.md
new file mode 100644
index 00000000000..530de4daa12
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/usemagiclink.md
@@ -0,0 +1,7 @@
+---
+title: '`useMagicLink` -> `useEmailLink`'
+matcher: 'useMagicLink'
+replaceWithString: 'useEmailLink'
+---
+
+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/src/versions/core-2/common/useorganization-invitationlist.md b/packages/upgrade/src/versions/core-2/common/useorganization-invitationlist.md
new file mode 100644
index 00000000000..f4cc8a6dcea
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/useorganization-invitationlist.md
@@ -0,0 +1,25 @@
+---
+title: '`invitationList` -> `invitations` as param to `useOrganizations`'
+matcher: "useOrganizations\\(\\s*{[\\s\\S]*?invitationList:"
+matcherFlags: 'm'
+---
+
+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 });
+```
diff --git a/packages/upgrade/src/versions/core-2/common/useorganization-membershiplist.md b/packages/upgrade/src/versions/core-2/common/useorganization-membershiplist.md
new file mode 100644
index 00000000000..28091c7bd2e
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/useorganization-membershiplist.md
@@ -0,0 +1,25 @@
+---
+title: '`membershipList` -> `members` as param to `useOrganization`'
+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:
+
+```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 });
+```
diff --git a/packages/upgrade/src/versions/core-2/common/useorganizations.md b/packages/upgrade/src/versions/core-2/common/useorganizations.md
new file mode 100644
index 00000000000..cf16ebbd80c
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/useorganizations.md
@@ -0,0 +1,26 @@
+---
+title: '`useOrganizations` -> `useOrganizationList`'
+matcher: "useOrganizations\\("
+---
+
+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,
+}
+```
diff --git a/packages/upgrade/src/versions/core-2/common/user-getorganizationinvitations-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/user-getorganizationinvitations-arguments-changed.md
new file mode 100644
index 00000000000..ff2cbb5b00b
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/user-getorganizationinvitations-arguments-changed.md
@@ -0,0 +1,16 @@
+---
+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
+ const { data } = await user.getOrganizationInvitations({
+- limit: 10,
++ pageSize: 10,
+- offset: 10,
++ initialPage: 2,
+ })
+```
diff --git a/packages/upgrade/src/versions/core-2/common/user-getorganizationmemberships-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/user-getorganizationmemberships-arguments-changed.md
new file mode 100644
index 00000000000..bcc111b808b
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/user-getorganizationmemberships-arguments-changed.md
@@ -0,0 +1,16 @@
+---
+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
+ const { data } = await user.getOrganizationMemberships({
+- limit: 10,
++ pageSize: 10,
+- offset: 10,
++ initialPage: 2,
+ })
+```
diff --git a/packages/upgrade/src/versions/core-2/common/user-getorganizationmemberships-return-signature.md b/packages/upgrade/src/versions/core-2/common/user-getorganizationmemberships-return-signature.md
new file mode 100644
index 00000000000..279e8d044be
--- /dev/null
+++ b/packages/upgrade/src/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/src/versions/core-2/common/user-getorganizationsuggestions-arguments-changed.md b/packages/upgrade/src/versions/core-2/common/user-getorganizationsuggestions-arguments-changed.md
new file mode 100644
index 00000000000..55140d68b59
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/user-getorganizationsuggestions-arguments-changed.md
@@ -0,0 +1,16 @@
+---
+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
+ const { data } = await user.getOrganizationSuggestions({
+- limit: 10,
++ pageSize: 10,
+- offset: 10,
++ initialPage: 2,
+ })
+```
diff --git a/packages/upgrade/src/versions/core-2/common/user-profileimageurl.md b/packages/upgrade/src/versions/core-2/common/user-profileimageurl.md
new file mode 100644
index 00000000000..ca0d0d719e1
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/user-profileimageurl.md
@@ -0,0 +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/src/versions/core-2/common/user-update-password.md b/packages/upgrade/src/versions/core-2/common/user-update-password.md
new file mode 100644
index 00000000000..9d87692f9a9
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/user-update-password.md
@@ -0,0 +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:
+
+```diff
+- user.update({ password: 'foo' });
+
++ user.updatePassword({
++ currentPassword: 'bar',
++ newPassword: 'foo',
++ signOutOfOtherSessions: true,
++ });
+```
diff --git a/packages/upgrade/src/versions/core-2/common/userbuttonpopoveractionbuttontext-removed.md b/packages/upgrade/src/versions/core-2/common/userbuttonpopoveractionbuttontext-removed.md
new file mode 100644
index 00000000000..4216195fe79
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/userbuttonpopoveractionbuttontext-removed.md
@@ -0,0 +1,15 @@
+---
+title: '`userButtonPopoverActionButtonText` customization id removed'
+image: true
+category: 'appearance'
+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]*?}"
+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/src/versions/core-2/common/userbuttontrigger-userbuttonbox-invert.md b/packages/upgrade/src/versions/core-2/common/userbuttontrigger-userbuttonbox-invert.md
new file mode 100644
index 00000000000..6d6608957fa
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/userbuttontrigger-userbuttonbox-invert.md
@@ -0,0 +1,13 @@
+---
+title: '`userButtonBox` is now a child of `userButtonTrigger`'
+warning: true
+category: 'appearance'
+matcher:
+ - "\\.cl-userButtonTrigger"
+ - "\\.cl-userButtonBox"
+ - "elements:\\s+{[\\s\\S]*?userButtonTrigger:[\\s\\S]*?}"
+ - "elements:\\s+{[\\s\\S]*?userButtonBox:[\\s\\S]*?}"
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/common/userprofile-prop.md b/packages/upgrade/src/versions/core-2/common/userprofile-prop.md
new file mode 100644
index 00000000000..7d040f838e5
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/userprofile-prop.md
@@ -0,0 +1,13 @@
+---
+title: '`userProfile` -> `userProfileProps` for `UserButton`'
+matcher: ""
+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.
+
+```diff
+-
++
+```
diff --git a/packages/upgrade/src/versions/core-2/common/userprofile-security.md b/packages/upgrade/src/versions/core-2/common/userprofile-security.md
new file mode 100644
index 00000000000..738f9f0e20f
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/userprofile-security.md
@@ -0,0 +1,9 @@
+---
+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/src/versions/core-2/common/withclerk-hof-removed.md b/packages/upgrade/src/versions/core-2/common/withclerk-hof-removed.md
new file mode 100644
index 00000000000..a749b212ce8
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/withclerk-hof-removed.md
@@ -0,0 +1,30 @@
+---
+title: '`withClerk` function removed'
+matcher: "import\\s+{[^}]*?withClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]"
+category: 'hof-removal'
+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:
+
+```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/src/versions/core-2/common/withclerk-removed.md b/packages/upgrade/src/versions/core-2/common/withclerk-removed.md
new file mode 100644
index 00000000000..b7fecd0dcb5
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/withclerk-removed.md
@@ -0,0 +1,17 @@
+---
+title: '`WithClerk` component removed'
+matcher: "import\\s+{[^}]*?WithClerk[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]"
+category: 'hof-removal'
+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:
+
+```js
+export const WithClerk = ({ children }) => {
+ const clerk = useClerk();
+ if (typeof children !== 'function') throw new Error();
+
+ return {children(clerk)};
+};
+```
diff --git a/packages/upgrade/src/versions/core-2/common/withsession-hof-removed.md b/packages/upgrade/src/versions/core-2/common/withsession-hof-removed.md
new file mode 100644
index 00000000000..fd3574e338b
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/withsession-hof-removed.md
@@ -0,0 +1,30 @@
+---
+title: '`withSession` function removed'
+matcher: "import\\s+{[^}]*?withSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]"
+category: 'hof-removal'
+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:
+
+```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/src/versions/core-2/common/withsession-removed.md b/packages/upgrade/src/versions/core-2/common/withsession-removed.md
new file mode 100644
index 00000000000..0e2a3d07b35
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/withsession-removed.md
@@ -0,0 +1,17 @@
+---
+title: '`WithSession` component removed'
+matcher: "import\\s+{[^}]*?WithSession[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]"
+category: 'hof-removal'
+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:
+
+```js
+export const WithSession = ({ children }) => {
+ const session = useSession();
+ if (typeof children !== 'function') throw new Error();
+
+ return {children(session)};
+};
+```
diff --git a/packages/upgrade/src/versions/core-2/common/withuser-hof-removed.md b/packages/upgrade/src/versions/core-2/common/withuser-hof-removed.md
new file mode 100644
index 00000000000..b12e4967d7d
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/withuser-hof-removed.md
@@ -0,0 +1,30 @@
+---
+title: '`withUser` function removed'
+matcher: "import\\s+{[^}]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]"
+category: 'hof-removal'
+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:
+
+```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/src/versions/core-2/common/withuser-removed-2.md b/packages/upgrade/src/versions/core-2/common/withuser-removed-2.md
new file mode 100644
index 00000000000..4311b5b3c03
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/common/withuser-removed-2.md
@@ -0,0 +1,17 @@
+---
+title: '`WithUser` component removed'
+matcher: "import\\s+{[^}]*?withUser[\\s\\S]*?from\\s+['\"]@clerk\\/(?:nextjs|clerk-react)[\\s\\S]*?['\"]"
+category: 'hof-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
+export const WithUser = ({ children }) => {
+ const user = useUser();
+ if (typeof children !== 'function') throw new Error();
+
+ return {children(user)};
+};
+```
diff --git a/packages/upgrade/src/versions/core-2/expo/apikey-to-publishable-key.md b/packages/upgrade/src/versions/core-2/expo/apikey-to-publishable-key.md
new file mode 100644
index 00000000000..5ea0615b20c
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/expo/apikey-to-publishable-key.md
@@ -0,0 +1,7 @@
+---
+title: '`CLERK_FRONTEND_API` replaced by `CLERK_PUBLISHABLE_KEY`'
+category: 'deprecation-removal'
+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/src/versions/core-2/expo/clerkprovider-frontendapi.md b/packages/upgrade/src/versions/core-2/expo/clerkprovider-frontendapi.md
new file mode 100644
index 00000000000..525b5dd80b5
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/expo/clerkprovider-frontendapi.md
@@ -0,0 +1,15 @@
+---
+title: '`frontendApi` -> `publishableKey` as prop to `ClerkProvider`'
+matcher: ""
+category: 'deprecation-removal'
+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. Publishable keys can be found in your Clerk dashboard.
+
+```diff
+import { ClerkProvider } from '@clerk/clerk-expo';
+
+-
++
+```
diff --git a/packages/upgrade/src/versions/core-2/fastify/api-url-value-change.md b/packages/upgrade/src/versions/core-2/fastify/api-url-value-change.md
new file mode 100644
index 00000000000..a961c23f31e
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/fastify/api-url-value-change.md
@@ -0,0 +1,8 @@
+---
+title: '`API_URL` value has changed'
+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/src/versions/core-2/fastify/clerk-import-change.md b/packages/upgrade/src/versions/core-2/fastify/clerk-import-change.md
new file mode 100644
index 00000000000..32d532b76af
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/fastify/clerk-import-change.md
@@ -0,0 +1,12 @@
+---
+title: '`Clerk` -> `{ createClerkClient }`'
+matcher: "import\\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/src/versions/core-2/fastify/clerkplugin-frontendapi.md b/packages/upgrade/src/versions/core-2/fastify/clerkplugin-frontendapi.md
new file mode 100644
index 00000000000..b8da261380d
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/fastify/clerkplugin-frontendapi.md
@@ -0,0 +1,15 @@
+---
+title: '`frontendApi` -> `publishableKey` as param to clerkPlugin'
+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
+import { clerkPlugin } from '@clerk/fastify';
+
+- fastify.register(clerkPlugin, { frontendApi: '...' });
++ fastify.register(clerkPlugin, { publishableKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/fastify/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/fastify/createclerkclient-apikey.md
new file mode 100644
index 00000000000..da3f40c945a
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/fastify/createclerkclient-apikey.md
@@ -0,0 +1,15 @@
+---
+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
+import { createClerkClient } from '@clerk/fastify';
+
+- createClerkClient({ apiKey: '...' });
++ createClerkClient({ secretKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/fastify/createclerkclient-frontendapi.md b/packages/upgrade/src/versions/core-2/fastify/createclerkclient-frontendapi.md
new file mode 100644
index 00000000000..8ffdc929a60
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/fastify/createclerkclient-frontendapi.md
@@ -0,0 +1,15 @@
+---
+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
+import { createClerkClient } from '@clerk/fastify';
+
+- createClerkClient({ frontendApi: '...' });
++ createClerkClient({ publishableKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/gatsby/api-url-value-change.md b/packages/upgrade/src/versions/core-2/gatsby/api-url-value-change.md
new file mode 100644
index 00000000000..1d4dec4b2cf
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/gatsby/api-url-value-change.md
@@ -0,0 +1,8 @@
+---
+title: '`API_URL` value has changed'
+matcher: "import\\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/src/versions/core-2/gatsby/apikey-to-publishable-key.md b/packages/upgrade/src/versions/core-2/gatsby/apikey-to-publishable-key.md
new file mode 100644
index 00000000000..b0bf7e1845d
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/gatsby/apikey-to-publishable-key.md
@@ -0,0 +1,7 @@
+---
+title: '`GATSBY_CLERK_FRONTEND_API` replaced by `GATSBY_CLERK_PUBLISHABLE_KEY`'
+category: 'deprecation-removal'
+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/src/versions/core-2/gatsby/clerk-import-change.md b/packages/upgrade/src/versions/core-2/gatsby/clerk-import-change.md
new file mode 100644
index 00000000000..01be4617f38
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/gatsby/clerk-import-change.md
@@ -0,0 +1,12 @@
+---
+title: '`Clerk` -> `{ createClerkClient }`'
+matcher: "import\\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/src/versions/core-2/gatsby/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/gatsby/createclerkclient-apikey.md
new file mode 100644
index 00000000000..ee7c8662df9
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/gatsby/createclerkclient-apikey.md
@@ -0,0 +1,15 @@
+---
+title: '`apiKey` -> `secretKey` as param to createClerkClient'
+matcher: "createClerkClient\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`.
+
+```diff
+import { createClerkClient } from 'gatsby-plugin-clerk/api';
+
+- createClerkClient({ apiKey: '...' });
++ createClerkClient({ secretKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/gatsby/createclerkclient-frontendapi.md b/packages/upgrade/src/versions/core-2/gatsby/createclerkclient-frontendapi.md
new file mode 100644
index 00000000000..c157dc2a946
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/gatsby/createclerkclient-frontendapi.md
@@ -0,0 +1,15 @@
+---
+title: '`frontendApi` -> `publishableKey` as param to createClerkClient'
+matcher: "createClerkClient\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+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.
+
+```diff
+import { createClerkClient } from 'gatsby-plugin-clerk/api';
+
+- createClerkClient({ frontendApi: '...' });
++ createClerkClient({ publishableKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/gatsby/withserverauth-return-type.md b/packages/upgrade/src/versions/core-2/gatsby/withserverauth-return-type.md
new file mode 100644
index 00000000000..40dd0888e98
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/gatsby/withserverauth-return-type.md
@@ -0,0 +1,35 @@
+---
+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. 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;
+ };
+```
diff --git a/packages/upgrade/src/versions/core-2/index.js b/packages/upgrade/src/versions/core-2/index.js
new file mode 100644
index 00000000000..a4d17cb37d1
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/index.js
@@ -0,0 +1,382 @@
+import createLoader from '../../util/load-change.js';
+
+const load = createLoader({
+ version: 'core-2',
+ baseUrl: 'https://clerk.com/docs/upgrade-guides/core-2',
+});
+
+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',
+ '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',
+];
+
+const jsChanges = [
+ 'setsession',
+ 'organization-create-string',
+ 'organization-getpendinginvitations',
+ 'mfa-dropdown',
+ 'appearance-variables-breaking-changes',
+ 'aftersignxurl-changes',
+ 'supported-external-accounts-removed',
+];
+
+const reactChanges = [
+ 'magiclinkerrorcode',
+ 'usemagiclink',
+ 'ismagiclinkerror',
+ 'magiclinkerror',
+ 'handlemagiclinkverification',
+ 'clerkprovider-frontendapi-2',
+ 'navigate-to-routerpush-routerreplace',
+ 'afterswitchorganizationurl',
+ 'appearance-organizationpreview-organizationswitcher',
+ 'useorganization-invitationlist',
+ 'useorganization-membershiplist',
+ 'useorganizations',
+ 'userprofile-prop',
+ 'organizationprofile-settings',
+ 'userprofile-security',
+ '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',
+ 'externalaccount-avatarurl',
+ 'organizationmembershippublicuserdata-profileimageurl',
+];
+
+export default {
+ nextjs: load(
+ 'nextjs',
+ dedupeMerge(changesAffectingAll, jsChanges, [
+ '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',
+ 'organizationprofile-settings',
+ 'userprofile-security',
+ '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(changesAffectingAll, reactChanges, jsChanges, [
+ 'api-key-to-secret-key',
+ 'createclerkclient-apikey',
+ 'apikey-to-publishable-key',
+ 'createclerkclient-frontendapi',
+ 'ismagiclinkerror',
+ 'usemagiclink',
+ 'magiclinkerrorcode',
+ 'api-url-value-change',
+ 'withserverauth-return-type',
+ 'clerk-import-change',
+ ]),
+ ),
+ remix: load(
+ 'remix',
+ dedupeMerge(changesAffectingAll, jsChanges, [
+ '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',
+ 'new-localization-keys',
+ 'removed-localization-keys',
+ 'changed-localization-keys',
+ 'signoutcallback-to-redirecturl',
+ 'clerk-import-change',
+ 'externalaccount-avatarurl',
+ 'organizationmembershippublicuserdata-profileimageurl',
+ ]),
+ ),
+ expo: load(
+ 'expo',
+ dedupeMerge(changesAffectingAll, jsChanges, [
+ 'apikey-to-publishable-key',
+ 'ismagiclinkerror',
+ 'usemagiclink',
+ 'magiclinkerrorcode',
+ 'organizationprofile-settings',
+ 'userprofile-security',
+ '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',
+ 'externalaccount-picture',
+ 'createclerkexpressrequireauth-public-key-required',
+ 'createclerkexpresswithauth-publickey-required',
+ ]),
+ ),
+ react: load('react', dedupeMerge(changesAffectingAll, reactChanges, jsChanges)),
+ js: load(
+ 'js',
+ dedupeMerge(changesAffectingAll, jsChanges, [
+ 'magiclinkerror',
+ 'ismagiclinkerror',
+ 'magiclinkerrorcode',
+ 'usemagiclink',
+ 'handlemagiclinkverification',
+ 'user-orgpublicdata-profileimageurl',
+ 'experimental-canusecaptcha',
+ 'experimental-captchaurl',
+ 'experimental-captchasitekey',
+ 'getorganizationmemberships',
+ 'lastorganizationinvitation-member',
+ 'unstable-invitationupdate',
+ 'unstable-membershipupdate',
+ 'user-createexternalaccount-redirecturl', // maybe shared with all?
+ 'signup-attemptweb3walletverification-generatedsignature',
+ 'redirecttohome',
+ 'organizationprofile-settings',
+ 'userprofile-security',
+ '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',
+ 'clerk-import',
+ ]),
+ ),
+ shared: load('shared', [
+ 'magiclinkerror',
+ 'ismagiclinkerror',
+ 'magiclinkerrorcode',
+ 'usemagiclink',
+ 'getrequesturl',
+ 'organizationcontext',
+ 'useorganizationlist-organizationlist', // shared outside this pkg?
+ ]),
+ 'chrome-extension': load(
+ 'chrome-extension',
+ dedupeMerge(changesAffectingAll, jsChanges, ['clerkprovider-tokencache']),
+ ),
+ localizations: load('localization', [
+ 'new-localization-keys',
+ 'removed-localization-keys',
+ 'changed-localization-keys',
+ ]),
+ 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',
+ 'getclientlist-arguments',
+ 'getsessionlist-arguments',
+ 'members-count',
+ ]),
+ ),
+ types: [],
+ redwood: [],
+ express: [],
+};
+
+function dedupeMerge(...arrays) {
+ return [...new Set(arrays.flat())];
+}
diff --git a/packages/upgrade/src/versions/core-2/js/clerk-import.md b/packages/upgrade/src/versions/core-2/js/clerk-import.md
new file mode 100644
index 00000000000..a23febb3372
--- /dev/null
+++ b/packages/upgrade/src/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(?:\/headless)?['\"]"
+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';
+```
diff --git a/packages/upgrade/src/versions/core-2/js/clerk-isready-removed.md b/packages/upgrade/src/versions/core-2/js/clerk-isready-removed.md
new file mode 100644
index 00000000000..d4be8be4666
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/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.
diff --git a/packages/upgrade/src/versions/core-2/js/experimental-canusecaptcha.md b/packages/upgrade/src/versions/core-2/js/experimental-canusecaptcha.md
new file mode 100644
index 00000000000..ae0154b3bde
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/js/experimental-canusecaptcha.md
@@ -0,0 +1,7 @@
+---
+title: '`Clerk.experimental_canUseCaptcha` property removed'
+category: 'deprecation-removal'
+matcher: 'experimental_canUseCaptcha'
+---
+
+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)!
diff --git a/packages/upgrade/src/versions/core-2/js/experimental-captchasitekey.md b/packages/upgrade/src/versions/core-2/js/experimental-captchasitekey.md
new file mode 100644
index 00000000000..125f50a918d
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/js/experimental-captchasitekey.md
@@ -0,0 +1,7 @@
+---
+title: '`Clerk.experimental_captchaSiteKey` property removed'
+category: 'deprecation-removal'
+matcher: 'experimental_captchaSiteKey'
+---
+
+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)!
diff --git a/packages/upgrade/src/versions/core-2/js/experimental-captchaurl.md b/packages/upgrade/src/versions/core-2/js/experimental-captchaurl.md
new file mode 100644
index 00000000000..6ff3554d046
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/js/experimental-captchaurl.md
@@ -0,0 +1,7 @@
+---
+title: '`Clerk.experimental_captchaURL` property removed'
+category: 'deprecation-removal'
+matcher: 'experimental_captchaURL'
+---
+
+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)!
diff --git a/packages/upgrade/src/versions/core-2/js/getorganizationmemberships.md b/packages/upgrade/src/versions/core-2/js/getorganizationmemberships.md
new file mode 100644
index 00000000000..e3a5eea7e3b
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/js/getorganizationmemberships.md
@@ -0,0 +1,11 @@
+---
+title: '`Clerk.getOrganizationMemberships()` -> `user.getOrganizationMemberships()`'
+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.
+
+```diff
+- Clerk.getOrganizationMemberships();
++ user.getOrganizationMemberships();
+```
diff --git a/packages/upgrade/src/versions/core-2/js/lastorganizationinvitation-member.md b/packages/upgrade/src/versions/core-2/js/lastorganizationinvitation-member.md
new file mode 100644
index 00000000000..ef6daa3c61a
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/js/lastorganizationinvitation-member.md
@@ -0,0 +1,6 @@
+---
+title: '`lastOrganizationInvitation` and `lastOrganizationMember` dropped from event emitter'
+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!
diff --git a/packages/upgrade/src/versions/core-2/js/redirecttohome.md b/packages/upgrade/src/versions/core-2/js/redirecttohome.md
new file mode 100644
index 00000000000..1f6f04ce283
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/js/redirecttohome.md
@@ -0,0 +1,13 @@
+---
+title: '`Clerk.redirectToHome()` removed'
+matcher: "Clerk.redirectToHome\\("
+---
+
+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:
+
+- 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/src/versions/core-2/js/signup-attemptweb3walletverification-generatedsignature.md b/packages/upgrade/src/versions/core-2/js/signup-attemptweb3walletverification-generatedsignature.md
new file mode 100644
index 00000000000..51cde252f38
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/js/signup-attemptweb3walletverification-generatedsignature.md
@@ -0,0 +1,22 @@
+---
+title: '`generatedSignature` -> `signature` as param of `Signup.attemptWeb3WalletVerification`'
+matcher: "attemptWeb3WalletVerification\\([\\s\\S]*?generatedSignature:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+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.
+
+```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 });
+```
diff --git a/packages/upgrade/src/versions/core-2/js/unstable-invitationupdate.md b/packages/upgrade/src/versions/core-2/js/unstable-invitationupdate.md
new file mode 100644
index 00000000000..3b53149e28e
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/js/unstable-invitationupdate.md
@@ -0,0 +1,7 @@
+---
+title: '`Clerk.__unstable__invitationUpdate` removed'
+category: 'deprecation-removal'
+matcher: '__unstable__invitationUpdate'
+---
+
+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)!
diff --git a/packages/upgrade/src/versions/core-2/js/unstable-membershipupdate.md b/packages/upgrade/src/versions/core-2/js/unstable-membershipupdate.md
new file mode 100644
index 00000000000..c013fa6caa3
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/js/unstable-membershipupdate.md
@@ -0,0 +1,7 @@
+---
+title: '`Clerk.__unstable__membershipUpdate` removed'
+category: 'deprecation-removal'
+matcher: '__unstable__membershipUpdate'
+---
+
+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)!
diff --git a/packages/upgrade/src/versions/core-2/js/user-createexternalaccount-redirecturl.md b/packages/upgrade/src/versions/core-2/js/user-createexternalaccount-redirecturl.md
new file mode 100644
index 00000000000..36e23f8efd4
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/js/user-createexternalaccount-redirecturl.md
@@ -0,0 +1,8 @@
+---
+title: '`redirect_url` -> `redirectUrl` as param of `User.createExternalAccount`'
+matcher: "createExternalAccount\\(\\s*{[\\s\\S]*?(redirect_url):[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+replaceWithString: 'redirectUrl'
+---
+
+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.
diff --git a/packages/upgrade/src/versions/core-2/js/user-orgpublicdata-profileimageurl.md b/packages/upgrade/src/versions/core-2/js/user-orgpublicdata-profileimageurl.md
new file mode 100644
index 00000000000..15e3f06c9a4
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/js/user-orgpublicdata-profileimageurl.md
@@ -0,0 +1,7 @@
+---
+title: '`[User|OrganizationMembershipPublicData].profileImageUrl` -> `[User|OrganizationMembershipPublicData].imageUrl`'
+matcher: "\\.profileImageUrl"
+replaceWithString: '.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`.
diff --git a/packages/upgrade/src/versions/core-2/nextjs/api-url-value-change.md b/packages/upgrade/src/versions/core-2/nextjs/api-url-value-change.md
new file mode 100644
index 00000000000..0e1af39b8e0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/api-url-value-change.md
@@ -0,0 +1,8 @@
+---
+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/src/versions/core-2/nextjs/auth-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/auth-import-change.md
new file mode 100644
index 00000000000..750882d5788
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/auth-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`auth` import moved under `/server`'
+matcher: "import\\s+{[^}]*?[,\\s]auth[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/auth-middleware-deprecated.md b/packages/upgrade/src/versions/core-2/nextjs/auth-middleware-deprecated.md
new file mode 100644
index 00000000000..788c6f41652
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/auth-middleware-deprecated.md
@@ -0,0 +1,50 @@
+---
+title: '`authMiddleware` deprecated'
+matcher: "import\\s+{[^}]*?authMiddleware[\\s\\S]*?}\\s+from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'middleware'
+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`.
+
+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: ['/((?!.*\\..*|_next).*)', '/', '/(api|trpc)(.*)'],
+};
+```
diff --git a/packages/upgrade/src/versions/core-2/nextjs/authmiddleware-apikey.md b/packages/upgrade/src/versions/core-2/nextjs/authmiddleware-apikey.md
new file mode 100644
index 00000000000..358a13cdca5
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/authmiddleware-apikey.md
@@ -0,0 +1,15 @@
+---
+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`.
+
+```diff
+import { authMiddleware } from '@clerk/nextjs';
+
+- authMiddleware({ apiKey: '...' });
++ authMiddleware({ secretKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/nextjs/authmiddleware-frontendapi.md b/packages/upgrade/src/versions/core-2/nextjs/authmiddleware-frontendapi.md
new file mode 100644
index 00000000000..f2ef1a71a59
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/authmiddleware-frontendapi.md
@@ -0,0 +1,15 @@
+---
+title: '`frontendApi` -> `publishableKey` as param to `authMiddleware`'
+matcher: "authMiddleware\\({[\\s\\S]*?frontendApi:[\\s\\S]*?}\\)"
+category: 'deprecation-removal'
+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/src/versions/core-2/nextjs/authmiddleware-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/authmiddleware-import-change.md
new file mode 100644
index 00000000000..cb9f6f802b9
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/authmiddleware-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`authMiddleware` import moved under `/server`'
+matcher: "import\\s+{[^}]*?authMiddleware[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+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:
+
+```diff
+- import { authMiddleware } from "@clerk/nextjs"
++ import { authMiddleware } from "@clerk/nextjs/server"
+```
diff --git a/packages/upgrade/src/versions/core-2/nextjs/buildclerkprops-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/buildclerkprops-import-change.md
new file mode 100644
index 00000000000..d49434a4b87
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/buildclerkprops-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`buildClerkProps` import moved under `/server`'
+matcher: "import\\s+{[^}]*?buildClerkProps[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/clerk-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/clerk-import-change.md
new file mode 100644
index 00000000000..ab146fe80c9
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/clerk-import-change.md
@@ -0,0 +1,13 @@
+---
+title: '`Clerk` import moved under `/server`'
+matcher: "import\\s+{[^}]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/nextjs(?!\/server)[\\s\\S]*?['\"]"
+category: 'top-level-imports'
+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
+- import { Clerk } from "@clerk/nextjs"
++ import { createClerkClient } from "@clerk/nextjs/server"
+```
diff --git a/packages/upgrade/src/versions/core-2/nextjs/clerk-js-version-next-public.md b/packages/upgrade/src/versions/core-2/nextjs/clerk-js-version-next-public.md
new file mode 100644
index 00000000000..2ee0c00d468
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/clerk-js-version-next-public.md
@@ -0,0 +1,9 @@
+---
+title: '`CLERK_JS_VERSION` should be `NEXT_PUBLIC_CLERK_JS_VERSION`'
+category: 'deprecation-removal'
+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.
+
+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.
diff --git a/packages/upgrade/src/versions/core-2/nextjs/constants-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/constants-import-change.md
new file mode 100644
index 00000000000..dea092bfdce
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/constants-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`constants` import moved under `/server`'
+matcher: "import\\s+{[^}]*?constants[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/createauthenticaterequest-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/createauthenticaterequest-import-change.md
new file mode 100644
index 00000000000..89999098916
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/createauthenticaterequest-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`createAuthenticateRequest` import moved under `/server`'
+matcher: "import\\s+{[^}]*?createAuthenticateRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/nextjs/createclerkclient-apikey.md
new file mode 100644
index 00000000000..a4f4b71e306
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/createclerkclient-apikey.md
@@ -0,0 +1,15 @@
+---
+title: '`apiKey` -> `secretKey` as param to `createClerkClient`'
+matcher: "createClerkClient\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`.
+
+```diff
+import { createClerkClient } from '@clerk/nextjs/server';
+
+- createClerkClient({ apiKey: '...' });
++ createClerkClient({ secretKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/nextjs/createclerkclient-frontendapi.md b/packages/upgrade/src/versions/core-2/nextjs/createclerkclient-frontendapi.md
new file mode 100644
index 00000000000..be66087dbf9
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/createclerkclient-frontendapi.md
@@ -0,0 +1,15 @@
+---
+title: '`frontendApi` -> `publishableKey` as param to `createClerkClient`'
+matcher: "createClerkClient\\({[\\s\\S]*?frontendApi:[\\s\\S]*?}\\)"
+category: 'deprecation-removal'
+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.
+
+```diff
+import { createClerkClient } from '@clerk/nextjs/server';
+
+- createClerkClient({ frontendApi: '...' });
++ createClerkClient({ publishableKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/nextjs/createisomorphicrequest-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/createisomorphicrequest-import-change.md
new file mode 100644
index 00000000000..c9e74752ab2
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/createisomorphicrequest-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`createIsomorphicRequest` import moved under `/server`'
+matcher: "import\\s+{[^}]*?createIsomorphicRequest[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/currentuser-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/currentuser-import-change.md
new file mode 100644
index 00000000000..a0237faf329
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/currentuser-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`currentUser` import moved under `/server`'
+matcher: "import\\s+{[^}]*?currentUser[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/decodejwt-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/decodejwt-import-change.md
new file mode 100644
index 00000000000..660e4bac78d
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/decodejwt-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`decodeJwt` import moved under `/server`'
+matcher: "import\\s+{[^}]*?decodeJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/emaillinkerrorcode-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/emaillinkerrorcode-import-change.md
new file mode 100644
index 00000000000..7f4ec3d07d6
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/emaillinkerrorcode-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`EmailLinkErrorCode` import moved under `/errors`'
+matcher: "import\\s+{[^}]*?EmailLinkErrorCode[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/getauth-apikey.md b/packages/upgrade/src/versions/core-2/nextjs/getauth-apikey.md
new file mode 100644
index 00000000000..478c88ec8d4
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/getauth-apikey.md
@@ -0,0 +1,13 @@
+---
+title: '`apiKey` -> `secretKey` as param to `getAuth`'
+matcher: "getAuth\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+The `apiKey` argument passed to `getAuth` must be changed to `secretKey`.
+
+```diff
+- getAuth({ apiKey: '...' })
++ getAuth({ secretKey: '...' })
+```
diff --git a/packages/upgrade/src/versions/core-2/nextjs/import-api-url.md b/packages/upgrade/src/versions/core-2/nextjs/import-api-url.md
new file mode 100644
index 00000000000..6613a016fa6
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-api-url.md
@@ -0,0 +1,8 @@
+---
+title: '`API_URL` constant removed'
+matcher: "import\\s+{[^}]*?API_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/nextjs/import-api-version.md b/packages/upgrade/src/versions/core-2/nextjs/import-api-version.md
new file mode 100644
index 00000000000..a43511d465f
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-api-version.md
@@ -0,0 +1,8 @@
+---
+title: '`API_VERSION` constant removed'
+matcher: "import\\s+{[^}]*?API_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/nextjs/import-clerk-js-url.md b/packages/upgrade/src/versions/core-2/nextjs/import-clerk-js-url.md
new file mode 100644
index 00000000000..fd1fca555d0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-clerk-js-url.md
@@ -0,0 +1,8 @@
+---
+title: '`CLERK_JS_URL` constant removed'
+matcher: "import\\s+{[^}]*?CLERK_JS_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/nextjs/import-clerk-js-version.md b/packages/upgrade/src/versions/core-2/nextjs/import-clerk-js-version.md
new file mode 100644
index 00000000000..e69e6e0437c
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-clerk-js-version.md
@@ -0,0 +1,8 @@
+---
+title: '`CLERK_JS_VERSION` constant removed'
+matcher: "import\\s+{[^}]*?CLERK_JS_VERSION[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/nextjs/import-domain.md b/packages/upgrade/src/versions/core-2/nextjs/import-domain.md
new file mode 100644
index 00000000000..6dcd1e71cb2
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-domain.md
@@ -0,0 +1,8 @@
+---
+title: '`DOMAIN` constant removed'
+matcher: "import\\s+{[^}]*?DOMAIN[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/nextjs/import-is-satellite.md b/packages/upgrade/src/versions/core-2/nextjs/import-is-satellite.md
new file mode 100644
index 00000000000..e6dd26140b0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-is-satellite.md
@@ -0,0 +1,8 @@
+---
+title: '`IS_SATELLITE` constant removed'
+matcher: "import\\s+{[^}]*?IS_SATELLITE[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/nextjs/import-nextjs-api.md b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-api.md
new file mode 100644
index 00000000000..4529b649f12
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-api.md
@@ -0,0 +1,21 @@
+---
+title: '`@clerk/nextjs/api` import removed'
+category: 'deprecation-removal'
+matcher: "@clerk\\/nextjs\\/api"
+---
+
+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`.
diff --git a/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-app-beta.md b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-app-beta.md
new file mode 100644
index 00000000000..baf331c131f
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-app-beta.md
@@ -0,0 +1,11 @@
+---
+title: '`@clerk/nextjs/app-beta` import removed'
+category: 'deprecation-removal'
+matcher: "@clerk\\/nextjs\\/app-beta"
+---
+
+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.
diff --git a/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-edge-middleware.md b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-edge-middleware.md
new file mode 100644
index 00000000000..7001086e96f
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-edge-middleware.md
@@ -0,0 +1,7 @@
+---
+title: '`@clerk/nextjs/edge-middleware` import removed'
+category: 'deprecation-removal'
+matcher: "@clerk\\/nextjs\\/edge-middleware"
+---
+
+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.
diff --git a/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-edge-middlewarefiles.md b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-edge-middlewarefiles.md
new file mode 100644
index 00000000000..6ce9acf258c
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-edge-middlewarefiles.md
@@ -0,0 +1,7 @@
+---
+title: '`@clerk/nextjs/edge-middlewarefiles` import removed'
+category: 'deprecation-removal'
+matcher: "@clerk\\/nextjs\\/edge-middlewarefiles"
+---
+
+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.
diff --git a/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-ssr.md b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-ssr.md
new file mode 100644
index 00000000000..055a7cf7263
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-nextjs-ssr.md
@@ -0,0 +1,8 @@
+---
+title: '`@clerk/nextjs/ssr` import removed'
+matcher: "@clerk\\/nextjs\\/ssr"
+category: 'deprecation-removal'
+replaceWithString: '@clerk/nextjs'
+---
+
+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.
diff --git a/packages/upgrade/src/versions/core-2/nextjs/import-proxy-url.md b/packages/upgrade/src/versions/core-2/nextjs/import-proxy-url.md
new file mode 100644
index 00000000000..2cfa0729ba5
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-proxy-url.md
@@ -0,0 +1,8 @@
+---
+title: '`PROXY_URL` constant removed'
+matcher: "import\\s+{[^}]*?PROXY_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/nextjs/import-publishable-key.md b/packages/upgrade/src/versions/core-2/nextjs/import-publishable-key.md
new file mode 100644
index 00000000000..b5d9c6daea0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-publishable-key.md
@@ -0,0 +1,8 @@
+---
+title: '`PUBLISHABLE_KEY` constant removed'
+matcher: "import\\s+{[^}]*?PUBLISHABLE_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/nextjs/import-secret-key.md b/packages/upgrade/src/versions/core-2/nextjs/import-secret-key.md
new file mode 100644
index 00000000000..c422aa0ad09
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-secret-key.md
@@ -0,0 +1,8 @@
+---
+title: '`SECRET_KEY` constant removed'
+matcher: "import\\s+{[^}]*?SECRET_KEY[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/nextjs/import-sign-in-url.md b/packages/upgrade/src/versions/core-2/nextjs/import-sign-in-url.md
new file mode 100644
index 00000000000..bdd86ca1a34
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-sign-in-url.md
@@ -0,0 +1,8 @@
+---
+title: '`SIGN_IN_URL` constant removed'
+matcher: "import\\s+{[^}]*?SIGN_IN_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/nextjs/import-sign-up-url.md b/packages/upgrade/src/versions/core-2/nextjs/import-sign-up-url.md
new file mode 100644
index 00000000000..80e43dc528f
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/import-sign-up-url.md
@@ -0,0 +1,8 @@
+---
+title: '`SIGN_UP_URL` constant removed'
+matcher: "import\\s+{[^}]*?SIGN_UP_URL[\\s\\S]*?from\\s+['\"]@clerk\\/nextjs[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+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/src/versions/core-2/nextjs/isclerkapiresponserror-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/isclerkapiresponserror-import-change.md
new file mode 100644
index 00000000000..816f546d669
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/isclerkapiresponserror-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`isClerkAPIResponseError` import moved under `/errors`'
+matcher: "import\\s+{[^}]*?isClerkAPIResponseError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/isemaillinkerror-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/isemaillinkerror-import-change.md
new file mode 100644
index 00000000000..23d0a23ccc7
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/isemaillinkerror-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`isEmailLinkError` import moved under `/errors`'
+matcher: "import\\s+{[^}]*?isEmailLinkError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/isknownerror-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/isknownerror-import-change.md
new file mode 100644
index 00000000000..74d1619f776
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/isknownerror-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`isKnownError` import moved under `/errors`'
+matcher: "import\\s+{[^}]*?isKnownError[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/errors)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/min-nextjs-version.md b/packages/upgrade/src/versions/core-2/nextjs/min-nextjs-version.md
new file mode 100644
index 00000000000..c000ce378b5
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/min-nextjs-version.md
@@ -0,0 +1,11 @@
+---
+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:
+
+- [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/src/versions/core-2/nextjs/multisessionappsupport-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/multisessionappsupport-import-change.md
new file mode 100644
index 00000000000..f948d6b3096
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/multisessionappsupport-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`MultiSessionAppSupport` import moved under `/internal`'
+matcher: "import\\s+{[^}]*?MultiSessionAppSupport[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/internal)[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+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/src/versions/core-2/nextjs/next-public-clerk-js-url.md b/packages/upgrade/src/versions/core-2/nextjs/next-public-clerk-js-url.md
new file mode 100644
index 00000000000..775e21a9535
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/next-public-clerk-js-url.md
@@ -0,0 +1,7 @@
+---
+title: '`NEXT_PUBLIC_CLERK_JS` should be `NEXT_PUBLIC_CLERK_JS_URL`'
+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. 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/src/versions/core-2/nextjs/redirect-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/redirect-import-change.md
new file mode 100644
index 00000000000..9cd53151706
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/redirect-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`redirect` import moved under `/server`'
+matcher: "import\\s+{[^}]*?[,\\s]redirect[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/redirecttosignin-import-path.md b/packages/upgrade/src/versions/core-2/nextjs/redirecttosignin-import-path.md
new file mode 100644
index 00000000000..b16bc412671
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/redirecttosignin-import-path.md
@@ -0,0 +1,13 @@
+---
+title: '`redirectToSignIn` import moved under `/server`'
+matcher: "import\\s+{[^}]*?[,\\s]redirectToSignIn[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/redirecttosignup-import-path.md b/packages/upgrade/src/versions/core-2/nextjs/redirecttosignup-import-path.md
new file mode 100644
index 00000000000..14aa735e280
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/redirecttosignup-import-path.md
@@ -0,0 +1,13 @@
+---
+title: '`redirectToSignUp` import moved under `/server`'
+matcher: "import\\s+{[^}]*?[,\\s]redirectToSignUp[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/signjwt-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/signjwt-import-change.md
new file mode 100644
index 00000000000..2328f693259
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/signjwt-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`signJwt` import moved under `/server`'
+matcher: "import\\s+{[^}]*?signJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/verifyjwt-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/verifyjwt-import-change.md
new file mode 100644
index 00000000000..eb973236370
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/verifyjwt-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`verifyJwt` import moved under `/server`'
+matcher: "import\\s+{[^}]*?verifyJwt[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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/src/versions/core-2/nextjs/verifytoken-import-change.md b/packages/upgrade/src/versions/core-2/nextjs/verifytoken-import-change.md
new file mode 100644
index 00000000000..1820a079de8
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/verifytoken-import-change.md
@@ -0,0 +1,14 @@
+---
+title: '`verifyToken` import moved under `/server`'
+matcher: "import\\s+{[^}]*?verifyToken[\\s\\S]*?from\\s+['\"]@clerk\\/(nextjs)(?!\/server)[\\s\\S]*?['\"]"
+matcherFlags: 'm'
+category: 'top-level-imports'
+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"
+```
diff --git a/packages/upgrade/src/versions/core-2/nextjs/with-clerk-middleware-removed.md b/packages/upgrade/src/versions/core-2/nextjs/with-clerk-middleware-removed.md
new file mode 100644
index 00000000000..eef3727f0e0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/nextjs/with-clerk-middleware-removed.md
@@ -0,0 +1,56 @@
+---
+title: '`withClerkMiddleware` removed'
+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.
+
+```js
+// 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/src/versions/core-2/node/api-url-value-change.md b/packages/upgrade/src/versions/core-2/node/api-url-value-change.md
new file mode 100644
index 00000000000..3f28d76a90c
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/api-url-value-change.md
@@ -0,0 +1,8 @@
+---
+title: '`API_URL` value has changed'
+matcher: "import\\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/src/versions/core-2/node/cjs-esm-instance.md b/packages/upgrade/src/versions/core-2/node/cjs-esm-instance.md
new file mode 100644
index 00000000000..9d793230650
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/cjs-esm-instance.md
@@ -0,0 +1,14 @@
+---
+title: '`cjs/instance` and `esm/instance` imports no longer needed'
+matcher: "@clerk\\/clerk-sdk-node(\\/(?:cjs|esm)\\/instance)"
+category: '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.
+
+```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/src/versions/core-2/node/clerk-import-change.md b/packages/upgrade/src/versions/core-2/node/clerk-import-change.md
new file mode 100644
index 00000000000..ffd41918e23
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/clerk-import-change.md
@@ -0,0 +1,12 @@
+---
+title: '`Clerk` -> `{ createClerkClient }`'
+matcher: "import\\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/src/versions/core-2/node/clerkexpressrequireauth-apikey.md b/packages/upgrade/src/versions/core-2/node/clerkexpressrequireauth-apikey.md
new file mode 100644
index 00000000000..356b099dcb9
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/clerkexpressrequireauth-apikey.md
@@ -0,0 +1,15 @@
+---
+title: '`apiKey` -> `secretKey` as param to ClerkExpressRequireAuth'
+matcher: "ClerkExpressRequireAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+The `apiKey` argument passed to `ClerkExpressRequireAuth` must be changed to `secretKey`.
+
+```diff
+import { ClerkExpressRequireAuth } from '@clerk/clerk-sdk-node';
+
+- ClerkExpressRequireAuth({ apiKey: '...' });
++ ClerkExpressRequireAuth({ secretKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/clerkexpressrequireauth-frontendapi.md b/packages/upgrade/src/versions/core-2/node/clerkexpressrequireauth-frontendapi.md
new file mode 100644
index 00000000000..69d97497c23
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/clerkexpressrequireauth-frontendapi.md
@@ -0,0 +1,15 @@
+---
+title: '`frontendApi` -> `publishableKey` as param to ClerkExpressRequireAuth'
+matcher: "ClerkExpressRequireAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+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.
+
+```diff
+import { ClerkExpressRequireAuth } from '@clerk/clerk-sdk-node';
+
+- ClerkExpressRequireAuth({ frontendApi: '...' });
++ ClerkExpressRequireAuth({ publishableKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/clerkexpresswithauth-apikey.md b/packages/upgrade/src/versions/core-2/node/clerkexpresswithauth-apikey.md
new file mode 100644
index 00000000000..2f101fe82d3
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/clerkexpresswithauth-apikey.md
@@ -0,0 +1,15 @@
+---
+title: '`apiKey` -> `secretKey` as param to ClerkExpressWithAuth'
+matcher: "ClerkExpressWithAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+The `apiKey` argument passed to `ClerkExpressWithAuth` must be changed to `secretKey`.
+
+```diff
+import { ClerkExpressWithAuth } from '@clerk/clerk-sdk-node';
+
+- ClerkExpressWithAuth({ apiKey: '...' });
++ ClerkExpressWithAuth({ secretKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/clerkexpresswithauth-frontendapi.md b/packages/upgrade/src/versions/core-2/node/clerkexpresswithauth-frontendapi.md
new file mode 100644
index 00000000000..c6fe6cdda11
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/clerkexpresswithauth-frontendapi.md
@@ -0,0 +1,15 @@
+---
+title: '`frontendApi` -> `publishableKey` as param to ClerkExpressWithAuth'
+matcher: "ClerkExpressWithAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+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.
+
+```diff
+import { ClerkExpressWithAuth } from '@clerk/clerk-sdk-node';
+
+- ClerkExpressWithAuth({ frontendApi: '...' });
++ ClerkExpressWithAuth({ publishableKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/node/createclerkclient-apikey.md
new file mode 100644
index 00000000000..80b775f188c
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/createclerkclient-apikey.md
@@ -0,0 +1,15 @@
+---
+title: '`apiKey` -> `secretKey` as param to createClerkClient'
+matcher: "createClerkClient\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+The `apiKey` argument passed to `createClerkClient` must be changed to `secretKey`.
+
+```diff
+import { createClerkClient } from '@clerk/clerk-sdk-node';
+
+- createClerkClient({ apiKey: '...' });
++ createClerkClient({ secretKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/createclerkclient-frontendapi.md b/packages/upgrade/src/versions/core-2/node/createclerkclient-frontendapi.md
new file mode 100644
index 00000000000..7404774138c
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/createclerkclient-frontendapi.md
@@ -0,0 +1,15 @@
+---
+title: '`frontendApi` -> `publishableKey` as param to createClerkClient'
+matcher: "createClerkClient\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+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.
+
+```diff
+import { createClerkClient } from '@clerk/clerk-sdk-node';
+
+- createClerkClient({ frontendApi: '...' });
++ createClerkClient({ publishableKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-apikey.md b/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-apikey.md
new file mode 100644
index 00000000000..01e9fe2ecc9
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-apikey.md
@@ -0,0 +1,15 @@
+---
+title: '`apiKey` -> `secretKey` as param to createClerkExpressRequireAuth'
+matcher: "createClerkExpressRequireAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+The `apiKey` argument passed to `createClerkExpressRequireAuth` must be changed to `secretKey`.
+
+```diff
+import { createClerkExpressRequireAuth } from '@clerk/clerk-sdk-node';
+
+- createClerkExpressRequireAuth({ apiKey: '...' });
++ createClerkExpressRequireAuth({ secretKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-frontendapi.md b/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-frontendapi.md
new file mode 100644
index 00000000000..f9ed98e0660
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-frontendapi.md
@@ -0,0 +1,15 @@
+---
+title: '`frontendApi` -> `publishableKey` as param to createClerkExpressRequireAuth'
+matcher: "createClerkExpressRequireAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+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.
+
+```diff
+import { createClerkExpressRequireAuth } from '@clerk/clerk-sdk-node';
+
+- createClerkExpressRequireAuth({ frontendApi: '...' });
++ createClerkExpressRequireAuth({ publishableKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md b/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md
new file mode 100644
index 00000000000..4395b49f6eb
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/createclerkexpressrequireauth-public-key-required.md
@@ -0,0 +1,7 @@
+---
+title: '`createClerkExpressRequireAuth` requires publishable key'
+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/src/versions/core-2/node/createclerkexpresswithauth-apikey.md b/packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-apikey.md
new file mode 100644
index 00000000000..85db74f2d8f
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-apikey.md
@@ -0,0 +1,15 @@
+---
+title: '`apiKey` -> `secretKey` as param to createClerkExpressWithAuth'
+matcher: "createClerkExpressWithAuth\\([\\s\\S]*?apiKey:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+matcherFlags: 'm'
+---
+
+The `apiKey` argument passed to `createClerkExpressWithAuth` must be changed to `secretKey`.
+
+```diff
+import { createClerkExpressWithAuth } from '@clerk/clerk-sdk-node';
+
+- createClerkExpressWithAuth({ apiKey: '...' });
++ createClerkExpressWithAuth({ secretKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-frontendapi.md b/packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-frontendapi.md
new file mode 100644
index 00000000000..743a5d3dd6b
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-frontendapi.md
@@ -0,0 +1,15 @@
+---
+title: '`frontendApi` -> `publishableKey` as param to createClerkExpressWithAuth'
+matcher: "createClerkExpressWithAuth\\([\\s\\S]*?frontendApi:[\\s\\S]*?\\)"
+category: 'deprecation-removal'
+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.
+
+```diff
+import { createClerkExpressWithAuth } from '@clerk/clerk-sdk-node';
+
+- createClerkExpressWithAuth({ frontendApi: '...' });
++ createClerkExpressWithAuth({ publishableKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-publickey-required.md b/packages/upgrade/src/versions/core-2/node/createclerkexpresswithauth-publickey-required.md
new file mode 100644
index 00000000000..b2f9ea1bbb3
--- /dev/null
+++ b/packages/upgrade/src/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/packages/upgrade/src/versions/core-2/node/legacyauthobject-removed.md b/packages/upgrade/src/versions/core-2/node/legacyauthobject-removed.md
new file mode 100644
index 00000000000..e391c17a82e
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/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/src/versions/core-2/node/setclerkapikey.md b/packages/upgrade/src/versions/core-2/node/setclerkapikey.md
new file mode 100644
index 00000000000..5f1ff8b921b
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/setclerkapikey.md
@@ -0,0 +1,16 @@
+---
+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
+import { createClerkClient, setClerkApiKey } from '@clerk/clerk-sdk-node';
+
+- const clerkClient = createClerkClient({ apiKey: '...' });
+- setClerkApiKey('...');
+
++ const clerkClient = createClerkClient({ secretKey: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/setclerkapiversion.md b/packages/upgrade/src/versions/core-2/node/setclerkapiversion.md
new file mode 100644
index 00000000000..08b19ea75c0
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/setclerkapiversion.md
@@ -0,0 +1,16 @@
+---
+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
+import { clerkClient, setClerkApiKey } from '@clerk/clerk-sdk-node';
+
+- const clerkClient = createClerkClient({ apiKey: '...' });
+- setClerkApiVersion('...');
+
++ const clerkClient = createClerkClient({ secretKey: '...', apiVersion: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/setclerkhttpoptions.md b/packages/upgrade/src/versions/core-2/node/setclerkhttpoptions.md
new file mode 100644
index 00000000000..9f7cd7ae243
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/setclerkhttpoptions.md
@@ -0,0 +1,16 @@
+---
+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
+import { clerkClient, setClerkApiKey } from '@clerk/clerk-sdk-node';
+
+- const clerkClient = createClerkClient({ apiKey: '...' });
+- setClerkHttpOptions('...');
+
++ const clerkClient = createClerkClient({ secretKey: '...', httpOptions: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/node/setclerkserverapiurl.md b/packages/upgrade/src/versions/core-2/node/setclerkserverapiurl.md
new file mode 100644
index 00000000000..7d9c3ac6b34
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/node/setclerkserverapiurl.md
@@ -0,0 +1,19 @@
+---
+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
+import { clerkClient, setClerkApiKey } from '@clerk/clerk-sdk-node';
+
+- const clerkClient = createClerkClient({ apiKey: '...' });
+- setClerkServerApiUrl('...');
+
++ const clerkClient = createClerkClient({
++ secretKey: '...',
++ serverApiURL: '...',
++ });
+```
diff --git a/packages/upgrade/src/versions/core-2/react/api-url-value-change.md b/packages/upgrade/src/versions/core-2/react/api-url-value-change.md
new file mode 100644
index 00000000000..8b8fa16eacd
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/react/api-url-value-change.md
@@ -0,0 +1,8 @@
+---
+title: '`API_URL` value has changed'
+matcher: "import\\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/src/versions/core-2/remix/clerk-import-change.md b/packages/upgrade/src/versions/core-2/remix/clerk-import-change.md
new file mode 100644
index 00000000000..78f27bae1b3
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/remix/clerk-import-change.md
@@ -0,0 +1,13 @@
+---
+title: '`Clerk` -> `{ createClerkClient }`'
+matcher: "import\\s+{[^}]*?[,\\s]Clerk[,\\s][\\s\\S]*?from\\s+['\"]@clerk\\/remix[\\s\\S]*?['\"]"
+category: 'deprecation-removal'
+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"
+```
diff --git a/packages/upgrade/src/versions/core-2/remix/clerkerrorboundary-removed.md b/packages/upgrade/src/versions/core-2/remix/clerkerrorboundary-removed.md
new file mode 100644
index 00000000000..2436d0662b5
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/remix/clerkerrorboundary-removed.md
@@ -0,0 +1,24 @@
+---
+title: '`ClerkErrorBoundary` removed'
+matcher: "import\\s+{[^}]*?ClerkErrorBoundary[\\s\\S]*?from\\s+['\"]@clerk\\/remix[\\s\\S]*?['\"]"
+category: 'error-boundary-removed'
+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:
+
+```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();
+```
diff --git a/packages/upgrade/src/versions/core-2/remix/createclerkclient-apikey.md b/packages/upgrade/src/versions/core-2/remix/createclerkclient-apikey.md
new file mode 100644
index 00000000000..b5283b868aa
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/remix/createclerkclient-apikey.md
@@ -0,0 +1,15 @@
+---
+title: '`apiKey` -> `secretKey` as argument to createClerkClient'
+matcher: "createClerkClient\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)"
+category: 'deprecation-removal'
+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/src/versions/core-2/remix/getauth-apikey.md b/packages/upgrade/src/versions/core-2/remix/getauth-apikey.md
new file mode 100644
index 00000000000..6b2452ed93b
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/remix/getauth-apikey.md
@@ -0,0 +1,17 @@
+---
+title: '`apiKey` -> `secretKey` as argument to getAuth'
+matcher: "getAuth\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)"
+category: 'deprecation-removal'
+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/src/versions/core-2/remix/rootauthloader-apikey.md b/packages/upgrade/src/versions/core-2/remix/rootauthloader-apikey.md
new file mode 100644
index 00000000000..27764132975
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/remix/rootauthloader-apikey.md
@@ -0,0 +1,15 @@
+---
+title: '`apiKey` -> `secretKey` as argument to rootAuthLoader'
+matcher: "rootAuthLoader\\({[\\s\\S]*?apiKey:[\\s\\S]*?}\\)"
+category: 'deprecation-removal'
+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: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/remix/rootauthloader-frontendapi.md b/packages/upgrade/src/versions/core-2/remix/rootauthloader-frontendapi.md
new file mode 100644
index 00000000000..22c78f2af0a
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/remix/rootauthloader-frontendapi.md
@@ -0,0 +1,15 @@
+---
+title: '`frontendApi` -> `publishableKey` as argument to rootAuthLoader'
+matcher: "rootAuthLoader\\({[\\s\\S]*?frontendApi:[\\s\\S]*?}\\)"
+category: 'deprecation-removal'
+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: '...' });
+```
diff --git a/packages/upgrade/src/versions/core-2/shared/getrequesturl.md b/packages/upgrade/src/versions/core-2/shared/getrequesturl.md
new file mode 100644
index 00000000000..c9e75e23694
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/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).
diff --git a/packages/upgrade/src/versions/core-2/shared/organizationcontext.md b/packages/upgrade/src/versions/core-2/shared/organizationcontext.md
new file mode 100644
index 00000000000..67bb6d952d1
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/shared/organizationcontext.md
@@ -0,0 +1,7 @@
+---
+title: '`OrganizationContext` -> `OrganizationProvider`'
+matcher: 'OrganizationContext'
+replaceWithString: 'OrganizationProvider'
+---
+
+The name of the `OrganizationContext` provider has been changed to `OrganizationProvider` to more accurately reflect its functionality. There are no changes in functionality, just a name change, this can safely be treated as a text replacement.
diff --git a/packages/upgrade/src/versions/core-2/shared/useorganizationlist-organizationlist.md b/packages/upgrade/src/versions/core-2/shared/useorganizationlist-organizationlist.md
new file mode 100644
index 00000000000..8ba2602a28f
--- /dev/null
+++ b/packages/upgrade/src/versions/core-2/shared/useorganizationlist-organizationlist.md
@@ -0,0 +1,19 @@
+---
+title: '`organizationList` -> `userMemberships` as param to `useOrganizationList`'
+matcher: "useOrganizationList\\(\\s*{[\\s\\S]*?organizationList:[\\s\\S]*?\\)"
+matcherFlags: 'm'
+---
+
+The deprecated `organizationList` param to `useOrganizationList` has been removed. Instead, use the `userMemberships` param. Note that the values to be passed to the param and the return value have also changed.
+
+```js
+// before
+const { organizationList } = useOrganizationList({
+ organizationList: { limit: 10, offset: 1 },
+});
+
+// after
+const { memberships } = useOrganizationList({
+ userMemberships: { initialPage: 1, pageSize: 10 },
+});
+```
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.