diff --git a/.changeset/clean-kings-brake.md b/.changeset/clean-kings-brake.md deleted file mode 100644 index e0f62d24d6..0000000000 --- a/.changeset/clean-kings-brake.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@clerk/clerk-js': patch -'@clerk/shared': patch ---- - -Add a custom logger to allow logging a message or warning to the console once per session, in order to avoid consecutive identical logs due to component rerenders. diff --git a/.changeset/great-parents-invent.md b/.changeset/great-parents-invent.md deleted file mode 100644 index 55d818986e..0000000000 --- a/.changeset/great-parents-invent.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/localizations': patch ---- - -Review PT-BR localization: Adds missing keys, fixes some typos diff --git a/.changeset/hot-phones-serve.md b/.changeset/hot-phones-serve.md deleted file mode 100644 index 4fdc4f3c1a..0000000000 --- a/.changeset/hot-phones-serve.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@clerk/nextjs": patch -"@clerk/clerk-react": patch -"@clerk/shared": patch ---- - -With the next major release, NextJS@15 will depend on `react` and `react-dom` v19, which is still in beta. We are updating our peer dependencies accordingly in order to accept `react` and `react-dom` @ `19.0.0-beta` diff --git a/.changeset/sharp-apples-think.md b/.changeset/sharp-apples-think.md deleted file mode 100644 index 49759a90a7..0000000000 --- a/.changeset/sharp-apples-think.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/elements': patch ---- - -Update FieldError/GlobalError types to allow render function children while using the asChild prop diff --git a/integration/presets/next.ts b/integration/presets/next.ts index 505d27be39..68366b7ffa 100644 --- a/integration/presets/next.ts +++ b/integration/presets/next.ts @@ -12,8 +12,8 @@ const appRouter = applicationConfig() .addScript('build', 'npm run build') .addScript('serve', 'npm run start') .addDependency('next', constants.E2E_NEXTJS_VERSION) - .addDependency('react', constants.E2E_NEXTJS_VERSION) - .addDependency('react-dom', constants.E2E_NEXTJS_VERSION) + .addDependency('react', constants.E2E_REACT_VERSION) + .addDependency('react-dom', constants.E2E_REACT_DOM_VERSION) .addDependency('@clerk/nextjs', constants.E2E_CLERK_VERSION || clerkNextjsLocal); const appRouterTurbo = appRouter diff --git a/package-lock.json b/package-lock.json index 76fa00ec0b..d8f35334ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15982,6 +15982,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, "dependencies": { "is-what": "^4.1.8" }, @@ -20466,6 +20467,7 @@ }, "node_modules/fast-safe-stringify": { "version": "2.1.1", + "dev": true, "license": "MIT" }, "node_modules/fast-uri": { @@ -24816,6 +24818,7 @@ "version": "4.1.16", "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, "engines": { "node": ">=12.13" }, @@ -24873,7 +24876,9 @@ }, "node_modules/isomorphic-ws": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, "peerDependencies": { "ws": "*" } @@ -30580,6 +30585,7 @@ "version": "0.0.25", "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-0.0.25.tgz", "integrity": "sha512-1oCGA65fydX/FgdnsiBh68buOvfxuteoZVSb3Paci2kRp/7lhF0HyA8EDb5X/O6FxId1e+usPTQNRuzFEvkJbQ==", + "dev": true, "dependencies": { "event-target-shim": "^6.0.2" } @@ -30588,6 +30594,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz", "integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==", + "dev": true, "engines": { "node": ">=10.13.0" }, @@ -35182,6 +35189,7 @@ "version": "1.13.3", "resolved": "https://registry.npmjs.org/superjson/-/superjson-1.13.3.tgz", "integrity": "sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==", + "dev": true, "dependencies": { "copy-anything": "^3.0.2" }, @@ -38504,6 +38512,7 @@ }, "node_modules/ws": { "version": "8.13.0", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -38892,10 +38901,10 @@ }, "packages/backend": { "name": "@clerk/backend", - "version": "1.2.0", + "version": "1.2.1", "license": "MIT", "dependencies": { - "@clerk/shared": "2.2.0", + "@clerk/shared": "2.2.1", "cookie": "0.5.0", "snakecase-keys": "5.4.4", "tslib": "2.4.1" @@ -39009,12 +39018,12 @@ }, "packages/chrome-extension": { "name": "@clerk/chrome-extension", - "version": "1.0.13", + "version": "1.0.14", "license": "MIT", "dependencies": { - "@clerk/clerk-js": "5.5.0", - "@clerk/clerk-react": "5.2.0", - "@clerk/shared": "2.2.0", + "@clerk/clerk-js": "5.5.1", + "@clerk/clerk-react": "5.2.1", + "@clerk/shared": "2.2.1", "webextension-polyfill": "^0.10.0" }, "devDependencies": { @@ -39058,11 +39067,11 @@ }, "packages/clerk-js": { "name": "@clerk/clerk-js", - "version": "5.5.0", + "version": "5.5.1", "license": "MIT", "dependencies": { - "@clerk/localizations": "2.4.2", - "@clerk/shared": "2.2.0", + "@clerk/localizations": "2.4.3", + "@clerk/shared": "2.2.1", "@clerk/types": "4.5.0", "@emotion/cache": "11.11.0", "@emotion/react": "11.11.1", @@ -39611,21 +39620,21 @@ }, "packages/elements": { "name": "@clerk/elements", - "version": "0.4.6", + "version": "0.5.0", "license": "MIT", "dependencies": { "@radix-ui/react-form": "^0.0.3", "@radix-ui/react-slot": "^1.0.2", - "@statelyai/inspect": "^0.3.0", "@xstate/react": "^4.1.1", "client-only": "^0.0.1", "xstate": "^5.13.0" }, "devDependencies": { - "@clerk/clerk-react": "5.2.0", + "@clerk/clerk-react": "5.2.1", "@clerk/eslint-config-custom": "*", - "@clerk/shared": "2.2.0", + "@clerk/shared": "2.2.1", "@clerk/types": "^4.5.0", + "@statelyai/inspect": "^0.3.1", "@types/node": "^18.17.0", "@types/react": "*", "@types/react-dom": "*", @@ -39653,9 +39662,10 @@ } }, "packages/elements/node_modules/@statelyai/inspect": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@statelyai/inspect/-/inspect-0.3.0.tgz", - "integrity": "sha512-Fusho7ZTX5HjA0yPZVcz503exezNLIZo0pz3RdrjbJ/etAhP0GFeXcI5jdjYcxEmo0iYKX1uCybn74tyjGu/cw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@statelyai/inspect/-/inspect-0.3.1.tgz", + "integrity": "sha512-KW3owf5UbPs1+/xOGJoSV4D69hP5xTX7PCzARr2R1senwfUIwyGP8yEsB8dvkMvekYvgFS0qa6lmg1eszYr2tw==", + "dev": true, "dependencies": { "fast-safe-stringify": "^2.1.1", "isomorphic-ws": "^5.0.0", @@ -39778,6 +39788,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -40018,12 +40029,12 @@ }, "packages/expo": { "name": "@clerk/clerk-expo", - "version": "1.1.5", + "version": "1.1.6", "license": "MIT", "dependencies": { - "@clerk/clerk-js": "5.5.0", - "@clerk/clerk-react": "5.2.0", - "@clerk/shared": "2.2.0", + "@clerk/clerk-js": "5.5.1", + "@clerk/clerk-react": "5.2.1", + "@clerk/shared": "2.2.1", "base-64": "^1.0.0", "react-native-url-polyfill": "2.0.0", "tslib": "2.4.1" @@ -40104,11 +40115,11 @@ }, "packages/express": { "name": "@clerk/express", - "version": "0.0.9", + "version": "0.0.10", "license": "MIT", "dependencies": { - "@clerk/backend": "^1.2.0", - "@clerk/shared": "^2.2.0", + "@clerk/backend": "^1.2.1", + "@clerk/shared": "^2.2.1", "tslib": "2.4.1" }, "devDependencies": { @@ -40132,11 +40143,11 @@ }, "packages/fastify": { "name": "@clerk/fastify", - "version": "1.0.10", + "version": "1.0.11", "license": "MIT", "dependencies": { - "@clerk/backend": "1.2.0", - "@clerk/shared": "2.2.0", + "@clerk/backend": "1.2.1", + "@clerk/shared": "2.2.1", "@clerk/types": "4.5.0", "cookies": "0.8.0" }, @@ -40158,9 +40169,9 @@ "version": "5.0.0-beta.45", "license": "MIT", "dependencies": { - "@clerk/backend": "1.2.0", - "@clerk/clerk-react": "5.2.0", - "@clerk/clerk-sdk-node": "5.0.8", + "@clerk/backend": "1.2.1", + "@clerk/clerk-react": "5.2.1", + "@clerk/clerk-sdk-node": "5.0.9", "cookie": "0.5.0", "tslib": "2.4.1" }, @@ -40185,7 +40196,7 @@ }, "packages/localizations": { "name": "@clerk/localizations", - "version": "2.4.2", + "version": "2.4.3", "license": "MIT", "devDependencies": { "@clerk/eslint-config-custom": "*", @@ -40199,12 +40210,12 @@ }, "packages/nextjs": { "name": "@clerk/nextjs", - "version": "5.1.0", + "version": "5.1.2", "license": "MIT", "dependencies": { - "@clerk/backend": "1.2.0", - "@clerk/clerk-react": "5.2.0", - "@clerk/shared": "2.2.0", + "@clerk/backend": "1.2.1", + "@clerk/clerk-react": "5.2.1", + "@clerk/shared": "2.2.1", "crypto-js": "4.2.0", "path-to-regexp": "6.2.1", "tslib": "2.4.1" @@ -40223,9 +40234,9 @@ "node": ">=18.17.0" }, "peerDependencies": { - "next": "^13.5.4 || ^14.0.3", - "react": ">=18", - "react-dom": ">=18" + "next": "^13.5.4 || ^14.0.3 || >=15.0.0-rc", + "react": ">=18 || >=19.0.0-beta", + "react-dom": ">=18 || >=19.0.0-beta" } }, "packages/nextjs/node_modules/@next/env": { @@ -40435,10 +40446,10 @@ }, "packages/react": { "name": "@clerk/clerk-react", - "version": "5.2.0", + "version": "5.2.1", "license": "MIT", "dependencies": { - "@clerk/shared": "2.2.0", + "@clerk/shared": "2.2.1", "@clerk/types": "4.5.0", "tslib": "2.4.1" }, @@ -40455,8 +40466,8 @@ "node": ">=18.17.0" }, "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" + "react": ">=18 || >=19.0.0-beta", + "react-dom": ">=18 || >=19.0.0-beta" } }, "packages/react/node_modules/tslib": { @@ -40465,12 +40476,12 @@ }, "packages/remix": { "name": "@clerk/remix", - "version": "4.0.11", + "version": "4.0.12", "license": "MIT", "dependencies": { - "@clerk/backend": "1.2.0", - "@clerk/clerk-react": "5.2.0", - "@clerk/shared": "2.2.0", + "@clerk/backend": "1.2.1", + "@clerk/clerk-react": "5.2.1", + "@clerk/shared": "2.2.1", "cookie": "0.5.0", "tslib": "2.4.1" }, @@ -40501,11 +40512,11 @@ }, "packages/sdk-node": { "name": "@clerk/clerk-sdk-node", - "version": "5.0.8", + "version": "5.0.9", "license": "MIT", "dependencies": { - "@clerk/backend": "1.2.0", - "@clerk/shared": "2.2.0", + "@clerk/backend": "1.2.1", + "@clerk/shared": "2.2.1", "tslib": "2.4.1" }, "devDependencies": { @@ -40529,7 +40540,7 @@ }, "packages/shared": { "name": "@clerk/shared", - "version": "2.2.0", + "version": "2.2.1", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -40552,8 +40563,8 @@ "node": ">=18.17.0" }, "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" + "react": ">=18 || >=19.0.0-beta", + "react-dom": ">=18 || >=19.0.0-beta" }, "peerDependenciesMeta": { "react": { @@ -40574,10 +40585,10 @@ }, "packages/testing": { "name": "@clerk/testing", - "version": "1.1.3", + "version": "1.1.4", "license": "MIT", "dependencies": { - "@clerk/shared": "2.2.0", + "@clerk/shared": "2.2.1", "@clerk/types": "4.5.0", "dotenv": "16.4.5" }, diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 937ee57dc6..1cbb75bd2c 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 1.2.1 + +### Patch Changes + +- Updated dependencies [[`ff31f7255`](https://github.com/clerk/javascript/commit/ff31f725541d82caaa9c13cf42cf15f8ce3992f4), [`0e48fc210`](https://github.com/clerk/javascript/commit/0e48fc210cf0b5852052a21494a05f6e723101f5)]: + - @clerk/shared@2.2.1 + ## 1.2.0 ### Minor Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index d0ac28102e..880d8442e8 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "1.2.0", + "version": "1.2.1", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { @@ -95,7 +95,7 @@ "test:cloudflare-workerd": "tests/cloudflare-workerd/run.sh" }, "dependencies": { - "@clerk/shared": "2.2.0", + "@clerk/shared": "2.2.1", "cookie": "0.5.0", "snakecase-keys": "5.4.4", "tslib": "2.4.1" diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index e912050140..3148ebfab4 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.0.14 + +### Patch Changes + +- Updated dependencies [[`ff31f7255`](https://github.com/clerk/javascript/commit/ff31f725541d82caaa9c13cf42cf15f8ce3992f4), [`0e48fc210`](https://github.com/clerk/javascript/commit/0e48fc210cf0b5852052a21494a05f6e723101f5)]: + - @clerk/clerk-js@5.5.1 + - @clerk/shared@2.2.1 + - @clerk/clerk-react@5.2.1 + ## 1.0.13 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index cc8d30c799..715ac863cc 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "1.0.13", + "version": "1.0.14", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", @@ -44,9 +44,9 @@ "test:coverage": "jest --collectCoverage && open coverage/lcov-report/index.html" }, "dependencies": { - "@clerk/clerk-js": "5.5.0", - "@clerk/clerk-react": "5.2.0", - "@clerk/shared": "2.2.0", + "@clerk/clerk-js": "5.5.1", + "@clerk/clerk-react": "5.2.1", + "@clerk/shared": "2.2.1", "webextension-polyfill": "^0.10.0" }, "devDependencies": { diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index 3195de2ef6..ae7f11a684 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 5.5.1 + +### Patch Changes + +- Add a custom logger to allow logging a message or warning to the console once per session, in order to avoid consecutive identical logs due to component rerenders. ([#3383](https://github.com/clerk/javascript/pull/3383)) by [@desiprisg](https://github.com/desiprisg) + +- Updated dependencies [[`ff31f7255`](https://github.com/clerk/javascript/commit/ff31f725541d82caaa9c13cf42cf15f8ce3992f4), [`8e5969d82`](https://github.com/clerk/javascript/commit/8e5969d82818c333d5459e5c70eb626d0968eb66), [`0e48fc210`](https://github.com/clerk/javascript/commit/0e48fc210cf0b5852052a21494a05f6e723101f5)]: + - @clerk/shared@2.2.1 + - @clerk/localizations@2.4.3 + ## 5.5.0 ### Minor Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index bc430aedc9..9da6d6e2dc 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.5.0", + "version": "5.5.1", "description": "Clerk JS library", "keywords": [ "clerk", @@ -50,8 +50,8 @@ }, "browserslist": "last 2 versions, ios_saf > 12, Safari > 12, > 1%, not dead, not ie > 0", "dependencies": { - "@clerk/localizations": "2.4.2", - "@clerk/shared": "2.2.0", + "@clerk/localizations": "2.4.3", + "@clerk/shared": "2.2.1", "@clerk/types": "4.5.0", "@emotion/cache": "11.11.0", "@emotion/react": "11.11.1", diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md index ba2cb3ad98..6a49792779 100644 --- a/packages/elements/CHANGELOG.md +++ b/packages/elements/CHANGELOG.md @@ -1,5 +1,26 @@ # @clerk/elements +## 0.5.0 + +### Minor Changes + +- - Adds Stately's Browser Inspector in development builds ([#3424](https://github.com/clerk/javascript/pull/3424)) by [@tmilewski](https://github.com/tmilewski) + + - Removes `@statelyai/inspect` from dependencies + - Ensures all inspector-related code is omitted from the build + +### Patch Changes + +- Fix: Verification form submission wasn't working after returning from "choosing an alternate strategy" without making a selection. ([#3425](https://github.com/clerk/javascript/pull/3425)) by [@tmilewski](https://github.com/tmilewski) + + Perf: Adds a `NeverRetriable` state for applicable strategies so the countdown doesn't run needlessly. + +## 0.4.7 + +### Patch Changes + +- Update FieldError/GlobalError types to allow render function children while using the asChild prop ([#3426](https://github.com/clerk/javascript/pull/3426)) by [@tmilewski](https://github.com/tmilewski) + ## 0.4.6 ## 0.4.5 diff --git a/packages/elements/package.json b/packages/elements/package.json index 2e790bfe9e..422bba6763 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/elements", - "version": "0.4.6", + "version": "0.5.0", "description": "Clerk Elements", "keywords": [ "clerk", @@ -55,12 +55,13 @@ "app:dev": "(cd examples/nextjs && npm run dev --turbo)", "app:dev:debug": "(cd examples/nextjs && NEXT_PUBLIC_CLERK_ELEMENTS_DEBUG=true npm run dev --turbo)", "app:dev:debug:server": "(cd examples/nextjs && NEXT_PUBLIC_CLERK_ELEMENTS_DEBUG=true CLERK_ELEMENTS_DEBUG_SERVER=true npm run dev --turbo)", + "app:dev:debug:ui": "(cd examples/nextjs && NEXT_PUBLIC_CLERK_ELEMENTS_DEBUG_UI=true npm run dev --turbo)", "app:e2e": "(cd examples/nextjs && npm run e2e)", "app:lint": "(cd examples/nextjs && npm run lint)", - "build": "tsup", - "build:analyze": "tsup --metafile; open https://esbuild.github.io/analyze/", - "build:declarations": "tsc -p tsconfig.json", - "dev": "tsup --watch", + "build": "tsup --env.NODE_ENV production", + "build:analyze": "tsup --env.NODE_ENV production --metafile; open https://esbuild.github.io/analyze/", + "build:declarations": "tsc --env.NODE_ENV production -p tsconfig.json", + "dev": "tsup --env.NODE_ENV development --watch", "dev:example": "concurrently \"npm run dev\" \"npm run app:dev\"", "lint": "eslint src/", "lint:attw": "attw --pack .", @@ -71,16 +72,16 @@ "dependencies": { "@radix-ui/react-form": "^0.0.3", "@radix-ui/react-slot": "^1.0.2", - "@statelyai/inspect": "^0.3.0", "@xstate/react": "^4.1.1", "client-only": "^0.0.1", "xstate": "^5.13.0" }, "devDependencies": { - "@clerk/clerk-react": "5.2.0", + "@clerk/clerk-react": "5.2.1", "@clerk/eslint-config-custom": "*", - "@clerk/shared": "2.2.0", + "@clerk/shared": "2.2.1", "@clerk/types": "^4.5.0", + "@statelyai/inspect": "^0.3.1", "@types/node": "^18.17.0", "@types/react": "*", "@types/react-dom": "*", diff --git a/packages/elements/src/internals/machines/form/form.context.ts b/packages/elements/src/internals/machines/form/form.context.ts index 0d9d093246..7517c89924 100644 --- a/packages/elements/src/internals/machines/form/form.context.ts +++ b/packages/elements/src/internals/machines/form/form.context.ts @@ -2,11 +2,11 @@ import { createActorContext } from '@xstate/react'; import type { SnapshotFrom } from 'xstate'; import { FormMachine } from '~/internals/machines/form'; -import { consoleInspector } from '~/internals/utils/inspector'; +import { inspect } from '~/internals/utils/inspector'; export type SnapshotState = SnapshotFrom; -const FormMachineContext = createActorContext(FormMachine, { inspect: consoleInspector }); +const FormMachineContext = createActorContext(FormMachine, { inspect }); export const FormStoreProvider = FormMachineContext.Provider; export const useFormStore = FormMachineContext.useActorRef; diff --git a/packages/elements/src/internals/machines/sign-in/router.machine.ts b/packages/elements/src/internals/machines/sign-in/router.machine.ts index 8356414e45..a2d2a13b54 100644 --- a/packages/elements/src/internals/machines/sign-in/router.machine.ts +++ b/packages/elements/src/internals/machines/sign-in/router.machine.ts @@ -363,7 +363,11 @@ export const SignInRouterMachine = setup({ ChoosingStrategy: { tags: ['route:choose-strategy'], on: { - 'NAVIGATE.PREVIOUS': 'Idle', + 'NAVIGATE.PREVIOUS': { + description: 'Go to Idle, and also tell firstFactor to go to Pending', + target: 'Idle', + actions: sendTo('firstFactor', { type: 'NAVIGATE.PREVIOUS' }), + }, }, }, ForgotPassword: { diff --git a/packages/elements/src/internals/machines/sign-in/verification.machine.ts b/packages/elements/src/internals/machines/sign-in/verification.machine.ts index 9b4af28755..4846322a9e 100644 --- a/packages/elements/src/internals/machines/sign-in/verification.machine.ts +++ b/packages/elements/src/internals/machines/sign-in/verification.machine.ts @@ -145,6 +145,7 @@ const SignInVerificationMachine = setup({ }, guards: { isResendable: ({ context }) => context.resendable || context.resendableAfter === 0, + isNeverResendable: ({ context }) => context.currentFactor?.strategy === 'password', }, delays: SignInVerificationDelays, types: {} as SignInVerificationSchema, @@ -161,6 +162,7 @@ const SignInVerificationMachine = setup({ }), initial: 'Init', on: { + 'NAVIGATE.PREVIOUS': '.Hist', 'STRATEGY.REGISTER': { actions: assign({ registeredStrategies: ({ context, event }) => context.registeredStrategies.add(event.factor), @@ -233,11 +235,31 @@ const SignInVerificationMachine = setup({ reenter: true, }, }, - initial: 'NotResendable', + initial: 'Init', states: { + Init: { + description: 'Marks appropriate factors as never resendable.', + always: [ + { + guard: 'isNeverResendable', + target: 'NeverResendable', + }, + { + target: 'NotResendable', + }, + ], + }, Resendable: { description: 'Waiting for user to retry', }, + NeverResendable: { + description: 'Handles never resendable', + on: { + RETRY: { + actions: log('Never retriable'), + }, + }, + }, NotResendable: { description: 'Handle countdowns', on: { @@ -299,6 +321,9 @@ const SignInVerificationMachine = setup({ }, }, }, + Hist: { + type: 'history', + }, }, }); diff --git a/packages/elements/src/internals/utils/inspector/browser.ts b/packages/elements/src/internals/utils/inspector/browser.ts deleted file mode 100644 index 9f11aa4cf1..0000000000 --- a/packages/elements/src/internals/utils/inspector/browser.ts +++ /dev/null @@ -1,85 +0,0 @@ -import type { StatelyInspectionEvent } from '@statelyai/inspect'; -import { useEffect, useState } from 'react'; - -export interface InspectorOptions { - filter?: (event: StatelyInspectionEvent) => boolean; - serialize?: (event: StatelyInspectionEvent) => StatelyInspectionEvent; - /** - * Whether to automatically start the inspector. - * - * @default true - */ - autoStart?: boolean; -} - -export interface BrowserInspectorOptions extends InspectorOptions { - url?: string; - window?: Window; - iframe?: HTMLIFrameElement | null; -} - -/** - * Stately Browser Inspector - * - * Used for debugging state machines in the browser. These hooks are used internally to conditionally - * enable the state inspector in client-only development environments. - * - * @param params.enabled - Whether to enable the inspector (or `NEXT_PUBLIC_CLERK_ELEMENTS_DEBUG=true`) - * @param params.options - Options for the inspector - * - * @example - * const { useBrowserInspector } = createBrowserInspectorReactHook(); - * const { loading: inspectorLoading, inspector } = useBrowserInspector(); - * - * @returns useBrowserInspector - A hook for using the inspector - */ -export function createBrowserInspectorReactHook(params?: { enabled?: boolean; options?: BrowserInspectorOptions }) { - const { enabled = process.env.NEXT_PUBLIC_CLERK_ELEMENTS_DEBUG === 'true', options } = params || {}; - const loadable = typeof window !== 'undefined'; - let storedInspector: any; - - function useDisabledBrowserInspector() { - return { - loading: false, - inspector: undefined, - }; - } - - function useEnabledBrowserInspector() { - const [inspector, setInspector] = useState(storedInspector || undefined); // TODO: No relevant types exported from statelyai/inspect - - useEffect(() => { - if (inspector) return; - - const getInspector = async () => { - const { createBrowserInspector } = (await import('@statelyai/inspect')).default; - return createBrowserInspector(options); - }; - - getInspector() - .then(res => { - storedInspector = res; - setInspector(res); - }) - .catch(console.error); - }, [inspector]); - - return { - /** - * Whether the inspector is loading. - * Will be `false` if the inspector is disabled. - */ - loading: !inspector, - /** - * The inspector instance. - * Will be `undefined` if the inspector is disabled. - * @see https://stately.ai/docs/inspector - */ - inspector, - }; - } - - return { - useBrowserInspector: !loadable || !enabled ? useDisabledBrowserInspector : useEnabledBrowserInspector, - }; -} diff --git a/packages/elements/src/internals/utils/inspector/browser/index.ts b/packages/elements/src/internals/utils/inspector/browser/index.ts new file mode 100644 index 0000000000..ba3d0ff2d0 --- /dev/null +++ b/packages/elements/src/internals/utils/inspector/browser/index.ts @@ -0,0 +1,19 @@ +import { isTruthy } from '@clerk/shared/underscore'; +import { createBrowserInspector } from '@statelyai/inspect'; + +export const getInspector = () => { + if ( + __DEV__ && + typeof window !== 'undefined' && + process.env.NODE_ENV === 'development' && + isTruthy(process.env.NEXT_PUBLIC_CLERK_ELEMENTS_DEBUG_UI ?? process.env.CLERK_ELEMENTS_DEBUG_UI) + ) { + const { inspect } = createBrowserInspector({ + autoStart: true, + }); + + return inspect; + } + + return undefined; +}; diff --git a/packages/elements/src/internals/utils/inspector/console.ts b/packages/elements/src/internals/utils/inspector/console/console.ts similarity index 100% rename from packages/elements/src/internals/utils/inspector/console.ts rename to packages/elements/src/internals/utils/inspector/console/console.ts diff --git a/packages/elements/src/internals/utils/inspector/console/index.ts b/packages/elements/src/internals/utils/inspector/console/index.ts new file mode 100644 index 0000000000..62385651a6 --- /dev/null +++ b/packages/elements/src/internals/utils/inspector/console/index.ts @@ -0,0 +1,17 @@ +import { isTruthy } from '@clerk/shared/underscore'; + +import { createConsoleInspector } from './console'; + +export function getInspector() { + if ( + __DEV__ && + process.env.NODE_ENV === 'development' && + isTruthy(process.env.NEXT_PUBLIC_CLERK_ELEMENTS_DEBUG ?? process.env.CLERK_ELEMENTS_DEBUG) + ) { + return createConsoleInspector({ + enabled: true, + debugServer: isTruthy(process.env.CLERK_ELEMENTS_DEBUG_SERVER), + }); + } + return undefined; +} diff --git a/packages/elements/src/internals/utils/inspector/index.ts b/packages/elements/src/internals/utils/inspector/index.ts index 00bf6e8982..8ff89fbdd3 100644 --- a/packages/elements/src/internals/utils/inspector/index.ts +++ b/packages/elements/src/internals/utils/inspector/index.ts @@ -1,9 +1,16 @@ -import { isTruthy } from '@clerk/shared/underscore'; +import type { InspectionEvent, Observer } from 'xstate'; -export { createBrowserInspectorReactHook } from './browser'; -import { createConsoleInspector } from './console'; +import { getInspector as getBrowserInspector } from './browser'; +import { getInspector as getConsoleInspector } from './console'; -export const consoleInspector = createConsoleInspector({ - enabled: isTruthy(process.env.NEXT_PUBLIC_CLERK_ELEMENTS_DEBUG ?? process.env.CLERK_ELEMENTS_DEBUG), - debugServer: isTruthy(process.env.CLERK_ELEMENTS_DEBUG_SERVER), -}); +export let inspect: Observer | undefined; + +if (__DEV__) { + inspect = getBrowserInspector() ?? getConsoleInspector(); +} + +const inspector = { + inspect, +}; + +export default inspector; diff --git a/packages/elements/src/react/hooks/index.ts b/packages/elements/src/react/hooks/index.ts index c000eaba5c..3b8850d87b 100644 --- a/packages/elements/src/react/hooks/index.ts +++ b/packages/elements/src/react/hooks/index.ts @@ -1,5 +1,4 @@ export { useActiveStates } from './use-active-states.hook'; export { useActiveTags } from './use-active-tags.hook'; -export { useBrowserInspector } from './use-browser-inspector.hook'; export { useThirdPartyProvider } from './use-third-party-provider.hook'; export { useFocus } from './use-focus.hook'; diff --git a/packages/elements/src/react/hooks/use-browser-inspector.hook.ts b/packages/elements/src/react/hooks/use-browser-inspector.hook.ts deleted file mode 100644 index 9f99a86d43..0000000000 --- a/packages/elements/src/react/hooks/use-browser-inspector.hook.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createBrowserInspectorReactHook } from '~/internals/utils/inspector'; - -export const { useBrowserInspector } = createBrowserInspectorReactHook(); diff --git a/packages/elements/src/react/sign-in/root.tsx b/packages/elements/src/react/sign-in/root.tsx index 1d12978205..ad0dc420cc 100644 --- a/packages/elements/src/react/sign-in/root.tsx +++ b/packages/elements/src/react/sign-in/root.tsx @@ -7,7 +7,7 @@ import { SIGN_IN_DEFAULT_BASE_PATH, SIGN_UP_DEFAULT_BASE_PATH } from '~/internal import { FormStoreProvider, useFormStore } from '~/internals/machines/form/form.context'; import type { SignInRouterInitEvent } from '~/internals/machines/sign-in'; import { SignInRouterMachine } from '~/internals/machines/sign-in'; -import { consoleInspector } from '~/internals/utils/inspector'; +import { inspect } from '~/internals/utils/inspector'; import { Router, useClerkRouter, useNextRouter } from '~/react/router'; import { SignInRouterCtx } from '~/react/sign-in/context'; @@ -18,7 +18,7 @@ type SignInFlowProviderProps = { exampleMode?: boolean; }; -const actor = createActor(SignInRouterMachine, { inspect: consoleInspector }); +const actor = createActor(SignInRouterMachine, { inspect }); actor.start(); function SignInFlowProvider({ children, exampleMode }: SignInFlowProviderProps) { diff --git a/packages/elements/src/react/sign-up/root.tsx b/packages/elements/src/react/sign-up/root.tsx index bf2c9c198e..0eea9bf0df 100644 --- a/packages/elements/src/react/sign-up/root.tsx +++ b/packages/elements/src/react/sign-up/root.tsx @@ -8,7 +8,7 @@ import { SIGN_IN_DEFAULT_BASE_PATH, SIGN_UP_DEFAULT_BASE_PATH } from '~/internal import { FormStoreProvider, useFormStore } from '~/internals/machines/form/form.context'; import type { SignUpRouterInitEvent } from '~/internals/machines/sign-up'; import { SignUpRouterMachine } from '~/internals/machines/sign-up'; -import { consoleInspector } from '~/internals/utils/inspector'; +import { inspect } from '~/internals/utils/inspector'; import { Router, useClerkRouter, useNextRouter } from '~/react/router'; import { SignUpRouterCtx } from '~/react/sign-up/context'; @@ -19,7 +19,7 @@ type SignUpFlowProviderProps = { exampleMode?: boolean; }; -const actor = createActor(SignUpRouterMachine, { inspect: consoleInspector }); +const actor = createActor(SignUpRouterMachine, { inspect }); const ref = actor.start(); function SignUpFlowProvider({ children, exampleMode }: SignUpFlowProviderProps) { diff --git a/packages/elements/src/types/globals.d.ts b/packages/elements/src/types/globals.d.ts new file mode 100644 index 0000000000..72b67abb15 --- /dev/null +++ b/packages/elements/src/types/globals.d.ts @@ -0,0 +1,7 @@ +export {}; + +declare global { + const PACKAGE_NAME: string; + const PACKAGE_VERSION: string; + const __DEV__: boolean; +} diff --git a/packages/elements/tsup.config.ts b/packages/elements/tsup.config.ts index 86b57be791..c8cb1e480a 100644 --- a/packages/elements/tsup.config.ts +++ b/packages/elements/tsup.config.ts @@ -21,7 +21,7 @@ export default defineConfig(overrideOptions => { 'react/sign-in/index': 'src/react/sign-in/index.ts', 'react/sign-up/index': 'src/react/sign-up/index.ts', }, - external: ['react', 'react-dom'], + external: ['react', 'react-dom', '@statelyai/inspect'], format: ['cjs', 'esm'], minify: false, sourcemap: true, diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index f2295cb635..c6dded898c 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.1.6 + +### Patch Changes + +- Updated dependencies [[`ff31f7255`](https://github.com/clerk/javascript/commit/ff31f725541d82caaa9c13cf42cf15f8ce3992f4), [`0e48fc210`](https://github.com/clerk/javascript/commit/0e48fc210cf0b5852052a21494a05f6e723101f5)]: + - @clerk/clerk-js@5.5.1 + - @clerk/shared@2.2.1 + - @clerk/clerk-react@5.2.1 + ## 1.1.5 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 10a70d6353..778962ab53 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "1.1.5", + "version": "1.1.6", "description": "Clerk React Native/Expo library", "keywords": [ "react", @@ -39,9 +39,9 @@ "publish:local": "npx yalc push --replace --sig" }, "dependencies": { - "@clerk/clerk-js": "5.5.0", - "@clerk/clerk-react": "5.2.0", - "@clerk/shared": "2.2.0", + "@clerk/clerk-js": "5.5.1", + "@clerk/clerk-react": "5.2.1", + "@clerk/shared": "2.2.1", "base-64": "^1.0.0", "react-native-url-polyfill": "2.0.0", "tslib": "2.4.1" diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index d68c330ce6..e8e5954e5a 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 0.0.10 + +### Patch Changes + +- Updated dependencies [[`ff31f7255`](https://github.com/clerk/javascript/commit/ff31f725541d82caaa9c13cf42cf15f8ce3992f4), [`0e48fc210`](https://github.com/clerk/javascript/commit/0e48fc210cf0b5852052a21494a05f6e723101f5)]: + - @clerk/shared@2.2.1 + - @clerk/backend@1.2.1 + ## 0.0.9 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index 9bb4520db8..37860f03db 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "0.0.9", + "version": "0.0.10", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", @@ -53,8 +53,8 @@ "test:ci": "jest --maxWorkers=70%" }, "dependencies": { - "@clerk/backend": "^1.2.0", - "@clerk/shared": "^2.2.0", + "@clerk/backend": "^1.2.1", + "@clerk/shared": "^2.2.1", "tslib": "2.4.1" }, "devDependencies": { diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index 379d4a1ddc..c765e969a7 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 1.0.11 + +### Patch Changes + +- Updated dependencies [[`ff31f7255`](https://github.com/clerk/javascript/commit/ff31f725541d82caaa9c13cf42cf15f8ce3992f4), [`0e48fc210`](https://github.com/clerk/javascript/commit/0e48fc210cf0b5852052a21494a05f6e723101f5)]: + - @clerk/shared@2.2.1 + - @clerk/backend@1.2.1 + ## 1.0.10 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 2d3e6b5c12..06d09444bd 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "1.0.10", + "version": "1.0.11", "description": "Clerk SDK for Fastify", "keywords": [ "auth", @@ -40,8 +40,8 @@ "test:cache:clear": "jest --clearCache --useStderr" }, "dependencies": { - "@clerk/backend": "1.2.0", - "@clerk/shared": "2.2.0", + "@clerk/backend": "1.2.1", + "@clerk/shared": "2.2.1", "@clerk/types": "4.5.0", "cookies": "0.8.0" }, diff --git a/packages/gatsby-plugin-clerk/package.json b/packages/gatsby-plugin-clerk/package.json index ef0f73be28..e98f6b140e 100644 --- a/packages/gatsby-plugin-clerk/package.json +++ b/packages/gatsby-plugin-clerk/package.json @@ -44,9 +44,9 @@ "publish:local": "npx yalc push --replace --sig" }, "dependencies": { - "@clerk/backend": "1.2.0", - "@clerk/clerk-react": "5.2.0", - "@clerk/clerk-sdk-node": "5.0.8", + "@clerk/backend": "1.2.1", + "@clerk/clerk-react": "5.2.1", + "@clerk/clerk-sdk-node": "5.0.9", "cookie": "0.5.0", "tslib": "2.4.1" }, diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index 9a7c51d9ba..7475171430 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 2.4.3 + +### Patch Changes + +- Review PT-BR localization: Adds missing keys, fixes some typos ([#3412](https://github.com/clerk/javascript/pull/3412)) by [@danilofuchs](https://github.com/danilofuchs) + ## 2.4.2 ### Patch Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index d4d4f7820b..a2ad612843 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "2.4.2", + "version": "2.4.3", "description": "Localizations for the Clerk components", "keywords": [ "react", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index 0f0e99a626..2e9e88b256 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,24 @@ # Change Log +## 5.1.2 + +### Patch Changes + +- Allow next@15.0.0-rc as a peer dependency by [@nikosdouvlis](https://github.com/nikosdouvlis) + +## 5.1.1 + +### Patch Changes + +- With the next major release, NextJS@15 will depend on `react` and `react-dom` v19, which is still in beta. We are updating our peer dependencies accordingly in order to accept `react` and `react-dom` @ `19.0.0-beta` ([#3428](https://github.com/clerk/javascript/pull/3428)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +- Utilize an awaitable replace function internally to avoid race conditions when using `router.replace`. ([#3416](https://github.com/clerk/javascript/pull/3416)) by [@desiprisg](https://github.com/desiprisg) + +- Updated dependencies [[`ff31f7255`](https://github.com/clerk/javascript/commit/ff31f725541d82caaa9c13cf42cf15f8ce3992f4), [`0e48fc210`](https://github.com/clerk/javascript/commit/0e48fc210cf0b5852052a21494a05f6e723101f5)]: + - @clerk/shared@2.2.1 + - @clerk/clerk-react@5.2.1 + - @clerk/backend@1.2.1 + ## 5.1.0 ### Minor Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 2612004ca1..5779b0192e 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "5.1.0", + "version": "5.1.2", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", @@ -67,9 +67,9 @@ "test:ci": "jest --maxWorkers=70%" }, "dependencies": { - "@clerk/backend": "1.2.0", - "@clerk/clerk-react": "5.2.0", - "@clerk/shared": "2.2.0", + "@clerk/backend": "1.2.1", + "@clerk/clerk-react": "5.2.1", + "@clerk/shared": "2.2.1", "crypto-js": "4.2.0", "path-to-regexp": "6.2.1", "tslib": "2.4.1" @@ -85,7 +85,7 @@ "typescript": "*" }, "peerDependencies": { - "next": "^13.5.4 || ^14.0.3", + "next": "^13.5.4 || ^14.0.3 || >=15.0.0-rc", "react": ">=18 || >=19.0.0-beta", "react-dom": ">=18 || >=19.0.0-beta" }, diff --git a/packages/nextjs/src/app-router/client/ClerkProvider.tsx b/packages/nextjs/src/app-router/client/ClerkProvider.tsx index 09cd7270b6..44efa5a0be 100644 --- a/packages/nextjs/src/app-router/client/ClerkProvider.tsx +++ b/packages/nextjs/src/app-router/client/ClerkProvider.tsx @@ -8,7 +8,8 @@ import { ClerkNextOptionsProvider } from '../../client-boundary/NextOptionsConte import type { NextClerkProviderProps } from '../../types'; import { ClerkJSScript } from '../../utils/clerk-js-script'; import { mergeNextClerkPropsWithEnv } from '../../utils/mergeNextClerkPropsWithEnv'; -import { useAwaitableNavigate } from './useAwaitableNavigate'; +import { useAwaitablePush } from './useAwaitablePush'; +import { useAwaitableReplace } from './useAwaitableReplace'; declare global { export interface Window { @@ -21,7 +22,8 @@ declare global { export const ClientClerkProvider = (props: NextClerkProviderProps) => { const { __unstable_invokeMiddlewareOnAuthStateChange = true, children } = props; const router = useRouter(); - const navigate = useAwaitableNavigate(); + const push = useAwaitablePush(); + const replace = useAwaitableReplace(); const [isPending, startTransition] = useTransition(); useEffect(() => { @@ -68,8 +70,8 @@ export const ClientClerkProvider = (props: NextClerkProviderProps) => { const mergedProps = mergeNextClerkPropsWithEnv({ ...props, - routerPush: navigate, - routerReplace: to => router.replace(to), + routerPush: push, + routerReplace: replace, }); return ( diff --git a/packages/nextjs/src/app-router/client/useAwaitablePush.ts b/packages/nextjs/src/app-router/client/useAwaitablePush.ts new file mode 100644 index 0000000000..3bf53e2310 --- /dev/null +++ b/packages/nextjs/src/app-router/client/useAwaitablePush.ts @@ -0,0 +1,19 @@ +'use client'; + +import { useRouter } from 'next/navigation'; + +import { useInternalNavFun } from './useInternalNavFun'; + +/** + * Creates an "awaitable" navigation function that will do its best effort to wait for Next.js to finish its route transition. + * This is accomplished by wrapping the call to `router.push` in `startTransition()`, which should rely on React to coordinate the pending state. We key off of + * `isPending` to flush the stored promises and ensure the navigates "resolve". + */ +export const useAwaitablePush = () => { + const router = useRouter(); + + return useInternalNavFun({ + windowNav: typeof window !== 'undefined' ? window.history.pushState.bind(window.history) : undefined, + routerNav: router.push.bind(router), + }); +}; diff --git a/packages/nextjs/src/app-router/client/useAwaitableReplace.ts b/packages/nextjs/src/app-router/client/useAwaitableReplace.ts new file mode 100644 index 0000000000..9107f48f25 --- /dev/null +++ b/packages/nextjs/src/app-router/client/useAwaitableReplace.ts @@ -0,0 +1,19 @@ +'use client'; + +import { useRouter } from 'next/navigation'; + +import { useInternalNavFun } from './useInternalNavFun'; + +/** + * Creates an "awaitable" navigation function that will do its best effort to wait for Next.js to finish its route transition. + * This is accomplished by wrapping the call to `router.replace` in `startTransition()`, which should rely on React to coordinate the pending state. We key off of + * `isPending` to flush the stored promises and ensure the navigates "resolve". + */ +export const useAwaitableReplace = () => { + const router = useRouter(); + + return useInternalNavFun({ + windowNav: typeof window !== 'undefined' ? window.history.replaceState.bind(window.history) : undefined, + routerNav: router.replace.bind(router), + }); +}; diff --git a/packages/nextjs/src/app-router/client/useAwaitableNavigate.ts b/packages/nextjs/src/app-router/client/useInternalNavFun.ts similarity index 76% rename from packages/nextjs/src/app-router/client/useAwaitableNavigate.ts rename to packages/nextjs/src/app-router/client/useInternalNavFun.ts index 0fc080d8c8..38c89e0c51 100644 --- a/packages/nextjs/src/app-router/client/useAwaitableNavigate.ts +++ b/packages/nextjs/src/app-router/client/useInternalNavFun.ts @@ -1,28 +1,27 @@ -'use client'; - -import { usePathname, useRouter } from 'next/navigation'; +import type { AppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime'; +import { usePathname } from 'next/navigation'; import { useCallback, useEffect, useTransition } from 'react'; import type { NextClerkProviderProps } from '../../types'; declare global { interface Window { + __clerk_internal_navFun: NonNullable< + NextClerkProviderProps['routerPush'] | NextClerkProviderProps['routerReplace'] + >; __clerk_internal_navPromisesBuffer: Array<() => void> | undefined; - __clerk_internal_navFun: NonNullable; } } -/** - * Creates an "awaitable" navigation function that will do its best effort to wait for Next.js to finish its route transition. - * This is accomplished by wrapping the call to `router.push` in `startTransition()`, which should rely on React to coordinate the pending state. We key off of - * `isPending` to flush the stored promises and ensure the navigates "resolve". - */ -export const useAwaitableNavigate = () => { - const router = useRouter(); +export const useInternalNavFun = (props: { + windowNav: typeof window.history.pushState | typeof window.history.replaceState | undefined; + routerNav: AppRouterInstance['push'] | AppRouterInstance['replace']; +}) => { + const { windowNav, routerNav } = props; const pathname = usePathname(); const [isPending, startTransition] = useTransition(); - if (typeof window !== 'undefined') { + if (windowNav) { window.__clerk_internal_navFun = (to, opts) => { return new Promise(res => { if (!window.__clerk_internal_navPromisesBuffer) { @@ -39,15 +38,15 @@ export const useAwaitableNavigate = () => { if (opts?.__internal_metadata?.navigationType === 'internal') { // In 14.1.0, useSearchParams becomes reactive to shallow updates, // but only if passing `null` as the history state. - // Older versions need to maintain the history state for push to work, + // Older versions need to maintain the history state for push/replace to work, // without affecting how the Next router works. const state = ((window as any).next?.version ?? '') < '14.1.0' ? history.state : null; - window.history.pushState(state, '', to); + windowNav(state, '', to); } else { // If the navigation is external (usually when navigating away from the component but still within the app), // we should use the Next.js router to navigate as it will handle updating the URL and also // fetching the new page if necessary. - router.push(to); + routerNav(to); } }); }); diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index f6bf3b5f64..99f6c235d3 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 5.2.1 + +### Patch Changes + +- With the next major release, NextJS@15 will depend on `react` and `react-dom` v19, which is still in beta. We are updating our peer dependencies accordingly in order to accept `react` and `react-dom` @ `19.0.0-beta` ([#3428](https://github.com/clerk/javascript/pull/3428)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +- Updated dependencies [[`ff31f7255`](https://github.com/clerk/javascript/commit/ff31f725541d82caaa9c13cf42cf15f8ce3992f4), [`0e48fc210`](https://github.com/clerk/javascript/commit/0e48fc210cf0b5852052a21494a05f6e723101f5)]: + - @clerk/shared@2.2.1 + ## 5.2.0 ### Minor Changes diff --git a/packages/react/package.json b/packages/react/package.json index 7637234d00..398d51e4a3 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "5.2.0", + "version": "5.2.1", "description": "Clerk React library", "keywords": [ "clerk", @@ -76,7 +76,7 @@ "test:ci": "jest --maxWorkers=70%" }, "dependencies": { - "@clerk/shared": "2.2.0", + "@clerk/shared": "2.2.1", "@clerk/types": "4.5.0", "tslib": "2.4.1" }, diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index c811970bc4..e6c456f3fc 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 4.0.12 + +### Patch Changes + +- Updated dependencies [[`ff31f7255`](https://github.com/clerk/javascript/commit/ff31f725541d82caaa9c13cf42cf15f8ce3992f4), [`0e48fc210`](https://github.com/clerk/javascript/commit/0e48fc210cf0b5852052a21494a05f6e723101f5)]: + - @clerk/shared@2.2.1 + - @clerk/clerk-react@5.2.1 + - @clerk/backend@1.2.1 + ## 4.0.11 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index cee8ab817b..cf73940555 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.0.11", + "version": "4.0.12", "description": "Clerk SDK for Remix", "keywords": [ "clerk", @@ -73,9 +73,9 @@ "publish:local": "npx yalc push --replace --sig" }, "dependencies": { - "@clerk/backend": "1.2.0", - "@clerk/clerk-react": "5.2.0", - "@clerk/shared": "2.2.0", + "@clerk/backend": "1.2.1", + "@clerk/clerk-react": "5.2.1", + "@clerk/shared": "2.2.1", "cookie": "0.5.0", "tslib": "2.4.1" }, diff --git a/packages/sdk-node/CHANGELOG.md b/packages/sdk-node/CHANGELOG.md index 3370bc6bdc..b8b3e77671 100644 --- a/packages/sdk-node/CHANGELOG.md +++ b/packages/sdk-node/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 5.0.9 + +### Patch Changes + +- Updated dependencies [[`ff31f7255`](https://github.com/clerk/javascript/commit/ff31f725541d82caaa9c13cf42cf15f8ce3992f4), [`0e48fc210`](https://github.com/clerk/javascript/commit/0e48fc210cf0b5852052a21494a05f6e723101f5)]: + - @clerk/shared@2.2.1 + - @clerk/backend@1.2.1 + ## 5.0.8 ### Patch Changes diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json index cd5328a64d..41a5333135 100644 --- a/packages/sdk-node/package.json +++ b/packages/sdk-node/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-sdk-node", - "version": "5.0.8", + "version": "5.0.9", "description": "Clerk server SDK for usage with node", "keywords": [ "clerk", @@ -53,8 +53,8 @@ "test:ci": "jest --maxWorkers=70%" }, "dependencies": { - "@clerk/backend": "1.2.0", - "@clerk/shared": "2.2.0", + "@clerk/backend": "1.2.1", + "@clerk/shared": "2.2.1", "tslib": "2.4.1" }, "devDependencies": { diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index 35ad4706f0..30f1a6a718 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 2.2.1 + +### Patch Changes + +- Add a custom logger to allow logging a message or warning to the console once per session, in order to avoid consecutive identical logs due to component rerenders. ([#3383](https://github.com/clerk/javascript/pull/3383)) by [@desiprisg](https://github.com/desiprisg) + +- With the next major release, NextJS@15 will depend on `react` and `react-dom` v19, which is still in beta. We are updating our peer dependencies accordingly in order to accept `react` and `react-dom` @ `19.0.0-beta` ([#3428](https://github.com/clerk/javascript/pull/3428)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + ## 2.2.0 ### Minor Changes diff --git a/packages/shared/package.json b/packages/shared/package.json index d3e58ebe22..bbcaa6b873 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "2.2.0", + "version": "2.2.1", "description": "Internal package utils used by the Clerk SDKs", "repository": { "type": "git", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index e22a72fc69..e84dd412dc 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,12 @@ # @clerk/testing +## 1.1.4 + +### Patch Changes + +- Updated dependencies [[`ff31f7255`](https://github.com/clerk/javascript/commit/ff31f725541d82caaa9c13cf42cf15f8ce3992f4), [`0e48fc210`](https://github.com/clerk/javascript/commit/0e48fc210cf0b5852052a21494a05f6e723101f5)]: + - @clerk/shared@2.2.1 + ## 1.1.3 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index 31c00df816..99803c71dd 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.1.3", + "version": "1.1.4", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", @@ -62,7 +62,7 @@ "lint": "eslint src/" }, "dependencies": { - "@clerk/shared": "2.2.0", + "@clerk/shared": "2.2.1", "@clerk/types": "4.5.0", "dotenv": "16.4.5" },