From 697949646887ba940f620b390cd40d5183fa1f57 Mon Sep 17 00:00:00 2001 From: SamSalvatico <40636569+SamSalvatico@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:19:07 +0200 Subject: [PATCH] Feature/merge 1.15.0 (#5) * chore(schemas): renaming * refactor(core): refactor code * refactor(core): overload function interface * refactor(core): refactor * feat(core): add GET /configs/jwt-customizer API * chore(core,test): update tests and refactor getJwtCustomizer query * fix(test): fix tests * refactor(core): refactor * feat(core): add GET /configs/jwt-customizer API * feat(core): add DELETE /configs/jwt-customizer API * fix(core): fix rebase * refactor(console): implement environment variables input field (1/2) (#5471) * refactor(console): extract the KeyValueInput ds component extract the KeyValueInput ds component * fix(console): remove unused styles remove unused styles * refactor(console): extract the FormField from KeyValueInput extract the FormField from KeyValueInput * fix(console): refactor some code based on code review comment refactor some code based the code review comment * feat(console,phrases): implement environment variables input field (2/2) (#5473) feat(console,phrases): implement environment variables input field implement environment variables input field * feat(console,phrases): add test sample code editor (#5475) * feat(console,phrases): add test sample code editor add test sample code editor * fix(console): remove unused styles remove unused styles * refactor(console): refactor the components structure erfactor the components structure * refactor(console): clean up the root component clean up the root component * feat(console,phrases): add test result component (#5479) * feat(console,phrases): add test result component add test result component * fix(console): remove unused styles remove unused styles * feat(core): create user with avatar and custom data (#5476) * feat(core): add password algorithm transition (#5481) * chore(console): component rename (#5480) rename component XXXPanel -> XXXSection * fix(console): fix input field background color (#5478) * feat(console, phrases): implement the copy, clear and reset button (#5490) * refactor(console): replace copy button with CopyToClipboard component replace copy button with CopyToClipboard component * feat(console): implement the clear and reset button implement the clear and reset button * refactor(console): bind RHF controller to the code editor bind RHF controller to the code editor * chore(console): add some comments add some comments * feat(core,schemas): update jwt customizer user info context * feat(console): add change alert and save changes footer (#5492) * feat(console): add change alert and save changes footer add change alert and save changes footer * chore(console): add useMemo hook add useMemo hook * refactor(experience): skip non-object messages in native (#5491) * refactor(experience): skip non-object messages in native * chore: add changeset * chore(schemas): add cloud scope, service log type and API guard * refactor(core): update organization invitation apis (#5474) * refactor(core): update organization invitation apis * chore: add api tests * refactor(core,console): align the jwt token path enum (#5493) align the jwt token path enum used in console and core * feat(console,phrases): integrate jwt customizer api (#5495) * feat(console,phrases): integrate jwt customizer api integrate jwt customizer api * chore(console): update the comment update the comment * fix(console): clear the console logs clear the console logs * refactor(console,core,schemas): rename the jwtCustomizer related type and guards (#5496) rename the jwtCustomizer related type and guards * feat(phrases): add i18n phrases for cloud collaboration * feat(console): add global loading skeleton (#5498) add global loading skeleton * fix(console): fix code edtior set undefined value bug (#5499) fix the code editor set undefined value bug * fix(core): the koa response status guard missing 422 in sso integration API (#5506) * chore(schemas): export custom JWT API request body type (#5510) chore(schemas): export custom jwt API request body type * refactor: remove slonik from shared * refactor: fix errors * refactor: use silverhand slonik * chore: upgrade slonik * refactor: remove unused files * chore: add changeset for the bug fix PR (#5507) add changeset for the bug fix PR * feat(core): set oidc issuer to custom domain (#5509) * feat(core): set oidc issuer to custom domain * refactor(core): get tenant id return whether is custom domain * test(core): mock crypto functions in password tests (#5522) * refactor: update invitation apis * feat: allow get invitations by invitee * refactor(console): refactor the code editor type definition (#5516) * refactor(console): refactor the code editor type definition refactor the code editor type definition * refactor(console): extract type definition gen process extract the type definition gen step to the build time. As typescript is not available at run time. * fix(console): add generate to console build script add generate to console build script * fix(console): add prettier format add prettier format * refactor(console): replace the field table with type definition code (#5519) * refactor(console): replace the field table with type definition code replace the field table with type definition code * refactor(console): rebase and pickup the generated type definitions rebase and pickup the generated type definitions * feat: return and store connector raw data * chore: add exception for connector template * refactor(core): update user context type * feat: add oidc standard claims to user * refactor(core,schemas): refactor to improve lib method performance * fix(console): fix some user related type in console * refactor(console,phrases): refactor the jwt customizer content (#5527) * refactor(console,phrases): refactor the jwt customizer content refactor the jwt customizer content * fix(console): add isDev guard add isDev guard * refactor(core): refactor oidc sso connector (#5528) refactor oidc sso connector * refactor: fix type issues * refactor: fix tests * chore: remove org role scopes field since it relies on pagination setup * feat: add profile api, update api and database, add tests * chore: add changeset and api doc * ci: bump workflow version (#5533) * fix(schemas): fix the get interation/consent api bug (#5503) * fix(schemas): fix the get interation/consent api bug fix the get interation/consent api bug * chore: update changeset update changeset * fix: update changeset update changeset * refactor(schemas, console): alter the resource scopes description field to nullable (#5504) * refactor(schemas, console): alter the resoruce scopes description field nullable make the resourec scopes description nullable * fix(test): fix the type issue in the integration test fix the type issue in the integration test * fix(console): add the field register add the field register * fix: update the changeset update the changeset * fix(console,test): update comments and rebase update comments and rebase the master * chore: add comments * feat(core): add POST /configs/jwt-customizer/test API * refactor(core): use discriminate union for custom jwt test API * chore: update core dependency * chore: add todo * chore: remove 500 status guard * refactor: refactor * refactor(core): add cloud-only API prune for API docs * refactor: remove cloud only operations when needed * refactor: keep origin customJwtFetcherGuard * refactor: adopt suggestion * chore(schemas): remove deprecated `prune:logs` scope (#5524) * chore: add status 403 for custom jwt test API * feat(console): integrate jwt customizer test api (#5532) * feat(console): integrate jwt customizer test api integrate jwt customizer test api * refactor(console,core): jwt test api integration jwt test api integration * chore: add cloud connection scope config for fetching custom jwt --------- Co-authored-by: Darcy Ye * feat(console): add tenant member and invitation lists (#5501) * feat(console): add tenant member and invitation lists * refactor: polish code per comments * fix: lockfile * Update README.md (#5535) https://github.com/logto-io/logto/issues/1937#issuecomment-1968113758 * refactor: fix test and ci * feat(core): add the support on custom JWT feature * fix: cloud connection should bypass custom JWT flow * chore: update cloud dependency * refactor(core): add cache for cloud connection data * refactor: block admin tenant from using creating jwt-customizer API * refactor: remove credentials cache * refactor: try catch extraTokenClaims function to avoid breaking the auth process * style(console): fix the jwt test panel layout (#5538) fix the jwt test panel layout * chore: fix * chore: fix * refactor(core): remove unused mark mfa skip function (#5517) fixed #5482 * chore(schemas): add comments for `ReservedPlanId` (#5542) * refactor(console): extract shared quota between featured plan and comparison table (#5543) * refactor(console): avoid nested modal content for role creation (#5544) * refactor: reorder code * refactor: not update console cloud dependency * refactor(phrases,core,console): update API and console error handling/display * chore: add comments * refactor(schemas,core,console): skip onboarding if user has pending invitations (#5547) * fix(core): fix the post domains api error status code (#5552) fix the post domains api error status code * chore: bump @logto dependencies (#5548) * chore(phrases): add i18n phrases for console invitation interim pages (#5553) * refactor(console): reorg sidebar menu items (#5550) * fix(core,phrases): fix custom JWT PUT API block admin tenant logic * feat: support direct sign-in (#5536) * feat: support direct sign-in * chore: add changesets * refactor: add test cases * chore(deps): upgrade logto sdks * chore(deps): update softprops/action-gh-release action to v2 (#5486) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(schemas): update customJwtFetcherGuard to specify custom jwt use case * feat(console): invite members dialog (#5531) * feat(console): add console landing page to accept user invitation (#5554) * chore(deps): update packges (#5545) * chore(deps): upgrade puppeteer * chore: replace plugin * refactor: fix tests * feat(core,schemas): add new Azure OIDC SSO connector (#5540) add new Azure OIDC SSO connector * refactor(core,schemas): refactor the sso connector factory type (#5541) * refactor(core,schemas): refactor the sso connector factory type refactor the sso connector factory type and add providerType to the config data * fix(core): fix ut fix ut * refactor(schemas): add the providerType to the providerDetails return type add the new providerType property to the providerDetails return type * refactor(console): refactor useApi (#5549) refactor useApi hideToast logic * refactor(console): refactor sso detail pages (#5551) * refactor(console): refactor sso detail pages refactor sso details pages * fix(console): fix the sso paywall guard content fix the sso paywall guard content * style(console): fix the color code white css (#5564) fix the color code white css * feat(console): support signing-key rotation for oss version (#5559) * fix(console,phrases): api resource indicator should be a valid absolute uri (#5561) * fix(console,phrases): api resource indicator should be a valid absolute uri * refactor: use vitest for connectors (#5562) * fix(console): fix jwt test context code editor bug (#5563) fix jwt test context code editor bug * fix(console): fix the zod-to-ts type infer bug (#5566) fix the zod-to-ts type infer bug * feat(console): implement interim landing page for new users to join invited tenants (#5560) * feat(console): support permission editing (#5567) * chore(schemas,core): update custom JWT sample token payload guard * feat(console): add quick join options in tenant selector dropdown (#5568) * feat(console): implement interim landing page for new users to join invited tenants * feat(console): add quick join options in tenant selector dropdown * chore(console): update the default user context as well * refactor: remove jest * refactor: remove jest * refactor: add back `build:test` for other packages * chore: add test coverage pacakge * refactor: remove jest * test: wait 0ms after each test * refactor(console): update tenant settings access per user tenant scopes (#5571) * test: add integration tests for jwt (#5565) * test: improve integration tests (#5577) * refactor(schemas): remove invite member scope from tenant member role (#5578) * fix(deps): update dependency snakecase-keys to v7 (#5556) * fix(deps): update dependency snakecase-keys to v7 * test: wait for 1ms for every api test --------- Co-authored-by: Gao Sun * fix(deps): update dependency snake-case to v4 (#5534) Co-authored-by: Gao Sun * chore: add comments for cloud seed data (#5583) * feat(schemas): add new scope read:member to both tenant admin and member roles (#5582) * chore: update cloud version and the way to call cloud custom JWT API * fix(console,phrases): should check duplicated emails when inviting members (#5581) fix(console,phrases): check duplicated emails when inviting members * fix(console): revert the custom jwt forms overflow hidden (#5573) revert the custom jwt forms overflow hidden styles * feat(schemas): add util method to convert admin tenant org id to user tenant id (#5570) * refactor: use ky in integration tests (#5584) * refactor: use ky in integration tests * refactor: remove node-fetch * refactor: fix test cases * refactor: remove waitFor after each test * feat: support direct sign-in for sso (#5589) * chore(core): update GET /configs/jwt-customizer/:tokenPath API error handling (#5595) * refactor(core): reorg and separate logto-config APIs into files * chore(cli): update translate CLI configs * fix(console): refresh invitation list after inviting members (#5593) * test: add tests for username case sensitive (#5597) * refactor(console): move organization template into a single page (#5590) * refactor(console): move organization template into a single page * feat(phrases): add org template translations * feat(console): implement custom jwt landing page implement custom jwt landing page * refactor(console): relocalte the component files relocate the component files * refactor(console): rename the jwtClaims page rename the jwtClaims page * refactor(console,phrases): refactor the customize jwt details page refactor the customize jwt details page * refactor(console): remove unused element remove unused element * refactor(console): redesign the jwt details page redesign the jwt details page * feat(console): update jwt create page button text update jwt create page button text * chore(console): align custom JWT path and hide the entrance for OSS * style(console): refine the SSO connector create model (#5594) refine the sso connector create model * fix(console): only pending invitations can be resent (#5601) * fix(core): update expired invitation to expired before inserting a new one (#5609) * feat(console): add leave tenant button in tenant settings (#5600) * fix(console): joining tenant should navigate user to the new tenant (#5602) * chore(core,console): update error handling of testing custom JWT * feat(core): add PATCH /configs/jwt-customizer API * fix(console): reset form as soon as JWT customizer is created (#5612) * feat(core,schemas): log extraTokenClaims exception (#5539) * refactor(console): improve invitation email input field (#5615) * refactor(schemas): rename tenant member role to collaborator (#5616) * fix(console,phrases): fix a batch of organization invitation console ui issues (#5614) * feat(console): support org permission management on new org template page (#5603) * feat(console): support org permission management on new org template page * refactor(console): rename org pages * refactor(console): rename phrase keys * refactor(console): rename org to organization * feat(console): add org role details general settings page (#5610) * chore(console,phrases): update content and fix console * chore(console,toolkit): update custom JWT details page code editor action buttons style * refactor(console,phrases): rename tenant member role to collaborator (#5618) * chore(console,toolkit): update custom JWT details page code editor action buttons style * chore(core,console,schemas): update variable name and field name * refactor(experience): fix sso callback page style (#5624) * refactor(phrases): add zh-cn phrases in OIDC consent page (#5606) * feat(phrases): add i18n phrases for zh-cn about OICD Authorize page * refactor: apply suggestions from code review --------- Co-authored-by: Gao Sun * chore(console): update style chore(console): update style * refactor(console,phrases): display inviter name on tenant invitations table (#5622) * refactor(console,phrases): display inviter name on tenant invitations table * chore: bump @logto/cloud * chore: update pnpm lockfile * refactor: update dependency on @logto/cloud and update legacy JWT customizer * fix(console): temporarily fix pro plan cannot invite members issue (#5629) * feat(console): create organization role (#5630) * feat(console): add permissions page for org role details page (#5631) * refactor(console): reorg resource details page (#5634) * feat(core): search organization roles (#5627) * feat(core,schemas): add organization resource scope relations (#5608) * feat(console): add azure OIDC guide (#5592) add azure OIDC guide * feat(core,schemas): edit and query resource scopes for org role (#5613) * fix(console,phrases): update the jwt test section content (#5641) update the jwt test section content * style(console): fix the jwt details page style (#5642) * style(console): fix the jwt details page style fix the jwt details page style * fix(console): remove the unused style remove the unused style * fix(console): remove sticky position remove sticky position * feat(console,core,phrases): add quota guard for cloud collaboration in console (#5644) * fix(console): fix test result panel overflow bug (#5643) fix test result panel overflow bug * chore(schemas): fix alteration timestamp (#5645) chore(schemas): fix alteration scripts order * feat(console): support searching for organization roles (#5646) * chore(schemas): fix alteration down (#5648) * refactor(console): show confirm box when inviting a member as admin (#5649) * fix(console): should stop requesting invitations api for collaborator role (#5650) * feat(console): add guide for organization template page (#5647) * refactor(console): collaborator can see tenant domain settings in readonly mode (#5652) * refactor(console): hide switching tabs and invite button for collaborators (#5654) * refactor(console): improve switch button styles (#5655) * fix(console): user should switch account and accept invitation properly in console (#5657) * fix(console): bump js sdks to fix the cannot switch user account issue * fix(console): accept invitation automatically after switching account * refactor(console): improve tenant member role related experience (#5659) * refactor(console,phrases): improve invite email input (#5661) * fix(console): go to onboarding process on clicking create new tenant button (#5663) * fix(connector): fix microsoft social connector readme (#5658) * fix(connector): fix microsoft social connector readme fix microsoft social connector readme * fix(connector): improve wording improve wording * fix(experience): fix the terms of use not clickable bug (#5670) * fix(experience): fix the terms of use not clickable bug fix the terms of use not clickable bug * chore: remove changeset remove changeset * chore(console): remove dev feature flags for cloud collaboration (#5666) * chore(console): update pricing plan items for jwt claims (#5672) * refactor(console): redirect to sign-up page on clicking invitation links (#5669) * chore: add changeset (#5668) add changeset * refactor(experience): fall back to sign-in page when error (#5673) * refactor(experience): fall back to sign-in page for edge cases * refactor: add unit tests * refactor: fix tests * release: version packages (#5463) * feat(cli): updated references to slonik lib --------- Co-authored-by: Darcy Ye Co-authored-by: simeng-li Co-authored-by: wangsijie Co-authored-by: Charles Zhao Co-authored-by: Gao Sun Co-authored-by: Xiao Yijun Co-authored-by: Julian Hackenberg Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: pawn <115976311+the-pawn-2017@users.noreply.github.com> Co-authored-by: silverhand-bot <107667382+silverhand-bot@users.noreply.github.com> --- ...eration-compatibility-integration-test.yml | 4 +- .github/workflows/commitlint.yml | 3 +- .github/workflows/integration-test.yml | 4 +- .github/workflows/release.yml | 2 +- .gitignore | 3 + .gitpod.yml | 2 +- README.md | 1 - commitlint.config.cjs => commitlint.config.ts | 10 +- package.json | 8 +- packages/app-insights/jest.config.js | 13 - packages/app-insights/package.json | 13 +- .../app-insights/src/normalize-error.test.ts | 2 + packages/app-insights/tsconfig.json | 2 +- packages/app-insights/tsconfig.test.json | 8 - packages/cli/CHANGELOG.md | 21 + packages/cli/jest.config.js | 13 - packages/cli/package.json | 31 +- .../database/alteration/index.test.ts | 26 +- .../src/commands/database/alteration/index.ts | 2 +- .../commands/database/ogcio/applications.ts | 2 +- .../cli/src/commands/database/ogcio/ogcio.ts | 2 +- .../database/ogcio/organizations-rbac.ts | 2 +- .../commands/database/ogcio/organizations.ts | 2 +- .../src/commands/database/ogcio/queries.ts | 2 +- .../commands/database/ogcio/resources-rbac.ts | 2 +- .../src/commands/database/ogcio/resources.ts | 2 +- .../cli/src/commands/database/seed/cloud.ts | 4 +- .../cli/src/commands/database/seed/index.ts | 2 +- .../src/commands/database/seed/oidc-config.ts | 2 +- .../cli/src/commands/database/seed/tables.ts | 28 +- .../database/seed/tenant-organizations.ts | 2 +- .../cli/src/commands/database/seed/tenant.ts | 7 +- packages/cli/src/commands/translate/openai.ts | 5 +- packages/cli/src/connector/factories.ts | 11 +- packages/cli/src/connector/types.ts | 2 +- packages/cli/src/connector/utils.ts | 2 +- packages/cli/src/database.ts | 15 +- packages/cli/src/include.d/import-meta.d.ts | 5 - .../include.d/slonik-interceptor-preset.d.ts | 10 - packages/cli/src/queries/database.ts | 4 +- packages/cli/src/queries/logto-config.ts | 7 +- packages/cli/src/queries/system.test.ts | 15 +- packages/cli/src/queries/system.ts | 7 +- packages/cli/src/sql.ts | 75 + packages/cli/src/test-utils.ts | 5 +- packages/cli/tsconfig.json | 2 +- packages/cli/tsconfig.test.json | 8 - packages/connectors/.gitignore | 3 +- .../connector-alipay-native/CHANGELOG.md | 14 + .../connector-alipay-native/package.json | 9 +- .../connector-alipay-native/src/index.test.ts | 53 +- .../connector-alipay-native/src/index.ts | 6 +- .../connector-alipay-native/src/utils.test.ts | 8 +- .../connector-alipay-web/CHANGELOG.md | 14 + .../connector-alipay-web/package.json | 9 +- .../connector-alipay-web/src/index.test.ts | 49 +- .../connector-alipay-web/src/index.ts | 8 +- .../connector-alipay-web/src/utils.test.ts | 8 +- .../connector-aliyun-dm/CHANGELOG.md | 10 + .../connector-aliyun-dm/package.json | 9 +- .../connector-aliyun-dm/src/index.test.ts | 10 +- .../src/single-send-mail.test.ts | 6 +- .../connector-aliyun-dm/src/utils.test.ts | 6 +- .../connector-aliyun-sms/CHANGELOG.md | 10 + .../connector-aliyun-sms/package.json | 9 +- .../connector-aliyun-sms/src/index.test.ts | 10 +- .../src/single-send-text.test.ts | 6 +- .../connector-aliyun-sms/src/utils.test.ts | 6 +- .../connectors/connector-apple/CHANGELOG.md | 15 + .../connectors/connector-apple/package.json | 9 +- .../connector-apple/src/index.test.ts | 49 +- .../connectors/connector-apple/src/index.ts | 2 + .../connectors/connector-aws-ses/CHANGELOG.md | 10 + .../connectors/connector-aws-ses/package.json | 9 +- .../connector-aws-ses/src/index.test.ts | 8 +- .../connectors/connector-azuread/CHANGELOG.md | 19 + .../connectors/connector-azuread/README.md | 47 +- .../connectors/connector-azuread/package.json | 15 +- .../connector-azuread/src/index.test.ts | 69 +- .../connectors/connector-azuread/src/index.ts | 12 +- .../connectors/connector-discord/CHANGELOG.md | 14 + .../connectors/connector-discord/package.json | 9 +- .../connector-discord/src/index.test.ts | 31 +- .../connectors/connector-discord/src/index.ts | 6 +- .../connector-facebook/CHANGELOG.md | 14 + .../connector-facebook/package.json | 9 +- .../connector-facebook/src/index.test.ts | 38 +- .../connector-facebook/src/index.ts | 5 +- .../connector-feishu-web/CHANGELOG.md | 14 + .../connector-feishu-web/package.json | 9 +- .../connector-feishu-web/src/index.test.ts | 36 +- .../connector-feishu-web/src/index.ts | 2 + .../connectors/connector-github/CHANGELOG.md | 14 + .../connectors/connector-github/package.json | 9 +- .../connector-github/src/index.test.ts | 46 +- .../connectors/connector-github/src/index.ts | 5 +- .../connectors/connector-google/CHANGELOG.md | 14 + .../connectors/connector-google/package.json | 9 +- .../connector-google/src/index.test.ts | 32 +- .../connectors/connector-google/src/index.ts | 5 +- .../connectors/connector-kakao/CHANGELOG.md | 14 + .../connectors/connector-kakao/package.json | 9 +- .../connector-kakao/src/index.test.ts | 54 +- .../connectors/connector-kakao/src/index.ts | 5 +- .../connector-logto-email/CHANGELOG.md | 10 + .../connector-logto-email/package.json | 11 +- .../connector-logto-email/src/index.test.ts | 6 +- .../connector-logto-email/src/index.ts | 11 +- .../connector-logto-sms/CHANGELOG.md | 10 + .../connector-logto-sms/package.json | 9 +- .../connector-logto-sms/src/index.test.ts | 4 +- .../connector-logto-social-demo/CHANGELOG.md | 10 + .../connector-logto-social-demo/package.json | 9 +- .../src/index.test.ts | 6 +- .../connectors/connector-mailgun/CHANGELOG.md | 10 + .../connectors/connector-mailgun/package.json | 9 +- .../connector-mailgun/src/index.test.ts | 10 +- .../CHANGELOG.md | 10 + .../package.json | 9 +- .../connector-mock-email/CHANGELOG.md | 10 + .../connector-mock-email/package.json | 9 +- .../connector-mock-sms/CHANGELOG.md | 10 + .../connector-mock-sms/package.json | 9 +- .../connector-mock-social/CHANGELOG.md | 14 + .../connector-mock-social/package.json | 9 +- .../connector-mock-social/src/index.ts | 8 +- .../connectors/connector-naver/CHANGELOG.md | 14 + .../connectors/connector-naver/package.json | 9 +- .../connector-naver/src/index.test.ts | 58 +- .../connectors/connector-naver/src/index.ts | 5 +- .../connectors/connector-oauth2/CHANGELOG.md | 14 + .../connectors/connector-oauth2/package.json | 9 +- .../connector-oauth2/src/index.test.ts | 15 +- .../connectors/connector-oauth2/src/index.ts | 3 +- .../connectors/connector-oidc/CHANGELOG.md | 15 + .../connectors/connector-oidc/package.json | 9 +- .../connector-oidc/src/index.test.ts | 20 +- .../connectors/connector-oidc/src/index.ts | 2 + .../connectors/connector-saml/CHANGELOG.md | 10 + .../connectors/connector-saml/package.json | 9 +- .../connector-saml/src/index.test.ts | 18 +- .../connector-saml/src/utils.test.ts | 4 +- .../connector-sendgrid-email/CHANGELOG.md | 10 + .../connector-sendgrid-email/package.json | 9 +- .../src/index.test.ts | 4 +- .../connectors/connector-smsaero/CHANGELOG.md | 10 + .../connectors/connector-smsaero/package.json | 9 +- .../connector-smsaero/src/index.test.ts | 4 +- .../connectors/connector-smtp/CHANGELOG.md | 10 + .../connectors/connector-smtp/package.json | 9 +- .../connector-smtp/src/index.test.ts | 10 +- .../connector-tencent-sms/CHANGELOG.md | 10 + .../connector-tencent-sms/package.json | 9 +- .../connector-tencent-sms/src/index.test.ts | 12 +- .../connector-twilio-sms/CHANGELOG.md | 10 + .../connector-twilio-sms/package.json | 9 +- .../connector-twilio-sms/src/index.test.ts | 4 +- .../connector-wechat-native/CHANGELOG.md | 14 + .../connector-wechat-native/package.json | 9 +- .../connector-wechat-native/src/index.test.ts | 39 +- .../connector-wechat-native/src/index.ts | 6 +- .../connector-wechat-web/CHANGELOG.md | 14 + .../connector-wechat-web/package.json | 9 +- .../connector-wechat-web/src/index.test.ts | 39 +- .../connector-wechat-web/src/index.ts | 6 +- .../connectors/connector-wecom/CHANGELOG.md | 15 + .../connectors/connector-wecom/package.json | 9 +- .../connector-wecom/src/index.test.ts | 40 +- .../connectors/connector-wecom/src/index.ts | 21 +- packages/connectors/templates/package.json | 17 +- .../templates/preset/jest.config.js | 7 - .../templates/preset/rollup.config.js | 6 +- .../connectors/templates/preset/tsconfig.json | 2 +- .../templates/preset/types/import-meta.d.ts | 10 - .../templates/preset/vitest.config.ts | 7 + packages/connectors/templates/sync-preset.js | 21 +- packages/console/CHANGELOG.md | 14 + packages/console/generate.sh | 12 + packages/console/package.json | 34 +- ...generate-jwt-customizer-type-definition.ts | 75 + packages/console/src/App.tsx | 13 +- .../docs/single-sign-on/azure-oidc/README.mdx | 78 + .../assets/application_details.webp | Bin 0 -> 492012 bytes .../azure-oidc/assets/config_application.webp | Bin 0 -> 262316 bytes .../azure-oidc/assets/create_application.webp | Bin 0 -> 243134 bytes .../azure-oidc/assets/create_secret.webp | Bin 0 -> 288338 bytes .../azure-oidc/assets/endpoints.webp | Bin 0 -> 425344 bytes .../src/assets/docs/single-sign-on/index.ts | 3 +- packages/console/src/assets/icons/book.svg | 4 + .../src/assets/icons/conical-flask.svg | 4 + .../console/src/assets/icons/invitation.svg | 3 + .../console/src/assets/icons/jwt-claims.svg | 4 + packages/console/src/assets/icons/key.svg | 3 + packages/console/src/assets/icons/members.svg | 3 + .../console/src/assets/icons/research.svg | 3 + packages/console/src/assets/icons/start.svg | 4 + .../src/assets/icons/token-file-icon.svg | 5 + .../src/assets/icons/user-file-icon.svg | 4 + packages/console/src/assets/icons/user.svg | 5 +- packages/console/src/cloud/AppRoutes.tsx | 8 + .../console/src/cloud/hooks/use-cloud-api.ts | 36 +- .../Main/InvitationList/index.module.scss | 71 + .../cloud/pages/Main/InvitationList/index.tsx | 90 + .../console/src/cloud/pages/Main/index.tsx | 11 + packages/console/src/cloud/types/router.ts | 16 + .../src/components/ActionsButton/index.tsx | 60 +- .../src/components/Conversion/index.tsx | 117 + .../src/components/Conversion/use-retry.ts | 52 + .../utils.test.ts | 0 .../src/components/Conversion/utils.ts | 106 + .../use-featured-plan-content.ts | 21 +- .../SelectTenantPlanModal/index.tsx | 2 + .../components/ItemPreview/UserPreview.tsx | 23 +- .../components/ItemPreview/index.module.scss | 5 +- .../src/components/ItemPreview/index.tsx | 2 +- .../index.tsx | 114 + .../PermissionsTable/EditPermissionModal.tsx | 79 + .../PermissionsTable/index.module.scss | 2 +- .../src/components/PermissionsTable/index.tsx | 209 +- .../src/components/ReportConversion/index.tsx | 85 - .../src/components/ReportConversion/utils.ts | 88 - .../SubmitFormChangesActionBar/index.tsx | 16 +- .../index.module.scss | 26 + .../TenantInvitationDropdownItem/index.tsx | 53 + .../Topbar/TenantSelector/index.module.scss | 9 +- .../Topbar/TenantSelector/index.tsx | 10 +- .../UserAccountInformation/index.tsx | 4 +- packages/console/src/consts/env.ts | 3 +- packages/console/src/consts/external-links.ts | 7 + packages/console/src/consts/logs.ts | 9 +- packages/console/src/consts/page-tabs.ts | 13 +- .../console/src/consts/quota-item-phrases.ts | 4 + packages/console/src/consts/subscriptions.ts | 10 + packages/console/src/consts/tenants.ts | 1 + .../ConsoleContent/Sidebar/hook.tsx | 52 +- .../src/containers/ConsoleContent/index.tsx | 77 +- .../ConsoleRoutes/index.tsx | 5 +- .../src/containers/ProtectedRoutes/index.tsx | 8 +- .../console/src/contexts/TenantsProvider.tsx | 8 +- .../ds-components/CardTitle/index.module.scss | 4 - .../src/ds-components/CardTitle/index.tsx | 15 +- .../ConfirmModal/index.module.scss | 4 + .../src/ds-components/ConfirmModal/index.tsx | 4 +- .../KeyValueInputField}/index.module.scss | 0 .../KeyValueInputField/index.tsx | 118 + .../ds-components/TextInput/index.module.scss | 3 +- .../src/ds-components/TextInput/index.tsx | 2 +- packages/console/src/hooks/use-api.ts | 60 +- .../src/hooks/use-current-tenant-scopes.ts | 61 + packages/console/src/hooks/use-swr-fetcher.ts | 4 +- .../console/src/hooks/use-user-invitations.ts | 42 + packages/console/src/include.d/tags.d.ts | 11 +- .../hooks/use-user-onboarding-data.ts | 23 +- packages/console/src/onboarding/index.tsx | 22 +- .../src/onboarding/pages/Welcome/index.tsx | 4 +- .../src/onboarding/pages/Welcome/options.tsx | 4 +- packages/console/src/onboarding/types.ts | 84 - .../SwitchAccount/index.module.scss | 43 + .../AcceptInvitation/SwitchAccount/index.tsx | 46 + .../src/pages/AcceptInvitation/index.tsx | 79 + .../CreatePermissionModal/index.tsx | 8 +- .../ApiResourcePermissions/index.tsx | 59 +- .../ApiResourceSettings/index.tsx | 14 +- .../src/pages/ApiResourceDetails/index.tsx | 42 +- .../src/pages/ApiResourceDetails/types.ts | 8 - .../components/CreateForm/index.tsx | 10 +- .../console/src/pages/ApiResources/index.tsx | 2 +- packages/console/src/pages/Callback/index.tsx | 2 - .../pages/CheckoutSuccessCallback/index.tsx | 11 +- .../pages/CustomizeJwt/CreateButton/index.tsx | 26 + .../CustomizerItem/index.module.scss | 38 + .../CustomizeJwt/CustomizerItem/index.tsx | 77 + .../src/pages/CustomizeJwt/index.module.scss | 24 + .../console/src/pages/CustomizeJwt/index.tsx | 67 + .../pages/CustomizeJwt/use-jwt-customizer.ts | 40 + .../src/pages/CustomizeJwt/utils/path.ts | 24 + .../src/pages/CustomizeJwt/utils/type.ts | 1 + .../CodeEditorLoadingContext.ts | 20 + .../ActionButton/CodeRestoreButton.tsx | 28 + .../ActionButton/index.module.scss | 5 + .../MonacoCodeEditor/ActionButton/index.tsx | 61 + .../Dashboard/index.module.scss | 39 + .../MonacoCodeEditor/Dashboard/index.tsx | 30 + .../MainContent/MonacoCodeEditor/config.ts | 33 + .../MonacoCodeEditor/index.module.scss | 87 + .../MainContent/MonacoCodeEditor/index.tsx | 205 + .../MainContent/MonacoCodeEditor/type.ts | 34 + .../MonacoCodeEditor/use-editor-height.ts | 35 + .../ErrorContent/index.module.scss | 6 + .../ScriptSection/ErrorContent/index.tsx | 28 + .../ScriptSection/index.module.scss | 18 + .../MainContent/ScriptSection/index.tsx | 120 + .../ScriptSection/use-test-handler.ts | 84 + .../EnvironmentVariablesField.tsx | 117 + .../GuideCard/index.module.scss | 60 + .../InstructionTab/GuideCard/index.tsx | 51 + .../InstructionTab/index.module.scss | 25 + .../SettingsSection/InstructionTab/index.tsx | 123 + .../SettingsSection/TestTab/index.module.scss | 10 + .../SettingsSection/TestTab/index.tsx | 129 + .../SettingsSection/index.module.scss | 80 + .../MainContent/SettingsSection/index.tsx | 42 + .../MainContent/index.module.scss | 26 + .../CustomizeJwtDetails/MainContent/index.tsx | 109 + .../PageLoadingSkeleton/index.module.scss | 47 + .../PageLoadingSkeleton/index.tsx | 41 + .../CustomizeJwtDetails/index.module.scss | 14 + .../src/pages/CustomizeJwtDetails/index.tsx | 66 + .../src/pages/CustomizeJwtDetails/type.ts | 25 + .../CustomizeJwtDetails/use-data-fetch.ts | 35 + .../CustomizeJwtDetails/utils/config.tsx | 256 ++ .../pages/CustomizeJwtDetails/utils/format.ts | 117 + .../pages/CustomizeJwtDetails/utils/path.ts | 4 + .../utils/type-definitions.ts | 39 + .../SsoConnectorRadioGroup/index.module.scss | 2 +- .../EnterpriseSso/SsoCreationModal/index.tsx | 11 +- .../console/src/pages/EnterpriseSso/types.ts | 85 - .../Connection/BasicInfo/index.tsx | 85 - .../Connection/OidcConnectorForm.tsx | 138 + .../ParsedConfigPreview/index.tsx | 5 +- .../Connection/OidcMetadataForm/index.tsx | 13 +- .../Connection/SamlAttributeMapping/index.tsx | 44 +- .../Connection/SamlConnectorForm.tsx | 147 + .../ParsedConfigPreview/index.tsx | 5 +- .../Connection/SamlMetadataForm/index.tsx | 34 +- .../OidcConnectorSpInfo.tsx | 30 + .../SamlConnectorSpInfo.tsx | 48 + .../index.module.scss | 0 .../EnterpriseSsoDetails/Connection/index.tsx | 224 +- .../src/pages/EnterpriseSsoDetails/config.ts | 3 + .../src/pages/EnterpriseSsoDetails/index.tsx | 49 +- .../pages/EnterpriseSsoDetails/types/oidc.ts | 36 + .../pages/EnterpriseSsoDetails/types/saml.ts | 64 + .../use-delete-connector.ts | 50 + .../Permissions/index.module.scss | 11 + .../Permissions/index.tsx | 155 + .../Settings/index.tsx | 78 + .../pages/OrganizationRoleDetails/index.tsx | 126 + .../OrganizationPermissions/index.module.scss | 11 + .../OrganizationPermissions/index.tsx | 156 + .../CreateOrganizationRoleModal.tsx | 86 + .../OrganizationRoles/index.module.scss | 13 + .../OrganizationRoles/index.tsx | 168 + .../OrganizationTemplate/index.module.scss | 8 + .../src/pages/OrganizationTemplate/index.tsx | 71 + .../RoleDetails/RolePermissions/index.tsx | 47 +- .../components/AssignToRoleModal/index.tsx | 4 +- .../components/CreateRoleModal/index.tsx | 27 +- .../SigningKeyFormCard}/index.module.scss | 0 .../SigningKeyFormCard}/index.tsx | 58 +- .../src/pages/SigningKeys/index.module.scss | 14 + .../console/src/pages/SigningKeys/index.tsx | 30 + .../PlanComparisonTable/index.tsx | 56 +- .../LeaveCard/index.module.scss | 15 + .../TenantBasicSettings/LeaveCard/index.tsx | 64 + .../TenantBasicSettings/ProfileForm/index.tsx | 3 + .../TenantBasicSettings/index.module.scss | 8 +- .../TenantBasicSettings/index.tsx | 48 +- .../AddDomainForm/index.tsx | 6 +- .../CustomDomain/CustomDomainHeader/index.tsx | 22 +- .../CustomDomain/index.tsx | 3 + .../TenantDomainSettings/index.tsx | 4 + .../TenantMembers/EditMemberModal/index.tsx | 102 + .../TenantMembers/Invitations/index.tsx | 248 ++ .../TenantMembers/InviteEmailsInput/hooks.ts | 133 + .../InviteEmailsInput/index.module.scss | 95 + .../TenantMembers/InviteEmailsInput/index.tsx | 176 + .../Footer/index.module.scss | 16 + .../InviteMemberModal/Footer/index.tsx | 74 + .../TenantMembers/InviteMemberModal/index.tsx | 158 + .../TenantMembers/Members/index.tsx | 125 + .../TenantSettings/TenantMembers/hooks.ts | 68 + .../TenantMembers/index.module.scss | 64 + .../TenantSettings/TenantMembers/index.tsx | 107 + .../TenantSettings/TenantMembers/types.ts | 23 + .../src/pages/TenantSettings/index.tsx | 8 +- .../console/src/pages/UserDetails/utils.ts | 4 +- .../WebhookDetails/WebhookLogs/index.tsx | 4 +- .../CustomHeaderField/index.tsx | 142 +- packages/console/src/scss/_underscore.scss | 2 +- packages/console/src/scss/normalized.scss | 1 + packages/console/src/utils/user.ts | 6 +- packages/console/tsconfig.scripts.gen.json | 7 + packages/core/CHANGELOG.md | 96 + packages/core/package.json | 26 +- packages/core/src/__mocks__/index.ts | 45 +- packages/core/src/__mocks__/user.ts | 17 +- packages/core/src/app/init.ts | 8 +- packages/core/src/database/delete-by-id.ts | 2 +- .../core/src/database/find-all-entities.ts | 5 +- .../core/src/database/find-entity-by-id.ts | 6 +- .../core/src/database/insert-into.test.ts | 2 +- packages/core/src/database/insert-into.ts | 16 +- packages/core/src/database/row-count.ts | 4 +- packages/core/src/database/update-where.ts | 6 +- packages/core/src/database/utils.ts | 6 +- .../src/env-set/check-alteration-state.ts | 2 +- packages/core/src/env-set/create-pool.ts | 16 +- packages/core/src/env-set/index.ts | 8 +- .../core/src/errors/RequestError/index.ts | 2 +- packages/core/src/errors/SlonikError/index.ts | 6 +- .../errors/SlonikError/slonik-error.test.ts | 2 +- .../include.d/slonik-interceptor-preset.d.ts | 10 - .../src/libraries/cloud-connection.test.ts | 4 + .../core/src/libraries/cloud-connection.ts | 3 +- packages/core/src/libraries/hook/utils.ts | 2 + packages/core/src/libraries/jwt-customizer.ts | 71 + packages/core/src/libraries/logto-config.ts | 85 +- .../src/libraries/organization-invitation.ts | 18 +- packages/core/src/libraries/quota.ts | 1 + packages/core/src/libraries/scope.ts | 30 + .../sign-in-experience/index.test.ts | 4 + packages/core/src/libraries/user.test.ts | 131 +- packages/core/src/libraries/user.ts | 89 +- .../core/src/libraries/verification-status.ts | 3 +- .../core/src/middleware/koa-auth/utils.ts | 4 +- packages/core/src/middleware/koa-guard.ts | 23 +- .../src/middleware/koa-security-headers.ts | 9 + .../koa-slonik-error-handler.test.ts | 6 +- .../middleware/koa-slonik-error-handler.ts | 4 +- .../src/middleware/koa-spa-session-guard.ts | 2 +- packages/core/src/oidc/init.test.ts | 6 +- packages/core/src/oidc/init.ts | 146 +- packages/core/src/oidc/scope.test.ts | 39 +- packages/core/src/oidc/scope.ts | 41 +- packages/core/src/oidc/type.ts | 8 - packages/core/src/oidc/utils.test.ts | 56 +- packages/core/src/oidc/utils.ts | 38 +- .../queries/application-sign-in-experience.ts | 4 +- .../application-user-consent-organizations.ts | 4 +- .../application-user-consent-scopes.ts | 4 +- packages/core/src/queries/application.test.ts | 8 +- packages/core/src/queries/application.ts | 8 +- .../core/src/queries/applications-roles.ts | 6 +- packages/core/src/queries/connector.test.ts | 4 +- packages/core/src/queries/connector.ts | 6 +- packages/core/src/queries/custom-phrase.ts | 7 +- .../core/src/queries/daily-active-user.ts | 30 +- .../core/src/queries/daily-token-usage.ts | 7 +- packages/core/src/queries/domains.ts | 7 +- packages/core/src/queries/hooks.ts | 6 +- packages/core/src/queries/log.ts | 37 +- .../core/src/queries/logto-config.test.ts | 4 +- packages/core/src/queries/logto-config.ts | 57 +- .../src/queries/oidc-model-instance.test.ts | 4 +- .../core/src/queries/oidc-model-instance.ts | 6 +- .../core/src/queries/organization/index.ts | 132 +- .../src/queries/organization/relations.ts | 18 +- packages/core/src/queries/passcode.test.ts | 8 +- packages/core/src/queries/passcode.ts | 6 +- packages/core/src/queries/resource.test.ts | 4 +- packages/core/src/queries/resource.ts | 8 +- packages/core/src/queries/roles-scopes.ts | 6 +- packages/core/src/queries/roles.test.ts | 8 +- packages/core/src/queries/roles.ts | 8 +- packages/core/src/queries/scope.ts | 8 +- .../src/queries/sign-in-experience.test.ts | 2 +- .../core/src/queries/sign-in-experience.ts | 2 +- packages/core/src/queries/sso-connectors.ts | 4 +- packages/core/src/queries/system.ts | 7 +- packages/core/src/queries/tenant.ts | 5 +- .../core/src/queries/user-sso-identities.ts | 4 +- packages/core/src/queries/user.test.ts | 6 +- packages/core/src/queries/user.ts | 8 +- packages/core/src/queries/users-roles.ts | 6 +- .../core/src/queries/verification-status.ts | 6 +- packages/core/src/routes-me/user.ts | 4 +- .../src/routes/admin-user/basic.openapi.json | 33 + .../core/src/routes/admin-user/basics.test.ts | 34 +- packages/core/src/routes/admin-user/basics.ts | 72 +- packages/core/src/routes/consts.ts | 11 - packages/core/src/routes/dashboard.test.ts | 6 +- packages/core/src/routes/dashboard.ts | 2 +- packages/core/src/routes/domain.ts | 3 +- packages/core/src/routes/init.ts | 2 +- .../src/routes/interaction/actions/helpers.ts | 2 +- .../actions/submit-interaction.mfa.test.ts | 2 +- .../actions/submit-interaction.test.ts | 2 +- .../interaction/actions/submit-interaction.ts | 37 +- .../src/routes/interaction/additional.test.ts | 6 +- .../src/routes/interaction/single-sign-on.ts | 2 +- .../utils/single-sign-on-session.ts | 2 +- .../interaction/utils/single-sign-on.test.ts | 2 +- .../interaction/utils/single-sign-on.ts | 3 +- .../identifier-payload-verification.test.ts | 9 +- .../identifier-payload-verification.ts | 3 +- .../verifications/mfa-verification.ts | 14 - .../core/src/routes/logto-config.openapi.json | 109 - .../index.test.ts} | 16 +- .../index.ts} | 16 +- .../logto-config/jwt-customizer.test.ts | 127 + .../src/routes/logto-config/jwt-customizer.ts | 221 + .../logto-config/logto-config.openapi.json | 298 ++ .../organization/invitations.openapi.json | 15 + .../src/routes/organization/invitations.ts | 38 +- .../routes/organization/roles.openapi.json | 78 + .../core/src/routes/organization/roles.ts | 52 +- .../core/src/routes/organization/utils.ts | 2 +- packages/core/src/routes/role.scope.ts | 18 +- .../src/routes/sso-connector/utils.test.ts | 7 +- .../core/src/routes/sso-connector/utils.ts | 8 +- packages/core/src/routes/swagger/index.ts | 19 +- .../core/src/routes/swagger/utils/general.ts | 47 +- packages/core/src/routes/user-assets.ts | 2 +- packages/core/src/sentinel/basic-sentinel.ts | 5 +- .../core/src/sso/AzureAdSsoConnector/index.ts | 5 +- .../src/sso/AzureOidcSsoConnector/index.ts | 98 + .../sso/GoogleWorkspaceSsoConnector/index.ts | 10 +- packages/core/src/sso/OidcConnector/index.ts | 29 +- .../core/src/sso/OidcSsoConnector/index.ts | 5 +- .../core/src/sso/OktaSsoConnector/index.ts | 53 +- .../core/src/sso/SamlSsoConnector/index.ts | 5 +- packages/core/src/sso/index.ts | 50 +- packages/core/src/sso/types/connector.ts | 20 + packages/core/src/sso/types/index.ts | 58 +- packages/core/src/sso/types/session.ts | 8 - packages/core/src/tenants/Libraries.ts | 4 + packages/core/src/tenants/Queries.ts | 2 +- .../core/src/tenants/SystemContex.test.ts | 2 +- packages/core/src/tenants/SystemContext.ts | 2 +- packages/core/src/tenants/Tenant.ts | 12 +- packages/core/src/tenants/index.ts | 11 +- packages/core/src/tenants/utils.ts | 4 +- packages/core/src/test-utils/tenant.ts | 2 +- packages/core/src/utils/RelationQueries.ts | 14 +- packages/core/src/utils/SchemaQueries.ts | 6 +- packages/core/src/utils/password.ts | 1 - .../core/src/utils/saml-assertion-handler.ts | 2 +- packages/core/src/utils/search.test.ts | 4 +- packages/core/src/utils/search.ts | 2 +- .../database => core/src/utils}/sql.test.ts | 6 +- .../src/database => core/src/utils}/sql.ts | 17 +- packages/core/src/utils/tenant.test.ts | 109 +- packages/core/src/utils/tenant.ts | 27 +- packages/core/src/utils/test-utils.ts | 12 +- packages/core/src/utils/zod.ts | 7 + packages/create/CHANGELOG.md | 6 + packages/create/package.json | 4 +- packages/demo-app/CHANGELOG.md | 8 + packages/demo-app/package.json | 10 +- packages/demo-app/src/App.tsx | 5 +- packages/experience/CHANGELOG.md | 28 + packages/experience/package.json | 14 +- packages/experience/src/App.tsx | 47 +- .../SettingsProvider.tsx | 7 +- packages/experience/src/constants/env.ts | 2 - .../src/hooks/use-check-single-sign-on.ts | 5 +- .../src/hooks/use-native-message-listener.ts | 10 +- .../src/hooks/use-single-sign-on-watch.ts | 5 +- .../experience/src/pages/Callback/index.tsx | 2 +- .../Callback/use-social-callback-handler.ts | 2 +- .../pages/Consent/ScopesListCard/index.tsx | 3 +- .../src/pages/DirectSignIn/index.test.tsx | 112 + .../src/pages/DirectSignIn/index.tsx | 46 + .../IdentifierRegisterForm/index.test.tsx | 5 +- .../IdentifierSignInForm/index.test.tsx | 5 +- .../SignIn/PasswordSignInForm/index.test.tsx | 5 +- .../SingleSignOn.tsx | 7 +- .../SocialSignIn.tsx | 6 +- .../index.test.tsx | 24 +- .../index.tsx | 12 +- .../use-single-sign-on-listener.ts | 20 +- .../use-social-sign-in-listener.ts | 24 +- packages/integration-tests/CHANGELOG.md | 20 + packages/integration-tests/jest.setup.js | 6 +- packages/integration-tests/package.json | 17 +- .../src/__mocks__/jwt-customizer.ts | 28 + .../integration-tests/src/api/admin-user.ts | 10 + packages/integration-tests/src/api/api.ts | 19 +- .../integration-tests/src/api/application.ts | 7 +- .../integration-tests/src/api/connector.ts | 14 +- .../src/api/custom-phrase.ts | 4 +- packages/integration-tests/src/api/factory.ts | 30 +- .../src/api/interaction-sso.ts | 1 - .../integration-tests/src/api/interaction.ts | 38 +- .../integration-tests/src/api/logto-config.ts | 30 + .../src/api/organization-invitation.ts | 8 + .../src/api/organization-role.ts | 16 + .../integration-tests/src/api/organization.ts | 2 +- .../integration-tests/src/api/resource.ts | 4 +- packages/integration-tests/src/api/scope.ts | 4 +- .../integration-tests/src/client/index.ts | 67 +- packages/integration-tests/src/constants.ts | 4 +- .../src/helpers/admin-tenant.ts | 3 +- .../integration-tests/src/helpers/client.ts | 10 +- .../integration-tests/src/helpers/index.ts | 41 +- .../src/helpers/interactions.ts | 2 +- .../integration-tests/src/helpers/resource.ts | 50 + .../src/helpers/sign-in-experience.ts | 9 + .../src/include.d/node-fetch.d.ts | 4 - .../src/tests/api/admin-user.roles.test.ts | 6 +- .../src/tests/api/admin-user.search.test.ts | 50 +- .../src/tests/api/admin-user.test.ts | 148 +- .../api/admin-user.username-case.test.ts | 40 + .../application-sign-in-experience.test.ts | 6 +- ...lication-user-consent-organization.test.ts | 8 +- .../application-user-consent-scope.test.ts | 16 +- .../api/application/application.roles.test.ts | 10 +- .../tests/api/application/application.test.ts | 12 +- .../src/tests/api/callback.test.ts | 11 +- .../src/tests/api/connector.test.ts | 10 +- .../src/tests/api/custom-phrase.test.ts | 2 +- .../src/tests/api/dashboard.test.ts | 10 +- .../src/tests/api/domains.test.ts | 8 +- .../src/tests/api/health-check.test.ts | 2 +- .../src/tests/api/hook/hook.test.ts | 20 +- .../src/tests/api/hook/hook.testing.test.ts | 8 +- .../interaction-details-guard.test.ts | 20 +- .../interaction-results-checking.test.ts | 16 +- .../patch-interaction-identifiers.test.ts | 2 +- .../post-send-verification-code.test.ts | 11 +- .../put-interaction-event.test.ts | 12 +- .../api-counter-cases/put-interaction.test.ts | 16 +- .../forgot-password/happy-path.test.ts | 8 +- .../forgot-password/sad-path.test.ts | 6 +- .../api/interaction/mfa/backup-code.test.ts | 4 +- .../tests/api/interaction/mfa/totp.test.ts | 12 +- .../happy-path.test.ts | 14 +- .../register-with-identifier/sad-path.test.ts | 8 +- .../single-sign-on.test.ts | 2 +- .../happy-path.test.ts | 14 +- .../sad-path.test.ts | 20 +- .../single-sign-on.test.ts | 2 +- .../happy-path.test.ts | 55 +- .../sad-path.test.ts | 20 +- .../single-sign-on.test.ts | 2 +- .../single-sign-on/happy-path.test.ts | 10 +- .../single-sign-on/sad-path.test.ts | 7 +- .../happy-path.test.ts | 76 +- .../sad-path.test.ts | 30 +- .../third-party-sign-in/happy-path.test.ts | 134 + .../src/tests/api/log.test.ts | 2 +- .../src/tests/api/logto-config.test.ts | 122 +- .../src/tests/api/me.test.ts | 28 +- .../oidc/always-issue-refresh-token.test.ts | 2 +- .../tests/api/oidc/content-type-json.test.ts | 14 +- .../tests/api/oidc/get-access-token.test.ts | 61 +- .../src/tests/api/oidc/id-token.test.ts | 2 +- .../api/oidc/refresh-token-grant.test.ts | 33 +- .../organization-invitation.creation.test.ts | 69 +- .../organization-invitation.get.test.ts | 95 + .../organization-invitation.status.test.ts | 18 +- .../organization/organization-role.test.ts | 171 +- .../organization/organization-scope.test.ts | 17 +- .../organization/organization-user.test.ts | 16 +- .../api/organization/organization.test.ts | 8 +- .../src/tests/api/resource.scope.test.ts | 22 +- .../src/tests/api/resource.test.ts | 14 +- .../src/tests/api/role.application.test.ts | 16 +- .../src/tests/api/role.scope.test.ts | 22 +- .../src/tests/api/role.test.ts | 20 +- .../src/tests/api/role.user.test.ts | 18 +- .../src/tests/api/sign-in-experience.test.ts | 2 +- .../src/tests/api/sso-connectors.test.ts | 6 +- .../src/tests/api/swagger-check.test.ts | 6 +- .../src/tests/api/verification-code.test.ts | 54 +- .../src/tests/api/well-known.test.ts | 4 +- .../tests/console/applications/index.test.ts | 10 +- .../src/tests/console/bootstrap.test.ts | 4 +- .../utils.ts => rbac/helper.ts} | 15 + .../machime-to-machime-rbac.test.ts | 26 +- .../{rbac.test.ts => rbac/user-rbac.test.ts} | 56 +- .../sign-in-experience/branding.test.ts | 6 +- .../connector-setup-helpers.ts | 6 +- .../sign-up-and-sign-in/happy-path.test.ts | 14 +- .../sign-up-and-sign-in/helpers.ts | 9 +- .../src/tests/console/user-management.test.ts | 7 +- .../tests/experience/direct-sign-in.test.ts | 132 + .../tests/experience/password-policy.test.ts | 18 +- .../tests/experience/social-sign-in.test.ts | 163 + .../src/ui-helpers/expect-experience.ts | 49 +- .../src/ui-helpers/expect-page.ts | 12 +- .../integration-tests/src/ui-helpers/index.ts | 4 +- packages/integration-tests/src/utils.ts | 5 + packages/phrases-experience/CHANGELOG.md | 18 + packages/phrases-experience/package.json | 4 +- .../src/locales/de/user-scopes.ts | 20 +- .../src/locales/en/user-scopes.ts | 19 +- .../src/locales/es/user-scopes.ts | 20 +- .../src/locales/fr/user-scopes.ts | 20 +- .../src/locales/it/user-scopes.ts | 20 +- .../src/locales/ja/user-scopes.ts | 20 +- .../src/locales/ko/user-scopes.ts | 20 +- .../src/locales/pl-pl/user-scopes.ts | 20 +- .../src/locales/pt-br/user-scopes.ts | 20 +- .../src/locales/pt-pt/user-scopes.ts | 20 +- .../src/locales/ru/user-scopes.ts | 20 +- .../src/locales/tr-tr/user-scopes.ts | 20 +- .../src/locales/zh-cn/description.ts | 29 +- .../src/locales/zh-cn/user-scopes.ts | 20 +- .../src/locales/zh-hk/user-scopes.ts | 20 +- .../src/locales/zh-tw/user-scopes.ts | 20 +- packages/phrases/CHANGELOG.md | 15 + packages/phrases/package.json | 2 +- .../phrases/src/locales/de/errors/index.ts | 2 + .../src/locales/de/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/de/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../de/translation/admin-console/general.ts | 4 + .../de/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 43 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 44 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 7 +- .../de/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../de/translation/admin-console/tenants.ts | 61 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/en/errors/index.ts | 2 + .../src/locales/en/errors/jwt-customizer.ts | 6 + .../phrases/src/locales/en/errors/user.ts | 2 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 1 + .../en/translation/admin-console/general.ts | 2 + .../en/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 14 + .../translation/admin-console/jwt-claims.ts | 61 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 43 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 7 + .../admin-console/subscription/quota-table.ts | 16 +- .../translation/admin-console/tab-sections.ts | 7 +- .../en/translation/admin-console/tabs.ts | 3 + .../admin-console/tenant-members.ts | 62 + .../en/translation/admin-console/tenants.ts | 53 +- .../translation/admin-console/upsell/index.ts | 1 + .../admin-console/upsell/paywall.ts | 6 + .../phrases/src/locales/es/errors/index.ts | 2 + .../src/locales/es/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/es/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../es/translation/admin-console/general.ts | 4 + .../es/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 43 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 7 +- .../es/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../es/translation/admin-console/tenants.ts | 60 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/fr/errors/index.ts | 2 + .../src/locales/fr/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/fr/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../fr/translation/admin-console/general.ts | 4 + .../fr/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 43 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 44 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 7 +- .../fr/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../fr/translation/admin-console/tenants.ts | 61 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/it/errors/index.ts | 2 + .../src/locales/it/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/it/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../it/translation/admin-console/general.ts | 4 + .../it/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 43 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 9 +- .../it/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../it/translation/admin-console/tenants.ts | 60 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/ja/errors/index.ts | 2 + .../src/locales/ja/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/ja/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../ja/translation/admin-console/general.ts | 4 + .../ja/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 43 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 7 +- .../ja/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../ja/translation/admin-console/tenants.ts | 60 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/ko/errors/index.ts | 2 + .../src/locales/ko/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/ko/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../ko/translation/admin-console/general.ts | 4 + .../ko/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 42 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 11 +- .../ko/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../ko/translation/admin-console/tenants.ts | 60 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/pl-pl/errors/index.ts | 2 + .../locales/pl-pl/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/pl-pl/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../translation/admin-console/general.ts | 4 + .../pl-pl/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 43 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 7 +- .../pl-pl/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../translation/admin-console/tenants.ts | 61 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/pt-br/errors/index.ts | 2 + .../locales/pt-br/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/pt-br/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../translation/admin-console/general.ts | 4 + .../pt-br/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 43 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 9 +- .../pt-br/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../translation/admin-console/tenants.ts | 60 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/pt-pt/errors/index.ts | 2 + .../locales/pt-pt/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/pt-pt/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../translation/admin-console/general.ts | 4 + .../pt-pt/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 43 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 11 +- .../pt-pt/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../translation/admin-console/tenants.ts | 60 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/ru/errors/index.ts | 2 + .../src/locales/ru/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/ru/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../ru/translation/admin-console/general.ts | 4 + .../ru/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 43 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 7 +- .../ru/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../ru/translation/admin-console/tenants.ts | 60 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/tr-tr/errors/index.ts | 2 + .../locales/tr-tr/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/tr-tr/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../translation/admin-console/general.ts | 4 + .../tr-tr/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 34 + .../admin-console/organization-template.ts | 43 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 44 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 7 +- .../tr-tr/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../translation/admin-console/tenants.ts | 60 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/zh-cn/errors/index.ts | 2 + .../locales/zh-cn/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/zh-cn/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../translation/admin-console/general.ts | 4 + .../zh-cn/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 32 + .../admin-console/organization-template.ts | 41 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 7 +- .../zh-cn/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../translation/admin-console/tenants.ts | 60 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/zh-hk/errors/index.ts | 2 + .../locales/zh-hk/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/zh-hk/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../translation/admin-console/general.ts | 4 + .../zh-hk/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 32 + .../admin-console/organization-template.ts | 41 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 11 +- .../zh-hk/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../translation/admin-console/tenants.ts | 60 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + .../phrases/src/locales/zh-tw/errors/index.ts | 2 + .../locales/zh-tw/errors/jwt-customizer.ts | 8 + .../phrases/src/locales/zh-tw/errors/user.ts | 4 + .../admin-console/api-resource-details.ts | 2 +- .../admin-console/api-resources.ts | 2 + .../translation/admin-console/general.ts | 4 + .../zh-tw/translation/admin-console/index.ts | 12 + .../translation/admin-console/invitation.ts | 22 + .../translation/admin-console/jwt-claims.ts | 99 + .../organization-role-details.ts | 32 + .../admin-console/organization-template.ts | 41 + .../translation/admin-console/permissions.ts | 5 + .../translation/admin-console/signing-keys.ts | 43 + .../admin-console/subscription/quota-item.ts | 12 + .../admin-console/subscription/quota-table.ts | 22 +- .../translation/admin-console/tab-sections.ts | 9 +- .../zh-tw/translation/admin-console/tabs.ts | 4 + .../admin-console/tenant-members.ts | 103 + .../translation/admin-console/tenants.ts | 60 +- .../translation/admin-console/upsell/index.ts | 2 + .../admin-console/upsell/paywall.ts | 9 + packages/schemas/CHANGELOG.md | 58 + ...-1677208902-update-admin-console-config.ts | 4 +- .../1.0.0-1677765137-seed-for-admin-tenant.ts | 4 +- ...982-allow-admin-create-multiple-tenants.ts | 2 +- .../1.0.0-1678157950-privacy-policy-url.ts | 2 +- ...678199795-add-verification-status-table.ts | 4 +- ...1678259693-remove-branding-style-config.ts | 4 +- ...0.0-1678269972-use-restrictive-policies.ts | 4 +- ....0.0-1678284778-restrict-internal-roles.ts | 2 +- .../1.0.0-1678425761-m2m-app-for-tenants.ts | 2 +- ...1.0.0-1678450233-support-custom-content.ts | 2 +- .../1.0.0-1678716747-service-logs.ts | 4 +- ...481-remove-deprecated-logto-config-item.ts | 4 +- ...78953179-update-get-started-task-config.ts | 4 +- ...9209413-drop-connector-database-storage.ts | 2 +- .../1.0.0_beta.10-1-logto-config.ts | 2 +- ...ta.10-1663923211-machine-to-machine-app.ts | 2 +- ...1.0.0_beta.10-1664265197-custom-phrases.ts | 2 +- ...1-1664347703-rename-language-key-to-tag.ts | 2 +- ...64356000-add-created-at-column-to-users.ts | 2 +- ...ect-user-created-at-column-by-user-logs.ts | 2 +- ....0.0_beta.14-1665300135-sign-in-sign-up.ts | 2 +- ...ta.14-1667283640-remove-forgot-password.ts | 2 +- ...eta.14-1667292082-remove-sign-in-method.ts | 2 +- .../1.0.0_beta.14-1667374974-user-suspend.ts | 2 +- ...4-1667900481-add-passcode-type-continue.ts | 2 +- ...90-support-multiple-connector-instances.ts | 2 +- ....18-1668666600-remove-connector-enabled.ts | 2 +- ...0.0_beta.18-1669091623-roles-and-scopes.ts | 2 +- .../1.0.0_beta.18-1669702299-sign-up.ts | 4 +- ..._beta.18-1671039448-add-user-name-index.ts | 2 +- .../1.0.0_beta.18-1671080370-terms-of-use.ts | 4 +- ...0_beta.18-1671336831-refactor-log-types.ts | 2 +- .../1.0.0_beta.18-1671509870-hooks.ts | 2 +- ...0-align-passcode-type-with-message-type.ts | 2 +- .../1.0.0_rc.0-1672815959-user-roles.ts | 2 +- ...1.0.0_rc.0-1672820345-scope-resource-id.ts | 2 +- ....0-1672901841-roles-and-scopes-not-null.ts | 2 +- ...c.0-1673001922-support-generic-passcode.ts | 2 +- .../1.0.0_rc.0-1673165463-scope-name-index.ts | 2 +- ...3349501-sms-sign-in-identifier-to-phone.ts | 2 +- .../1.0.0_rc.0-1673465463-ac-scope-name.ts | 2 +- .../1.0.0_rc.0-1673853579-ac-default-scope.ts | 2 +- .../1.0.0_rc.0-1673863835-ac-scope-role.ts | 2 +- ...0_rc.0-1673882867-fix-alteration-issues.ts | 2 +- ...0-1673940577-scope-description-not-null.ts | 2 +- ...1.0.0_rc.0-1673941897-application-roles.ts | 2 +- ...1674032095.1-dedup-resources-constraint.ts | 2 +- ...1.0.0_rc.0-1674032095.2-oidc-model-pkey.ts | 2 +- .../1.0.0_rc.0-1674032095.3-tenant-table.ts | 2 +- .../1.0.0_rc.0-1674032095.4-add-id-column.ts | 2 +- .../1.0.0_rc.0-1674032095.5-multi-tenancy.ts | 13 +- ...rc.0-1674032095.6-add-tenant-id-trigger.ts | 2 +- ...987042-drop-settings-and-create-systems.ts | 2 +- .../1.0.0_rc.0-1675316731-update-seed-data.ts | 2 +- ...1.0.0_rc.1-1675788753-multi-tenancy-rls.ts | 7 +- .../1.0.0_rc.1-1676115897-add-admin-tenant.ts | 7 +- .../1.0.0_rc.1-1676185899-fix-logs-index.ts | 2 +- ....0.0_rc.1-1676190092-migrate-admin-data.ts | 4 +- ..._rc.1-1676823841-update-sie-primary-key.ts | 2 +- ....0.0_rc.1-1676874936-support-custom-css.ts | 2 +- ...676886855-connector-database-read-write.ts | 2 +- .../1.0.0_rc.1-1676906977-remove-demo-app.ts | 2 +- ...1676956206-move-console-sie-to-database.ts | 2 +- ...85-move-console-application-to-database.ts | 2 +- ...10.1-1695647183-update-private-key-type.ts | 4 +- .../1.10.1-1696657546-organization-tables.ts | 2 +- ...0.1-1697683802-add-sso-connectors-table.ts | 2 +- ...698646271-add-organization-created-flag.ts | 4 +- ...698820410-add-user-sso-identities-table.ts | 2 +- .../1.10.1-1698910485-user-logto-data.ts | 2 +- ...tor-id-col-to-user-sso-identities-table.ts | 2 +- ...sso-only-column-in-sso-connectors-table.ts | 2 +- ...1700031616-update-org-role-foreign-keys.ts | 2 +- ...ue-constraint-to-the-sso-connector-name.ts | 2 +- ...-add-single-sign-on-enabled-flag-to-sie.ts | 2 +- ...hird-party-column-to-applications-table.ts | 2 +- ...2401-add-application-permissions-tables.ts | 2 +- .../1.13.0-1702544178-sync-tenant-orgs.ts | 2 +- ...0-1702871078-protected-application-type.ts | 2 +- ...1.13.0-1702877515-protected-app-configs.ts | 2 +- ...20-application-sign-in-experience-table.ts | 2 +- .../1.13.0-1703229996-daily-token-usage.ts | 2 +- .../1.13.0-1703230000-update-tenant-roles.ts | 2 +- ...13.0-1704692973-remove-legacy-resources.ts | 2 +- ...1.13.0-1704934999-add-magic-links-table.ts | 2 +- ...5001-add-organization-invitation-tables.ts | 2 +- ...cation-user-consent-organizations-table.ts | 2 +- ....0-1705991158-update-invitation-indices.ts | 2 +- ...4-update-organization-invitation-column.ts | 2 +- ...3.0-1706510290-protected-app-host-index.ts | 2 +- ...3.0-1706512952-restore-get-started-page.ts | 2 +- .../1.13.0-1706528755-remove-magic-links.ts | 2 +- ...5206-protected-app-custom-domain-unique.ts | 2 +- ...0939-grant-is-suspended-read-permission.ts | 2 +- ...gement-api-scopes-assigned-to-user-role.ts | 2 +- ....0-1709190131-enhance-dau-data-accuracy.ts | 2 +- ...1709521416-user-password-encrypt-method.ts | 36 + .../1.15.0-1709528944-regenerate-dau-data.ts | 49 + ...223946-add-fetch-custom-jwt-cloud-scope.ts | 92 + ...ke-resource-scopes-description-nullable.ts | 22 + ...9622-add-oidc-standard-claim-properties.ts | 38 + ...te-member-scope-from-tenant-member-role.ts | 20 + ...4-add-read-member-scope-to-tenant-roles.ts | 25 + ...-1711955211-organization-resource-scope.ts | 39 + ...rganization-member-role-to-collaborator.ts | 28 + ...2545011-fix-organization-resource-scope.ts | 43 + ...58-fix-down-organization-resource-scope.ts | 46 + ...285-fix-get-started-passwordless-status.ts | 2 +- .../1.3.0-1683292832-update-hooks.ts | 2 +- ...d-name-tag-created-at-for-tenants-table.ts | 2 +- ...684739802-create-hook-id-index-for-logs.ts | 2 +- .../1.5.0-1684822341-init-domains.ts | 4 +- ...d-manage-tenant-self-scope-to-user-role.ts | 2 +- ...5.0-1685285719-support-default-resource.ts | 2 +- .../1.6.0-1685691718-domain-unique.ts | 2 +- ...88375200-sync-cloud-m2m-to-logto-config.ts | 2 +- ...m-existing-logto-email-connector-config.ts | 2 +- .../1.7.0-1688627407-daily-active-users.ts | 2 +- ...-add-is-suspend-column-to-tenants-table.ts | 2 +- .../1.8.0-1692194751-add-affiliate-scopes.ts | 2 +- .../1.9.0-1693554904-add-possword-policy.ts | 2 +- ...-1694399696-add-type-col-to-roles-table.ts | 2 +- ...-role-type-function-to-be-public-schema.ts | 2 +- ...484927-remove-deprecated-challenge-flag.ts | 4 +- .../alterations/1.9.0-1694487524-sie-mfa.ts | 2 +- ...694509714-keep-existing-password-policy.ts | 2 +- .../1.9.0-1694746763-user-verifications.ts | 2 +- .../1.9.2-1694854226-init-sentinel.ts | 2 +- ...8741-remove-m2m-app-admin-access-switch.ts | 2 +- .../alterations/utils/1704934999-tables.ts | 2 +- packages/schemas/jest.config.js | 13 - packages/schemas/package.json | 28 +- packages/schemas/src/consts/experience.ts | 10 + packages/schemas/src/consts/index.ts | 1 + packages/schemas/src/consts/oidc.ts | 48 + packages/schemas/src/consts/subscriptions.ts | 23 + .../src/foundations/jsonb-types/index.ts | 16 +- .../src/foundations/jsonb-types/users.ts | 53 +- packages/schemas/src/gen/utils.test.ts | 2 + packages/schemas/src/seeds/cloud-api.ts | 11 +- packages/schemas/src/types/alteration.ts | 2 +- packages/schemas/src/types/consent.ts | 1 + packages/schemas/src/types/index.ts | 3 +- packages/schemas/src/types/log/index.ts | 5 +- .../schemas/src/types/log/jwt-customizer.ts | 11 + .../index.ts} | 51 +- .../types/logto-config/jwt-customizer.test.ts | 100 + .../src/types/logto-config/jwt-customizer.ts | 116 + .../src/types/logto-config/oidc-provider.ts | 40 + packages/schemas/src/types/onboarding.ts | 82 + packages/schemas/src/types/organization.ts | 46 +- packages/schemas/src/types/service-log.ts | 1 + packages/schemas/src/types/sso-connector.ts | 18 +- .../schemas/src/types/tenant-organization.ts | 32 +- packages/schemas/src/types/user.ts | 10 +- packages/schemas/src/utils/domain.test.ts | 2 + packages/schemas/src/utils/zod.ts | 5 + packages/schemas/tables/_functions.sql | 8 + ...nization_role_resource_scope_relations.sql | 12 + packages/schemas/tables/scopes.sql | 2 +- packages/schemas/tables/users.sql | 11 +- packages/schemas/tsconfig.test.json | 8 - packages/shared/jest.config.js | 13 - packages/shared/package.json | 19 +- packages/shared/src/database/types.ts | 5 - packages/shared/src/esm/module-proxy.ts | 4 + .../shared/src/include.d/import-meta.d.ts | 10 +- packages/shared/src/index.ts | 1 - packages/shared/src/node/env/UrlSet.test.ts | 2 + packages/shared/src/utils/id.test.ts | 2 + packages/shared/src/utils/sub-domain.test.ts | 2 + packages/shared/src/utils/ttl-cache.test.ts | 18 +- .../src/utils/user-display-name.test.ts | 2 + packages/shared/tsconfig.json | 2 +- packages/shared/tsconfig.test.json | 3 - packages/toolkit/connector-kit/CHANGELOG.md | 21 + packages/toolkit/connector-kit/jest.config.js | 13 - packages/toolkit/connector-kit/package.json | 20 +- .../toolkit/connector-kit/src/index.test.ts | 17 +- packages/toolkit/connector-kit/src/index.ts | 42 +- .../toolkit/connector-kit/src/types/index.ts | 4 +- .../connector-kit/src/types/passwordless.ts | 18 +- .../toolkit/connector-kit/src/types/social.ts | 33 +- .../toolkit/connector-kit/tsconfig.test.json | 8 - packages/toolkit/core-kit/CHANGELOG.md | 19 + packages/toolkit/core-kit/jest.config.js | 14 - packages/toolkit/core-kit/jest.setup.js | 4 - packages/toolkit/core-kit/package.json | 20 +- .../core-kit/scss/_console-themes.scss | 36 + packages/toolkit/core-kit/scss/_fonts.scss | 1 + packages/toolkit/core-kit/src/openid.ts | 51 +- .../core-kit/src/password-policy.test.ts | 5 +- .../toolkit/core-kit/src/password-policy.ts | 6 + packages/toolkit/core-kit/src/regex.test.ts | 2 + .../core-kit/src/utils/integration-test.ts | 10 + .../toolkit/core-kit/src/utils/url.test.ts | 2 + packages/toolkit/core-kit/tsconfig.test.json | 8 - packages/toolkit/language-kit/jest.config.js | 13 - packages/toolkit/language-kit/package.json | 16 +- .../toolkit/language-kit/src/utility.test.ts | 1 + .../toolkit/language-kit/tsconfig.test.json | 8 - pnpm-lock.yaml | 3679 +++++++++-------- 1212 files changed, 24415 insertions(+), 6861 deletions(-) rename commitlint.config.cjs => commitlint.config.ts (65%) delete mode 100644 packages/app-insights/jest.config.js delete mode 100644 packages/app-insights/tsconfig.test.json delete mode 100644 packages/cli/jest.config.js delete mode 100644 packages/cli/src/include.d/import-meta.d.ts delete mode 100644 packages/cli/src/include.d/slonik-interceptor-preset.d.ts create mode 100644 packages/cli/src/sql.ts delete mode 100644 packages/cli/tsconfig.test.json create mode 100644 packages/connectors/connector-wecom/CHANGELOG.md delete mode 100644 packages/connectors/templates/preset/jest.config.js delete mode 100644 packages/connectors/templates/preset/types/import-meta.d.ts create mode 100644 packages/connectors/templates/preset/vitest.config.ts create mode 100755 packages/console/generate.sh create mode 100644 packages/console/scripts/generate-jwt-customizer-type-definition.ts create mode 100644 packages/console/src/assets/docs/single-sign-on/azure-oidc/README.mdx create mode 100644 packages/console/src/assets/docs/single-sign-on/azure-oidc/assets/application_details.webp create mode 100644 packages/console/src/assets/docs/single-sign-on/azure-oidc/assets/config_application.webp create mode 100644 packages/console/src/assets/docs/single-sign-on/azure-oidc/assets/create_application.webp create mode 100644 packages/console/src/assets/docs/single-sign-on/azure-oidc/assets/create_secret.webp create mode 100644 packages/console/src/assets/docs/single-sign-on/azure-oidc/assets/endpoints.webp create mode 100644 packages/console/src/assets/icons/book.svg create mode 100644 packages/console/src/assets/icons/conical-flask.svg create mode 100644 packages/console/src/assets/icons/invitation.svg create mode 100644 packages/console/src/assets/icons/jwt-claims.svg create mode 100644 packages/console/src/assets/icons/key.svg create mode 100644 packages/console/src/assets/icons/members.svg create mode 100644 packages/console/src/assets/icons/research.svg create mode 100644 packages/console/src/assets/icons/start.svg create mode 100644 packages/console/src/assets/icons/token-file-icon.svg create mode 100644 packages/console/src/assets/icons/user-file-icon.svg create mode 100644 packages/console/src/cloud/pages/Main/InvitationList/index.module.scss create mode 100644 packages/console/src/cloud/pages/Main/InvitationList/index.tsx create mode 100644 packages/console/src/components/Conversion/index.tsx create mode 100644 packages/console/src/components/Conversion/use-retry.ts rename packages/console/src/components/{ReportConversion => Conversion}/utils.test.ts (100%) create mode 100644 packages/console/src/components/Conversion/utils.ts create mode 100644 packages/console/src/components/ManageOrganizationPermissionModal/index.tsx create mode 100644 packages/console/src/components/PermissionsTable/EditPermissionModal.tsx delete mode 100644 packages/console/src/components/ReportConversion/index.tsx delete mode 100644 packages/console/src/components/ReportConversion/utils.ts create mode 100644 packages/console/src/components/Topbar/TenantSelector/TenantInvitationDropdownItem/index.module.scss create mode 100644 packages/console/src/components/Topbar/TenantSelector/TenantInvitationDropdownItem/index.tsx rename packages/console/src/{pages => containers}/ConsoleRoutes/index.tsx (93%) rename packages/console/src/{pages/WebhookDetails/WebhookSettings/CustomHeaderField => ds-components/KeyValueInputField}/index.module.scss (100%) create mode 100644 packages/console/src/ds-components/KeyValueInputField/index.tsx create mode 100644 packages/console/src/hooks/use-current-tenant-scopes.ts create mode 100644 packages/console/src/hooks/use-user-invitations.ts create mode 100644 packages/console/src/pages/AcceptInvitation/SwitchAccount/index.module.scss create mode 100644 packages/console/src/pages/AcceptInvitation/SwitchAccount/index.tsx create mode 100644 packages/console/src/pages/AcceptInvitation/index.tsx delete mode 100644 packages/console/src/pages/ApiResourceDetails/types.ts create mode 100644 packages/console/src/pages/CustomizeJwt/CreateButton/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwt/CustomizerItem/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwt/CustomizerItem/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwt/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwt/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwt/use-jwt-customizer.ts create mode 100644 packages/console/src/pages/CustomizeJwt/utils/path.ts create mode 100644 packages/console/src/pages/CustomizeJwt/utils/type.ts create mode 100644 packages/console/src/pages/CustomizeJwtDetails/CodeEditorLoadingContext.ts create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/MonacoCodeEditor/ActionButton/CodeRestoreButton.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/MonacoCodeEditor/ActionButton/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/MonacoCodeEditor/ActionButton/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/MonacoCodeEditor/Dashboard/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/MonacoCodeEditor/Dashboard/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/MonacoCodeEditor/config.ts create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/MonacoCodeEditor/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/MonacoCodeEditor/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/MonacoCodeEditor/type.ts create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/MonacoCodeEditor/use-editor-height.ts create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/ScriptSection/ErrorContent/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/ScriptSection/ErrorContent/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/ScriptSection/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/ScriptSection/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/ScriptSection/use-test-handler.ts create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/SettingsSection/InstructionTab/EnvironmentVariablesField.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/SettingsSection/InstructionTab/GuideCard/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/SettingsSection/InstructionTab/GuideCard/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/SettingsSection/InstructionTab/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/SettingsSection/InstructionTab/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/SettingsSection/TestTab/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/SettingsSection/TestTab/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/SettingsSection/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/SettingsSection/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/MainContent/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/PageLoadingSkeleton/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/PageLoadingSkeleton/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/index.module.scss create mode 100644 packages/console/src/pages/CustomizeJwtDetails/index.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/type.ts create mode 100644 packages/console/src/pages/CustomizeJwtDetails/use-data-fetch.ts create mode 100644 packages/console/src/pages/CustomizeJwtDetails/utils/config.tsx create mode 100644 packages/console/src/pages/CustomizeJwtDetails/utils/format.ts create mode 100644 packages/console/src/pages/CustomizeJwtDetails/utils/path.ts create mode 100644 packages/console/src/pages/CustomizeJwtDetails/utils/type-definitions.ts delete mode 100644 packages/console/src/pages/EnterpriseSso/types.ts delete mode 100644 packages/console/src/pages/EnterpriseSsoDetails/Connection/BasicInfo/index.tsx create mode 100644 packages/console/src/pages/EnterpriseSsoDetails/Connection/OidcConnectorForm.tsx create mode 100644 packages/console/src/pages/EnterpriseSsoDetails/Connection/SamlConnectorForm.tsx create mode 100644 packages/console/src/pages/EnterpriseSsoDetails/Connection/ServiceProviderInfo/OidcConnectorSpInfo.tsx create mode 100644 packages/console/src/pages/EnterpriseSsoDetails/Connection/ServiceProviderInfo/SamlConnectorSpInfo.tsx rename packages/console/src/pages/EnterpriseSsoDetails/Connection/{BasicInfo => ServiceProviderInfo}/index.module.scss (100%) create mode 100644 packages/console/src/pages/EnterpriseSsoDetails/config.ts create mode 100644 packages/console/src/pages/EnterpriseSsoDetails/types/oidc.ts create mode 100644 packages/console/src/pages/EnterpriseSsoDetails/types/saml.ts create mode 100644 packages/console/src/pages/EnterpriseSsoDetails/use-delete-connector.ts create mode 100644 packages/console/src/pages/OrganizationRoleDetails/Permissions/index.module.scss create mode 100644 packages/console/src/pages/OrganizationRoleDetails/Permissions/index.tsx create mode 100644 packages/console/src/pages/OrganizationRoleDetails/Settings/index.tsx create mode 100644 packages/console/src/pages/OrganizationRoleDetails/index.tsx create mode 100644 packages/console/src/pages/OrganizationTemplate/OrganizationPermissions/index.module.scss create mode 100644 packages/console/src/pages/OrganizationTemplate/OrganizationPermissions/index.tsx create mode 100644 packages/console/src/pages/OrganizationTemplate/OrganizationRoles/CreateOrganizationRoleModal.tsx create mode 100644 packages/console/src/pages/OrganizationTemplate/OrganizationRoles/index.module.scss create mode 100644 packages/console/src/pages/OrganizationTemplate/OrganizationRoles/index.tsx create mode 100644 packages/console/src/pages/OrganizationTemplate/index.module.scss create mode 100644 packages/console/src/pages/OrganizationTemplate/index.tsx rename packages/console/src/pages/{TenantSettings/TenantBasicSettings/SigningKeys => SigningKeys/SigningKeyFormCard}/index.module.scss (100%) rename packages/console/src/pages/{TenantSettings/TenantBasicSettings/SigningKeys => SigningKeys/SigningKeyFormCard}/index.tsx (75%) create mode 100644 packages/console/src/pages/SigningKeys/index.module.scss create mode 100644 packages/console/src/pages/SigningKeys/index.tsx create mode 100644 packages/console/src/pages/TenantSettings/TenantBasicSettings/LeaveCard/index.module.scss create mode 100644 packages/console/src/pages/TenantSettings/TenantBasicSettings/LeaveCard/index.tsx create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/EditMemberModal/index.tsx create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/Invitations/index.tsx create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/InviteEmailsInput/hooks.ts create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/InviteEmailsInput/index.module.scss create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/InviteEmailsInput/index.tsx create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/InviteMemberModal/Footer/index.module.scss create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/InviteMemberModal/Footer/index.tsx create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/InviteMemberModal/index.tsx create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/Members/index.tsx create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/hooks.ts create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/index.module.scss create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/index.tsx create mode 100644 packages/console/src/pages/TenantSettings/TenantMembers/types.ts create mode 100644 packages/console/tsconfig.scripts.gen.json delete mode 100644 packages/core/src/include.d/slonik-interceptor-preset.d.ts create mode 100644 packages/core/src/libraries/jwt-customizer.ts create mode 100644 packages/core/src/libraries/scope.ts delete mode 100644 packages/core/src/oidc/type.ts delete mode 100644 packages/core/src/routes/consts.ts delete mode 100644 packages/core/src/routes/logto-config.openapi.json rename packages/core/src/routes/{logto-config.test.ts => logto-config/index.test.ts} (95%) rename packages/core/src/routes/{logto-config.ts => logto-config/index.ts} (93%) create mode 100644 packages/core/src/routes/logto-config/jwt-customizer.test.ts create mode 100644 packages/core/src/routes/logto-config/jwt-customizer.ts create mode 100644 packages/core/src/routes/logto-config/logto-config.openapi.json create mode 100644 packages/core/src/sso/AzureOidcSsoConnector/index.ts create mode 100644 packages/core/src/sso/types/connector.ts rename packages/{shared/src/database => core/src/utils}/sql.test.ts (96%) rename packages/{shared/src/database => core/src/utils}/sql.ts (87%) create mode 100644 packages/experience/src/pages/DirectSignIn/index.test.tsx create mode 100644 packages/experience/src/pages/DirectSignIn/index.tsx rename packages/experience/src/pages/{SocialSignInCallback => SocialSignInWebCallback}/SingleSignOn.tsx (80%) rename packages/experience/src/pages/{SocialSignInCallback => SocialSignInWebCallback}/SocialSignIn.tsx (60%) rename packages/experience/src/pages/{SocialSignInCallback => SocialSignInWebCallback}/index.test.tsx (83%) rename packages/experience/src/pages/{SocialSignInCallback => SocialSignInWebCallback}/index.tsx (64%) rename packages/experience/src/pages/{SocialSignInCallback => SocialSignInWebCallback}/use-single-sign-on-listener.ts (86%) rename packages/experience/src/pages/{SocialSignInCallback => SocialSignInWebCallback}/use-social-sign-in-listener.ts (88%) create mode 100644 packages/integration-tests/src/__mocks__/jwt-customizer.ts create mode 100644 packages/integration-tests/src/helpers/resource.ts delete mode 100644 packages/integration-tests/src/include.d/node-fetch.d.ts create mode 100644 packages/integration-tests/src/tests/api/admin-user.username-case.test.ts rename packages/integration-tests/src/tests/api/interaction/{social-interaction => social-sign-in}/happy-path.test.ts (84%) rename packages/integration-tests/src/tests/api/interaction/{social-interaction => social-sign-in}/sad-path.test.ts (96%) create mode 100644 packages/integration-tests/src/tests/api/interaction/third-party-sign-in/happy-path.test.ts create mode 100644 packages/integration-tests/src/tests/api/organization/organization-invitation.get.test.ts rename packages/integration-tests/src/tests/console/{machine-to-machine-rbac/utils.ts => rbac/helper.ts} (83%) rename packages/integration-tests/src/tests/console/{machine-to-machine-rbac => rbac}/machime-to-machime-rbac.test.ts (92%) rename packages/integration-tests/src/tests/console/{rbac.test.ts => rbac/user-rbac.test.ts} (86%) create mode 100644 packages/integration-tests/src/tests/experience/direct-sign-in.test.ts create mode 100644 packages/integration-tests/src/tests/experience/social-sign-in.test.ts create mode 100644 packages/phrases/src/locales/de/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/de/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/de/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/de/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/de/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/de/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/de/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/en/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/en/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/en/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/en/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/en/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/en/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/en/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/es/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/es/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/es/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/es/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/es/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/es/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/es/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/fr/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/fr/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/fr/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/fr/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/fr/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/fr/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/fr/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/it/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/it/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/it/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/it/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/it/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/it/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/it/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/ja/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/ja/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/ja/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/ja/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/ja/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/ja/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/ja/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/ko/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/ko/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/ko/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/ko/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/ko/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/ko/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/ko/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/pl-pl/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/pl-pl/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/pl-pl/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/pl-pl/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/pl-pl/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/pl-pl/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/pl-pl/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/pt-br/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/pt-br/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/pt-br/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/pt-br/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/pt-br/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/pt-br/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/pt-br/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/pt-pt/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/pt-pt/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/pt-pt/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/pt-pt/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/pt-pt/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/pt-pt/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/pt-pt/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/ru/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/ru/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/ru/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/ru/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/ru/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/ru/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/ru/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/tr-tr/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/tr-tr/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/tr-tr/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/tr-tr/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/tr-tr/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/tr-tr/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/tr-tr/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/zh-cn/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/zh-cn/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/zh-cn/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/zh-cn/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/zh-cn/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/zh-cn/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/zh-cn/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/zh-hk/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/zh-hk/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/zh-hk/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/zh-hk/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/zh-hk/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/zh-hk/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/zh-hk/translation/admin-console/tenant-members.ts create mode 100644 packages/phrases/src/locales/zh-tw/errors/jwt-customizer.ts create mode 100644 packages/phrases/src/locales/zh-tw/translation/admin-console/invitation.ts create mode 100644 packages/phrases/src/locales/zh-tw/translation/admin-console/jwt-claims.ts create mode 100644 packages/phrases/src/locales/zh-tw/translation/admin-console/organization-role-details.ts create mode 100644 packages/phrases/src/locales/zh-tw/translation/admin-console/organization-template.ts create mode 100644 packages/phrases/src/locales/zh-tw/translation/admin-console/signing-keys.ts create mode 100644 packages/phrases/src/locales/zh-tw/translation/admin-console/tenant-members.ts create mode 100644 packages/schemas/alterations/1.15.0-1709521416-user-password-encrypt-method.ts create mode 100644 packages/schemas/alterations/1.15.0-1709528944-regenerate-dau-data.ts create mode 100644 packages/schemas/alterations/1.15.0-1710223946-add-fetch-custom-jwt-cloud-scope.ts create mode 100644 packages/schemas/alterations/1.15.0-1710408335-make-resource-scopes-description-nullable.ts create mode 100644 packages/schemas/alterations/1.15.0-1710859622-add-oidc-standard-claim-properties.ts create mode 100644 packages/schemas/alterations/1.15.0-1711607772-remove-invite-member-scope-from-tenant-member-role.ts create mode 100644 packages/schemas/alterations/1.15.0-1711624564-add-read-member-scope-to-tenant-roles.ts create mode 100644 packages/schemas/alterations/1.15.0-1711955211-organization-resource-scope.ts create mode 100644 packages/schemas/alterations/1.15.0-1712041436-rename-organization-member-role-to-collaborator.ts create mode 100644 packages/schemas/alterations/1.15.0-1712545011-fix-organization-resource-scope.ts create mode 100644 packages/schemas/alterations/1.15.0-1712559358-fix-down-organization-resource-scope.ts delete mode 100644 packages/schemas/jest.config.js create mode 100644 packages/schemas/src/consts/experience.ts create mode 100644 packages/schemas/src/types/log/jwt-customizer.ts rename packages/schemas/src/types/{logto-config.ts => logto-config/index.ts} (69%) create mode 100644 packages/schemas/src/types/logto-config/jwt-customizer.test.ts create mode 100644 packages/schemas/src/types/logto-config/jwt-customizer.ts create mode 100644 packages/schemas/src/types/logto-config/oidc-provider.ts create mode 100644 packages/schemas/src/types/onboarding.ts create mode 100644 packages/schemas/src/utils/zod.ts create mode 100644 packages/schemas/tables/organization_role_resource_scope_relations.sql delete mode 100644 packages/schemas/tsconfig.test.json delete mode 100644 packages/shared/jest.config.js delete mode 100644 packages/shared/tsconfig.test.json delete mode 100644 packages/toolkit/connector-kit/jest.config.js delete mode 100644 packages/toolkit/connector-kit/tsconfig.test.json delete mode 100644 packages/toolkit/core-kit/jest.config.js delete mode 100644 packages/toolkit/core-kit/jest.setup.js create mode 100644 packages/toolkit/core-kit/src/utils/integration-test.ts delete mode 100644 packages/toolkit/core-kit/tsconfig.test.json delete mode 100644 packages/toolkit/language-kit/jest.config.js delete mode 100644 packages/toolkit/language-kit/tsconfig.test.json diff --git a/.github/workflows/alteration-compatibility-integration-test.yml b/.github/workflows/alteration-compatibility-integration-test.yml index 96cd0493c9c..f73c141d369 100644 --- a/.github/workflows/alteration-compatibility-integration-test.yml +++ b/.github/workflows/alteration-compatibility-integration-test.yml @@ -51,7 +51,7 @@ jobs: env: INTEGRATION_TEST: true steps: - - uses: logto-io/actions-package-logto-artifact@v1.1.0 + - uses: logto-io/actions-package-logto-artifact@v2 with: artifact-name: alteration-integration-test-${{ github.sha }} branch: ${{github.base_ref}} @@ -68,7 +68,7 @@ jobs: DB_URL: postgres://postgres:postgres@localhost:5432/postgres steps: - - uses: logto-io/actions-run-logto-integration-tests@v1.1.0 + - uses: logto-io/actions-run-logto-integration-tests@v2 with: branch: ${{github.base_ref}} logto_artifact: alteration-integration-test-${{ github.sha }} diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml index ecc733d7904..0ee63394e9e 100644 --- a/.github/workflows/commitlint.yml +++ b/.github/workflows/commitlint.yml @@ -24,7 +24,8 @@ jobs: uses: silverhand-io/actions-node-pnpm-run-steps@v4 - name: Commitlint - run: npx commitlint --from HEAD~${{ github.event.pull_request.commits }} --to HEAD + # Credit to https://stackoverflow.com/a/67365254/12514940 + run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose - name: Commitlint on PR title run: echo '${{ github.event.pull_request.title }}' | npx commitlint diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 65b2bdfe414..6fcd3f321cd 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -18,7 +18,7 @@ jobs: INTEGRATION_TEST: true steps: - - uses: logto-io/actions-package-logto-artifact@v1.1.0 + - uses: logto-io/actions-package-logto-artifact@v2 with: artifact-name: integration-test-${{ github.sha }} @@ -34,7 +34,7 @@ jobs: DB_URL: postgres://postgres:postgres@localhost:5432/postgres steps: - - uses: logto-io/actions-run-logto-integration-tests@v1.1.0 + - uses: logto-io/actions-run-logto-integration-tests@v2 with: logto_artifact: integration-test-${{ github.sha }} test_target: ${{ matrix.target }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 85383075915..b4f6eb2b88b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -118,7 +118,7 @@ jobs: run: ./.scripts/package.sh - name: Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: token: ${{ secrets.BOT_PAT }} body: "" diff --git a/.gitignore b/.gitignore index 0c3f3abc97e..a95d6581e74 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ dump.rdb # connectors /packages/core/connectors + +# console auto generated files +/packages/console/src/consts/jwt-customizer-type-definition.ts diff --git a/.gitpod.yml b/.gitpod.yml index 0974dbdc813..31dcc8e32d6 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -12,7 +12,7 @@ tasks: cd packages/core pnpm build cd - - pnpm connectors:build + pnpm connectors build pnpm cli connector link command: | gp ports await 5432 diff --git a/README.md b/README.md index ae1e1281029..98fe9a272bd 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,6 @@ Logto uses the [default browserslist config](https://github.com/browserslist/bro - About other bug reports, feature requests, and feedback, you can: - Directly 🙋 [open an issue](https://github.com/logto-io/logto/issues/new) on GitHub; - 💬 [join our Discord server](https://discord.gg/vRvwuwgpVX) to have a live chat; - - Engage in our 📍 [public roadmap](https://github.com/logto-io/logto/issues/1937). ## Licensing diff --git a/commitlint.config.cjs b/commitlint.config.ts similarity index 65% rename from commitlint.config.cjs rename to commitlint.config.ts index a46859ab2f3..5f44c75e5e8 100644 --- a/commitlint.config.cjs +++ b/commitlint.config.ts @@ -1,15 +1,17 @@ -const { rules } = require('@commitlint/config-conventional'); +import conventional from '@commitlint/config-conventional'; +import { UserConfig } from '@commitlint/types'; const isCi = process.env.CI === 'true'; -/** @type {import('@commitlint/types').UserConfig} **/ -module.exports = { +const config: UserConfig = { extends: ['@commitlint/config-conventional'], rules: { - 'type-enum': [2, 'always', [...rules['type-enum'][2], 'api', 'release']], + 'type-enum': [2, 'always', [...conventional.rules['type-enum'][2], 'api', 'release']], 'scope-enum': [2, 'always', ['connector', 'console', 'core', 'demo-app', 'test', 'phrases', 'schemas', 'shared', 'experience', 'deps', 'deps-dev', 'cli', 'toolkit', 'cloud', 'app-insights']], // Slightly increase the tolerance to allow the appending PR number ...(isCi && { 'header-max-length': [2, 'always', 110] }), 'body-max-line-length': [2, 'always', 110], }, }; + +export default config; diff --git a/package.json b/package.json index 292c0aa6989..d64d30c2cb7 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "cli": "logto", "changeset": "changeset", "alteration": "logto db alt", - "connectors:build": "pnpm -r --filter \"./packages/connectors/connector-*\" build", + "connectors": "pnpm -r --filter \"./packages/connectors/connector-*\"", "//": "# `changeset version` won't run version lifecycle scripts, see https://github.com/changesets/changesets/issues/860", "ci:version": "changeset version && pnpm -r version", "ci:build": "pnpm -r build", @@ -25,9 +25,9 @@ }, "devDependencies": { "@changesets/cli": "^2.26.2", - "@commitlint/cli": "^18.0.0", - "@commitlint/config-conventional": "^18.0.0", - "@commitlint/types": "^18.0.0", + "@commitlint/cli": "^19.0.0", + "@commitlint/config-conventional": "^19.0.0", + "@commitlint/types": "^19.0.0", "@types/pg": "^8.6.6", "husky": "^9.0.0", "pg": "^8.8.0", diff --git a/packages/app-insights/jest.config.js b/packages/app-insights/jest.config.js deleted file mode 100644 index 5656d33479a..00000000000 --- a/packages/app-insights/jest.config.js +++ /dev/null @@ -1,13 +0,0 @@ -/** @type {import('jest').Config} */ -const config = { - transform: {}, - coveragePathIgnorePatterns: ['/node_modules/', '/src/__mocks__/'], - coverageReporters: ['text-summary', 'lcov'], - coverageProvider: 'v8', - roots: ['./lib'], - moduleNameMapper: { - '^(chalk|inquirer)$': '/../shared/lib/esm/module-proxy.js', - }, -}; - -export default config; diff --git a/packages/app-insights/package.json b/packages/app-insights/package.json index 948f80f26bd..dc5229948e2 100644 --- a/packages/app-insights/package.json +++ b/packages/app-insights/package.json @@ -24,12 +24,12 @@ "scripts": { "precommit": "lint-staged", "build": "rm -rf lib/ && tsc -p tsconfig.build.json", - "build:test": "rm -rf lib/ && tsc -p tsconfig.test.json --sourcemap", + "build:test": "pnpm build", "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepack": "pnpm build" }, "devDependencies": { @@ -37,17 +37,16 @@ "@silverhand/eslint-config-react": "5.0.0", "@silverhand/ts-config": "5.0.0", "@silverhand/ts-config-react": "5.0.0", - "@types/jest": "^29.4.0", "@types/node": "^20.9.5", "@types/react": "^18.0.31", + "@vitest/coverage-v8": "^1.4.0", "eslint": "^8.44.0", "history": "^5.3.0", - "jest": "^29.7.0", "lint-staged": "^15.0.0", "prettier": "^3.0.0", "react": "^18.0.0", - "tslib": "^2.4.1", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "vitest": "^1.4.0" }, "engines": { "node": "^20.9.0" diff --git a/packages/app-insights/src/normalize-error.test.ts b/packages/app-insights/src/normalize-error.test.ts index 798d7cac663..ab60124a021 100644 --- a/packages/app-insights/src/normalize-error.test.ts +++ b/packages/app-insights/src/normalize-error.test.ts @@ -1,3 +1,5 @@ +import { describe, expect, it } from 'vitest'; + import { normalizeError } from './normalize-error.js'; describe('normalizeError()', () => { diff --git a/packages/app-insights/tsconfig.json b/packages/app-insights/tsconfig.json index 83eac9c0ac5..2e988e53b2f 100644 --- a/packages/app-insights/tsconfig.json +++ b/packages/app-insights/tsconfig.json @@ -2,7 +2,7 @@ "extends": "@silverhand/ts-config-react/tsconfig.base", "compilerOptions": { "outDir": "lib", - "types": ["node", "jest"], + "types": ["node"], }, "include": [ "src" diff --git a/packages/app-insights/tsconfig.test.json b/packages/app-insights/tsconfig.test.json deleted file mode 100644 index f30817b04be..00000000000 --- a/packages/app-insights/tsconfig.test.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./tsconfig.build", - "compilerOptions": { - "isolatedModules": false, - "allowJs": true, - }, - "include": ["src"] -} diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 25981db9de4..44a57e0f0c3 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,26 @@ # Change Log +## 1.15.0 + +### Patch Changes + +- Updated dependencies [5758f84f5] +- Updated dependencies [57d97a4df] +- Updated dependencies [abffb9f95] +- Updated dependencies [746483c49] +- Updated dependencies [2cbc591ff] +- Updated dependencies [57d97a4df] +- Updated dependencies [cc01acbd0] +- Updated dependencies [951865859] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/phrases@1.10.0 + - @logto/connector-kit@3.0.0 + - @logto/core-kit@2.4.0 + - @logto/schemas@1.15.0 + - @logto/phrases-experience@1.6.1 + - @logto/shared@3.1.0 + ## 1.14.0 ### Patch Changes diff --git a/packages/cli/jest.config.js b/packages/cli/jest.config.js deleted file mode 100644 index 5656d33479a..00000000000 --- a/packages/cli/jest.config.js +++ /dev/null @@ -1,13 +0,0 @@ -/** @type {import('jest').Config} */ -const config = { - transform: {}, - coveragePathIgnorePatterns: ['/node_modules/', '/src/__mocks__/'], - coverageReporters: ['text-summary', 'lcov'], - coverageProvider: 'v8', - roots: ['./lib'], - moduleNameMapper: { - '^(chalk|inquirer)$': '/../shared/lib/esm/module-proxy.js', - }, -}; - -export default config; diff --git a/packages/cli/package.json b/packages/cli/package.json index ea0cec92490..be66801bc57 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@logto/cli", - "version": "1.14.0", + "version": "1.15.0", "description": "Logto CLI.", "author": "Silverhand Inc. ", "homepage": "https://github.com/logto-io/logto#readme", @@ -25,15 +25,14 @@ "precommit": "lint-staged", "prepare:package-json": "node -p \"'export const packageJson = ' + JSON.stringify(require('./package.json'), undefined, 2) + ';'\" > src/package-json.ts", "build": "rm -rf lib && pnpm prepare:package-json && tsc -p tsconfig.build.json", - "build:test": "rm -rf lib/ && pnpm prepare:package-json && tsc -p tsconfig.test.json --sourcemap", + "build:test": "pnpm build", "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "start": "node .", "start:dev": "pnpm build && node .", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepack": "pnpm build" }, "engines": { @@ -43,14 +42,15 @@ "url": "https://github.com/logto-io/logto/issues" }, "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0", - "@logto/core-kit": "workspace:^2.3.0", + "@logto/connector-kit": "workspace:^3.0.0", + "@logto/core-kit": "workspace:^2.4.0", "@logto/language-kit": "workspace:^1.1.0", - "@logto/phrases": "workspace:^1.9.0", - "@logto/phrases-experience": "workspace:^1.6.0", - "@logto/schemas": "workspace:1.14.0", + "@logto/phrases": "workspace:^1.10.0", + "@logto/phrases-experience": "workspace:^1.6.1", + "@logto/schemas": "workspace:1.15.0", "@logto/shared": "workspace:^3.1.0", "@silverhand/essentials": "^2.9.0", + "@silverhand/slonik": "31.0.0-beta.2", "chalk": "^5.0.0", "decamelize": "^6.0.0", "dotenv": "^16.0.0", @@ -65,9 +65,6 @@ "pg-protocol": "^1.6.0", "roarr": "^7.11.0", "semver": "^7.3.8", - "slonik": "^30.0.0", - "slonik-interceptor-preset": "^1.2.10", - "slonik-sql-tag-raw": "^1.1.4", "tar": "^6.1.11", "typescript": "^5.3.3", "yargs": "^17.6.0", @@ -76,19 +73,19 @@ "devDependencies": { "@silverhand/eslint-config": "5.0.0", "@silverhand/ts-config": "5.0.0", - "@withtyped/server": "^0.12.9", "@types/inquirer": "^9.0.0", - "@types/jest": "^29.4.0", "@types/node": "^20.9.5", "@types/semver": "^7.3.12", "@types/sinon": "^17.0.0", "@types/tar": "^6.1.2", "@types/yargs": "^17.0.13", + "@vitest/coverage-v8": "^1.4.0", + "@withtyped/server": "^0.13.3", "eslint": "^8.44.0", - "jest": "^29.7.0", "lint-staged": "^15.0.0", "prettier": "^3.0.0", - "sinon": "^17.0.0" + "sinon": "^17.0.0", + "vitest": "^1.4.0" }, "eslintConfig": { "extends": "@silverhand", diff --git a/packages/cli/src/commands/database/alteration/index.test.ts b/packages/cli/src/commands/database/alteration/index.test.ts index db289c21a7a..47dbcf02a5e 100644 --- a/packages/cli/src/commands/database/alteration/index.test.ts +++ b/packages/cli/src/commands/database/alteration/index.test.ts @@ -1,14 +1,11 @@ -import { createMockUtils } from '@logto/shared/esm'; +import { createMockPool } from '@silverhand/slonik'; import Sinon from 'sinon'; -import { createMockPool } from 'slonik'; +import { vi, expect, afterAll, describe, it } from 'vitest'; import { chooseAlterationsByVersion } from './version.js'; -const { jest } = import.meta; -const { mockEsmWithActual } = createMockUtils(jest); - const pool = createMockPool({ - query: jest.fn(), + query: vi.fn(), }); const files = Object.freeze([ @@ -17,16 +14,19 @@ const files = Object.freeze([ { filename: '1.0.0-1663923772-c.js', path: '/alterations-js/1.0.0-1663923772-c.js' }, ]); -await mockEsmWithActual('./utils.js', () => ({ +vi.mock('./utils.js', async (importOriginal) => ({ + // eslint-disable-next-line @typescript-eslint/ban-types + ...(await importOriginal()), getAlterationFiles: async () => files, })); -const { getCurrentDatabaseAlterationTimestamp } = await mockEsmWithActual( - '../../../queries/system.js', - () => ({ - getCurrentDatabaseAlterationTimestamp: jest.fn(), - }) -); +const getCurrentDatabaseAlterationTimestamp = vi.fn(); + +vi.doMock('../../../queries/system.js', async (importOriginal) => ({ + // eslint-disable-next-line @typescript-eslint/ban-types + ...(await importOriginal()), + getCurrentDatabaseAlterationTimestamp, +})); const { getAvailableAlterations } = await import('./index.js'); diff --git a/packages/cli/src/commands/database/alteration/index.ts b/packages/cli/src/commands/database/alteration/index.ts index 03a10324376..16b47bd533f 100644 --- a/packages/cli/src/commands/database/alteration/index.ts +++ b/packages/cli/src/commands/database/alteration/index.ts @@ -1,7 +1,7 @@ import type { AlterationScript } from '@logto/schemas/lib/types/alteration.js'; import { conditionalString } from '@silverhand/essentials'; +import type { DatabasePool } from '@silverhand/slonik'; import chalk from 'chalk'; -import type { DatabasePool } from 'slonik'; import type { CommandModule } from 'yargs'; import { createPoolFromConfig } from '../../../database.js'; diff --git a/packages/cli/src/commands/database/ogcio/applications.ts b/packages/cli/src/commands/database/ogcio/applications.ts index 59446af2df9..a6630977417 100644 --- a/packages/cli/src/commands/database/ogcio/applications.ts +++ b/packages/cli/src/commands/database/ogcio/applications.ts @@ -4,7 +4,7 @@ /* eslint-disable @silverhand/fp/no-mutation */ import { ApplicationType } from '@logto/schemas'; import { generateStandardSecret } from '@logto/shared'; -import { sql, type DatabaseTransactionConnection } from 'slonik'; +import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; import { type OgcioParams } from './index.js'; import { createItem } from './queries.js'; diff --git a/packages/cli/src/commands/database/ogcio/ogcio.ts b/packages/cli/src/commands/database/ogcio/ogcio.ts index 11b2edbae7a..e88e2d12141 100644 --- a/packages/cli/src/commands/database/ogcio/ogcio.ts +++ b/packages/cli/src/commands/database/ogcio/ogcio.ts @@ -3,7 +3,7 @@ /* eslint-disable @silverhand/fp/no-let */ import { defaultTenantId } from '@logto/schemas'; -import type { CommonQueryMethods, DatabaseTransactionConnection } from 'slonik'; +import type { CommonQueryMethods, DatabaseTransactionConnection } from '@silverhand/slonik'; import { seedApplications } from './applications.js'; import { type OgcioParams } from './index.js'; diff --git a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts index 60829a8da04..c82c6697a2b 100644 --- a/packages/cli/src/commands/database/ogcio/organizations-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/organizations-rbac.ts @@ -3,7 +3,7 @@ /* eslint-disable @silverhand/fp/no-mutating-methods */ /* eslint-disable @silverhand/fp/no-mutation */ import { OrganizationScopes, OrganizationRoles } from '@logto/schemas'; -import { sql, type DatabaseTransactionConnection } from 'slonik'; +import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; import { createItem, createItemWithoutId } from './queries.js'; diff --git a/packages/cli/src/commands/database/ogcio/organizations.ts b/packages/cli/src/commands/database/ogcio/organizations.ts index b06fea5e686..ca3a85e6951 100644 --- a/packages/cli/src/commands/database/ogcio/organizations.ts +++ b/packages/cli/src/commands/database/ogcio/organizations.ts @@ -1,4 +1,4 @@ -import { type DatabaseTransactionConnection, sql } from 'slonik'; +import { type DatabaseTransactionConnection, sql } from '@silverhand/slonik'; import { createItem } from './queries.js'; diff --git a/packages/cli/src/commands/database/ogcio/queries.ts b/packages/cli/src/commands/database/ogcio/queries.ts index 76dd668506c..6db110c4672 100644 --- a/packages/cli/src/commands/database/ogcio/queries.ts +++ b/packages/cli/src/commands/database/ogcio/queries.ts @@ -9,7 +9,7 @@ import { type QueryResult, sql, type ValueExpression, -} from 'slonik'; +} from '@silverhand/slonik'; import { insertInto } from '../../../database.js'; import { consoleLog } from '../../../utils.js'; diff --git a/packages/cli/src/commands/database/ogcio/resources-rbac.ts b/packages/cli/src/commands/database/ogcio/resources-rbac.ts index f9c2daf809a..05f0f4b2a0a 100644 --- a/packages/cli/src/commands/database/ogcio/resources-rbac.ts +++ b/packages/cli/src/commands/database/ogcio/resources-rbac.ts @@ -2,7 +2,7 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ /* eslint-disable @silverhand/fp/no-mutating-methods */ /* eslint-disable @silverhand/fp/no-mutation */ -import { sql, type DatabaseTransactionConnection } from 'slonik'; +import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; import { createItem } from './queries.js'; diff --git a/packages/cli/src/commands/database/ogcio/resources.ts b/packages/cli/src/commands/database/ogcio/resources.ts index d61de195a8e..6210bfcd14d 100644 --- a/packages/cli/src/commands/database/ogcio/resources.ts +++ b/packages/cli/src/commands/database/ogcio/resources.ts @@ -1,6 +1,6 @@ /* eslint-disable eslint-comments/disable-enable-pair */ -import { sql, type DatabaseTransactionConnection } from 'slonik'; +import { sql, type DatabaseTransactionConnection } from '@silverhand/slonik'; import { createItem } from './queries.js'; diff --git a/packages/cli/src/commands/database/seed/cloud.ts b/packages/cli/src/commands/database/seed/cloud.ts index a6cc6446d60..9dc8194a9a4 100644 --- a/packages/cli/src/commands/database/seed/cloud.ts +++ b/packages/cli/src/commands/database/seed/cloud.ts @@ -9,8 +9,8 @@ import { } from '@logto/schemas'; import { GlobalValues } from '@logto/shared'; import { appendPath } from '@silverhand/essentials'; -import type { CommonQueryMethods } from 'slonik'; -import { sql } from 'slonik'; +import type { CommonQueryMethods } from '@silverhand/slonik'; +import { sql } from '@silverhand/slonik'; import { insertInto } from '../../../database.js'; import { consoleLog } from '../../../utils.js'; diff --git a/packages/cli/src/commands/database/seed/index.ts b/packages/cli/src/commands/database/seed/index.ts index 282c1708754..84042b5ae70 100644 --- a/packages/cli/src/commands/database/seed/index.ts +++ b/packages/cli/src/commands/database/seed/index.ts @@ -1,4 +1,4 @@ -import type { DatabasePool } from 'slonik'; +import type { DatabasePool } from '@silverhand/slonik'; import type { CommandModule } from 'yargs'; import { createPoolAndDatabaseIfNeeded } from '../../../database.js'; diff --git a/packages/cli/src/commands/database/seed/oidc-config.ts b/packages/cli/src/commands/database/seed/oidc-config.ts index 40334222845..bc0308ef701 100644 --- a/packages/cli/src/commands/database/seed/oidc-config.ts +++ b/packages/cli/src/commands/database/seed/oidc-config.ts @@ -4,8 +4,8 @@ import type { LogtoOidcConfigType } from '@logto/schemas'; import { LogtoOidcConfigKey, logtoConfigGuards } from '@logto/schemas'; import { generateStandardId } from '@logto/shared'; import { getEnvAsStringArray } from '@silverhand/essentials'; +import type { DatabaseTransactionConnection } from '@silverhand/slonik'; import chalk from 'chalk'; -import type { DatabaseTransactionConnection } from 'slonik'; import { z } from 'zod'; import { getRowsByKeys, updateValueByKey } from '../../../queries/logto-config.js'; diff --git a/packages/cli/src/commands/database/seed/tables.ts b/packages/cli/src/commands/database/seed/tables.ts index 33723c08081..de4dc07f84c 100644 --- a/packages/cli/src/commands/database/seed/tables.ts +++ b/packages/cli/src/commands/database/seed/tables.ts @@ -28,14 +28,14 @@ import { } from '@logto/schemas'; import { getTenantRole } from '@logto/schemas'; import { Tenants } from '@logto/schemas/models'; -import { convertToIdentifiers, generateStandardId } from '@logto/shared'; -import type { DatabaseTransactionConnection } from 'slonik'; -import { sql } from 'slonik'; -import { raw } from 'slonik-sql-tag-raw'; +import { generateStandardId } from '@logto/shared'; +import type { DatabaseTransactionConnection } from '@silverhand/slonik'; +import { sql } from '@silverhand/slonik'; import { insertInto } from '../../../database.js'; import { getDatabaseName } from '../../../queries/database.js'; import { updateDatabaseTimestamp } from '../../../queries/system.js'; +import { convertToIdentifiers } from '../../../sql.js'; import { consoleLog, getPathInModule } from '../../../utils.js'; import { appendAdminConsoleRedirectUris, seedTenantCloudServiceApplication } from './cloud.js'; @@ -104,7 +104,7 @@ export const createTables = async ( if (query) { await connection.query( - sql`${raw( + sql`${sql.raw( /* eslint-disable no-template-curly-in-string */ query .replaceAll('${name}', parameters.name ?? '') @@ -128,7 +128,7 @@ export const createTables = async ( /* eslint-disable no-await-in-loop */ for (const [file, query] of sorted) { - await connection.query(sql`${raw(query)}`); + await connection.query(sql`${sql.raw(query)}`); if (!query.includes('/* no_after_each */')) { await runLifecycleQuery('after_each', { name: file.split('.')[0], database }); @@ -168,7 +168,12 @@ export const seedTables = async ( adminTenantId, applicationRole.id, ...cloudAdditionalScopes - .filter(({ name }) => name === CloudScope.SendSms || name === CloudScope.SendEmail) + .filter( + ({ name }) => + name === CloudScope.SendSms || + name === CloudScope.SendEmail || + name === CloudScope.FetchCustomJwt + ) .map(({ id }) => id) ); @@ -186,11 +191,18 @@ export const seedTables = async ( ), connection.query(insertInto(createAdminTenantSignInExperience(), SignInExperiences.table)), connection.query(insertInto(createDefaultAdminConsoleApplication(), Applications.table)), - updateDatabaseTimestamp(connection, latestTimestamp), + ]); + + // The below seed data is for the Logto Cloud only. We put it here for the sack of simplicity. + // The data is not harmful for OSS, since they are all admin tenant data. OSS will not use them + // and they cannot be seen by the Console. + await Promise.all([ seedTenantOrganizations(connection), seedManagementApiProxyApplications(connection), ]); + await updateDatabaseTimestamp(connection, latestTimestamp); + consoleLog.succeed('Seed data'); }; diff --git a/packages/cli/src/commands/database/seed/tenant-organizations.ts b/packages/cli/src/commands/database/seed/tenant-organizations.ts index 01c99a1b967..ab6a4aaa127 100644 --- a/packages/cli/src/commands/database/seed/tenant-organizations.ts +++ b/packages/cli/src/commands/database/seed/tenant-organizations.ts @@ -12,7 +12,7 @@ import { getTenantOrganizationCreateData, Organizations, } from '@logto/schemas'; -import type { DatabaseTransactionConnection } from 'slonik'; +import type { DatabaseTransactionConnection } from '@silverhand/slonik'; import { insertInto } from '../../../database.js'; import { consoleLog } from '../../../utils.js'; diff --git a/packages/cli/src/commands/database/seed/tenant.ts b/packages/cli/src/commands/database/seed/tenant.ts index 0a2f9ca470e..092fe3a8a40 100644 --- a/packages/cli/src/commands/database/seed/tenant.ts +++ b/packages/cli/src/commands/database/seed/tenant.ts @@ -17,9 +17,8 @@ import { } from '@logto/schemas'; import { generateStandardId } from '@logto/shared'; import { assert } from '@silverhand/essentials'; -import type { CommonQueryMethods, DatabaseTransactionConnection } from 'slonik'; -import { sql } from 'slonik'; -import { raw } from 'slonik-sql-tag-raw'; +import type { CommonQueryMethods, DatabaseTransactionConnection } from '@silverhand/slonik'; +import { sql } from '@silverhand/slonik'; import { insertInto } from '../../../database.js'; import { getDatabaseName } from '../../../queries/database.js'; @@ -37,7 +36,7 @@ export const createTenant = async (pool: CommonQueryMethods, tenantId: string) = await pool.query(insertInto(createTenant, 'tenants')); await pool.query(sql` create role ${sql.identifier([role])} with inherit login - password '${raw(password)}' + password '${sql.raw(password)}' in role ${sql.identifier([parentRole])}; `); }; diff --git a/packages/cli/src/commands/translate/openai.ts b/packages/cli/src/commands/translate/openai.ts index 551465d459a..26e30efb20d 100644 --- a/packages/cli/src/commands/translate/openai.ts +++ b/packages/cli/src/commands/translate/openai.ts @@ -14,7 +14,7 @@ export const createOpenaiApi = () => { const proxy = getProxy(); return got.extend({ - prefixUrl: 'https://api.openai.com/v1', + prefixUrl: process.env.OPENAI_API_PROXY_ENDPOINT ?? 'https://api.openai.com/v1', headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY ?? ''}`, }, @@ -50,7 +50,8 @@ export const translate = async ({ api .post('chat/completions', { json: { - model: 'gpt-3.5-turbo-1106', + // The full list of OPENAI model can be found at https://platform.openai.com/docs/models. + model: process.env.OPENAI_MODEL_NAME ?? 'gpt-3.5-turbo-0125', messages: getTranslationPromptMessages({ sourceFileContent, targetLanguage, diff --git a/packages/cli/src/connector/factories.ts b/packages/cli/src/connector/factories.ts index 50281a72673..f907657edb8 100644 --- a/packages/cli/src/connector/factories.ts +++ b/packages/cli/src/connector/factories.ts @@ -8,8 +8,9 @@ import { loadConnector } from './loader.js'; import type { ConnectorFactory, ConnectorPackage } from './types.js'; import { parseMetadata, validateConnectorModule } from './utils.js'; -// eslint-disable-next-line @silverhand/fp/no-let, @typescript-eslint/no-explicit-any -let cachedConnectorFactories: Array>> | undefined; +// eslint-disable-next-line @silverhand/fp/no-let +let cachedConnectorFactories: // eslint-disable-next-line @typescript-eslint/no-explicit-any +Array>> | undefined; export const loadConnectorFactories = async ( connectorPackages: ConnectorPackage[], @@ -49,8 +50,10 @@ export const loadConnectorFactories = async ( // eslint-disable-next-line @silverhand/fp/no-mutation cachedConnectorFactories = connectorFactories.filter( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (connectorFactory): connectorFactory is ConnectorFactory> => + ( + connectorFactory + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ): connectorFactory is ConnectorFactory> => connectorFactory !== undefined ); diff --git a/packages/cli/src/connector/types.ts b/packages/cli/src/connector/types.ts index 2c296f545c8..e6c1287dbb5 100644 --- a/packages/cli/src/connector/types.ts +++ b/packages/cli/src/connector/types.ts @@ -6,7 +6,7 @@ import type { BaseRoutes, Router } from '@withtyped/server'; */ export type ConnectorFactory< // eslint-disable-next-line @typescript-eslint/no-explicit-any - T extends Router, + T extends Router, U extends AllConnector = AllConnector, > = Pick & { createConnector: CreateConnector; diff --git a/packages/cli/src/connector/utils.ts b/packages/cli/src/connector/utils.ts index c0f2c4ca666..7a1c612069b 100644 --- a/packages/cli/src/connector/utils.ts +++ b/packages/cli/src/connector/utils.ts @@ -93,7 +93,7 @@ export const parseMetadata = async ( export const buildRawConnector = async < // eslint-disable-next-line @typescript-eslint/no-explicit-any - T extends Router, + T extends Router, U extends AllConnector = AllConnector, >( connectorFactory: ConnectorFactory, diff --git a/packages/cli/src/database.ts b/packages/cli/src/database.ts index 26ca45a733d..f639ce8231a 100644 --- a/packages/cli/src/database.ts +++ b/packages/cli/src/database.ts @@ -1,11 +1,16 @@ import type { SchemaLike } from '@logto/schemas'; -import { convertToPrimitiveOrSql } from '@logto/shared'; import { assert } from '@silverhand/essentials'; +import { + createPool, + parseDsn, + sql, + stringifyDsn, + createInterceptorsPreset, +} from '@silverhand/slonik'; import decamelize from 'decamelize'; import { DatabaseError } from 'pg-protocol'; -import { createPool, parseDsn, sql, stringifyDsn } from 'slonik'; -import { createInterceptors } from 'slonik-interceptor-preset'; +import { convertToPrimitiveOrSql } from './sql.js'; import { ConfigKey, consoleLog, getCliConfigWithPrompt } from './utils.js'; export const defaultDatabaseUrl = 'postgresql://localhost:5432/logto'; @@ -22,7 +27,7 @@ export const createPoolFromConfig = async () => { assert(parseDsn(databaseUrl).databaseName, new Error('Database name is required in URL')); return createPool(databaseUrl, { - interceptors: createInterceptors(), + interceptors: createInterceptorsPreset(), }); }; @@ -49,7 +54,7 @@ export const createPoolAndDatabaseIfNeeded = async () => { // - It will throw error when creating database using '?' const databaseName = dsn.databaseName ?? '?'; const maintenancePool = await createPool(stringifyDsn({ ...dsn, databaseName: 'postgres' }), { - interceptors: createInterceptors(), + interceptors: createInterceptorsPreset(), }); await maintenancePool.query(sql` create database ${sql.identifier([databaseName])} diff --git a/packages/cli/src/include.d/import-meta.d.ts b/packages/cli/src/include.d/import-meta.d.ts deleted file mode 100644 index 7a1591f98d2..00000000000 --- a/packages/cli/src/include.d/import-meta.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -interface ImportMeta { - // By TypeScript design we must use `import()` - // eslint-disable-next-line @typescript-eslint/consistent-type-imports - jest: typeof jest & import('@logto/shared/esm').WithEsmMock; -} diff --git a/packages/cli/src/include.d/slonik-interceptor-preset.d.ts b/packages/cli/src/include.d/slonik-interceptor-preset.d.ts deleted file mode 100644 index 778cb40c066..00000000000 --- a/packages/cli/src/include.d/slonik-interceptor-preset.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -declare module 'slonik-interceptor-preset' { - import type { Interceptor } from 'slonik'; - - export const createInterceptors: (config?: { - benchmarkQueries: boolean; - logQueries: boolean; - normaliseQueries: boolean; - transformFieldNames: boolean; - }) => readonly Interceptor[]; -} diff --git a/packages/cli/src/queries/database.ts b/packages/cli/src/queries/database.ts index 5ba83752cc2..2f8f715a43c 100644 --- a/packages/cli/src/queries/database.ts +++ b/packages/cli/src/queries/database.ts @@ -1,5 +1,5 @@ -import type { CommonQueryMethods } from 'slonik'; -import { sql } from 'slonik'; +import type { CommonQueryMethods } from '@silverhand/slonik'; +import { sql } from '@silverhand/slonik'; export const getDatabaseName = async (pool: CommonQueryMethods, normalized = false) => { const { currentDatabase } = await pool.one<{ currentDatabase: string }>(sql` diff --git a/packages/cli/src/queries/logto-config.ts b/packages/cli/src/queries/logto-config.ts index a0912711b0d..1abca8fb196 100644 --- a/packages/cli/src/queries/logto-config.ts +++ b/packages/cli/src/queries/logto-config.ts @@ -1,11 +1,12 @@ import type { LogtoConfig, LogtoConfigKey, logtoConfigGuards } from '@logto/schemas'; import { LogtoConfigs } from '@logto/schemas'; -import { convertToIdentifiers } from '@logto/shared'; import type { Nullable } from '@silverhand/essentials'; -import type { CommonQueryMethods } from 'slonik'; -import { sql } from 'slonik'; +import type { CommonQueryMethods } from '@silverhand/slonik'; +import { sql } from '@silverhand/slonik'; import type { z } from 'zod'; +import { convertToIdentifiers } from '../sql.js'; + const { table, fields } = convertToIdentifiers(LogtoConfigs); export const doesConfigsTableExist = async (pool: CommonQueryMethods) => { diff --git a/packages/cli/src/queries/system.test.ts b/packages/cli/src/queries/system.test.ts index 8eda604e29d..15058d322fd 100644 --- a/packages/cli/src/queries/system.test.ts +++ b/packages/cli/src/queries/system.test.ts @@ -1,16 +1,15 @@ import { AlterationStateKey, Systems } from '@logto/schemas'; -import { convertToIdentifiers } from '@logto/shared'; +import { createMockPool, createMockQueryResult, sql } from '@silverhand/slonik'; import { DatabaseError } from 'pg-protocol'; -import { createMockPool, createMockQueryResult, sql } from 'slonik'; +import { describe, it, expect, vi, type MockedFunction, afterAll, beforeAll } from 'vitest'; +import { convertToIdentifiers } from '../sql.js'; import type { QueryType } from '../test-utils.js'; import { expectSqlAssert } from '../test-utils.js'; import { updateDatabaseTimestamp, getCurrentDatabaseAlterationTimestamp } from './system.js'; -const { jest } = import.meta; - -const mockQuery: jest.MockedFunction = jest.fn(); +const mockQuery: MockedFunction = vi.fn(); const pool = createMockPool({ query: async (sql, values) => { @@ -94,12 +93,12 @@ describe('updateDatabaseTimestamp()', () => { const updatedAt = '2022-09-21T06:32:46.583Z'; beforeAll(() => { - jest.useFakeTimers(); - jest.setSystemTime(new Date(updatedAt)); + vi.useFakeTimers(); + vi.setSystemTime(new Date(updatedAt)); }); afterAll(() => { - jest.useRealTimers(); + vi.useRealTimers(); }); it('sends upsert sql with timestamp and updatedAt', async () => { diff --git a/packages/cli/src/queries/system.ts b/packages/cli/src/queries/system.ts index 9b54907eb63..e6d274bcc24 100644 --- a/packages/cli/src/queries/system.ts +++ b/packages/cli/src/queries/system.ts @@ -1,12 +1,13 @@ import type { AlterationState, System, SystemKey } from '@logto/schemas'; import { systemGuards, Systems, AlterationStateKey } from '@logto/schemas'; -import { convertToIdentifiers } from '@logto/shared'; import type { Nullable } from '@silverhand/essentials'; +import type { CommonQueryMethods, DatabaseTransactionConnection } from '@silverhand/slonik'; +import { sql } from '@silverhand/slonik'; import { DatabaseError } from 'pg-protocol'; -import type { CommonQueryMethods, DatabaseTransactionConnection } from 'slonik'; -import { sql } from 'slonik'; import type { z } from 'zod'; +import { convertToIdentifiers } from '../sql.js'; + const { fields, table } = convertToIdentifiers(Systems); const doesTableExist = async (pool: CommonQueryMethods, table: string) => { diff --git a/packages/cli/src/sql.ts b/packages/cli/src/sql.ts new file mode 100644 index 00000000000..a7f23157ac4 --- /dev/null +++ b/packages/cli/src/sql.ts @@ -0,0 +1,75 @@ +/** + * @fileoverview Copied from `@logto/core`. Originally we put them in `@logto/shared` but it + * requires `slonik` which makes the package too heavy. + * + * Since `@logto/cli` only use these functions in a stable manner, we copy them here for now. If + * the number of functions grows, we should consider moving them to a separate package. (Actually, + * we should remove the dependency on `slonik` at all, and this may not be an issue then.) + */ + +import { type SchemaValue, type SchemaValuePrimitive, type Table } from '@logto/shared'; +import { type IdentifierSqlToken, type SqlToken, sql } from '@silverhand/slonik'; + +/** + * Note `undefined` is removed from the acceptable list, + * since you should NOT call this function if ignoring the field is the desired behavior. + * Calling this function with `null` means an explicit `null` setting in database is expected. + * @param key The key of value. Will treat as `timestamp` if it ends with `_at` or 'At' AND value is a number; + * @param value The value to convert. + * @returns A primitive that can be saved into database. + */ +export const convertToPrimitiveOrSql = ( + key: string, + value: SchemaValue + // eslint-disable-next-line @typescript-eslint/ban-types +): NonNullable | SqlToken | null => { + if (value === null) { + return null; + } + + if (typeof value === 'object') { + return JSON.stringify(value); + } + + if ( + (['_at', 'At'].some((value) => key.endsWith(value)) || key === 'date') && + typeof value === 'number' + ) { + return sql`to_timestamp(${value}::double precision / 1000)`; + } + + if (typeof value === 'number' || typeof value === 'boolean') { + return value; + } + + if (typeof value === 'string') { + if (value === '') { + return null; + } + + return value; + } + + throw new Error(`Cannot convert ${key} to primitive`); +}; + +type FieldIdentifiers = { + [key in Key]: IdentifierSqlToken; +}; + +export const convertToIdentifiers = ( + { table, fields }: Table, + withPrefix = false +) => { + const fieldsIdentifiers = Object.entries(fields).map<[Key, IdentifierSqlToken]>( + // eslint-disable-next-line no-restricted-syntax -- Object.entries can only return string keys + ([key, value]) => [key as Key, sql.identifier(withPrefix ? [table, value] : [value])] + ); + + return { + table: sql.identifier([table]), + // Key value inferred from the original fields directly + // eslint-disable-next-line no-restricted-syntax + fields: Object.fromEntries(fieldsIdentifiers) as FieldIdentifiers, + }; +}; diff --git a/packages/cli/src/test-utils.ts b/packages/cli/src/test-utils.ts index ce1310ed334..67dfee35f18 100644 --- a/packages/cli/src/test-utils.ts +++ b/packages/cli/src/test-utils.ts @@ -1,7 +1,8 @@ // Copied from core -import type { QueryResult, QueryResultRow } from 'slonik'; -import type { PrimitiveValueExpression } from 'slonik/dist/src/types.js'; +import type { QueryResult, QueryResultRow } from '@silverhand/slonik'; +import type { PrimitiveValueExpression } from '@silverhand/slonik/dist/src/types.js'; +import { expect } from 'vitest'; export type QueryType = ( sql: string, diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 561ecb995f0..c4b6045bf6f 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -2,7 +2,7 @@ "extends": "@silverhand/ts-config/tsconfig.base", "compilerOptions": { "outDir": "lib", - "types": ["node", "jest"] + "types": ["node"] }, "include": [ "src" diff --git a/packages/cli/tsconfig.test.json b/packages/cli/tsconfig.test.json deleted file mode 100644 index 55de18c33aa..00000000000 --- a/packages/cli/tsconfig.test.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./tsconfig", - "compilerOptions": { - "isolatedModules": false, - "allowJs": true - }, - "include": ["src"] -} diff --git a/packages/connectors/.gitignore b/packages/connectors/.gitignore index 35dfa630e50..65245801929 100644 --- a/packages/connectors/.gitignore +++ b/packages/connectors/.gitignore @@ -1,8 +1,7 @@ # generated files -/*/types /*/tsconfig.* -/*/jest.config.* /*/rollup.config.* +/*/vitest.config.* # keep templates !/templates/** diff --git a/packages/connectors/connector-alipay-native/CHANGELOG.md b/packages/connectors/connector-alipay-native/CHANGELOG.md index ca6de109843..6e84bd0e814 100644 --- a/packages/connectors/connector-alipay-native/CHANGELOG.md +++ b/packages/connectors/connector-alipay-native/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-alipay-native +## 1.2.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-alipay-native/package.json b/packages/connectors/connector-alipay-native/package.json index df22a902b7c..b490e627503 100644 --- a/packages/connectors/connector-alipay-native/package.json +++ b/packages/connectors/connector-alipay-native/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-alipay-native", - "version": "1.1.0", + "version": "1.2.0", "description": "Alipay Native implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0", + "@logto/connector-kit": "workspace:^3.0.0", "dayjs": "^1.10.5", "iconv-lite": "^0.6.3" }, @@ -29,9 +29,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-alipay-native/src/index.test.ts b/packages/connectors/connector-alipay-native/src/index.test.ts index 4ec5f4c426d..634a41e6b4e 100644 --- a/packages/connectors/connector-alipay-native/src/index.test.ts +++ b/packages/connectors/connector-alipay-native/src/index.test.ts @@ -6,13 +6,11 @@ import { alipayEndpoint } from './constant.js'; import createConnector, { getAccessToken } from './index.js'; import { mockedAlipayNativeConfigWithValidPrivateKey } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedAlipayNativeConfigWithValidPrivateKey); +const getConfig = vi.fn().mockResolvedValue(mockedAlipayNativeConfigWithValidPrivateKey); describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid uri by state', async () => { @@ -26,7 +24,7 @@ describe('getAuthorizationUri', () => { jti: 'dummy-jti', headers: {}, }, - jest.fn() + vi.fn() ); expect(authorizationUri).toBe('alipay://?app_id=2021000000000000&state=dummy-state'); }); @@ -35,7 +33,7 @@ describe('getAuthorizationUri', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); const alipayEndpointUrl = new URL(alipayEndpoint); @@ -72,7 +70,7 @@ describe('getAccessToken', () => { sign: '', }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({}, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({}, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, '{}') ); }); @@ -93,7 +91,7 @@ describe('getAccessToken', () => { }); await expect( getAccessToken('code', mockedAlipayNativeConfigWithValidPrivateKey) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); }); it('should fail with wrong code', async () => { @@ -110,7 +108,7 @@ describe('getAccessToken', () => { }); await expect( getAccessToken('wrong_code', mockedAlipayNativeConfigWithValidPrivateKey) - ).rejects.toMatchError( + ).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'Invalid code') ); }); @@ -136,7 +134,7 @@ describe('getUserInfo', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); const alipayEndpointUrl = new URL(alipayEndpoint); @@ -156,10 +154,23 @@ describe('getUserInfo', () => { sign: '', }); const connector = await createConnector({ getConfig }); - const { id, name, avatar } = await connector.getUserInfo({ auth_code: 'code' }, jest.fn()); + const { id, name, avatar, rawData } = await connector.getUserInfo( + { auth_code: 'code' }, + vi.fn() + ); expect(id).toEqual('2088000000000000'); expect(name).toEqual('PlayboyEric'); expect(avatar).toEqual('https://www.alipay.com/xxx.jpg'); + expect(rawData).toEqual({ + alipay_user_info_share_response: { + code: '10000', + msg: 'Success', + user_id: '2088000000000000', + nick_name: 'PlayboyEric', + avatar: 'https://www.alipay.com/xxx.jpg', + }, + sign: '', + }); }); it('should throw SocialAccessTokenInvalid with code 20001', async () => { @@ -176,9 +187,7 @@ describe('getUserInfo', () => { sign: '', }); const connector = await createConnector({ getConfig }); - await expect( - connector.getUserInfo({ auth_code: 'wrong_code' }, jest.fn()) - ).rejects.toMatchError( + await expect(connector.getUserInfo({ auth_code: 'wrong_code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid, 'Invalid auth token') ); }); @@ -197,9 +206,7 @@ describe('getUserInfo', () => { sign: '', }); const connector = await createConnector({ getConfig }); - await expect( - connector.getUserInfo({ auth_code: 'wrong_code' }, jest.fn()) - ).rejects.toMatchError( + await expect(connector.getUserInfo({ auth_code: 'wrong_code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'Invalid auth code') ); }); @@ -218,9 +225,7 @@ describe('getUserInfo', () => { sign: '', }); const connector = await createConnector({ getConfig }); - await expect( - connector.getUserInfo({ auth_code: 'wrong_code' }, jest.fn()) - ).rejects.toMatchError( + await expect(connector.getUserInfo({ auth_code: 'wrong_code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { errorDescription: 'Invalid parameter', code: '40002', @@ -245,14 +250,14 @@ describe('getUserInfo', () => { sign: '', }); const connector = await createConnector({ getConfig }); - await expect( - connector.getUserInfo({ auth_code: 'wrong_code' }, jest.fn()) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.InvalidResponse)); + await expect(connector.getUserInfo({ auth_code: 'wrong_code' }, vi.fn())).rejects.toStrictEqual( + new ConnectorError(ConnectorErrorCodes.InvalidResponse) + ); }); it('should throw with other request errors', async () => { nock(alipayEndpointUrl.origin).post(alipayEndpointUrl.pathname).query(true).reply(500); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ auth_code: 'wrong_code' }, jest.fn())).rejects.toThrow(); + await expect(connector.getUserInfo({ auth_code: 'wrong_code' }, vi.fn())).rejects.toThrow(); }); }); diff --git a/packages/connectors/connector-alipay-native/src/index.ts b/packages/connectors/connector-alipay-native/src/index.ts index fa412d68fab..dc7d216ebbd 100644 --- a/packages/connectors/connector-alipay-native/src/index.ts +++ b/packages/connectors/connector-alipay-native/src/index.ts @@ -131,8 +131,8 @@ const getUserInfo = searchParams: signedSearchParameters, timeout: { request: defaultTimeout }, }); - - const result = userInfoResponseGuard.safeParse(parseJson(httpResponse.body)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -148,7 +148,7 @@ const getUserInfo = throw new ConnectorError(ConnectorErrorCodes.InvalidResponse); } - return { id, avatar, name }; + return { id, avatar, name, rawData }; }; const errorHandler: ErrorHandler = ({ code, msg, sub_code, sub_msg }) => { diff --git a/packages/connectors/connector-alipay-native/src/utils.test.ts b/packages/connectors/connector-alipay-native/src/utils.test.ts index 727f1d52cd0..053a18b8216 100644 --- a/packages/connectors/connector-alipay-native/src/utils.test.ts +++ b/packages/connectors/connector-alipay-native/src/utils.test.ts @@ -5,14 +5,12 @@ import { } from './mock.js'; import { signingParameters } from './utils.js'; -const { jest } = import.meta; - -const listenJSONParse = jest.spyOn(JSON, 'parse'); -const listenJSONStringify = jest.spyOn(JSON, 'stringify'); +const listenJSONParse = vi.spyOn(JSON, 'parse'); +const listenJSONStringify = vi.spyOn(JSON, 'stringify'); describe('signingParameters', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); const testingParameters = { diff --git a/packages/connectors/connector-alipay-web/CHANGELOG.md b/packages/connectors/connector-alipay-web/CHANGELOG.md index af8302d3896..d2682545a91 100644 --- a/packages/connectors/connector-alipay-web/CHANGELOG.md +++ b/packages/connectors/connector-alipay-web/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-alipay-web +## 1.3.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.2.0 ### Minor Changes diff --git a/packages/connectors/connector-alipay-web/package.json b/packages/connectors/connector-alipay-web/package.json index b23babe622f..2dcc0397c42 100644 --- a/packages/connectors/connector-alipay-web/package.json +++ b/packages/connectors/connector-alipay-web/package.json @@ -1,9 +1,9 @@ { "name": "@logto/connector-alipay-web", - "version": "1.2.0", + "version": "1.3.0", "description": "Alipay implementation.", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0", + "@logto/connector-kit": "workspace:^3.0.0", "dayjs": "^1.10.5", "iconv-lite": "^0.6.3" }, @@ -28,9 +28,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-alipay-web/src/index.test.ts b/packages/connectors/connector-alipay-web/src/index.test.ts index 2e0ad24fa52..caef90e611a 100644 --- a/packages/connectors/connector-alipay-web/src/index.test.ts +++ b/packages/connectors/connector-alipay-web/src/index.test.ts @@ -6,13 +6,11 @@ import { alipayEndpoint, authorizationEndpoint } from './constant.js'; import createConnector, { getAccessToken } from './index.js'; import { mockedAlipayConfigWithValidPrivateKey } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedAlipayConfigWithValidPrivateKey); +const getConfig = vi.fn().mockResolvedValue(mockedAlipayConfigWithValidPrivateKey); describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid uri by redirectUri and state', async () => { @@ -26,7 +24,7 @@ describe('getAuthorizationUri', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); expect(authorizationUri).toEqual( `${authorizationEndpoint}?app_id=2021000000000000&redirect_uri=http%3A%2F%2Flocalhost%3A3001%2Fcallback&scope=auth_user&state=some_state` @@ -37,7 +35,7 @@ describe('getAuthorizationUri', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); const alipayEndpointUrl = new URL(alipayEndpoint); @@ -78,7 +76,7 @@ describe('getAccessToken', () => { await expect( getAccessToken('code', mockedAlipayConfigWithValidPrivateKey) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); }); it('should fail with wrong code', async () => { @@ -96,7 +94,7 @@ describe('getAccessToken', () => { await expect( getAccessToken('wrong_code', mockedAlipayConfigWithValidPrivateKey) - ).rejects.toMatchError( + ).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'Invalid code') ); }); @@ -105,7 +103,7 @@ describe('getAccessToken', () => { describe('getUserInfo', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); beforeEach(() => { @@ -142,15 +140,28 @@ describe('getUserInfo', () => { sign: '', }); const connector = await createConnector({ getConfig }); - const { id, name, avatar } = await connector.getUserInfo({ auth_code: 'code' }, jest.fn()); + const { id, name, avatar, rawData } = await connector.getUserInfo( + { auth_code: 'code' }, + vi.fn() + ); expect(id).toEqual('2088000000000000'); expect(name).toEqual('PlayboyEric'); expect(avatar).toEqual('https://www.alipay.com/xxx.jpg'); + expect(rawData).toEqual({ + alipay_user_info_share_response: { + code: '10000', + msg: 'Success', + user_id: '2088000000000000', + nick_name: 'PlayboyEric', + avatar: 'https://www.alipay.com/xxx.jpg', + }, + sign: '', + }); }); it('throw General error if auth_code not provided in input', async () => { const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({}, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({}, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.InvalidResponse, '{}') ); }); @@ -169,9 +180,7 @@ describe('getUserInfo', () => { sign: '', }); const connector = await createConnector({ getConfig }); - await expect( - connector.getUserInfo({ auth_code: 'wrong_code' }, jest.fn()) - ).rejects.toMatchError( + await expect(connector.getUserInfo({ auth_code: 'wrong_code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid, 'Invalid auth token') ); }); @@ -190,9 +199,7 @@ describe('getUserInfo', () => { sign: '', }); const connector = await createConnector({ getConfig }); - await expect( - connector.getUserInfo({ auth_code: 'wrong_code' }, jest.fn()) - ).rejects.toMatchError( + await expect(connector.getUserInfo({ auth_code: 'wrong_code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'Invalid auth code') ); }); @@ -211,9 +218,7 @@ describe('getUserInfo', () => { sign: '', }); const connector = await createConnector({ getConfig }); - await expect( - connector.getUserInfo({ auth_code: 'wrong_code' }, jest.fn()) - ).rejects.toMatchError( + await expect(connector.getUserInfo({ auth_code: 'wrong_code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { errorDescription: 'Invalid parameter', code: '40002', @@ -238,7 +243,7 @@ describe('getUserInfo', () => { sign: '', }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ auth_code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ auth_code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.InvalidResponse) ); }); @@ -246,6 +251,6 @@ describe('getUserInfo', () => { it('should throw with other request errors', async () => { nock(alipayEndpointUrl.origin).post(alipayEndpointUrl.pathname).query(true).reply(500); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ auth_code: 'code' }, jest.fn())).rejects.toThrow(); + await expect(connector.getUserInfo({ auth_code: 'code' }, vi.fn())).rejects.toThrow(); }); }); diff --git a/packages/connectors/connector-alipay-web/src/index.ts b/packages/connectors/connector-alipay-web/src/index.ts index 0329e5a4e55..c3f592e444b 100644 --- a/packages/connectors/connector-alipay-web/src/index.ts +++ b/packages/connectors/connector-alipay-web/src/index.ts @@ -130,10 +130,8 @@ const getUserInfo = searchParams: signedSearchParameters, timeout: { request: defaultTimeout }, }); - - const { body: rawBody } = httpResponse; - - const result = userInfoResponseGuard.safeParse(parseJson(rawBody)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -149,7 +147,7 @@ const getUserInfo = throw new ConnectorError(ConnectorErrorCodes.InvalidResponse); } - return { id, avatar, name }; + return { id, avatar, name, rawData }; }; const errorHandler: ErrorHandler = ({ code, msg, sub_code, sub_msg }) => { diff --git a/packages/connectors/connector-alipay-web/src/utils.test.ts b/packages/connectors/connector-alipay-web/src/utils.test.ts index 1b4a3338ca1..a285af53fb9 100644 --- a/packages/connectors/connector-alipay-web/src/utils.test.ts +++ b/packages/connectors/connector-alipay-web/src/utils.test.ts @@ -2,14 +2,12 @@ import { methodForAccessToken } from './constant.js'; import { mockedAlipayConfigWithValidPrivateKey, mockedAlipayPublicParameters } from './mock.js'; import { signingParameters } from './utils.js'; -const { jest } = import.meta; - -const listenJSONParse = jest.spyOn(JSON, 'parse'); -const listenJSONStringify = jest.spyOn(JSON, 'stringify'); +const listenJSONParse = vi.spyOn(JSON, 'parse'); +const listenJSONStringify = vi.spyOn(JSON, 'stringify'); describe('signingParameters', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); const testingParameters = { diff --git a/packages/connectors/connector-aliyun-dm/CHANGELOG.md b/packages/connectors/connector-aliyun-dm/CHANGELOG.md index c2e3311bcd8..425189c294e 100644 --- a/packages/connectors/connector-aliyun-dm/CHANGELOG.md +++ b/packages/connectors/connector-aliyun-dm/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-aliyun-dm +## 1.1.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-aliyun-dm/package.json b/packages/connectors/connector-aliyun-dm/package.json index 1e8af3bbb8d..1871c95491c 100644 --- a/packages/connectors/connector-aliyun-dm/package.json +++ b/packages/connectors/connector-aliyun-dm/package.json @@ -1,9 +1,9 @@ { "name": "@logto/connector-aliyun-dm", - "version": "1.1.0", + "version": "1.1.1", "description": "Aliyun DM connector implementation.", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -23,9 +23,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-aliyun-dm/src/index.test.ts b/packages/connectors/connector-aliyun-dm/src/index.test.ts index 9c8d0ea1a9f..89c6495f5ae 100644 --- a/packages/connectors/connector-aliyun-dm/src/index.test.ts +++ b/packages/connectors/connector-aliyun-dm/src/index.test.ts @@ -2,16 +2,14 @@ import { TemplateType } from '@logto/connector-kit'; import { mockedConfigWithAllRequiredTemplates } from './mock.js'; -const { jest } = import.meta; +const getConfig = vi.fn().mockResolvedValue(mockedConfigWithAllRequiredTemplates); -const getConfig = jest.fn().mockResolvedValue(mockedConfigWithAllRequiredTemplates); - -const singleSendMail = jest.fn(() => ({ +const singleSendMail = vi.fn(() => ({ body: JSON.stringify({ EnvId: 'env-id', RequestId: 'request-id' }), statusCode: 200, })); -jest.unstable_mockModule('./single-send-mail.js', () => ({ +vi.mock('./single-send-mail.js', () => ({ singleSendMail, })); @@ -19,7 +17,7 @@ const { default: createConnector } = await import('./index.js'); describe('sendMessage()', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should call singleSendMail() with correct template and content', async () => { diff --git a/packages/connectors/connector-aliyun-dm/src/single-send-mail.test.ts b/packages/connectors/connector-aliyun-dm/src/single-send-mail.test.ts index 4804ad8e78a..1162b5d3210 100644 --- a/packages/connectors/connector-aliyun-dm/src/single-send-mail.test.ts +++ b/packages/connectors/connector-aliyun-dm/src/single-send-mail.test.ts @@ -1,8 +1,6 @@ -const { jest } = import.meta; +const request = vi.fn(); -const request = jest.fn(); - -jest.unstable_mockModule('./utils.js', () => ({ +vi.mock('./utils.js', () => ({ request, })); diff --git a/packages/connectors/connector-aliyun-dm/src/utils.test.ts b/packages/connectors/connector-aliyun-dm/src/utils.test.ts index 87d18dfad40..24da02e7a88 100644 --- a/packages/connectors/connector-aliyun-dm/src/utils.test.ts +++ b/packages/connectors/connector-aliyun-dm/src/utils.test.ts @@ -1,10 +1,8 @@ import { mockedParameters } from './mock.js'; -const { jest } = import.meta; +const post = vi.fn(); -const post = jest.fn(); - -jest.unstable_mockModule('got', () => ({ +vi.mock('got', () => ({ got: { post }, })); diff --git a/packages/connectors/connector-aliyun-sms/CHANGELOG.md b/packages/connectors/connector-aliyun-sms/CHANGELOG.md index b2ab91a5a5c..952eb8f9155 100644 --- a/packages/connectors/connector-aliyun-sms/CHANGELOG.md +++ b/packages/connectors/connector-aliyun-sms/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-aliyun-sms +## 1.1.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-aliyun-sms/package.json b/packages/connectors/connector-aliyun-sms/package.json index 82f36fc3ea7..5bd96d213fa 100644 --- a/packages/connectors/connector-aliyun-sms/package.json +++ b/packages/connectors/connector-aliyun-sms/package.json @@ -1,9 +1,9 @@ { "name": "@logto/connector-aliyun-sms", - "version": "1.1.0", + "version": "1.1.1", "description": "Aliyun SMS connector implementation.", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -23,9 +23,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-aliyun-sms/src/index.test.ts b/packages/connectors/connector-aliyun-sms/src/index.test.ts index 10dba3ed0d8..bfbacf15b66 100644 --- a/packages/connectors/connector-aliyun-sms/src/index.test.ts +++ b/packages/connectors/connector-aliyun-sms/src/index.test.ts @@ -2,16 +2,14 @@ import { TemplateType } from '@logto/connector-kit'; import { mockedConnectorConfig, phoneTest, codeTest } from './mock.js'; -const { jest } = import.meta; +const getConfig = vi.fn().mockResolvedValue(mockedConnectorConfig); -const getConfig = jest.fn().mockResolvedValue(mockedConnectorConfig); - -const sendSms = jest.fn().mockResolvedValue({ +const sendSms = vi.fn().mockResolvedValue({ body: JSON.stringify({ Code: 'OK', RequestId: 'request-id', Message: 'OK' }), statusCode: 200, }); -jest.unstable_mockModule('./single-send-text.js', () => ({ +vi.mock('./single-send-text.js', () => ({ sendSms, })); @@ -19,7 +17,7 @@ const { default: createConnector } = await import('./index.js'); describe('sendMessage()', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should call singleSendMail() and replace code in content', async () => { diff --git a/packages/connectors/connector-aliyun-sms/src/single-send-text.test.ts b/packages/connectors/connector-aliyun-sms/src/single-send-text.test.ts index 64d269e98a8..ec7da921964 100644 --- a/packages/connectors/connector-aliyun-sms/src/single-send-text.test.ts +++ b/packages/connectors/connector-aliyun-sms/src/single-send-text.test.ts @@ -1,10 +1,8 @@ import { mockedRandomCode } from './mock.js'; -const { jest } = import.meta; +const request = vi.fn(); -const request = jest.fn(); - -jest.unstable_mockModule('./utils.js', () => ({ request })); +vi.mock('./utils.js', () => ({ request })); const { sendSms } = await import('./single-send-text.js'); diff --git a/packages/connectors/connector-aliyun-sms/src/utils.test.ts b/packages/connectors/connector-aliyun-sms/src/utils.test.ts index 87d18dfad40..24da02e7a88 100644 --- a/packages/connectors/connector-aliyun-sms/src/utils.test.ts +++ b/packages/connectors/connector-aliyun-sms/src/utils.test.ts @@ -1,10 +1,8 @@ import { mockedParameters } from './mock.js'; -const { jest } = import.meta; +const post = vi.fn(); -const post = jest.fn(); - -jest.unstable_mockModule('got', () => ({ +vi.mock('got', () => ({ got: { post }, })); diff --git a/packages/connectors/connector-apple/CHANGELOG.md b/packages/connectors/connector-apple/CHANGELOG.md index 5a016939923..56904be0ab1 100644 --- a/packages/connectors/connector-apple/CHANGELOG.md +++ b/packages/connectors/connector-apple/CHANGELOG.md @@ -1,5 +1,20 @@ # @logto/connector-apple +## 1.3.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + - @logto/shared@3.1.0 + ## 1.2.0 ### Minor Changes diff --git a/packages/connectors/connector-apple/package.json b/packages/connectors/connector-apple/package.json index 084b811a137..cb9ae15e3a0 100644 --- a/packages/connectors/connector-apple/package.json +++ b/packages/connectors/connector-apple/package.json @@ -1,9 +1,9 @@ { "name": "@logto/connector-apple", - "version": "1.2.0", + "version": "1.3.0", "description": "Apple web connector implementation.", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0", + "@logto/connector-kit": "workspace:^3.0.0", "@logto/shared": "workspace:^3.1.0", "jose": "^5.0.0" }, @@ -25,9 +25,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-apple/src/index.test.ts b/packages/connectors/connector-apple/src/index.test.ts index fdf8c77716b..7671330055d 100644 --- a/packages/connectors/connector-apple/src/index.test.ts +++ b/packages/connectors/connector-apple/src/index.test.ts @@ -2,15 +2,13 @@ import { ConnectorError, ConnectorErrorCodes } from '@logto/connector-kit'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; +const getConfig = vi.fn().mockResolvedValue(mockedConfig); -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const jwtVerify = vi.fn(); -const jwtVerify = jest.fn(); - -jest.unstable_mockModule('jose', () => ({ +vi.mock('jose', () => ({ jwtVerify, - createRemoteJWKSet: jest.fn(), + createRemoteJWKSet: vi.fn(), })); const { authorizationEndpoint } = await import('./constant.js'); @@ -18,12 +16,12 @@ const { default: createConnector } = await import('./index.js'); describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid uri by redirectUri and state', async () => { const connector = await createConnector({ getConfig }); - const setSession = jest.fn(); + const setSession = vi.fn(); const authorizationUri = await connector.getAuthorizationUri( { state: 'some_state', @@ -50,7 +48,7 @@ describe('getAuthorizationUri', () => { describe('getUserInfo', () => { afterAll(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get user info from id token payload', async () => { @@ -59,8 +57,12 @@ describe('getUserInfo', () => { payload: { sub: userId, email: 'foo@bar.com', email_verified: true }, })); const connector = await createConnector({ getConfig }); - const userInfo = await connector.getUserInfo({ id_token: 'idToken' }, jest.fn()); - expect(userInfo).toEqual({ id: userId, email: 'foo@bar.com' }); + const userInfo = await connector.getUserInfo({ id_token: 'idToken' }, vi.fn()); + expect(userInfo).toEqual({ + id: userId, + email: 'foo@bar.com', + rawData: { id_token: 'idToken' }, + }); }); it('should ignore unverified email', async () => { @@ -68,8 +70,8 @@ describe('getUserInfo', () => { payload: { sub: 'userId', email: 'foo@bar.com' }, })); const connector = await createConnector({ getConfig }); - const userInfo = await connector.getUserInfo({ id_token: 'idToken' }, jest.fn()); - expect(userInfo).toEqual({ id: 'userId' }); + const userInfo = await connector.getUserInfo({ id_token: 'idToken' }, vi.fn()); + expect(userInfo).toEqual({ id: 'userId', rawData: { id_token: 'idToken' } }); }); it('should get user info from the `user` field', async () => { @@ -86,15 +88,26 @@ describe('getUserInfo', () => { name: { firstName: 'foo', lastName: 'bar' }, }), }, - jest.fn() + vi.fn() ); // Should use info from `user` field first - expect(userInfo).toEqual({ id: userId, email: 'foo2@bar.com', name: 'foo bar' }); + expect(userInfo).toEqual({ + id: userId, + email: 'foo2@bar.com', + name: 'foo bar', + rawData: { + id_token: 'idToken', + user: JSON.stringify({ + email: 'foo2@bar.com', + name: { firstName: 'foo', lastName: 'bar' }, + }), + }, + }); }); it('should throw if id token is missing', async () => { const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({}, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({}, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, '{}') ); }); @@ -104,7 +117,7 @@ describe('getUserInfo', () => { throw new Error('jwtVerify failed'); }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ id_token: 'id_token' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ id_token: 'id_token' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialIdTokenInvalid) ); }); @@ -114,7 +127,7 @@ describe('getUserInfo', () => { payload: { iat: 123_456 }, })); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ id_token: 'id_token' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ id_token: 'id_token' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialIdTokenInvalid) ); }); diff --git a/packages/connectors/connector-apple/src/index.ts b/packages/connectors/connector-apple/src/index.ts index fa699aab4e3..bbd23d2d699 100644 --- a/packages/connectors/connector-apple/src/index.ts +++ b/packages/connectors/connector-apple/src/index.ts @@ -12,6 +12,7 @@ import { ConnectorErrorCodes, validateConfig, ConnectorType, + jsonGuard, } from '@logto/connector-kit'; import { generateStandardId } from '@logto/shared/universal'; import { createRemoteJWKSet, jwtVerify } from 'jose'; @@ -112,6 +113,7 @@ const getUserInfo = user?.email ?? (payload.email && payload.email_verified === true ? String(payload.email) : undefined), name: [user?.name?.firstName, user?.name?.lastName].filter(Boolean).join(' ') || undefined, + rawData: jsonGuard.parse(data), }; } catch { throw new ConnectorError(ConnectorErrorCodes.SocialIdTokenInvalid); diff --git a/packages/connectors/connector-aws-ses/CHANGELOG.md b/packages/connectors/connector-aws-ses/CHANGELOG.md index dd6073d1c8b..eb0337e4ede 100644 --- a/packages/connectors/connector-aws-ses/CHANGELOG.md +++ b/packages/connectors/connector-aws-ses/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-aws-ses +## 1.1.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-aws-ses/package.json b/packages/connectors/connector-aws-ses/package.json index 558304d7b96..bfc993a75d5 100644 --- a/packages/connectors/connector-aws-ses/package.json +++ b/packages/connectors/connector-aws-ses/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-aws-ses", - "version": "1.1.0", + "version": "1.1.1", "description": "Logto Connector for Amazon SES", "author": "Jeff ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0", + "@logto/connector-kit": "workspace:^3.0.0", "@aws-sdk/client-sesv2": "^3.224.0", "@aws-sdk/types": "^3.226.0" }, @@ -26,9 +26,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-aws-ses/src/index.test.ts b/packages/connectors/connector-aws-ses/src/index.test.ts index f95720a70fc..408b6de163d 100644 --- a/packages/connectors/connector-aws-ses/src/index.test.ts +++ b/packages/connectors/connector-aws-ses/src/index.test.ts @@ -4,11 +4,9 @@ import { TemplateType } from '@logto/connector-kit'; import createConnector from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; +const getConfig = vi.fn().mockResolvedValue(mockedConfig); -const getConfig = jest.fn().mockResolvedValue(mockedConfig); - -jest.spyOn(SESv2Client.prototype, 'send').mockResolvedValue({ +vi.spyOn(SESv2Client.prototype, 'send').mockResolvedValue({ MessageId: 'mocked-message-id', $metadata: { httpStatusCode: 200, @@ -17,7 +15,7 @@ jest.spyOn(SESv2Client.prototype, 'send').mockResolvedValue({ describe('sendMessage()', () => { afterAll(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should call SendMail() with correct template and content', async () => { diff --git a/packages/connectors/connector-azuread/CHANGELOG.md b/packages/connectors/connector-azuread/CHANGELOG.md index 3044ce85d77..f24cfea3574 100644 --- a/packages/connectors/connector-azuread/CHANGELOG.md +++ b/packages/connectors/connector-azuread/CHANGELOG.md @@ -1,5 +1,24 @@ # @logto/connector-azuread +## 1.2.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- 5cde35ec1: Update the Microsoft social connector integration guide. + + - Reorganize the content to make it more readable. + - Exclusively explained the different access types and their corresponding tenant IDs in the Azure Portal. + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-azuread/README.md b/packages/connectors/connector-azuread/README.md index 6578b956eb3..ac09b62863a 100644 --- a/packages/connectors/connector-azuread/README.md +++ b/packages/connectors/connector-azuread/README.md @@ -3,6 +3,7 @@ The Microsoft Azure AD connector provides a succinct way for your application to use Azure’s OAuth 2.0 authentication system. **Table of contents** + - [Microsoft Azure AD connector](#microsoft-azure-ad-connector) - [Set up Microsoft Azure AD in the Azure Portal](#set-up-microsoft-azure-ad-in-the-azure-portal) - [Fill in the configuration](#fill-in-the-configuration) @@ -14,34 +15,42 @@ The Microsoft Azure AD connector provides a succinct way for your application to - Visit the [Azure Portal](https://portal.azure.com/#home) and sign in with your Azure account. You need to have an active subscription to access Microsoft Azure AD. - Click the **Azure Active Directory** from the services they offer, and click the **App Registrations** from the left menu. -- Click **New Registration** at the top and enter a description, select your **access type** and add your **Redirect URI**, which redirect the user to the application after logging in. In our case, this will be `${your_logto_endpoint}/callback/${connector_id}`. e.g. `https://foo.logto.app/callback/${connector_id}`. (The `connector_id` can be also found on the top bar of the Logto Admin Console connector details page) -- You need to select Web as Platform. - - If you select **Sign in users of a specific organization only** for access type then you need to enter **TenantID**. - - If you select **Sign in users with work and school accounts or personal Microsoft accounts** for access type then you need to enter **common**. - - If you select **Sign in users with work and school accounts** for access type then you need to enter **organizations**. - - If you select **Sign in users with personal Microsoft accounts (MSA) only** for access type then you need to enter **consumers**. +- Click **New Registration** at the top, enter a description, select your **access type** and add your **Redirect URI**, which will redirect the user to the application after logging in. In our case, this will be `${your_logto_endpoint}/callback/${connector_id}`. e.g. `https://foo.logto.app/callback/${connector_id}`. (The `connector_id` can be also found on the top bar of the Logto Admin Console connector details page) + > You can copy the `Callback URI` in the configuration section. +- Select Web as Platform. -> You can copy the `Callback URI` in the configuration section. +## Fill in the configuration in Logto -## Fill in the configuration +| Name | Type | +| ------------- | ------ | +| clientId | string | +| clientSecret | string | +| tenantId | string | +| cloudInstance | string | -In details page of the newly registered app, you can find the **Application (client) ID** and **Directory (tenant) ID**. +### Client ID -For **Cloud Instance**, usually it is `https://login.microsoftonline.com/`. See [Azure AD authentication endpoints](https://learn.microsoft.com/en-us/azure/active-directory/develop/authentication-national-cloud#azure-ad-authentication-endpoints) for more information. +You may find the **Application (client) ID** in the **Overview** section of your newly created application in the Azure Portal. + +### Client Secret -## Configure your client secret - In your newly created application, click the **Certificates & Secrets** to get a client secret, and click the **New client secret** from the top. - Enter a description and an expiration. - This will only show your client secret once. Fill the **value** to the Logto connector configuration and save it to a secure location. -## Config types +### Cloud Instance -| Name | Type | -| ------------- | ------ | -| clientId | string | -| clientSecret | string | -| tenantId | string | -| cloudInstance | string | +Usually, it is `https://login.microsoftonline.com/`. See [Azure AD authentication endpoints](https://learn.microsoft.com/en-us/azure/active-directory/develop/authentication-national-cloud#azure-ad-authentication-endpoints) for more information. + +### Tenant ID + +Logto will use this field to construct the authorization endpoints. This value is dependent on the **access type** you selected when creating the application in the Azure Portal. + +- If you select **Accounts in this organizational directory only** for access type then you need to enter your **{TenantID}**. You can find the tenant ID in the **Overview** section of your Azure Active Directory. +- If you select **Accounts in any organizational directory** for access type then you need to enter **organizations**. +- If you select **Accounts in any organizational directory or personal Microsoft accounts** for access type then you need to enter **common**. +- If you select **Personal Microsoft accounts only** for access type then you need to enter **consumers**. ## References -* [Web app that signs in users](https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-web-app-sign-user-overview) + +- [Web app that signs in users](https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-web-app-sign-user-overview) diff --git a/packages/connectors/connector-azuread/package.json b/packages/connectors/connector-azuread/package.json index fdb999b7561..236885e7cc9 100644 --- a/packages/connectors/connector-azuread/package.json +++ b/packages/connectors/connector-azuread/package.json @@ -1,11 +1,11 @@ { "name": "@logto/connector-azuread", - "version": "1.1.0", + "version": "1.2.0", "description": "Microsoft Azure AD connector implementation.", "author": "Mobilist Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0", - "@azure/msal-node": "^2.0.0" + "@azure/msal-node": "^2.0.0", + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -25,9 +25,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { @@ -48,5 +47,9 @@ "prettier": "@silverhand/eslint-config/.prettierrc", "publishConfig": { "access": "public" + }, + "devDependencies": { + "@vitest/coverage-v8": "^1.4.0", + "vitest": "^1.4.0" } } diff --git a/packages/connectors/connector-azuread/src/index.test.ts b/packages/connectors/connector-azuread/src/index.test.ts index 0be0dd8f691..1368f85b64b 100644 --- a/packages/connectors/connector-azuread/src/index.test.ts +++ b/packages/connectors/connector-azuread/src/index.test.ts @@ -1,13 +1,76 @@ -import type { GetConnectorConfig } from '@logto/connector-kit'; +import nock from 'nock'; +import { vi, describe, beforeAll, it, expect } from 'vitest'; + +import { graphAPIEndpoint } from './constant.js'; import createConnector from './index.js'; -const { jest } = import.meta; +vi.mock('@azure/msal-node', async () => ({ + ConfidentialClientApplication: class { + async acquireTokenByCode() { + return { + accessToken: 'accessToken', + scopes: ['scopes'], + tokenType: 'tokenType', + }; + } + }, +})); -const getConnectorConfig = jest.fn() as GetConnectorConfig; +const getConnectorConfig = vi.fn().mockResolvedValue({ + clientId: 'clientId', + clientSecret: 'clientSecret', + cloudInstance: 'https://login.microsoftonline.com', + tenantId: 'tenantId', +}); describe('Azure AD connector', () => { it('init without exploding', () => { expect(async () => createConnector({ getConfig: getConnectorConfig })).not.toThrow(); }); }); + +describe('getUserInfo', () => { + beforeAll(async () => { + const graphMeUrl = new URL(graphAPIEndpoint); + nock(graphMeUrl.origin).get(graphMeUrl.pathname).reply(200, { + id: 'id', + displayName: 'displayName', + mail: 'mail', + userPrincipalName: 'userPrincipalName', + }); + }); + + it('should get user info from graph api', async () => { + const connector = await createConnector({ getConfig: getConnectorConfig }); + const userInfo = await connector.getUserInfo( + { code: 'code', redirectUri: 'redirectUri' }, + vi.fn() + ); + expect(userInfo).toEqual({ + id: 'id', + name: 'displayName', + email: 'mail', + rawData: { + id: 'id', + displayName: 'displayName', + mail: 'mail', + userPrincipalName: 'userPrincipalName', + }, + }); + }); + + it('should throw if graph api response has no id', async () => { + const graphMeUrl = new URL(graphAPIEndpoint); + nock(graphMeUrl.origin).get(graphMeUrl.pathname).reply(200, { + displayName: 'displayName', + mail: 'mail', + userPrincipalName: 'userPrincipalName', + }); + + const connector = await createConnector({ getConfig: getConnectorConfig }); + const userInfo = connector.getUserInfo({ code: 'code', redirectUri: 'redirectUri' }, vi.fn()); + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + await expect(userInfo).rejects.toThrow(expect.objectContaining({ code: 'invalid_response' })); + }); +}); diff --git a/packages/connectors/connector-azuread/src/index.ts b/packages/connectors/connector-azuread/src/index.ts index 91c95332da8..eec02121a34 100644 --- a/packages/connectors/connector-azuread/src/index.ts +++ b/packages/connectors/connector-azuread/src/index.ts @@ -3,7 +3,7 @@ import { got, HTTPError } from 'got'; import path from 'node:path'; import type { AuthorizationCodeRequest, AuthorizationUrlRequest } from '@azure/msal-node'; -import { ConfidentialClientApplication, CryptoProvider } from '@azure/msal-node'; +import { ConfidentialClientApplication } from '@azure/msal-node'; import type { GetAuthorizationUri, GetUserInfo, @@ -31,10 +31,6 @@ import { // eslint-disable-next-line @silverhand/fp/no-let let authCodeRequest: AuthorizationCodeRequest; -// This `cryptoProvider` seems not used. -// Temporarily keep this as this is a refactor, which should not change the logics. -const cryptoProvider = new CryptoProvider(); - const getAuthorizationUri = (getConfig: GetConnectorConfig): GetAuthorizationUri => async ({ state, redirectUri }) => { @@ -85,7 +81,6 @@ const getAccessToken = async (config: AzureADConfig, code: string, redirectUri: }); const authResult = await clientApplication.acquireTokenByCode(codeRequest); - const result = accessTokenResponseGuard.safeParse(authResult); if (!result.success) { @@ -117,8 +112,8 @@ const getUserInfo = }, timeout: { request: defaultTimeout }, }); - - const result = userInfoResponseGuard.safeParse(parseJson(httpResponse.body)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -130,6 +125,7 @@ const getUserInfo = id, email: conditional(mail), name: conditional(displayName), + rawData, }; } catch (error: unknown) { if (error instanceof HTTPError) { diff --git a/packages/connectors/connector-discord/CHANGELOG.md b/packages/connectors/connector-discord/CHANGELOG.md index 6fa918aead1..7a1db6bf874 100644 --- a/packages/connectors/connector-discord/CHANGELOG.md +++ b/packages/connectors/connector-discord/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-discord +## 1.3.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.2.0 ### Minor Changes diff --git a/packages/connectors/connector-discord/package.json b/packages/connectors/connector-discord/package.json index 3cfe00c2916..c1c148df7f5 100644 --- a/packages/connectors/connector-discord/package.json +++ b/packages/connectors/connector-discord/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-discord", - "version": "1.2.0", + "version": "1.3.0", "description": "Discord connector implementation.", "author": "ZR3SYSTEMS. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-discord/src/index.test.ts b/packages/connectors/connector-discord/src/index.test.ts index 31a20641a07..45664a11d50 100644 --- a/packages/connectors/connector-discord/src/index.test.ts +++ b/packages/connectors/connector-discord/src/index.test.ts @@ -6,14 +6,12 @@ import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './ import createConnector, { getAccessToken } from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('Discord connector', () => { describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid authorizationUri with redirectUri and state', async () => { @@ -27,7 +25,7 @@ describe('Discord connector', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); expect(authorizationUri).toEqual( `${authorizationEndpoint}?client_id=%3Cclient-id%3E&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&response_type=code&scope=identify+email&state=some_state` @@ -38,7 +36,7 @@ describe('Discord connector', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get an accessToken by exchanging with code', async () => { @@ -66,7 +64,7 @@ describe('Discord connector', () => { await expect( getAccessToken(mockedConfig, { code: 'code', redirectUri: 'dummyRedirectUri' }) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); }); }); @@ -82,7 +80,7 @@ describe('Discord connector', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get valid SocialUserInfo', async () => { @@ -99,13 +97,20 @@ describe('Discord connector', () => { code: 'code', redirectUri: 'dummyRedirectUri', }, - jest.fn() + vi.fn() ); - expect(socialUserInfo).toMatchObject({ + expect(socialUserInfo).toStrictEqual({ id: '1234567890', name: 'Whumpus', avatar: 'https://cdn.discordapp.com/avatars/1234567890/avatar_id', email: 'whumpus@discord.com', + rawData: { + id: '1234567890', + username: 'Whumpus', + avatar: 'avatar_id', + email: 'whumpus@discord.com', + verified: true, + }, }); }); @@ -113,15 +118,15 @@ describe('Discord connector', () => { nock(userInfoEndpoint).get('').reply(401); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code: 'code', redirectUri: 'dummyRedirectUri' }, jest.fn()) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid)); + connector.getUserInfo({ code: 'code', redirectUri: 'dummyRedirectUri' }, vi.fn()) + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid)); }); it('throws unrecognized error', async () => { nock(userInfoEndpoint).get('').reply(500); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code: 'code', redirectUri: 'dummyRedirectUri' }, jest.fn()) + connector.getUserInfo({ code: 'code', redirectUri: 'dummyRedirectUri' }, vi.fn()) ).rejects.toThrow(); }); }); diff --git a/packages/connectors/connector-discord/src/index.ts b/packages/connectors/connector-discord/src/index.ts index 224543952e3..4483cc2e9a9 100644 --- a/packages/connectors/connector-discord/src/index.ts +++ b/packages/connectors/connector-discord/src/index.ts @@ -102,8 +102,8 @@ const getUserInfo = }, timeout: { request: defaultTimeout }, }); - - const result = userInfoResponseGuard.safeParse(parseJson(httpResponse.body)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -124,7 +124,7 @@ const getUserInfo = throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, userInfoResult.error); } - return userInfoResult.data; + return { ...userInfoResult.data, rawData }; } catch (error: unknown) { if (error instanceof HTTPError) { const { statusCode, body: rawBody } = error.response; diff --git a/packages/connectors/connector-facebook/CHANGELOG.md b/packages/connectors/connector-facebook/CHANGELOG.md index 0114694dcb8..9e5e7bcf628 100644 --- a/packages/connectors/connector-facebook/CHANGELOG.md +++ b/packages/connectors/connector-facebook/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-facebook +## 1.3.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.2.0 ### Minor Changes diff --git a/packages/connectors/connector-facebook/package.json b/packages/connectors/connector-facebook/package.json index ad43c9f85d9..ec63896d6a5 100644 --- a/packages/connectors/connector-facebook/package.json +++ b/packages/connectors/connector-facebook/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-facebook", - "version": "1.2.0", + "version": "1.3.0", "description": "Facebook web connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-facebook/src/index.test.ts b/packages/connectors/connector-facebook/src/index.test.ts index d0919328928..69df5e0d076 100644 --- a/packages/connectors/connector-facebook/src/index.test.ts +++ b/packages/connectors/connector-facebook/src/index.test.ts @@ -6,14 +6,12 @@ import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './ import createConnector, { getAccessToken } from './index.js'; import { clientId, clientSecret, code, dummyRedirectUri, fields, mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('Facebook connector', () => { describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid authorizationUri with redirectUri and state', async () => { @@ -29,7 +27,7 @@ describe('Facebook connector', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); const encodedRedirectUri = encodeURIComponent(redirectUri); @@ -42,7 +40,7 @@ describe('Facebook connector', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get an accessToken by exchanging with code', async () => { @@ -86,7 +84,7 @@ describe('Facebook connector', () => { await expect( getAccessToken(mockedConfig, { code, redirectUri: dummyRedirectUri }) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); }); }); @@ -110,7 +108,7 @@ describe('Facebook connector', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get valid SocialUserInfo', async () => { @@ -130,13 +128,19 @@ describe('Facebook connector', () => { code, redirectUri: dummyRedirectUri, }, - jest.fn() + vi.fn() ); - expect(socialUserInfo).toMatchObject({ + expect(socialUserInfo).toStrictEqual({ id: '1234567890', avatar, name: 'monalisa octocat', email: 'octocat@facebook.com', + rawData: { + id: '1234567890', + name: 'monalisa octocat', + email: 'octocat@facebook.com', + picture: { data: { url: avatar } }, + }, }); }); @@ -144,8 +148,8 @@ describe('Facebook connector', () => { nock(userInfoEndpoint).get('').query({ fields }).reply(400); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code, redirectUri: dummyRedirectUri }, jest.fn()) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid)); + connector.getUserInfo({ code, redirectUri: dummyRedirectUri }, vi.fn()) + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid)); }); it('throws AuthorizationFailed error if error is access_denied', async () => { @@ -168,9 +172,9 @@ describe('Facebook connector', () => { error_description: 'Permissions error.', error_reason: 'user_denied', }, - jest.fn() + vi.fn() ) - ).rejects.toMatchError( + ).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.AuthorizationFailed, 'Permissions error.') ); }); @@ -195,9 +199,9 @@ describe('Facebook connector', () => { error_description: 'General error encountered.', error_reason: 'user_denied', }, - jest.fn() + vi.fn() ) - ).rejects.toMatchError( + ).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { error: 'general_error', error_code: 200, @@ -211,7 +215,7 @@ describe('Facebook connector', () => { nock(userInfoEndpoint).get('').reply(500); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code, redirectUri: dummyRedirectUri }, jest.fn()) + connector.getUserInfo({ code, redirectUri: dummyRedirectUri }, vi.fn()) ).rejects.toThrow(); }); }); diff --git a/packages/connectors/connector-facebook/src/index.ts b/packages/connectors/connector-facebook/src/index.ts index 7cb622c0ff0..0aa677a247a 100644 --- a/packages/connectors/connector-facebook/src/index.ts +++ b/packages/connectors/connector-facebook/src/index.ts @@ -105,8 +105,8 @@ const getUserInfo = }, timeout: { request: defaultTimeout }, }); - - const result = userInfoResponseGuard.safeParse(parseJson(httpResponse.body)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -119,6 +119,7 @@ const getUserInfo = avatar: picture?.data.url, email, name, + rawData, }; } catch (error: unknown) { if (error instanceof HTTPError) { diff --git a/packages/connectors/connector-feishu-web/CHANGELOG.md b/packages/connectors/connector-feishu-web/CHANGELOG.md index c83ecc53428..69fca21a6ae 100644 --- a/packages/connectors/connector-feishu-web/CHANGELOG.md +++ b/packages/connectors/connector-feishu-web/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-feishu-web +## 1.2.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-feishu-web/package.json b/packages/connectors/connector-feishu-web/package.json index 1d552351d1b..7fc99edaaef 100644 --- a/packages/connectors/connector-feishu-web/package.json +++ b/packages/connectors/connector-feishu-web/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-feishu-web", - "version": "1.1.0", + "version": "1.2.0", "description": "Feishu web connector.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-feishu-web/src/index.test.ts b/packages/connectors/connector-feishu-web/src/index.test.ts index dc9871c97b7..7a20668fc71 100644 --- a/packages/connectors/connector-feishu-web/src/index.test.ts +++ b/packages/connectors/connector-feishu-web/src/index.test.ts @@ -6,13 +6,11 @@ import { accessTokenEndpoint, codeEndpoint, userInfoEndpoint } from './constant. import createConnector, { buildAuthorizationUri, getAccessToken } from './index.js'; import { mockedFeishuConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedFeishuConfig); +const getConfig = vi.fn().mockResolvedValue(mockedFeishuConfig); describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should build authorization uri', function () { @@ -33,7 +31,7 @@ describe('getAuthorizationUri', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); expect(authorizationUri).toEqual( `${codeEndpoint}?client_id=1112233&redirect_uri=http%3A%2F%2Flocalhost%3A3001%2Fcallback&response_type=code&state=some_state` @@ -44,7 +42,7 @@ describe('getAuthorizationUri', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); const accessTokenUrl = new URL(accessTokenEndpoint); @@ -73,7 +71,7 @@ describe('getAccessToken', () => { await expect( getAccessToken('code', '123', '123', 'http://localhost:3000') - ).rejects.toMatchError( + ).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'access_token is empty') ); }); @@ -86,7 +84,7 @@ describe('getAccessToken', () => { await expect( getAccessToken('code', '123', '123', 'http://localhost:3000') - ).rejects.toMatchError( + ).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'invalid code') ); }); @@ -95,7 +93,7 @@ describe('getAccessToken', () => { describe('getUserInfo', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); beforeEach(() => { @@ -112,7 +110,7 @@ describe('getUserInfo', () => { const accessTokenUrl = new URL(accessTokenEndpoint); it('should get userInfo with accessToken', async () => { - nock(userInfoUrl.origin).get(userInfoUrl.pathname).query(true).once().reply(200, { + const jsonResponse = Object.freeze({ sub: 'ou_caecc734c2e3328a62489fe0648c4b98779515d3', name: '李雷', picture: 'https://www.feishu.cn/avatar', @@ -129,23 +127,25 @@ describe('getUserInfo', () => { employee_no: '111222333', mobile: '+86130xxxx0000', }); + nock(userInfoUrl.origin).get(userInfoUrl.pathname).query(true).once().reply(200, jsonResponse); const connector = await createConnector({ getConfig }); - const { id, name, avatar } = await connector.getUserInfo( + const { id, name, avatar, rawData } = await connector.getUserInfo( { code: 'code', redirectUri: 'http://localhost:3000', }, - jest.fn() + vi.fn() ); expect(id).toEqual('ou_caecc734c2e3328a62489fe0648c4b98779515d3'); expect(name).toEqual('李雷'); expect(avatar).toEqual('www.feishu.cn/avatar/icon'); + expect(rawData).toEqual(jsonResponse); }); it('throw General error if code not provided in input', async () => { const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({}, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({}, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.InvalidResponse, '{}') ); }); @@ -157,8 +157,8 @@ describe('getUserInfo', () => { }); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code: 'error_code', redirectUri: 'http://localhost:3000' }, jest.fn()) - ).rejects.toMatchError( + connector.getUserInfo({ code: 'error_code', redirectUri: 'http://localhost:3000' }, vi.fn()) + ).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid, 'invalid access token') ); }); @@ -169,8 +169,8 @@ describe('getUserInfo', () => { }); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code: 'code', redirectUri: 'http://localhost:3000' }, jest.fn()) - ).rejects.toMatchError( + connector.getUserInfo({ code: 'code', redirectUri: 'http://localhost:3000' }, vi.fn()) + ).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.InvalidResponse, 'invalid user response') ); }); @@ -179,7 +179,7 @@ describe('getUserInfo', () => { nock(userInfoUrl.origin).get(userInfoUrl.pathname).query(true).reply(500); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code: 'code', redirectUri: 'http://localhost:3000' }, jest.fn()) + connector.getUserInfo({ code: 'code', redirectUri: 'http://localhost:3000' }, vi.fn()) ).rejects.toThrow(); }); }); diff --git a/packages/connectors/connector-feishu-web/src/index.ts b/packages/connectors/connector-feishu-web/src/index.ts index d5c8f36f7f9..a2b25b2f929 100644 --- a/packages/connectors/connector-feishu-web/src/index.ts +++ b/packages/connectors/connector-feishu-web/src/index.ts @@ -13,6 +13,7 @@ import { ConnectorErrorCodes, ConnectorPlatform, ConnectorType, + jsonGuard, validateConfig, } from '@logto/connector-kit'; @@ -153,6 +154,7 @@ export function getUserInfo(getConfig: GetConnectorConfig): GetUserInfo { email: conditional(email), userId: conditional(user_id), phone: conditional(mobile), + rawData: jsonGuard.parse(response.body), }; } catch (error: unknown) { if (error instanceof ConnectorError) { diff --git a/packages/connectors/connector-github/CHANGELOG.md b/packages/connectors/connector-github/CHANGELOG.md index ca98e8abd7a..73b8a2eb0ee 100644 --- a/packages/connectors/connector-github/CHANGELOG.md +++ b/packages/connectors/connector-github/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-github +## 1.3.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.2.0 ### Minor Changes diff --git a/packages/connectors/connector-github/package.json b/packages/connectors/connector-github/package.json index 63295f5c46a..30bd1beaee2 100644 --- a/packages/connectors/connector-github/package.json +++ b/packages/connectors/connector-github/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-github", - "version": "1.2.0", + "version": "1.3.0", "description": "Github web connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0", + "@logto/connector-kit": "workspace:^3.0.0", "query-string": "^9.0.0" }, "main": "./lib/index.js", @@ -25,9 +25,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-github/src/index.test.ts b/packages/connectors/connector-github/src/index.test.ts index 6a5df4cf557..0656245e073 100644 --- a/packages/connectors/connector-github/src/index.test.ts +++ b/packages/connectors/connector-github/src/index.test.ts @@ -7,13 +7,11 @@ import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './ import createConnector, { getAccessToken } from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid uri by redirectUri and state', async () => { @@ -27,7 +25,7 @@ describe('getAuthorizationUri', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); expect(authorizationUri).toEqual( `${authorizationEndpoint}?client_id=%3Cclient-id%3E&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&state=some_state&scope=read%3Auser` @@ -38,7 +36,7 @@ describe('getAuthorizationUri', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get an accessToken by exchanging with code', async () => { @@ -60,7 +58,7 @@ describe('getAccessToken', () => { nock(accessTokenEndpoint) .post('') .reply(200, qs.stringify({ access_token: '', scope: 'scope', token_type: 'token_type' })); - await expect(getAccessToken(mockedConfig, { code: 'code' })).rejects.toMatchError( + await expect(getAccessToken(mockedConfig, { code: 'code' })).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid) ); }); @@ -82,7 +80,7 @@ describe('getUserInfo', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get valid SocialUserInfo', async () => { @@ -91,14 +89,22 @@ describe('getUserInfo', () => { avatar_url: 'https://github.com/images/error/octocat_happy.gif', name: 'monalisa octocat', email: 'octocat@github.com', + foo: 'bar', }); const connector = await createConnector({ getConfig }); - const socialUserInfo = await connector.getUserInfo({ code: 'code' }, jest.fn()); - expect(socialUserInfo).toMatchObject({ + const socialUserInfo = await connector.getUserInfo({ code: 'code' }, vi.fn()); + expect(socialUserInfo).toStrictEqual({ id: '1', avatar: 'https://github.com/images/error/octocat_happy.gif', name: 'monalisa octocat', email: 'octocat@github.com', + rawData: { + id: 1, + avatar_url: 'https://github.com/images/error/octocat_happy.gif', + name: 'monalisa octocat', + email: 'octocat@github.com', + foo: 'bar', + }, }); }); @@ -110,16 +116,22 @@ describe('getUserInfo', () => { email: null, }); const connector = await createConnector({ getConfig }); - const socialUserInfo = await connector.getUserInfo({ code: 'code' }, jest.fn()); + const socialUserInfo = await connector.getUserInfo({ code: 'code' }, vi.fn()); expect(socialUserInfo).toMatchObject({ id: '1', + rawData: { + id: 1, + avatar_url: null, + name: null, + email: null, + }, }); }); it('throws SocialAccessTokenInvalid error if remote response code is 401', async () => { nock(userInfoEndpoint).get('').reply(401); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid) ); }); @@ -140,9 +152,9 @@ describe('getUserInfo', () => { error_uri: 'https://docs.github.com/apps/troubleshooting-authorization-request-errors#access-denied', }, - jest.fn() + vi.fn() ) - ).rejects.toMatchError( + ).rejects.toStrictEqual( new ConnectorError( ConnectorErrorCodes.AuthorizationFailed, 'The user has denied your application access.' @@ -164,9 +176,9 @@ describe('getUserInfo', () => { error: 'general_error', error_description: 'General error encountered.', }, - jest.fn() + vi.fn() ) - ).rejects.toMatchError( + ).rejects.toStrictEqual( new ConnectorError( ConnectorErrorCodes.General, '{"error":"general_error","error_description":"General error encountered."}' @@ -177,6 +189,6 @@ describe('getUserInfo', () => { it('throws unrecognized error', async () => { nock(userInfoEndpoint).get('').reply(500); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toThrow(); + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toThrow(); }); }); diff --git a/packages/connectors/connector-github/src/index.ts b/packages/connectors/connector-github/src/index.ts index 547ce396452..52a0e97f182 100644 --- a/packages/connectors/connector-github/src/index.ts +++ b/packages/connectors/connector-github/src/index.ts @@ -117,8 +117,8 @@ const getUserInfo = }, timeout: { request: defaultTimeout }, }); - - const result = userInfoResponseGuard.safeParse(parseJson(httpResponse.body)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -131,6 +131,7 @@ const getUserInfo = avatar: conditional(avatar), email: conditional(email), name: conditional(name), + rawData, }; } catch (error: unknown) { if (error instanceof HTTPError) { diff --git a/packages/connectors/connector-google/CHANGELOG.md b/packages/connectors/connector-google/CHANGELOG.md index 2a7f2b638f1..2f79c263150 100644 --- a/packages/connectors/connector-google/CHANGELOG.md +++ b/packages/connectors/connector-google/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-google +## 1.3.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.2.0 ### Minor Changes diff --git a/packages/connectors/connector-google/package.json b/packages/connectors/connector-google/package.json index 2148928fb6c..cb5dee0d232 100644 --- a/packages/connectors/connector-google/package.json +++ b/packages/connectors/connector-google/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-google", - "version": "1.2.0", + "version": "1.3.0", "description": "Google web connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-google/src/index.test.ts b/packages/connectors/connector-google/src/index.test.ts index 21560f0ad8d..4b258f02144 100644 --- a/packages/connectors/connector-google/src/index.test.ts +++ b/packages/connectors/connector-google/src/index.test.ts @@ -6,14 +6,12 @@ import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './ import createConnector, { getAccessToken } from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('google connector', () => { describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid authorizationUri with redirectUri and state', async () => { @@ -27,7 +25,7 @@ describe('google connector', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); expect(authorizationUri).toEqual( `${authorizationEndpoint}?client_id=%3Cclient-id%3E&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&response_type=code&state=some_state&scope=openid+profile+email` @@ -38,7 +36,7 @@ describe('google connector', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get an accessToken by exchanging with code', async () => { @@ -60,7 +58,7 @@ describe('google connector', () => { .reply(200, { access_token: '', scope: 'scope', token_type: 'token_type' }); await expect( getAccessToken(mockedConfig, { code: 'code', redirectUri: 'dummyRedirectUri' }) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); }); }); @@ -75,11 +73,11 @@ describe('google connector', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get valid SocialUserInfo', async () => { - nock(userInfoEndpoint).post('').reply(200, { + const jsonResponse = Object.freeze({ sub: '1234567890', name: 'monalisa octocat', given_name: 'monalisa', @@ -89,19 +87,21 @@ describe('google connector', () => { email_verified: true, locale: 'en', }); + nock(userInfoEndpoint).post('').reply(200, jsonResponse); const connector = await createConnector({ getConfig }); const socialUserInfo = await connector.getUserInfo( { code: 'code', redirectUri: 'redirectUri', }, - jest.fn() + vi.fn() ); - expect(socialUserInfo).toMatchObject({ + expect(socialUserInfo).toStrictEqual({ id: '1234567890', avatar: 'https://github.com/images/error/octocat_happy.gif', name: 'monalisa octocat', email: 'octocat@google.com', + rawData: jsonResponse, }); }); @@ -109,8 +109,8 @@ describe('google connector', () => { nock(userInfoEndpoint).post('').reply(401); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code: 'code', redirectUri: '' }, jest.fn()) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid)); + connector.getUserInfo({ code: 'code', redirectUri: '' }, vi.fn()) + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid)); }); it('throws General error', async () => { @@ -131,9 +131,9 @@ describe('google connector', () => { error: 'general_error', error_description: 'General error encountered.', }, - jest.fn() + vi.fn() ) - ).rejects.toMatchError( + ).rejects.toStrictEqual( new ConnectorError( ConnectorErrorCodes.General, '{"error":"general_error","error_description":"General error encountered."}' @@ -145,7 +145,7 @@ describe('google connector', () => { nock(userInfoEndpoint).post('').reply(500); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code: 'code', redirectUri: '' }, jest.fn()) + connector.getUserInfo({ code: 'code', redirectUri: '' }, vi.fn()) ).rejects.toThrow(); }); }); diff --git a/packages/connectors/connector-google/src/index.ts b/packages/connectors/connector-google/src/index.ts index db6a6ad0990..19c8fd9a273 100644 --- a/packages/connectors/connector-google/src/index.ts +++ b/packages/connectors/connector-google/src/index.ts @@ -101,8 +101,8 @@ const getUserInfo = }, timeout: { request: defaultTimeout }, }); - - const result = userInfoResponseGuard.safeParse(parseJson(httpResponse.body)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -115,6 +115,7 @@ const getUserInfo = avatar, email: conditional(email_verified && email), name, + rawData, }; } catch (error: unknown) { return getUserInfoErrorHandler(error); diff --git a/packages/connectors/connector-kakao/CHANGELOG.md b/packages/connectors/connector-kakao/CHANGELOG.md index 786b8f9b1e1..341fe977229 100644 --- a/packages/connectors/connector-kakao/CHANGELOG.md +++ b/packages/connectors/connector-kakao/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-kakao +## 1.2.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-kakao/package.json b/packages/connectors/connector-kakao/package.json index 6da7db82f49..b89bdb04999 100644 --- a/packages/connectors/connector-kakao/package.json +++ b/packages/connectors/connector-kakao/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-kakao", - "version": "1.1.0", + "version": "1.2.0", "description": "Kakao connector implementation.", "author": "Kyungyoon Kim. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-kakao/src/index.test.ts b/packages/connectors/connector-kakao/src/index.test.ts index 90db9c0cd8f..830897ebd5a 100644 --- a/packages/connectors/connector-kakao/src/index.test.ts +++ b/packages/connectors/connector-kakao/src/index.test.ts @@ -6,14 +6,12 @@ import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './ import createConnector, { getAccessToken } from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('kakao connector', () => { describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid authorizationUri with redirectUri and state', async () => { @@ -27,7 +25,7 @@ describe('kakao connector', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); expect(authorizationUri).toEqual( `${authorizationEndpoint}?client_id=%3Cclient-id%3E&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&response_type=code&state=some_state` @@ -38,7 +36,7 @@ describe('kakao connector', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get an accessToken by exchanging with code', async () => { @@ -60,7 +58,7 @@ describe('kakao connector', () => { .reply(200, { access_token: '', scope: 'scope', token_type: 'token_type' }); await expect( getAccessToken(mockedConfig, { code: 'code', redirectUri: 'dummyRedirectUri' }) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); }); }); @@ -75,37 +73,37 @@ describe('kakao connector', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get valid SocialUserInfo', async () => { - nock(userInfoEndpoint) - .post('') - .reply(200, { - id: 1_234_567_890, - kakao_account: { - is_email_valid: true, - email: 'ruddbs5302@gmail.com', - profile: { - nickname: 'pemassi', - profile_image_url: 'https://github.com/images/error/octocat_happy.gif', - is_default_image: false, - }, + const jsonResponse = Object.freeze({ + id: 1_234_567_890, + kakao_account: { + is_email_valid: true, + email: 'ruddbs5302@gmail.com', + profile: { + nickname: 'pemassi', + profile_image_url: 'https://github.com/images/error/octocat_happy.gif', + is_default_image: false, }, - }); + }, + }); + nock(userInfoEndpoint).post('').reply(200, jsonResponse); const connector = await createConnector({ getConfig }); const socialUserInfo = await connector.getUserInfo( { code: 'code', redirectUri: 'redirectUri', }, - jest.fn() + vi.fn() ); - expect(socialUserInfo).toMatchObject({ + expect(socialUserInfo).toStrictEqual({ id: '1234567890', avatar: 'https://github.com/images/error/octocat_happy.gif', name: 'pemassi', email: 'ruddbs5302@gmail.com', + rawData: jsonResponse, }); }); @@ -113,8 +111,8 @@ describe('kakao connector', () => { nock(userInfoEndpoint).post('').reply(401); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code: 'code', redirectUri: '' }, jest.fn()) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid)); + connector.getUserInfo({ code: 'code', redirectUri: '' }, vi.fn()) + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid)); }); it('throws General error', async () => { @@ -135,9 +133,9 @@ describe('kakao connector', () => { error: 'general_error', error_description: 'General error encountered.', }, - jest.fn() + vi.fn() ) - ).rejects.toMatchError( + ).rejects.toStrictEqual( new ConnectorError( ConnectorErrorCodes.General, '{"error":"general_error","error_description":"General error encountered."}' @@ -149,7 +147,7 @@ describe('kakao connector', () => { nock(userInfoEndpoint).post('').reply(500); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code: 'code', redirectUri: '' }, jest.fn()) + connector.getUserInfo({ code: 'code', redirectUri: '' }, vi.fn()) ).rejects.toThrow(); }); }); diff --git a/packages/connectors/connector-kakao/src/index.ts b/packages/connectors/connector-kakao/src/index.ts index 1c8dbf72620..a07eadb8d0c 100644 --- a/packages/connectors/connector-kakao/src/index.ts +++ b/packages/connectors/connector-kakao/src/index.ts @@ -99,8 +99,8 @@ const getUserInfo = }, timeout: { request: defaultTimeout }, }); - - const result = userInfoResponseGuard.safeParse(parseJson(httpResponse.body)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -118,6 +118,7 @@ const getUserInfo = avatar: conditional(profile && !profile.is_default_image && profile.profile_image_url), email: conditional(is_email_valid && email), name: conditional(profile?.nickname), + rawData, }; } catch (error: unknown) { return getUserInfoErrorHandler(error); diff --git a/packages/connectors/connector-logto-email/CHANGELOG.md b/packages/connectors/connector-logto-email/CHANGELOG.md index b859f7ceb51..0742b6e2d83 100644 --- a/packages/connectors/connector-logto-email/CHANGELOG.md +++ b/packages/connectors/connector-logto-email/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-logto-email +## 1.1.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-logto-email/package.json b/packages/connectors/connector-logto-email/package.json index db0a66b2fc9..fb5f6d8a668 100644 --- a/packages/connectors/connector-logto-email/package.json +++ b/packages/connectors/connector-logto-email/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-logto-email", - "version": "1.1.0", + "version": "1.1.1", "description": "Logto email connector.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { @@ -49,6 +48,6 @@ "access": "public" }, "devDependencies": { - "@logto/cloud": "0.2.5-faca9a9" + "@logto/cloud": "0.2.5-ab8a489" } } diff --git a/packages/connectors/connector-logto-email/src/index.test.ts b/packages/connectors/connector-logto-email/src/index.test.ts index e38af0d89ec..084e461100d 100644 --- a/packages/connectors/connector-logto-email/src/index.test.ts +++ b/packages/connectors/connector-logto-email/src/index.test.ts @@ -6,16 +6,14 @@ import { TemplateType } from '@logto/connector-kit'; import { emailEndpoint, usageEndpoint } from './constant.js'; import createConnector from './index.js'; -const { jest } = import.meta; - const endpoint = 'http://localhost:3003'; const api = got.extend({ prefixUrl: endpoint }); const dropLeadingSlash = (path: string) => path.replace(/^\//, ''); const buildUrl = (path: string, endpoint: string) => new URL(`${endpoint}/api${path}`); -const getConfig = jest.fn().mockResolvedValue({}); -const getCloudServiceClient = jest.fn().mockResolvedValue({ +const getConfig = vi.fn().mockResolvedValue({}); +const getCloudServiceClient = vi.fn().mockResolvedValue({ post: async (path: string, payload: { body: unknown }) => { return api(dropLeadingSlash(path), { method: 'POST', diff --git a/packages/connectors/connector-logto-email/src/index.ts b/packages/connectors/connector-logto-email/src/index.ts index 1a7451bd622..2e64e7f2385 100644 --- a/packages/connectors/connector-logto-email/src/index.ts +++ b/packages/connectors/connector-logto-email/src/index.ts @@ -38,7 +38,16 @@ const sendMessage = try { await client.post(`/api${emailEndpoint}`, { body: { - data: { to, type, payload: { ...payload, senderName, companyInformation, appLogo } }, + data: { + to, + type, + payload: { + ...payload, + ...conditional(senderName && { senderName }), + ...conditional(companyInformation && { companyInformation }), + ...conditional(appLogo && { appLogo }), + }, + }, }, }); } catch (error: unknown) { diff --git a/packages/connectors/connector-logto-sms/CHANGELOG.md b/packages/connectors/connector-logto-sms/CHANGELOG.md index 1265cc0cb1c..cdb1dcb483d 100644 --- a/packages/connectors/connector-logto-sms/CHANGELOG.md +++ b/packages/connectors/connector-logto-sms/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-logto-sms +## 1.1.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-logto-sms/package.json b/packages/connectors/connector-logto-sms/package.json index 6113e8b022a..2a81c137182 100644 --- a/packages/connectors/connector-logto-sms/package.json +++ b/packages/connectors/connector-logto-sms/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-logto-sms", - "version": "1.1.0", + "version": "1.1.1", "description": "Logto SMS connector.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-logto-sms/src/index.test.ts b/packages/connectors/connector-logto-sms/src/index.test.ts index 740d7b34fd1..95d1ed10ee5 100644 --- a/packages/connectors/connector-logto-sms/src/index.test.ts +++ b/packages/connectors/connector-logto-sms/src/index.test.ts @@ -5,9 +5,7 @@ import { TemplateType } from '@logto/connector-kit'; import { smsEndpoint } from './constant.js'; import { mockedAccessTokenResponse, mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); const { default: createConnector } = await import('./index.js'); diff --git a/packages/connectors/connector-logto-social-demo/CHANGELOG.md b/packages/connectors/connector-logto-social-demo/CHANGELOG.md index 20666c2e121..ba7962448b0 100644 --- a/packages/connectors/connector-logto-social-demo/CHANGELOG.md +++ b/packages/connectors/connector-logto-social-demo/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-logto-social-demo +## 1.1.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-logto-social-demo/package.json b/packages/connectors/connector-logto-social-demo/package.json index 8fdd8495858..0a12e00a09b 100644 --- a/packages/connectors/connector-logto-social-demo/package.json +++ b/packages/connectors/connector-logto-social-demo/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-logto-social-demo", - "version": "1.1.0", + "version": "1.1.1", "description": "OAuth standard connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-logto-social-demo/src/index.test.ts b/packages/connectors/connector-logto-social-demo/src/index.test.ts index 63aaf3990e4..0bce8984e6c 100644 --- a/packages/connectors/connector-logto-social-demo/src/index.test.ts +++ b/packages/connectors/connector-logto-social-demo/src/index.test.ts @@ -2,14 +2,12 @@ import createConnector from './index.js'; import type { SocialDemoConfig } from './types.js'; import { SocialProvider } from './types.js'; -const { jest } = import.meta; - const mockedConfig: SocialDemoConfig = { provider: SocialProvider.GitHub, clientId: 'client-id', redirectUri: 'http://localhost:3000/callback', }; -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('getAuthorizationUri', () => { it('should get a valid uri by redirectUri and state', async () => { @@ -23,7 +21,7 @@ describe('getAuthorizationUri', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); expect(authorizationUri).toContain(encodeURIComponent(mockedConfig.redirectUri)); expect(authorizationUri).toContain( diff --git a/packages/connectors/connector-mailgun/CHANGELOG.md b/packages/connectors/connector-mailgun/CHANGELOG.md index 61946f1a55b..2820a1bb633 100644 --- a/packages/connectors/connector-mailgun/CHANGELOG.md +++ b/packages/connectors/connector-mailgun/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-mailgun +## 1.2.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.2.0 ### Minor Changes diff --git a/packages/connectors/connector-mailgun/package.json b/packages/connectors/connector-mailgun/package.json index af66a5b2366..9345a26c89e 100644 --- a/packages/connectors/connector-mailgun/package.json +++ b/packages/connectors/connector-mailgun/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-mailgun", - "version": "1.2.0", + "version": "1.2.1", "description": "Mailgun connector for Logto.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-mailgun/src/index.test.ts b/packages/connectors/connector-mailgun/src/index.test.ts index 50468ce537c..ac1b4d03456 100644 --- a/packages/connectors/connector-mailgun/src/index.test.ts +++ b/packages/connectors/connector-mailgun/src/index.test.ts @@ -5,9 +5,7 @@ import { TemplateType } from '@logto/connector-kit'; import createMailgunConnector from './index.js'; import { type MailgunConfig } from './types.js'; -const { jest } = import.meta; - -const getConfig = jest.fn(); +const getConfig = vi.fn(); const domain = 'example.com'; const apiKey = 'apiKey'; @@ -210,7 +208,7 @@ describe('Maligun connector', () => { code: '123456', }, }) - ).rejects.toThrowErrorMatchingInlineSnapshot('"ConnectorError: template_not_found"'); + ).rejects.toThrowErrorMatchingInlineSnapshot('[Error: ConnectorError: template_not_found]'); await expect( connector.sendMessage({ @@ -221,7 +219,7 @@ describe('Maligun connector', () => { code: '123456', }, }) - ).rejects.toThrowErrorMatchingInlineSnapshot('"ConnectorError: template_not_found"'); + ).rejects.toThrowErrorMatchingInlineSnapshot('[Error: ConnectorError: template_not_found]'); }); it('should throw error if mailgun returns error', async () => { @@ -247,7 +245,7 @@ describe('Maligun connector', () => { }, }) ).rejects.toThrowErrorMatchingInlineSnapshot( - '"ConnectorError: {"statusCode":400,"body":"{\\"message\\":\\"error\\"}"}"' + '[Error: ConnectorError: {"statusCode":400,"body":"{\\"message\\":\\"error\\"}"}]' ); }); }); diff --git a/packages/connectors/connector-mock-email-alternative/CHANGELOG.md b/packages/connectors/connector-mock-email-alternative/CHANGELOG.md index cda777eea55..a1142990d04 100644 --- a/packages/connectors/connector-mock-email-alternative/CHANGELOG.md +++ b/packages/connectors/connector-mock-email-alternative/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-mock-standard-email +## 2.0.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 2.0.0 ### Major Changes diff --git a/packages/connectors/connector-mock-email-alternative/package.json b/packages/connectors/connector-mock-email-alternative/package.json index 63fa84fd9a9..b44be9b87ea 100644 --- a/packages/connectors/connector-mock-email-alternative/package.json +++ b/packages/connectors/connector-mock-email-alternative/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-mock-standard-email", - "version": "2.0.0", + "version": "2.0.1", "description": "Mock Standard Email Service connector implementation for integration tests only.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "scripts": { "precommit": "lint-staged", @@ -13,9 +13,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "main": "./lib/index.js", diff --git a/packages/connectors/connector-mock-email/CHANGELOG.md b/packages/connectors/connector-mock-email/CHANGELOG.md index bea9665a940..4ad35a91007 100644 --- a/packages/connectors/connector-mock-email/CHANGELOG.md +++ b/packages/connectors/connector-mock-email/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-mock-email +## 2.0.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 2.0.0 ### Major Changes diff --git a/packages/connectors/connector-mock-email/package.json b/packages/connectors/connector-mock-email/package.json index 96e5f94c2d0..937c34f1580 100644 --- a/packages/connectors/connector-mock-email/package.json +++ b/packages/connectors/connector-mock-email/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-mock-email", - "version": "2.0.0", + "version": "2.0.1", "description": "Mock Email Service connector implementation for integration tests only.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "scripts": { "precommit": "lint-staged", @@ -13,9 +13,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "main": "./lib/index.js", diff --git a/packages/connectors/connector-mock-sms/CHANGELOG.md b/packages/connectors/connector-mock-sms/CHANGELOG.md index 59b928d4db8..a72ac350823 100644 --- a/packages/connectors/connector-mock-sms/CHANGELOG.md +++ b/packages/connectors/connector-mock-sms/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-mock-sms +## 2.0.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 2.0.0 ### Major Changes diff --git a/packages/connectors/connector-mock-sms/package.json b/packages/connectors/connector-mock-sms/package.json index 9678d8e704e..46a0a74bb2d 100644 --- a/packages/connectors/connector-mock-sms/package.json +++ b/packages/connectors/connector-mock-sms/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-mock-sms", - "version": "2.0.0", + "version": "2.0.1", "description": "Mock SMS connector implementation for integration tests only.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "scripts": { "precommit": "lint-staged", @@ -13,9 +13,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "main": "./lib/index.js", diff --git a/packages/connectors/connector-mock-social/CHANGELOG.md b/packages/connectors/connector-mock-social/CHANGELOG.md index 202d3db7f54..57dcf6d62ec 100644 --- a/packages/connectors/connector-mock-social/CHANGELOG.md +++ b/packages/connectors/connector-mock-social/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-mock-social +## 1.2.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-mock-social/package.json b/packages/connectors/connector-mock-social/package.json index 1b49bbaf661..4726bd25e47 100644 --- a/packages/connectors/connector-mock-social/package.json +++ b/packages/connectors/connector-mock-social/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-mock-social", - "version": "1.1.0", + "version": "1.2.0", "description": "Social mock connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "scripts": { "precommit": "lint-staged", @@ -13,9 +13,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "main": "./lib/index.js", diff --git a/packages/connectors/connector-mock-social/src/index.ts b/packages/connectors/connector-mock-social/src/index.ts index 2b6d0d4663e..b9c76058c35 100644 --- a/packages/connectors/connector-mock-social/src/index.ts +++ b/packages/connectors/connector-mock-social/src/index.ts @@ -7,7 +7,12 @@ import type { CreateConnector, SocialConnector, } from '@logto/connector-kit'; -import { ConnectorError, ConnectorErrorCodes, ConnectorType } from '@logto/connector-kit'; +import { + ConnectorError, + ConnectorErrorCodes, + ConnectorType, + jsonGuard, +} from '@logto/connector-kit'; import { defaultMetadata } from './constant.js'; import { mockSocialConfigGuard } from './types.js'; @@ -35,6 +40,7 @@ const getUserInfo: GetUserInfo = async (data) => { return { id: userId ?? `mock-social-sub-${randomUUID()}`, ...rest, + rawData: jsonGuard.parse(data), }; }; diff --git a/packages/connectors/connector-naver/CHANGELOG.md b/packages/connectors/connector-naver/CHANGELOG.md index 90ae66b8ab8..978f2a4c883 100644 --- a/packages/connectors/connector-naver/CHANGELOG.md +++ b/packages/connectors/connector-naver/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-naver +## 1.2.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-naver/package.json b/packages/connectors/connector-naver/package.json index 66154e9c50c..09fa173db46 100644 --- a/packages/connectors/connector-naver/package.json +++ b/packages/connectors/connector-naver/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-naver", - "version": "1.1.0", + "version": "1.2.0", "description": "Naver connector implementation.", "author": "Kyungyoon Kim. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-naver/src/index.test.ts b/packages/connectors/connector-naver/src/index.test.ts index e4191463768..03268914c75 100644 --- a/packages/connectors/connector-naver/src/index.test.ts +++ b/packages/connectors/connector-naver/src/index.test.ts @@ -6,14 +6,12 @@ import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './ import createConnector, { getAccessToken } from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('naver connector', () => { describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid authorizationUri with redirectUri and state', async () => { @@ -27,7 +25,7 @@ describe('naver connector', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); expect(authorizationUri).toEqual( `${authorizationEndpoint}?client_id=%3Cclient-id%3E&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fcallback&response_type=code&state=some_state` @@ -38,7 +36,7 @@ describe('naver connector', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get an accessToken by exchanging with code', async () => { @@ -60,7 +58,7 @@ describe('naver connector', () => { .reply(200, { access_token: '', scope: 'scope', token_type: 'token_type' }); await expect( getAccessToken(mockedConfig, { code: 'code', redirectUri: 'dummyRedirectUri' }) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid)); }); }); @@ -75,39 +73,39 @@ describe('naver connector', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get valid SocialUserInfo', async () => { - nock(userInfoEndpoint) - .post('') - .reply(200, { - resultcode: '00', - message: 'success', - response: { - email: 'openapi@naver.com', - nickname: 'OpenAPI', - profile_image: 'https://ssl.pstatic.net/static/pwe/address/nodata_33x33.gif', - age: '40-49', - gender: 'F', - id: '32742776', - name: '오픈 API', - birthday: '10-01', - }, - }); + const jsonResponse = Object.freeze({ + resultcode: '00', + message: 'success', + response: { + email: 'openapi@naver.com', + nickname: 'OpenAPI', + profile_image: 'https://ssl.pstatic.net/static/pwe/address/nodata_33x33.gif', + age: '40-49', + gender: 'F', + id: '32742776', + name: '오픈 API', + birthday: '10-01', + }, + }); + nock(userInfoEndpoint).post('').reply(200, jsonResponse); const connector = await createConnector({ getConfig }); const socialUserInfo = await connector.getUserInfo( { code: 'code', redirectUri: 'redirectUri', }, - jest.fn() + vi.fn() ); expect(socialUserInfo).toMatchObject({ id: '32742776', avatar: 'https://ssl.pstatic.net/static/pwe/address/nodata_33x33.gif', name: 'OpenAPI', email: 'openapi@naver.com', + rawData: jsonResponse, }); }); @@ -115,8 +113,8 @@ describe('naver connector', () => { nock(userInfoEndpoint).post('').reply(401); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code: 'code', redirectUri: '' }, jest.fn()) - ).rejects.toMatchError(new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid)); + connector.getUserInfo({ code: 'code', redirectUri: '' }, vi.fn()) + ).rejects.toStrictEqual(new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid)); }); it('throws General error', async () => { @@ -137,9 +135,9 @@ describe('naver connector', () => { error: 'general_error', error_description: 'General error encountered.', }, - jest.fn() + vi.fn() ) - ).rejects.toMatchError( + ).rejects.toStrictEqual( new ConnectorError( ConnectorErrorCodes.General, '{"error":"general_error","error_description":"General error encountered."}' @@ -151,7 +149,7 @@ describe('naver connector', () => { nock(userInfoEndpoint).post('').reply(500); const connector = await createConnector({ getConfig }); await expect( - connector.getUserInfo({ code: 'code', redirectUri: '' }, jest.fn()) + connector.getUserInfo({ code: 'code', redirectUri: '' }, vi.fn()) ).rejects.toThrow(); }); }); diff --git a/packages/connectors/connector-naver/src/index.ts b/packages/connectors/connector-naver/src/index.ts index 0a85a9c312b..3e553e4bd88 100644 --- a/packages/connectors/connector-naver/src/index.ts +++ b/packages/connectors/connector-naver/src/index.ts @@ -99,8 +99,8 @@ const getUserInfo = }, timeout: { request: defaultTimeout }, }); - - const result = userInfoResponseGuard.safeParse(parseJson(httpResponse.body)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -114,6 +114,7 @@ const getUserInfo = avatar: conditional(profile_image), email: conditional(email), name: conditional(nickname), + rawData, }; } catch (error: unknown) { return getUserInfoErrorHandler(error); diff --git a/packages/connectors/connector-oauth2/CHANGELOG.md b/packages/connectors/connector-oauth2/CHANGELOG.md index 84ea166ddcb..b8f64dd545f 100644 --- a/packages/connectors/connector-oauth2/CHANGELOG.md +++ b/packages/connectors/connector-oauth2/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-oauth +## 1.2.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-oauth2/package.json b/packages/connectors/connector-oauth2/package.json index eaa3cec19a8..7b73b7e8b90 100644 --- a/packages/connectors/connector-oauth2/package.json +++ b/packages/connectors/connector-oauth2/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-oauth", - "version": "1.1.0", + "version": "1.2.0", "description": "OAuth standard connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0", + "@logto/connector-kit": "workspace:^3.0.0", "query-string": "^9.0.0" }, "main": "./lib/index.js", @@ -25,9 +25,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-oauth2/src/index.test.ts b/packages/connectors/connector-oauth2/src/index.test.ts index d99681876cb..e242fe579f0 100644 --- a/packages/connectors/connector-oauth2/src/index.test.ts +++ b/packages/connectors/connector-oauth2/src/index.test.ts @@ -2,20 +2,18 @@ import nock from 'nock'; import { mockConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockConfig); +const getConfig = vi.fn().mockResolvedValue(mockConfig); const { default: createConnector } = await import('./index.js'); describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid uri by redirectUri and state', async () => { const connector = await createConnector({ getConfig }); - const setSession = jest.fn(); + const setSession = vi.fn(); const authorizationUri = await connector.getAuthorizationUri( { state: 'some_state', @@ -40,7 +38,7 @@ describe('getAuthorizationUri', () => { describe('getUserInfo', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get valid userInfo', async () => { @@ -59,14 +57,15 @@ describe('getUserInfo', () => { const userInfoEndpointUrl = new URL(mockConfig.userInfoEndpoint); nock(userInfoEndpointUrl.origin).get(userInfoEndpointUrl.pathname).query(true).reply(200, { sub: userId, + foo: 'bar', }); const connector = await createConnector({ getConfig }); const userInfo = await connector.getUserInfo( { code: 'code' }, - jest.fn().mockImplementationOnce(() => { + vi.fn().mockImplementationOnce(() => { return { redirectUri: 'http://localhost:3001/callback' }; }) ); - expect(userInfo).toEqual({ id: userId }); + expect(userInfo).toStrictEqual({ id: userId, rawData: { sub: userId, foo: 'bar' } }); }); }); diff --git a/packages/connectors/connector-oauth2/src/index.ts b/packages/connectors/connector-oauth2/src/index.ts index 4d952dc58b1..f2b1c274b1c 100644 --- a/packages/connectors/connector-oauth2/src/index.ts +++ b/packages/connectors/connector-oauth2/src/index.ts @@ -71,8 +71,9 @@ const getUserInfo = }, timeout: { request: defaultTimeout }, }); + const rawData = parseJsonObject(httpResponse.body); - return userProfileMapping(parseJsonObject(httpResponse.body), parsedConfig.profileMap); + return { ...userProfileMapping(rawData, parsedConfig.profileMap), rawData }; } catch (error: unknown) { if (error instanceof HTTPError) { throw new ConnectorError(ConnectorErrorCodes.General, JSON.stringify(error.response.body)); diff --git a/packages/connectors/connector-oidc/CHANGELOG.md b/packages/connectors/connector-oidc/CHANGELOG.md index 31c4366b148..028aa310b9a 100644 --- a/packages/connectors/connector-oidc/CHANGELOG.md +++ b/packages/connectors/connector-oidc/CHANGELOG.md @@ -1,5 +1,20 @@ # @logto/connector-oidc +## 1.2.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + - @logto/shared@3.1.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-oidc/package.json b/packages/connectors/connector-oidc/package.json index f84a7b44c99..bd8871732c9 100644 --- a/packages/connectors/connector-oidc/package.json +++ b/packages/connectors/connector-oidc/package.json @@ -1,9 +1,9 @@ { "name": "@logto/connector-oidc", - "version": "1.1.0", + "version": "1.2.0", "description": "OIDC standard connector implementation.", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0", + "@logto/connector-kit": "workspace:^3.0.0", "@logto/shared": "workspace:^3.1.0", "jose": "^5.0.0", "nanoid": "^5.0.1" @@ -26,9 +26,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-oidc/src/index.test.ts b/packages/connectors/connector-oidc/src/index.test.ts index be4033678a2..b54bc311fdd 100644 --- a/packages/connectors/connector-oidc/src/index.test.ts +++ b/packages/connectors/connector-oidc/src/index.test.ts @@ -2,22 +2,20 @@ import nock from 'nock'; import { mockConfig } from './mock.js'; -const { jest } = import.meta; +const getConfig = vi.fn().mockResolvedValue(mockConfig); -const getConfig = jest.fn().mockResolvedValue(mockConfig); +const jwtVerify = vi.fn(); -const jwtVerify = jest.fn(); - -jest.unstable_mockModule('jose', () => ({ +vi.mock('jose', () => ({ jwtVerify, - createRemoteJWKSet: jest.fn(), + createRemoteJWKSet: vi.fn(), })); const { default: createConnector } = await import('./index.js'); describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid uri by redirectUri and state', async () => { @@ -31,7 +29,7 @@ describe('getAuthorizationUri', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); const { origin, pathname, searchParams } = new URL(authorizationUri); @@ -48,7 +46,7 @@ describe('getAuthorizationUri', () => { describe('getUserInfo', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get valid userInfo', async () => { @@ -65,10 +63,10 @@ describe('getUserInfo', () => { const connector = await createConnector({ getConfig }); const userInfo = await connector.getUserInfo( { code: 'code' }, - jest.fn().mockImplementationOnce(() => { + vi.fn().mockImplementationOnce(() => { return { nonce: 'nonce', redirectUri: 'http://localhost:3001/callback' }; }) ); - expect(userInfo).toEqual({ id: userId }); + expect(userInfo).toMatchObject({ id: userId, rawData: { sub: userId, nonce: 'nonce' } }); }); }); diff --git a/packages/connectors/connector-oidc/src/index.ts b/packages/connectors/connector-oidc/src/index.ts index ae8e6d749dd..a413a26c06f 100644 --- a/packages/connectors/connector-oidc/src/index.ts +++ b/packages/connectors/connector-oidc/src/index.ts @@ -14,6 +14,7 @@ import { ConnectorErrorCodes, validateConfig, ConnectorType, + jsonGuard, } from '@logto/connector-kit'; import { generateStandardId } from '@logto/shared/universal'; import { createRemoteJWKSet, jwtVerify } from 'jose'; @@ -137,6 +138,7 @@ const getUserInfo = avatar: conditional(picture), email: conditional(email_verified && email), phone: conditional(phone_verified && phone), + rawData: jsonGuard.parse(payload), }; } catch (error: unknown) { if (error instanceof HTTPError) { diff --git a/packages/connectors/connector-saml/CHANGELOG.md b/packages/connectors/connector-saml/CHANGELOG.md index 6549a3914db..3abfe03a9d0 100644 --- a/packages/connectors/connector-saml/CHANGELOG.md +++ b/packages/connectors/connector-saml/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-saml +## 1.1.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-saml/package.json b/packages/connectors/connector-saml/package.json index aa92eec856b..76dbad1e125 100644 --- a/packages/connectors/connector-saml/package.json +++ b/packages/connectors/connector-saml/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-saml", - "version": "1.1.0", + "version": "1.1.1", "description": "SAML standard connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0", + "@logto/connector-kit": "workspace:^3.0.0", "fast-xml-parser": "^4.2.5", "samlify": "2.8.10" }, @@ -26,9 +26,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-saml/src/index.test.ts b/packages/connectors/connector-saml/src/index.test.ts index 1f564dd2d90..289af187860 100644 --- a/packages/connectors/connector-saml/src/index.test.ts +++ b/packages/connectors/connector-saml/src/index.test.ts @@ -1,18 +1,16 @@ import createConnector, { validateSamlAssertion } from './index.js'; import { mockAttributes, mockedConfig, mockSamlResponse } from './mock.js'; -const { jest } = import.meta; +const getConfig = vi.fn().mockResolvedValue(mockedConfig); -const getConfig = jest.fn().mockResolvedValue(mockedConfig); - -const setSession = jest.fn(); -const getSession = jest.fn(); +const setSession = vi.fn(); +const getSession = vi.fn(); const connector = await createConnector({ getConfig }); describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid uri and save required information to storage', async () => { @@ -39,11 +37,11 @@ describe('getAuthorizationUri', () => { describe('validateSamlAssertion', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('Should return right redirectUri', async () => { - jest.useFakeTimers().setSystemTime(new Date('2023-01-18T14:55:45.406Z')); + vi.useFakeTimers().setSystemTime(new Date('2023-01-18T14:55:45.406Z')); getSession.mockResolvedValue({ connectorFactoryId: 'saml', state: 'some_state', @@ -61,13 +59,13 @@ describe('validateSamlAssertion', () => { ); expect(setSession).toHaveBeenCalledWith(expect.anything()); expect(redirectUri).toEqual('http://localhost:3000/callback?state=some_state'); - jest.useRealTimers(); + vi.useRealTimers(); }); }); describe('getUserInfo', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('get right profile', async () => { diff --git a/packages/connectors/connector-saml/src/utils.test.ts b/packages/connectors/connector-saml/src/utils.test.ts index 828471f1e86..5b9ef7a7363 100644 --- a/packages/connectors/connector-saml/src/utils.test.ts +++ b/packages/connectors/connector-saml/src/utils.test.ts @@ -1,10 +1,8 @@ import { userProfileMapping } from './utils.js'; -const { jest } = import.meta; - describe('userProfileMapping', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should return right user profile', () => { diff --git a/packages/connectors/connector-sendgrid-email/CHANGELOG.md b/packages/connectors/connector-sendgrid-email/CHANGELOG.md index 1c1de07b679..a6c4d6730db 100644 --- a/packages/connectors/connector-sendgrid-email/CHANGELOG.md +++ b/packages/connectors/connector-sendgrid-email/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-sendgrid-email +## 1.1.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-sendgrid-email/package.json b/packages/connectors/connector-sendgrid-email/package.json index 2f7650c7078..650f4b88050 100644 --- a/packages/connectors/connector-sendgrid-email/package.json +++ b/packages/connectors/connector-sendgrid-email/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-sendgrid-email", - "version": "1.1.0", + "version": "1.1.1", "description": "SendGrid Email Service connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-sendgrid-email/src/index.test.ts b/packages/connectors/connector-sendgrid-email/src/index.test.ts index 9f518865ce4..1062b215985 100644 --- a/packages/connectors/connector-sendgrid-email/src/index.test.ts +++ b/packages/connectors/connector-sendgrid-email/src/index.test.ts @@ -1,9 +1,7 @@ import createConnector from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('SendGrid connector', () => { it('init without throwing errors', async () => { diff --git a/packages/connectors/connector-smsaero/CHANGELOG.md b/packages/connectors/connector-smsaero/CHANGELOG.md index 651102d641a..72813750cc4 100644 --- a/packages/connectors/connector-smsaero/CHANGELOG.md +++ b/packages/connectors/connector-smsaero/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-smsaero +## 1.2.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.2.0 ### Minor Changes diff --git a/packages/connectors/connector-smsaero/package.json b/packages/connectors/connector-smsaero/package.json index 2465fdefe94..da34f59e820 100644 --- a/packages/connectors/connector-smsaero/package.json +++ b/packages/connectors/connector-smsaero/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-smsaero", - "version": "1.2.0", + "version": "1.2.1", "description": "SMSAero connector implementation.", "author": "Danil Tankov ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-smsaero/src/index.test.ts b/packages/connectors/connector-smsaero/src/index.test.ts index 253b7ada79e..dd1e579457d 100644 --- a/packages/connectors/connector-smsaero/src/index.test.ts +++ b/packages/connectors/connector-smsaero/src/index.test.ts @@ -1,9 +1,7 @@ import createConnector from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('SMSAero SMS connector', () => { it('init without throwing errors', async () => { diff --git a/packages/connectors/connector-smtp/CHANGELOG.md b/packages/connectors/connector-smtp/CHANGELOG.md index c0d3cf643c0..2543676bcd0 100644 --- a/packages/connectors/connector-smtp/CHANGELOG.md +++ b/packages/connectors/connector-smtp/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-smtp +## 1.1.2 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.1 ### Patch Changes diff --git a/packages/connectors/connector-smtp/package.json b/packages/connectors/connector-smtp/package.json index 0cf61efa87a..7c07a29ee35 100644 --- a/packages/connectors/connector-smtp/package.json +++ b/packages/connectors/connector-smtp/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-smtp", - "version": "1.1.1", + "version": "1.1.2", "description": "SMTP connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0", + "@logto/connector-kit": "workspace:^3.0.0", "nodemailer": "^6.9.9" }, "devDependencies": { @@ -28,9 +28,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-smtp/src/index.test.ts b/packages/connectors/connector-smtp/src/index.test.ts index ad442604557..a28137dd32d 100644 --- a/packages/connectors/connector-smtp/src/index.test.ts +++ b/packages/connectors/connector-smtp/src/index.test.ts @@ -16,18 +16,16 @@ import { } from './mock.js'; import { smtpConfigGuard } from './types.js'; -const { jest } = import.meta; +const getConfig = vi.fn().mockResolvedValue(mockedConfig); -const getConfig = jest.fn().mockResolvedValue(mockedConfig); - -const sendMail = jest.fn(); +const sendMail = vi.fn(); // @ts-expect-error for testing -jest.spyOn(nodemailer, 'createTransport').mockReturnValue({ sendMail } as Transporter); +vi.spyOn(nodemailer, 'createTransport').mockReturnValue({ sendMail } as Transporter); describe('SMTP connector', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('init without throwing errors', async () => { diff --git a/packages/connectors/connector-tencent-sms/CHANGELOG.md b/packages/connectors/connector-tencent-sms/CHANGELOG.md index 36b37f5da0a..9e296ec2754 100644 --- a/packages/connectors/connector-tencent-sms/CHANGELOG.md +++ b/packages/connectors/connector-tencent-sms/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-tencent-sms +## 1.1.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-tencent-sms/package.json b/packages/connectors/connector-tencent-sms/package.json index 9f0b2ef411f..60614fab7d5 100644 --- a/packages/connectors/connector-tencent-sms/package.json +++ b/packages/connectors/connector-tencent-sms/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-tencent-sms", - "version": "1.1.0", + "version": "1.1.1", "description": "Tencent SMS connector implementation.", "author": "StringKe", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-tencent-sms/src/index.test.ts b/packages/connectors/connector-tencent-sms/src/index.test.ts index a30b51fed2f..06e60445a37 100644 --- a/packages/connectors/connector-tencent-sms/src/index.test.ts +++ b/packages/connectors/connector-tencent-sms/src/index.test.ts @@ -2,11 +2,9 @@ import { TemplateType } from '@logto/connector-kit'; import { codeTest, mockedConnectorConfig, mockedTemplateCode, phoneTest } from './mock.js'; -const { jest } = import.meta; +const getConfig = vi.fn().mockResolvedValue(mockedConnectorConfig); -const getConfig = jest.fn().mockResolvedValue(mockedConnectorConfig); - -const sendSmsRequest = jest.fn(() => { +const sendSmsRequest = vi.fn(() => { return { body: { Response: { @@ -27,10 +25,10 @@ const sendSmsRequest = jest.fn(() => { }; }); -jest.unstable_mockModule('./http.js', () => { +vi.mock('./http.js', () => { return { sendSmsRequest, - isSmsErrorResponse: jest.fn((response) => { + isSmsErrorResponse: vi.fn((response) => { return response.Response.Error !== undefined; }), }; @@ -40,7 +38,7 @@ const { default: createConnector } = await import('./index.js'); describe('sendMessage()', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should call sendSmsRequest() and replace code in content', async () => { diff --git a/packages/connectors/connector-twilio-sms/CHANGELOG.md b/packages/connectors/connector-twilio-sms/CHANGELOG.md index 00869b4705c..bafc7348638 100644 --- a/packages/connectors/connector-twilio-sms/CHANGELOG.md +++ b/packages/connectors/connector-twilio-sms/CHANGELOG.md @@ -1,5 +1,15 @@ # @logto/connector-twilio-sms +## 1.1.1 + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-twilio-sms/package.json b/packages/connectors/connector-twilio-sms/package.json index 3fc3c5c665b..91bd74d1796 100644 --- a/packages/connectors/connector-twilio-sms/package.json +++ b/packages/connectors/connector-twilio-sms/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-twilio-sms", - "version": "1.1.0", + "version": "1.1.1", "description": "Twilio SMS connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-twilio-sms/src/index.test.ts b/packages/connectors/connector-twilio-sms/src/index.test.ts index f7f61febb5e..937403c0f1e 100644 --- a/packages/connectors/connector-twilio-sms/src/index.test.ts +++ b/packages/connectors/connector-twilio-sms/src/index.test.ts @@ -1,9 +1,7 @@ import createConnector from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('Twilio SMS connector', () => { it('init without throwing errors', async () => { diff --git a/packages/connectors/connector-wechat-native/CHANGELOG.md b/packages/connectors/connector-wechat-native/CHANGELOG.md index 41b0a5a7481..a8b63c8afc6 100644 --- a/packages/connectors/connector-wechat-native/CHANGELOG.md +++ b/packages/connectors/connector-wechat-native/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-wechat-native +## 1.2.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.1.0 ### Minor Changes diff --git a/packages/connectors/connector-wechat-native/package.json b/packages/connectors/connector-wechat-native/package.json index 6a9e9986efc..ffb01ca21db 100644 --- a/packages/connectors/connector-wechat-native/package.json +++ b/packages/connectors/connector-wechat-native/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-wechat-native", - "version": "1.1.0", + "version": "1.2.0", "description": "WeChat native connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-wechat-native/src/index.test.ts b/packages/connectors/connector-wechat-native/src/index.test.ts index 15a5f449ef5..b4bde0fb283 100644 --- a/packages/connectors/connector-wechat-native/src/index.test.ts +++ b/packages/connectors/connector-wechat-native/src/index.test.ts @@ -6,13 +6,11 @@ import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './ import createConnector, { getAccessToken } from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid uri', async () => { @@ -26,7 +24,7 @@ describe('getAuthorizationUri', () => { jti: 'dummy-jti', headers: {}, }, - jest.fn() + vi.fn() ); expect(authorizationUri).toEqual( `${authorizationEndpoint}?app_id=%3Capp-id%3E&state=dummy-state` @@ -37,7 +35,7 @@ describe('getAuthorizationUri', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); const accessTokenEndpointUrl = new URL(accessTokenEndpoint); @@ -66,7 +64,7 @@ describe('getAccessToken', () => { .get(accessTokenEndpointUrl.pathname) .query(parameters) .reply(200, { errcode: 40_029, errmsg: 'invalid code' }); - await expect(getAccessToken('code', mockedConfig)).rejects.toMatchError( + await expect(getAccessToken('code', mockedConfig)).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'invalid code') ); }); @@ -76,7 +74,7 @@ describe('getAccessToken', () => { .get(accessTokenEndpointUrl.pathname) .query(true) .reply(200, { errcode: 40_163, errmsg: 'code been used' }); - await expect(getAccessToken('code', mockedConfig)).rejects.toMatchError( + await expect(getAccessToken('code', mockedConfig)).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'code been used') ); }); @@ -86,7 +84,7 @@ describe('getAccessToken', () => { .get(accessTokenEndpointUrl.pathname) .query(true) .reply(200, { errcode: -1, errmsg: 'system error' }); - await expect(getAccessToken('wrong_code', mockedConfig)).rejects.toMatchError( + await expect(getAccessToken('wrong_code', mockedConfig)).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { errorDescription: 'system error', errcode: -1, @@ -132,30 +130,35 @@ describe('getUserInfo', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); const userInfoEndpointUrl = new URL(userInfoEndpoint); const parameters = new URLSearchParams({ access_token: 'access_token', openid: 'openid' }); it('should get valid SocialUserInfo', async () => { - nock(userInfoEndpointUrl.origin).get(userInfoEndpointUrl.pathname).query(parameters).reply(0, { + const jsonResponse = Object.freeze({ unionid: 'this_is_an_arbitrary_wechat_union_id', headimgurl: 'https://github.com/images/error/octocat_happy.gif', nickname: 'wechat bot', }); + nock(userInfoEndpointUrl.origin) + .get(userInfoEndpointUrl.pathname) + .query(parameters) + .reply(0, jsonResponse); const connector = await createConnector({ getConfig }); - const socialUserInfo = await connector.getUserInfo({ code: 'code' }, jest.fn()); + const socialUserInfo = await connector.getUserInfo({ code: 'code' }, vi.fn()); expect(socialUserInfo).toMatchObject({ id: 'this_is_an_arbitrary_wechat_union_id', avatar: 'https://github.com/images/error/octocat_happy.gif', name: 'wechat bot', + rawData: jsonResponse, }); }); it('throws General error if code not provided in input', async () => { const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({}, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({}, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, '{}') ); }); @@ -170,7 +173,7 @@ describe('getUserInfo', () => { errmsg: 'missing openid', }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { errorDescription: 'missing openid', errcode: 41_009, @@ -184,7 +187,7 @@ describe('getUserInfo', () => { .query(parameters) .reply(200, { errcode: 40_001, errmsg: 'invalid credential' }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid, 'invalid credential') ); }); @@ -192,7 +195,7 @@ describe('getUserInfo', () => { it('throws unrecognized error', async () => { nock(userInfoEndpointUrl.origin).get(userInfoEndpointUrl.pathname).query(parameters).reply(500); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toThrow(); + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toThrow(); }); it('throws Error if request failed and errcode is not 40001', async () => { @@ -201,7 +204,7 @@ describe('getUserInfo', () => { .query(parameters) .reply(200, { errcode: 40_003, errmsg: 'invalid openid' }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { errorDescription: 'invalid openid', errcode: 40_003, @@ -212,7 +215,7 @@ describe('getUserInfo', () => { it('throws SocialAccessTokenInvalid error if response code is 401', async () => { nock(userInfoEndpointUrl.origin).get(userInfoEndpointUrl.pathname).query(parameters).reply(401); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid) ); }); diff --git a/packages/connectors/connector-wechat-native/src/index.ts b/packages/connectors/connector-wechat-native/src/index.ts index fc976cc0931..e2fe4f9ec26 100644 --- a/packages/connectors/connector-wechat-native/src/index.ts +++ b/packages/connectors/connector-wechat-native/src/index.ts @@ -100,8 +100,8 @@ const getUserInfo = searchParams: { access_token: accessToken, openid }, timeout: { request: defaultTimeout }, }); - - const result = userInfoResponseGuard.safeParse(parseJson(httpResponse.body)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -114,7 +114,7 @@ const getUserInfo = // 'errmsg' and 'errcode' turn to non-empty values or empty values at the same time. Hence, if 'errmsg' is non-empty then 'errcode' should be non-empty. userInfoResponseMessageParser(result.data); - return { id: unionid ?? openid, avatar: headimgurl, name: nickname }; + return { id: unionid ?? openid, avatar: headimgurl, name: nickname, rawData }; } catch (error: unknown) { return getUserInfoErrorHandler(error); } diff --git a/packages/connectors/connector-wechat-web/CHANGELOG.md b/packages/connectors/connector-wechat-web/CHANGELOG.md index 136c82791e3..c30b52bafe5 100644 --- a/packages/connectors/connector-wechat-web/CHANGELOG.md +++ b/packages/connectors/connector-wechat-web/CHANGELOG.md @@ -1,5 +1,19 @@ # @logto/connector-wechat-web +## 1.3.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 + ## 1.2.0 ### Minor Changes diff --git a/packages/connectors/connector-wechat-web/package.json b/packages/connectors/connector-wechat-web/package.json index e05743e9121..d14d5c9b49c 100644 --- a/packages/connectors/connector-wechat-web/package.json +++ b/packages/connectors/connector-wechat-web/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-wechat-web", - "version": "1.2.0", + "version": "1.3.0", "description": "Wechat Web connector implementation.", "author": "Silverhand Inc. ", "dependencies": { - "@logto/connector-kit": "workspace:^2.1.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-wechat-web/src/index.test.ts b/packages/connectors/connector-wechat-web/src/index.test.ts index 6d03e72b000..3906fed7e31 100644 --- a/packages/connectors/connector-wechat-web/src/index.test.ts +++ b/packages/connectors/connector-wechat-web/src/index.test.ts @@ -6,13 +6,11 @@ import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './ import createConnector, { getAccessToken } from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid uri by redirectUri and state', async () => { @@ -26,7 +24,7 @@ describe('getAuthorizationUri', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); expect(authorizationUri).toEqual( `${authorizationEndpoint}?appid=%3Capp-id%3E&redirect_uri=http%3A%2F%2Flocalhost%3A3001%2Fcallback&response_type=code&scope=snsapi_login&state=some_state` @@ -37,7 +35,7 @@ describe('getAuthorizationUri', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); const accessTokenEndpointUrl = new URL(accessTokenEndpoint); @@ -66,7 +64,7 @@ describe('getAccessToken', () => { .get(accessTokenEndpointUrl.pathname) .query(parameters) .reply(200, { errcode: 40_029, errmsg: 'invalid code' }); - await expect(getAccessToken('code', mockedConfig)).rejects.toMatchError( + await expect(getAccessToken('code', mockedConfig)).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'invalid code') ); }); @@ -76,7 +74,7 @@ describe('getAccessToken', () => { .get(accessTokenEndpointUrl.pathname) .query(true) .reply(200, { errcode: 40_163, errmsg: 'code been used' }); - await expect(getAccessToken('code', mockedConfig)).rejects.toMatchError( + await expect(getAccessToken('code', mockedConfig)).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'code been used') ); }); @@ -86,7 +84,7 @@ describe('getAccessToken', () => { .get(accessTokenEndpointUrl.pathname) .query(true) .reply(200, { errcode: -1, errmsg: 'system error' }); - await expect(getAccessToken('wrong_code', mockedConfig)).rejects.toMatchError( + await expect(getAccessToken('wrong_code', mockedConfig)).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { errorDescription: 'system error', errcode: -1, @@ -123,35 +121,40 @@ describe('getUserInfo', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); const userInfoEndpointUrl = new URL(userInfoEndpoint); const parameters = new URLSearchParams({ access_token: 'access_token', openid: 'openid' }); it('should get valid SocialUserInfo', async () => { - nock(userInfoEndpointUrl.origin).get(userInfoEndpointUrl.pathname).query(parameters).reply(0, { + const jsonResponse = Object.freeze({ unionid: 'this_is_an_arbitrary_wechat_union_id', headimgurl: 'https://github.com/images/error/octocat_happy.gif', nickname: 'wechat bot', }); + nock(userInfoEndpointUrl.origin) + .get(userInfoEndpointUrl.pathname) + .query(parameters) + .reply(0, jsonResponse); const connector = await createConnector({ getConfig }); const socialUserInfo = await connector.getUserInfo( { code: 'code', }, - jest.fn() + vi.fn() ); expect(socialUserInfo).toMatchObject({ id: 'this_is_an_arbitrary_wechat_union_id', avatar: 'https://github.com/images/error/octocat_happy.gif', name: 'wechat bot', + rawData: jsonResponse, }); }); it('throws General error if code not provided in input', async () => { const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({}, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({}, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, '{}') ); }); @@ -166,7 +169,7 @@ describe('getUserInfo', () => { errmsg: 'missing openid', }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { errorDescription: 'missing openid', errcode: 41_009, @@ -180,7 +183,7 @@ describe('getUserInfo', () => { .query(parameters) .reply(200, { errcode: 40_001, errmsg: 'invalid credential' }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid, 'invalid credential') ); }); @@ -188,7 +191,7 @@ describe('getUserInfo', () => { it('throws unrecognized error', async () => { nock(userInfoEndpointUrl.origin).get(userInfoEndpointUrl.pathname).query(parameters).reply(500); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toThrow(); + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toThrow(); }); it('throws Error if request failed and errcode is not 40001', async () => { @@ -197,7 +200,7 @@ describe('getUserInfo', () => { .query(parameters) .reply(200, { errcode: 40_003, errmsg: 'invalid openid' }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { errorDescription: 'invalid openid', errcode: 40_003, @@ -208,7 +211,7 @@ describe('getUserInfo', () => { it('throws SocialAccessTokenInvalid error if response code is 401', async () => { nock(userInfoEndpointUrl.origin).get(userInfoEndpointUrl.pathname).query(parameters).reply(401); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid) ); }); diff --git a/packages/connectors/connector-wechat-web/src/index.ts b/packages/connectors/connector-wechat-web/src/index.ts index 7e1d96ff472..49541457264 100644 --- a/packages/connectors/connector-wechat-web/src/index.ts +++ b/packages/connectors/connector-wechat-web/src/index.ts @@ -101,8 +101,8 @@ const getUserInfo = searchParams: { access_token: accessToken, openid }, timeout: { request: defaultTimeout }, }); - - const result = userInfoResponseGuard.safeParse(parseJson(httpResponse.body)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -115,7 +115,7 @@ const getUserInfo = // 'errmsg' and 'errcode' turn to non-empty values or empty values at the same time. Hence, if 'errmsg' is non-empty then 'errcode' should be non-empty. userInfoResponseMessageParser(result.data); - return { id: unionid ?? openid, avatar: headimgurl, name: nickname }; + return { id: unionid ?? openid, avatar: headimgurl, name: nickname, rawData }; } catch (error: unknown) { return getUserInfoErrorHandler(error); } diff --git a/packages/connectors/connector-wecom/CHANGELOG.md b/packages/connectors/connector-wecom/CHANGELOG.md new file mode 100644 index 00000000000..b96f0187cdd --- /dev/null +++ b/packages/connectors/connector-wecom/CHANGELOG.md @@ -0,0 +1,15 @@ +# @logto/connector-wecom + +## 0.2.0 + +### Minor Changes + +- 57d97a4df: return and store social connector raw data + +### Patch Changes + +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [57d97a4df] +- Updated dependencies [2c10c2423] + - @logto/connector-kit@3.0.0 diff --git a/packages/connectors/connector-wecom/package.json b/packages/connectors/connector-wecom/package.json index 622de5d67a5..40ca4af76aa 100644 --- a/packages/connectors/connector-wecom/package.json +++ b/packages/connectors/connector-wecom/package.json @@ -1,10 +1,10 @@ { "name": "@logto/connector-wecom", - "version": "0.1.0", + "version": "0.2.0", "description": "Wecom connector implementation.", "author": "Dove fork from Wechat Web connector", "dependencies": { - "@logto/connector-kit": "workspace:^2.0.0" + "@logto/connector-kit": "workspace:^3.0.0" }, "main": "./lib/index.js", "module": "./lib/index.js", @@ -24,9 +24,8 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "engines": { diff --git a/packages/connectors/connector-wecom/src/index.test.ts b/packages/connectors/connector-wecom/src/index.test.ts index 474b1949df3..7f4d3a1a226 100644 --- a/packages/connectors/connector-wecom/src/index.test.ts +++ b/packages/connectors/connector-wecom/src/index.test.ts @@ -11,13 +11,11 @@ import { import createConnector, { getAccessToken } from './index.js'; import { mockedConfig } from './mock.js'; -const { jest } = import.meta; - -const getConfig = jest.fn().mockResolvedValue(mockedConfig); +const getConfig = vi.fn().mockResolvedValue(mockedConfig); describe('getAuthorizationUri', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should get a valid uri by redirectUri and state', async () => { @@ -31,7 +29,7 @@ describe('getAuthorizationUri', () => { jti: 'some_jti', headers: {}, }, - jest.fn() + vi.fn() ); const userAgent = 'some_UA'; const isWecom = userAgent.toLowerCase().includes('wxwork'); @@ -48,7 +46,7 @@ describe('getAuthorizationUri', () => { describe('getAccessToken', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); const accessTokenEndpointUrl = new URL(accessTokenEndpoint); @@ -74,7 +72,7 @@ describe('getAccessToken', () => { .get(accessTokenEndpointUrl.pathname) .query(parameters) .reply(200, { errcode: 40_029, errmsg: 'invalid code' }); - await expect(getAccessToken(mockedConfig)).rejects.toMatchError( + await expect(getAccessToken(mockedConfig)).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'invalid code') ); }); @@ -84,7 +82,7 @@ describe('getAccessToken', () => { .get(accessTokenEndpointUrl.pathname) .query(true) .reply(200, { errcode: 40_163, errmsg: 'code been used' }); - await expect(getAccessToken(mockedConfig)).rejects.toMatchError( + await expect(getAccessToken(mockedConfig)).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAuthCodeInvalid, 'code been used') ); }); @@ -94,7 +92,7 @@ describe('getAccessToken', () => { .get(accessTokenEndpointUrl.pathname) .query(true) .reply(200, { errcode: -1, errmsg: 'system error' }); - await expect(getAccessToken(mockedConfig)).rejects.toMatchError( + await expect(getAccessToken(mockedConfig)).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { errorDescription: 'system error', errcode: -1, @@ -128,33 +126,39 @@ describe('getUserInfo', () => { afterEach(() => { nock.cleanAll(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); const userInfoEndpointUrl = new URL(userInfoEndpoint); const parameters = new URLSearchParams({ access_token: 'access_token', code: 'code' }); it('should get valid SocialUserInfo', async () => { - nock(userInfoEndpointUrl.origin).get(userInfoEndpointUrl.pathname).query(parameters).reply(0, { + const jsonResponse = Object.freeze({ userid: 'wecom_id', + foo: 'bar', }); + nock(userInfoEndpointUrl.origin) + .get(userInfoEndpointUrl.pathname) + .query(parameters) + .reply(0, jsonResponse); const connector = await createConnector({ getConfig }); const socialUserInfo = await connector.getUserInfo( { code: 'code', }, - jest.fn() + vi.fn() ); expect(socialUserInfo).toMatchObject({ id: 'wecom_id', avatar: '', name: 'wecom_id', + rawData: jsonResponse, }); }); it('throws General error if code not provided in input', async () => { const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({}, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({}, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, '{}') ); }); @@ -169,7 +173,7 @@ describe('getUserInfo', () => { errmsg: 'missing openid', }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { errorDescription: 'missing openid', errcode: 41_009, @@ -183,7 +187,7 @@ describe('getUserInfo', () => { .query(parameters) .reply(200, { errcode: 40_001, errmsg: 'invalid credential' }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid, 'invalid credential') ); }); @@ -191,7 +195,7 @@ describe('getUserInfo', () => { it('throws unrecognized error', async () => { nock(userInfoEndpointUrl.origin).get(userInfoEndpointUrl.pathname).query(parameters).reply(500); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toThrow(); + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toThrow(); }); it('throws Error if request failed and errcode is not 40001', async () => { @@ -200,7 +204,7 @@ describe('getUserInfo', () => { .query(parameters) .reply(200, { errcode: 40_003, errmsg: 'invalid openid' }); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.General, { errorDescription: 'invalid openid', errcode: 40_003, @@ -211,7 +215,7 @@ describe('getUserInfo', () => { it('throws SocialAccessTokenInvalid error if response code is 401', async () => { nock(userInfoEndpointUrl.origin).get(userInfoEndpointUrl.pathname).query(parameters).reply(401); const connector = await createConnector({ getConfig }); - await expect(connector.getUserInfo({ code: 'code' }, jest.fn())).rejects.toMatchError( + await expect(connector.getUserInfo({ code: 'code' }, vi.fn())).rejects.toStrictEqual( new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid) ); }); diff --git a/packages/connectors/connector-wecom/src/index.ts b/packages/connectors/connector-wecom/src/index.ts index 1f8ee1114c8..266f2be8453 100644 --- a/packages/connectors/connector-wecom/src/index.ts +++ b/packages/connectors/connector-wecom/src/index.ts @@ -106,8 +106,8 @@ const getUserInfo = searchParams: { access_token: accessToken, code }, timeout: { request: defaultTimeout }, }); - - const result = userInfoResponseGuard.safeParse(parseJson(httpResponse.body)); + const rawData = parseJson(httpResponse.body); + const result = userInfoResponseGuard.safeParse(rawData); if (!result.success) { throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error); @@ -118,15 +118,18 @@ const getUserInfo = errorResponseHandler(result.data); // const { userid, openid } = result.data; + const id = userid ?? openid; - if (userid) { - return { id: userid, avatar: '', name: userid }; - } - if (openid) { - return { id: openid, avatar: '', name: openid }; + if (!id) { + throw new Error('Both userid and openid are undefined or null.'); } - throw new Error('Both userid and openid are undefined or null.'); - // Both userid and openid are null + + return { + id, + avatar: '', + name: id, + rawData, + }; } catch (error: unknown) { return getUserInfoErrorHandler(error); } diff --git a/packages/connectors/templates/package.json b/packages/connectors/templates/package.json index a74f8dcdd08..d750610fe60 100644 --- a/packages/connectors/templates/package.json +++ b/packages/connectors/templates/package.json @@ -17,38 +17,35 @@ "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput --incremental", "lint": "eslint --ext .ts src", "lint:report": "pnpm lint --format json --output-file report.json", - "test:only": "NODE_OPTIONS=--experimental-vm-modules jest", - "test": "pnpm build:test && pnpm test:only", - "test:ci": "pnpm test:only --silent --coverage", + "test": "vitest src", + "test:ci": "pnpm run test --silent --coverage", "prepublishOnly": "pnpm build" }, "dependencies": { "@silverhand/essentials": "^2.9.0", "got": "^14.0.0", - "snakecase-keys": "^6.0.0", + "snakecase-keys": "^7.0.0", "zod": "^3.22.4" }, "devDependencies": { - "@jest/types": "^29.5.0", "@rollup/plugin-commonjs": "^25.0.0", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", "@rollup/plugin-typescript": "^11.0.0", "@silverhand/eslint-config": "5.0.0", "@silverhand/ts-config": "5.0.0", - "@types/jest": "^29.4.0", "@types/node": "^20.9.5", "@types/supertest": "^6.0.0", + "@vitest/coverage-v8": "^1.4.0", "eslint": "^8.44.0", - "jest": "^29.7.0", - "jest-matcher-specific-error": "^1.0.0", "lint-staged": "^15.0.0", "nock": "^13.2.2", "prettier": "^3.0.0", "rollup": "^4.0.0", - "rollup-plugin-summary": "^2.0.0", + "rollup-plugin-output-size": "^1.3.0", "supertest": "^6.2.2", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "vitest": "^1.4.0" }, "engines": { "node": "^20.9.0" diff --git a/packages/connectors/templates/preset/jest.config.js b/packages/connectors/templates/preset/jest.config.js deleted file mode 100644 index 6ca9a171124..00000000000 --- a/packages/connectors/templates/preset/jest.config.js +++ /dev/null @@ -1,7 +0,0 @@ -/** @type {import('jest').Config} */ -const config = { - setupFilesAfterEnv: ['jest-matcher-specific-error'], - roots: ['lib'], -}; - -export default config; diff --git a/packages/connectors/templates/preset/rollup.config.js b/packages/connectors/templates/preset/rollup.config.js index 29a81ed5d06..df98e6a1c1b 100644 --- a/packages/connectors/templates/preset/rollup.config.js +++ b/packages/connectors/templates/preset/rollup.config.js @@ -2,7 +2,7 @@ import commonjs from '@rollup/plugin-commonjs'; import json from '@rollup/plugin-json'; import { nodeResolve } from '@rollup/plugin-node-resolve'; import typescript from '@rollup/plugin-typescript'; -import { summary } from 'rollup-plugin-summary'; +import outputSize from 'rollup-plugin-output-size'; /** * @type {import('rollup').RollupOptions} @@ -14,10 +14,10 @@ const configs = [ external: ['zod', 'got', '@logto/connector-kit'], plugins: [ typescript({ tsconfig: 'tsconfig.build.json' }), - nodeResolve({ exportConditions: ['node'] }), + nodeResolve({ exportConditions: ['node'], preferBuiltins: true }), commonjs(), json(), - summary(), + outputSize(), ], }, ]; diff --git a/packages/connectors/templates/preset/tsconfig.json b/packages/connectors/templates/preset/tsconfig.json index 40492907f59..4fa2dd684aa 100644 --- a/packages/connectors/templates/preset/tsconfig.json +++ b/packages/connectors/templates/preset/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "./tsconfig.base", "compilerOptions": { - "types": ["node", "jest", "jest-matcher-specific-error"] + "types": ["node", "vitest/globals"] }, "include": ["src", "types"] } diff --git a/packages/connectors/templates/preset/types/import-meta.d.ts b/packages/connectors/templates/preset/types/import-meta.d.ts deleted file mode 100644 index e016debb586..00000000000 --- a/packages/connectors/templates/preset/types/import-meta.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -interface ImportMeta { - jest: typeof jest & { - // Almost same as `jest.mock()`, but factory is required - unstable_mockModule: ( - moduleName: string, - factory: () => T, - options?: jest.MockOptions - ) => typeof jest; - }; -} diff --git a/packages/connectors/templates/preset/vitest.config.ts b/packages/connectors/templates/preset/vitest.config.ts new file mode 100644 index 00000000000..32ae898f000 --- /dev/null +++ b/packages/connectors/templates/preset/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + }, +}) diff --git a/packages/connectors/templates/sync-preset.js b/packages/connectors/templates/sync-preset.js index 1c4294d198f..65225ca181d 100644 --- a/packages/connectors/templates/sync-preset.js +++ b/packages/connectors/templates/sync-preset.js @@ -15,6 +15,11 @@ const templateJson = Object.fromEntries( ); const templateKeys = Object.keys(templateJson); +/** + * An object that contains exceptions for scripts that are allowed to be different from the template. + */ +const scriptExceptions = {}; + const sync = async () => { const packagesDirectory = './'; const packages = await fs.readdir(packagesDirectory); @@ -42,9 +47,23 @@ const sync = async () => { ); } + const scriptOverrides = scriptExceptions[packageName] + ? Object.fromEntries( + scriptExceptions[packageName].map((key) => [key, current.scripts[key]]) + ) + : {}; + await fs.writeFile( packageJsonPath, - JSON.stringify({ ...current, ...templateJson }, undefined, 2) + '\n' + JSON.stringify( + { + ...current, + ...templateJson, + scripts: { ...templateJson.scripts, ...scriptOverrides }, + }, + undefined, + 2 + ) + '\n' ); // Copy preset diff --git a/packages/console/CHANGELOG.md b/packages/console/CHANGELOG.md index 5cf1630705e..1d632565e22 100644 --- a/packages/console/CHANGELOG.md +++ b/packages/console/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## 1.13.0 + +### Minor Changes + +- 5758f84f5: feat(console): support signing-key rotation + +### Patch Changes + +- 746483c49: api resource indicator must be a valid absolute uri + + An invalid indicator will make Console crash without this check. + + Note: We don't mark it as a breaking change as the api behavior has not changed, only adding the check on Console. + ## 1.12.1 ### Patch Changes diff --git a/packages/console/generate.sh b/packages/console/generate.sh new file mode 100755 index 00000000000..d54dcf99a7d --- /dev/null +++ b/packages/console/generate.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +# Clean up +rm -rf scripts-js/ +# build the jwt-customizer-type-definition generate script +pnpm exec tsc -p tsconfig.scripts.gen.json +# clean up the existing generated jwt-customizer-type-definition file +rm -f src/consts/jwt-customizer-type-definition.ts +# run script +node scripts-js/generate-jwt-customizer-type-definition.js +# Clean up +rm -rf scripts-js/ diff --git a/packages/console/package.json b/packages/console/package.json index 64626cda817..d614198b90c 100644 --- a/packages/console/package.json +++ b/packages/console/package.json @@ -1,6 +1,6 @@ { "name": "@logto/console", - "version": "1.12.1", + "version": "1.13.0", "description": "> TODO: description", "author": "Silverhand Inc. ", "homepage": "https://github.com/logto-io/logto#readme", @@ -11,11 +11,13 @@ "dist" ], "scripts": { + "prepack": "pnpm generate", + "generate": "./generate.sh", "precommit": "lint-staged", "start": "parcel src/index.html", "dev": "cross-env PORT=5002 parcel src/index.html --public-url ${CONSOLE_PUBLIC_URL:-/console} --no-cache --hmr-port 6002", "check": "tsc --noEmit", - "build": "pnpm check && rm -rf dist && parcel build src/index.html --no-autoinstall --no-cache --public-url ${CONSOLE_PUBLIC_URL:-/console}", + "build": "pnpm generate && pnpm check && rm -rf dist && parcel build src/index.html --no-autoinstall --no-cache --public-url ${CONSOLE_PUBLIC_URL:-/console}", "lint": "eslint --ext .ts --ext .tsx src", "lint:report": "pnpm lint --format json --output-file report.json", "stylelint": "stylelint \"src/**/*.scss\"", @@ -26,16 +28,17 @@ "@fontsource/roboto-mono": "^5.0.0", "@jest/types": "^29.5.0", "@logto/app-insights": "workspace:^1.4.0", - "@logto/cloud": "0.2.5-faca9a9", - "@logto/connector-kit": "workspace:^2.1.0", - "@logto/core-kit": "workspace:^2.3.0", + "@logto/cloud": "0.2.5-ab8a489", + "@logto/connector-kit": "workspace:^3.0.0", + "@logto/core-kit": "workspace:^2.4.0", "@logto/language-kit": "workspace:^1.1.0", - "@logto/phrases": "workspace:^1.9.0", - "@logto/phrases-experience": "workspace:^1.6.0", - "@logto/react": "^3.0.0", - "@logto/schemas": "workspace:^1.13.1", + "@logto/phrases": "workspace:^1.10.0", + "@logto/phrases-experience": "workspace:^1.6.1", + "@logto/react": "^3.0.5", + "@logto/schemas": "workspace:^1.15.0", "@logto/shared": "workspace:^3.1.0", "@mdx-js/react": "^1.6.22", + "@monaco-editor/react": "^4.6.0", "@parcel/compressor-brotli": "2.9.3", "@parcel/compressor-gzip": "2.9.3", "@parcel/core": "2.9.3", @@ -60,7 +63,7 @@ "@types/react-helmet": "^6.1.6", "@types/react-modal": "^3.13.1", "@types/react-syntax-highlighter": "^15.5.1", - "@withtyped/client": "^0.7.22", + "@withtyped/client": "^0.8.4", "buffer": "^5.7.1", "classnames": "^2.3.1", "clean-deep": "^3.4.0", @@ -81,7 +84,7 @@ "jest-transform-stub": "^2.0.0", "jest-transformer-svg": "^2.0.0", "just-kebab-case": "^4.2.0", - "ky": "^1.0.0", + "ky": "^1.2.3", "libphonenumber-js": "^1.10.51", "lint-staged": "^15.0.0", "nanoid": "^5.0.1", @@ -120,7 +123,8 @@ "ts-node": "^10.9.2", "tslib": "^2.4.1", "typescript": "^5.3.3", - "zod": "^3.22.4" + "zod": "^3.22.4", + "zod-to-ts": "^1.2.0" }, "engines": { "node": "^20.9.0" @@ -140,6 +144,12 @@ }, "eslintConfig": { "extends": "@silverhand/react", + "parserOptions": { + "project": [ + "./tsconfig.json", + "./tsconfig.scripts.gen.json" + ] + }, "rules": { "react/function-component-definition": [ "error", diff --git a/packages/console/scripts/generate-jwt-customizer-type-definition.ts b/packages/console/scripts/generate-jwt-customizer-type-definition.ts new file mode 100644 index 00000000000..9b25077a20b --- /dev/null +++ b/packages/console/scripts/generate-jwt-customizer-type-definition.ts @@ -0,0 +1,75 @@ +import fs from 'node:fs'; + +import { + accessTokenPayloadGuard, + clientCredentialsPayloadGuard, + jwtCustomizerUserContextGuard, +} from '@logto/schemas'; +import prettier from 'prettier'; +import { type ZodTypeAny } from 'zod'; +import { printNode, zodToTs } from 'zod-to-ts'; + +const filePath = 'src/consts/jwt-customizer-type-definition.ts'; + +const typeIdentifiers = `export enum JwtCustomizerTypeDefinitionKey { + JwtCustomizerUserContext = 'JwtCustomizerUserContext', + AccessTokenPayload = 'AccessTokenPayload', + ClientCredentialsPayload = 'ClientCredentialsPayload', + EnvironmentVariables = 'EnvironmentVariables', +};`; + +const inferTsDefinitionFromZod = (zodSchema: ZodTypeAny, identifier: string): string => { + /** + * We have z.lazy() used for defining Json objects in the zod schemas. + * @see https://zod.dev/?id=json-type + * zod-to-ts does not support z.lazy() yet. It will use the root type of the lazy schema. Which will be the identifier we pass to the function. + * @see https://github.com/sachinraja/zod-to-ts?tab=readme-ov-file#zlazy + * + * The second argument is the root type identifier for the schema. + * Here we use 'Record' as the root type identifier. So all the Json objects will be inferred as Record. + * This is a limitation of zod-to-ts. We can't infer the exact type of the Json objects. + * This solution is hacky but it works for now. The impact is it will always define the type identifer as Record. + */ + const { node } = zodToTs(zodSchema, 'Record', { nativeEnums: 'union' }); + const typeDefinition = printNode(node); + + return `type ${identifier} = ${typeDefinition};`; +}; + +// Create the jwt-customizer-type-definition.ts file +const createJwtCustomizerTypeDefinitions = async () => { + const jwtCustomizerUserContextTypeDefinition = inferTsDefinitionFromZod( + jwtCustomizerUserContextGuard, + 'JwtCustomizerUserContext' + ); + + const accessTokenPayloadTypeDefinition = inferTsDefinitionFromZod( + accessTokenPayloadGuard, + 'AccessTokenPayload' + ); + + const clientCredentialsPayloadTypeDefinition = inferTsDefinitionFromZod( + clientCredentialsPayloadGuard, + 'ClientCredentialsPayload' + ); + + const fileContent = `/* This file is auto-generated. Do not modify it manually. */ +${typeIdentifiers} + +export const jwtCustomizerUserContextTypeDefinition = \`${jwtCustomizerUserContextTypeDefinition}\`; + +export const accessTokenPayloadTypeDefinition = \`${accessTokenPayloadTypeDefinition}\`; + +export const clientCredentialsPayloadTypeDefinition = \`${clientCredentialsPayloadTypeDefinition}\`; +`; + + const formattedFileContent = await prettier.format(fileContent, { + parser: 'typescript', + tabWidth: 2, + singleQuote: true, + }); + + fs.writeFileSync(filePath, formattedFileContent); +}; + +void createJwtCustomizerTypeDefinitions(); diff --git a/packages/console/src/App.tsx b/packages/console/src/App.tsx index 007f035a99b..451560e44fb 100644 --- a/packages/console/src/App.tsx +++ b/packages/console/src/App.tsx @@ -1,6 +1,6 @@ import { AppInsightsBoundary } from '@logto/app-insights/react'; import { UserScope } from '@logto/core-kit'; -import { LogtoProvider, useLogto } from '@logto/react'; +import { LogtoProvider, Prompt, useLogto } from '@logto/react'; import { adminConsoleApplicationId, defaultTenantId, @@ -22,11 +22,12 @@ import CloudAppRoutes from '@/cloud/AppRoutes'; import AppLoading from '@/components/AppLoading'; import { isCloud } from '@/consts/env'; import { cloudApi, getManagementApi, meApi } from '@/consts/resources'; +import { ConsoleRoutes } from '@/containers/ConsoleRoutes'; import useTrackUserId from '@/hooks/use-track-user-id'; import { OnboardingRoutes } from '@/onboarding'; import useUserOnboardingData from '@/onboarding/hooks/use-user-onboarding-data'; -import { ConsoleRoutes } from '@/pages/ConsoleRoutes'; +import { GlobalScripts } from './components/Conversion'; import { adminTenantEndpoint, mainTitle } from './consts'; import ErrorBoundary from './containers/ErrorBoundary'; import LogtoErrorBoundary from './containers/LogtoErrorBoundary'; @@ -109,6 +110,7 @@ function Providers() { appId: adminConsoleApplicationId, resources, scopes, + prompt: [Prompt.Login, Prompt.Consent], }} > @@ -153,5 +155,10 @@ function AppRoutes() { return ; } - return isAuthenticated && isOnboarding ? : ; + return ( + <> + + {isAuthenticated && isOnboarding ? : } + + ); } diff --git a/packages/console/src/assets/docs/single-sign-on/azure-oidc/README.mdx b/packages/console/src/assets/docs/single-sign-on/azure-oidc/README.mdx new file mode 100644 index 00000000000..0245fe9393d --- /dev/null +++ b/packages/console/src/assets/docs/single-sign-on/azure-oidc/README.mdx @@ -0,0 +1,78 @@ +import OidcCallbackUri from '@/mdx-components/OidcCallbackUri'; +import Step from '@/mdx-components/Step'; + +import createApplication from './assets/create_application.webp'; +import configApplication from './assets/config_application.webp'; +import applicationDetails from './assets/application_details.webp'; +import createSecret from './assets/create_secret.webp'; +import endpoints from './assets/endpoints.webp'; + + + +1. Go to the [Microsoft Entra admin center](https://entra.microsoft.com/) and sign in as an administrator. + +2. Browse to Identity > Applications > App registrations. + +
+ Create Application +
+ +3. Select `New registration`. + +4. Enter the application name and select the appropriate account type for your application. + +5. Select `Web` as the application platform. Enter the redirect URI for the application. The redirect URI is the URL where the user is redirected after they have authenticated with Microsoft Entra ID. + + + +
+ Configure Application +
+ +6. Click `Register` to create the application. + +
+ + + +After successfully creating an Microsoft Entra OIDC application, you will need to provide the IdP configurations back to Logto. Navigate to the `Connection` tab at Logto console, and fill in the following configurations: + +1. **Client ID**: A unique identifier assigned to your OIDC application by the Microsoft Entra. This identifier is used by Logto to identify and authenticate the application during the OIDC flow. You can find it in the application overview page as `Application (client) ID`. + +
+ Application Details +
+ +2. **Client Secret**: Create a new client secret and copy the value to Logto. This secret is used to authenticate the OIDC application and secure the communication between Logto and the IdP. + +
+ Create Secret +
+ +3. **Issuer**: The issuer URL, a unique identifier for the IdP, specifying the location where the OIDC identity provider can be found. It is a crucial part of the OIDC configuration as it helps Logto discover the necessary endpoints. + + Instead of manually provide all these OIDC endpoints, Logto fetch all the required configurations and IdP endpoints automatically. This is done by utilizing the issuer url you provided and making a call to the IdP's discover endpoint. + + To get the issuer URL, you can find it in the `Endpoints` section of the application overview page. + + Locate the `OpenID Connect metadata document` endpoint and copy the URL **WITHOUT** the trailing path `.well-known/openid-configuration`. This is because Logto will automatically append the `.well-known/openid-configuration` to the issuer URL when fetching the OIDC configurations. + +
+ Endpoints +
+ +4. **Scope**: A space-separated list of strings defining the desired permissions or access levels requested by Logto during the OIDC authentication process. The scope parameter allows you to specify what information and access Logto is requesting from the IdP. + +The scope parameter is optional. Regardless of the custom scope settings, Logto will always send the `openid`, `profile` and `email` scopes to the IdP. + +Click `Save` to finish the configuration process + +
+ + + +Provide the email `domains` of your organization on the connector `experience` tab. This will enabled the SSO connector as an authentication method for those users. + +Users with email addresses in the specified domains will be exclusively limited to use your SSO connector as their only authentication method. + + diff --git a/packages/console/src/assets/docs/single-sign-on/azure-oidc/assets/application_details.webp b/packages/console/src/assets/docs/single-sign-on/azure-oidc/assets/application_details.webp new file mode 100644 index 0000000000000000000000000000000000000000..909c0626c8df2741d14661d33ea036fec6cab376 GIT binary patch literal 492012 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∾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

No_0WxYbBgB4Z|*H1hu$X=n_ZuTd?x>y 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

k88Lppt6N3NwM%8W&Ntmw_puY(97k8-^ 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 z

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

    -z+r&=BsNz#wiHXSua9;q?sW1a~sa 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

    9cQ0X4GpY_V^9V|B^J#kR# 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

    2E*7zb8*tfK4Aj(@9#Q_p3y1`~5 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