@tempoxyz/id 0.0.0-pr-187.sha-eed04d3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -0
- package/dist/App.d.ts +20 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +26 -0
- package/dist/App.js.map +1 -0
- package/dist/app/client/.assetsignore +2 -0
- package/dist/app/client/assets/BRLA-CZvVDNYr.png +0 -0
- package/dist/app/client/assets/CHFAU-DCedc4aH.png +0 -0
- package/dist/app/client/assets/DLUSD-BnRXm3EI.png +0 -0
- package/dist/app/client/assets/PRIME-CiFp2-3e.svg +14 -0
- package/dist/app/client/assets/Pilat-Bold-C1t1eIrF.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Book-CbS8ofT8.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Demi-CADSbPAt.woff2 +0 -0
- package/dist/app/client/assets/Pilat-Regular-Bx8vzE7q.woff2 +0 -0
- package/dist/app/client/assets/USD1-COVcO_PB.svg +30 -0
- package/dist/app/client/assets/YLDS-CRh8Zw0g.svg +3 -0
- package/dist/app/client/assets/ccip-Cq1mMiVl.js +1 -0
- package/dist/app/client/assets/frxUSD-n9pTpinR.svg +1 -0
- package/dist/app/client/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/app/client/assets/index-B7YJVP00.css +1 -0
- package/dist/app/client/assets/index-UXTxXCLk.js +55 -0
- package/dist/app/client/assets/pathUSD-BvaO6ooS.svg +25 -0
- package/dist/app/client/assets/reset-co-CHrff.css +1 -0
- package/dist/app/client/assets/wYLDS-CaCKDrO-.svg +10 -0
- package/dist/app/db/auth.d.ts +3207 -0
- package/dist/app/db/auth.d.ts.map +1 -0
- package/dist/app/db/auth.js +330 -0
- package/dist/app/db/auth.js.map +1 -0
- package/dist/app/db/schema.d.ts +932 -0
- package/dist/app/db/schema.d.ts.map +1 -0
- package/dist/app/db/schema.js +171 -0
- package/dist/app/db/schema.js.map +1 -0
- package/dist/app/server/.vite/manifest.json +489 -0
- package/dist/app/server/assets/BRLA-CZvVDNYr.png +0 -0
- package/dist/app/server/assets/CHFAU-DCedc4aH.png +0 -0
- package/dist/app/server/assets/DLUSD-BnRXm3EI.png +0 -0
- package/dist/app/server/assets/PRIME-CiFp2-3e.svg +14 -0
- package/dist/app/server/assets/Pilat-Bold-C1t1eIrF.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Book-CbS8ofT8.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Demi-CADSbPAt.woff2 +0 -0
- package/dist/app/server/assets/Pilat-Regular-Bx8vzE7q.woff2 +0 -0
- package/dist/app/server/assets/USD1-COVcO_PB.svg +30 -0
- package/dist/app/server/assets/YLDS-CRh8Zw0g.svg +3 -0
- package/dist/app/server/assets/_tanstack-start-manifest_v-DjQNeRZp.js +1 -0
- package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js +2 -0
- package/dist/app/server/assets/arktype-aI7TBD0R-D1R3Byo5.js.map +1 -0
- package/dist/app/server/assets/authorize-C95F-9E1-CbESJKGU.js +31 -0
- package/dist/app/server/assets/authorize-C95F-9E1-CbESJKGU.js.map +1 -0
- package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js +2 -0
- package/dist/app/server/assets/bun-sqlite-dialect-DoOVo4ja-CtyBkVMb.js.map +1 -0
- package/dist/app/server/assets/call-UQamaCKN.js +32 -0
- package/dist/app/server/assets/call-UQamaCKN.js.map +1 -0
- package/dist/app/server/assets/ccip-CbNKFO4n.js +2 -0
- package/dist/app/server/assets/ccip-CbNKFO4n.js.map +1 -0
- package/dist/app/server/assets/compiled-query-Ds2NVcFT.js +2 -0
- package/dist/app/server/assets/compiled-query-Ds2NVcFT.js.map +1 -0
- package/dist/app/server/assets/convert-BIC8n32x.js +2 -0
- package/dist/app/server/assets/convert-BIC8n32x.js.map +1 -0
- package/dist/app/server/assets/cookie-CS900nSP.css +1 -0
- package/dist/app/server/assets/cookie-Cce9CrIP.js +10 -0
- package/dist/app/server/assets/cookie-Cce9CrIP.js.map +1 -0
- package/dist/app/server/assets/core-B1HCXUmx.js +56 -0
- package/dist/app/server/assets/core-B1HCXUmx.js.map +1 -0
- package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js +2 -0
- package/dist/app/server/assets/d1-sqlite-dialect-m0f01-4z-Cv-csE1u.js.map +1 -0
- package/dist/app/server/assets/default-u_dwuiYb-BJJ9PwCi.js +2 -0
- package/dist/app/server/assets/default-u_dwuiYb-BJJ9PwCi.js.map +1 -0
- package/dist/app/server/assets/dist-BxSwugSY.js +1 -0
- package/dist/app/server/assets/dist-CZGFhmQd.js +2 -0
- package/dist/app/server/assets/dist-CZGFhmQd.js.map +1 -0
- package/dist/app/server/assets/dist-Dg3PQqiW.js +15 -0
- package/dist/app/server/assets/dist-Dg3PQqiW.js.map +1 -0
- package/dist/app/server/assets/effect-QlVUlMFu-2tSPDT2b.js +2 -0
- package/dist/app/server/assets/effect-QlVUlMFu-2tSPDT2b.js.map +1 -0
- package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js +2 -0
- package/dist/app/server/assets/empty-plugin-adapters-BaGcmrjC.js.map +1 -0
- package/dist/app/server/assets/factory-ipHlJXZY.js +5 -0
- package/dist/app/server/assets/factory-ipHlJXZY.js.map +1 -0
- package/dist/app/server/assets/frxUSD-n9pTpinR.svg +1 -0
- package/dist/app/server/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/app/server/assets/get-id-field-B0x109VU.js +6 -0
- package/dist/app/server/assets/get-id-field-B0x109VU.js.map +1 -0
- package/dist/app/server/assets/index-CLddUTqr-xpSuLpBt.js +2 -0
- package/dist/app/server/assets/index-CLddUTqr-xpSuLpBt.js.map +1 -0
- package/dist/app/server/assets/index-DZEfthgZ-8Uq5s5Pt.js +2 -0
- package/dist/app/server/assets/index-DZEfthgZ-8Uq5s5Pt.js.map +1 -0
- package/dist/app/server/assets/kysely-adapter-MkHAI9Jk.js +1 -0
- package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js +2 -0
- package/dist/app/server/assets/node-sqlite-dialect-BowWLXvK.js.map +1 -0
- package/dist/app/server/assets/pathUSD-BvaO6ooS.svg +25 -0
- package/dist/app/server/assets/reset-co-CHrff.css +1 -0
- package/dist/app/server/assets/rolldown-runtime-B0Z9INg1.js +1 -0
- package/dist/app/server/assets/router-CcbyBCI4.css +1 -0
- package/dist/app/server/assets/router-xjZtEeaI.js +7 -0
- package/dist/app/server/assets/router-xjZtEeaI.js.map +1 -0
- package/dist/app/server/assets/schema-check-Cf7QOZZD.js +9 -0
- package/dist/app/server/assets/schema-check-Cf7QOZZD.js.map +1 -0
- package/dist/app/server/assets/schemas-C2lCYmR5.js +2 -0
- package/dist/app/server/assets/schemas-C2lCYmR5.js.map +1 -0
- package/dist/app/server/assets/secp256k1-buM5g4AL.js +2 -0
- package/dist/app/server/assets/secp256k1-buM5g4AL.js.map +1 -0
- package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js +2 -0
- package/dist/app/server/assets/sqlite-adapter-C_LAV4e3.js.map +1 -0
- package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js +6 -0
- package/dist/app/server/assets/sqlite-introspector-DSCAP82F-Crx7Ny14.js.map +1 -0
- package/dist/app/server/assets/standard-json-Cg1N07hM.js +2 -0
- package/dist/app/server/assets/standard-json-Cg1N07hM.js.map +1 -0
- package/dist/app/server/assets/standard-json-DY77efq0.js +2 -0
- package/dist/app/server/assets/standard-json-DY77efq0.js.map +1 -0
- package/dist/app/server/assets/standard-json-ig2t0wRt.js +2 -0
- package/dist/app/server/assets/standard-json-ig2t0wRt.js.map +1 -0
- package/dist/app/server/assets/standard-json-t-LNckA6.js +2 -0
- package/dist/app/server/assets/standard-json-t-LNckA6.js.map +1 -0
- package/dist/app/server/assets/standard-openapi-CONmVRl8.js +2 -0
- package/dist/app/server/assets/standard-openapi-CONmVRl8.js.map +1 -0
- package/dist/app/server/assets/start-C63VetBp.js +2 -0
- package/dist/app/server/assets/start-C63VetBp.js.map +1 -0
- package/dist/app/server/assets/sury-CWZTCd75-xt1mWc9f.js +2 -0
- package/dist/app/server/assets/sury-CWZTCd75-xt1mWc9f.js.map +1 -0
- package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js +2 -0
- package/dist/app/server/assets/typebox-Dei93FPO-D_lCVdAz.js.map +1 -0
- package/dist/app/server/assets/utils-C4ZXZIZW.js +2 -0
- package/dist/app/server/assets/utils-C4ZXZIZW.js.map +1 -0
- package/dist/app/server/assets/valibot--1zFm7rT-NSoY2xTp.js +2 -0
- package/dist/app/server/assets/valibot--1zFm7rT-NSoY2xTp.js.map +1 -0
- package/dist/app/server/assets/valibot-D_HTw1Gn-CJwWeOUE.js +2 -0
- package/dist/app/server/assets/valibot-D_HTw1Gn-CJwWeOUE.js.map +1 -0
- package/dist/app/server/assets/wYLDS-CaCKDrO-.svg +10 -0
- package/dist/app/server/assets/zod-Bwrt9trS-CV38yPnQ.js +2 -0
- package/dist/app/server/assets/zod-Bwrt9trS-CV38yPnQ.js.map +1 -0
- package/dist/app/server/assets/zod-DSgpEGAE-BvlnBE2L.js +2 -0
- package/dist/app/server/assets/zod-DSgpEGAE-BvlnBE2L.js.map +1 -0
- package/dist/app/server/index.js +574 -0
- package/dist/app/server/index.js.map +1 -0
- package/dist/app/server/wrangler.json +1 -0
- package/dist/cli/Admin.d.ts +38 -0
- package/dist/cli/Admin.d.ts.map +1 -0
- package/dist/cli/Admin.js +62 -0
- package/dist/cli/Admin.js.map +1 -0
- package/dist/cli/Apps.d.ts +9 -0
- package/dist/cli/Apps.d.ts.map +1 -0
- package/dist/cli/Apps.js +36 -0
- package/dist/cli/Apps.js.map +1 -0
- package/dist/cli/Cli.d.ts +14 -0
- package/dist/cli/Cli.d.ts.map +1 -0
- package/dist/cli/Cli.js +27 -0
- package/dist/cli/Cli.js.map +1 -0
- package/dist/cli/Project.d.ts +20 -0
- package/dist/cli/Project.d.ts.map +1 -0
- package/dist/cli/Project.js +88 -0
- package/dist/cli/Project.js.map +1 -0
- package/dist/cli/Realms.d.ts +24 -0
- package/dist/cli/Realms.d.ts.map +1 -0
- package/dist/cli/Realms.js +49 -0
- package/dist/cli/Realms.js.map +1 -0
- package/dist/cli/Session.d.ts +85 -0
- package/dist/cli/Session.d.ts.map +1 -0
- package/dist/cli/Session.js +178 -0
- package/dist/cli/Session.js.map +1 -0
- package/dist/cli/User.d.ts +29 -0
- package/dist/cli/User.d.ts.map +1 -0
- package/dist/cli/User.js +39 -0
- package/dist/cli/User.js.map +1 -0
- package/dist/cli/V1.d.ts +35 -0
- package/dist/cli/V1.d.ts.map +1 -0
- package/dist/cli/V1.js +41 -0
- package/dist/cli/V1.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +46 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/admin/apps/create.d.ts +23 -0
- package/dist/cli/commands/admin/apps/create.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/create.js +89 -0
- package/dist/cli/commands/admin/apps/create.js.map +1 -0
- package/dist/cli/commands/admin/apps/delete.d.ts +14 -0
- package/dist/cli/commands/admin/apps/delete.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/delete.js +41 -0
- package/dist/cli/commands/admin/apps/delete.js.map +1 -0
- package/dist/cli/commands/admin/apps/index.d.ts +5 -0
- package/dist/cli/commands/admin/apps/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/index.js +14 -0
- package/dist/cli/commands/admin/apps/index.js.map +1 -0
- package/dist/cli/commands/admin/apps/list.d.ts +9 -0
- package/dist/cli/commands/admin/apps/list.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/list.js +26 -0
- package/dist/cli/commands/admin/apps/list.js.map +1 -0
- package/dist/cli/commands/admin/apps/rotate-secret.d.ts +16 -0
- package/dist/cli/commands/admin/apps/rotate-secret.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/rotate-secret.js +47 -0
- package/dist/cli/commands/admin/apps/rotate-secret.js.map +1 -0
- package/dist/cli/commands/admin/apps/update.d.ts +20 -0
- package/dist/cli/commands/admin/apps/update.d.ts.map +1 -0
- package/dist/cli/commands/admin/apps/update.js +76 -0
- package/dist/cli/commands/admin/apps/update.js.map +1 -0
- package/dist/cli/commands/admin/index.d.ts +5 -0
- package/dist/cli/commands/admin/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/index.js +13 -0
- package/dist/cli/commands/admin/index.js.map +1 -0
- package/dist/cli/commands/admin/migrate.d.ts +9 -0
- package/dist/cli/commands/admin/migrate.d.ts.map +1 -0
- package/dist/cli/commands/admin/migrate.js +17 -0
- package/dist/cli/commands/admin/migrate.js.map +1 -0
- package/dist/cli/commands/admin/realms/add.d.ts +12 -0
- package/dist/cli/commands/admin/realms/add.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/add.js +42 -0
- package/dist/cli/commands/admin/realms/add.js.map +1 -0
- package/dist/cli/commands/admin/realms/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/index.js +13 -0
- package/dist/cli/commands/admin/realms/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/list.d.ts +13 -0
- package/dist/cli/commands/admin/realms/list.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/list.js +36 -0
- package/dist/cli/commands/admin/realms/list.js.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/passkeys/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/index.js +13 -0
- package/dist/cli/commands/admin/realms/passkeys/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/set.d.ts +16 -0
- package/dist/cli/commands/admin/realms/passkeys/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/passkeys/set.js +46 -0
- package/dist/cli/commands/admin/realms/passkeys/set.js.map +1 -0
- package/dist/cli/commands/admin/realms/privy/index.d.ts +5 -0
- package/dist/cli/commands/admin/realms/privy/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/privy/index.js +13 -0
- package/dist/cli/commands/admin/realms/privy/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/privy/set.d.ts +18 -0
- package/dist/cli/commands/admin/realms/privy/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/privy/set.js +66 -0
- package/dist/cli/commands/admin/realms/privy/set.js.map +1 -0
- package/dist/cli/commands/admin/realms/remove.d.ts +11 -0
- package/dist/cli/commands/admin/realms/remove.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/remove.js +35 -0
- package/dist/cli/commands/admin/realms/remove.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts +15 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.js +42 -0
- package/dist/cli/commands/admin/realms/secp256k1/disable.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts +15 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.js +42 -0
- package/dist/cli/commands/admin/realms/secp256k1/enable.js.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.d.ts +9 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.js +17 -0
- package/dist/cli/commands/admin/realms/secp256k1/index.js.map +1 -0
- package/dist/cli/commands/admin/realms/set.d.ts +16 -0
- package/dist/cli/commands/admin/realms/set.d.ts.map +1 -0
- package/dist/cli/commands/admin/realms/set.js +46 -0
- package/dist/cli/commands/admin/realms/set.js.map +1 -0
- package/dist/cli/commands/admin/rotate-key.d.ts +15 -0
- package/dist/cli/commands/admin/rotate-key.d.ts.map +1 -0
- package/dist/cli/commands/admin/rotate-key.js +46 -0
- package/dist/cli/commands/admin/rotate-key.js.map +1 -0
- package/dist/cli/commands/init.d.ts +11 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +34 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/login.d.ts +12 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +29 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +8 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +12 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +24 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/client/Actions.d.ts +101 -0
- package/dist/client/Actions.d.ts.map +1 -0
- package/dist/client/Actions.js +90 -0
- package/dist/client/Actions.js.map +1 -0
- package/dist/client/Auth.d.ts +161 -0
- package/dist/client/Auth.d.ts.map +1 -0
- package/dist/client/Auth.js +113 -0
- package/dist/client/Auth.js.map +1 -0
- package/dist/client/Authorization.d.ts +29 -0
- package/dist/client/Authorization.d.ts.map +1 -0
- package/dist/client/Authorization.js +12 -0
- package/dist/client/Authorization.js.map +1 -0
- package/dist/client/Decorator.d.ts +170 -0
- package/dist/client/Decorator.d.ts.map +1 -0
- package/dist/client/Decorator.js +227 -0
- package/dist/client/Decorator.js.map +1 -0
- package/dist/client/Key.d.ts +85 -0
- package/dist/client/Key.d.ts.map +1 -0
- package/dist/client/Key.js +83 -0
- package/dist/client/Key.js.map +1 -0
- package/dist/client/Pending.d.ts +39 -0
- package/dist/client/Pending.d.ts.map +1 -0
- package/dist/client/Pending.js +12 -0
- package/dist/client/Pending.js.map +1 -0
- package/dist/client/Permissions.d.ts +34 -0
- package/dist/client/Permissions.d.ts.map +1 -0
- package/dist/client/Permissions.js +16 -0
- package/dist/client/Permissions.js.map +1 -0
- package/dist/client/Provider.d.ts +16 -0
- package/dist/client/Provider.d.ts.map +1 -0
- package/dist/client/Provider.js +12 -0
- package/dist/client/Provider.js.map +1 -0
- package/dist/client/Step.d.ts +21 -0
- package/dist/client/Step.d.ts.map +1 -0
- package/dist/client/Step.js +16 -0
- package/dist/client/Step.js.map +1 -0
- package/dist/client/Storage.d.ts +27 -0
- package/dist/client/Storage.d.ts.map +1 -0
- package/dist/client/Storage.js +16 -0
- package/dist/client/Storage.js.map +1 -0
- package/dist/client/TempoAccount.d.ts +40 -0
- package/dist/client/TempoAccount.d.ts.map +1 -0
- package/dist/client/TempoAccount.js +16 -0
- package/dist/client/TempoAccount.js.map +1 -0
- package/dist/client/Tokens.d.ts +25 -0
- package/dist/client/Tokens.d.ts.map +1 -0
- package/dist/client/Tokens.js +12 -0
- package/dist/client/Tokens.js.map +1 -0
- package/dist/client/User.d.ts +21 -0
- package/dist/client/User.d.ts.map +1 -0
- package/dist/client/User.js +12 -0
- package/dist/client/User.js.map +1 -0
- package/dist/client/actions/account.d.ts +25 -0
- package/dist/client/actions/account.d.ts.map +1 -0
- package/dist/client/actions/account.js +34 -0
- package/dist/client/actions/account.js.map +1 -0
- package/dist/client/actions/device.d.ts +53 -0
- package/dist/client/actions/device.d.ts.map +1 -0
- package/dist/client/actions/device.js +79 -0
- package/dist/client/actions/device.js.map +1 -0
- package/dist/client/actions/email.d.ts +84 -0
- package/dist/client/actions/email.d.ts.map +1 -0
- package/dist/client/actions/email.js +63 -0
- package/dist/client/actions/email.js.map +1 -0
- package/dist/client/actions/oauth.d.ts +115 -0
- package/dist/client/actions/oauth.d.ts.map +1 -0
- package/dist/client/actions/oauth.js +105 -0
- package/dist/client/actions/oauth.js.map +1 -0
- package/dist/client/actions/passkey.d.ts +88 -0
- package/dist/client/actions/passkey.d.ts.map +1 -0
- package/dist/client/actions/passkey.js +60 -0
- package/dist/client/actions/passkey.js.map +1 -0
- package/dist/client/actions/provider.d.ts +49 -0
- package/dist/client/actions/provider.d.ts.map +1 -0
- package/dist/client/actions/provider.js +34 -0
- package/dist/client/actions/provider.js.map +1 -0
- package/dist/client/actions/realm.d.ts +24 -0
- package/dist/client/actions/realm.d.ts.map +1 -0
- package/dist/client/actions/realm.js +15 -0
- package/dist/client/actions/realm.js.map +1 -0
- package/dist/client/actions/redirect.d.ts +153 -0
- package/dist/client/actions/redirect.d.ts.map +1 -0
- package/dist/client/actions/redirect.js +236 -0
- package/dist/client/actions/redirect.js.map +1 -0
- package/dist/client/internal/accessKey.d.ts +21 -0
- package/dist/client/internal/accessKey.d.ts.map +1 -0
- package/dist/client/internal/accessKey.js +38 -0
- package/dist/client/internal/accessKey.js.map +1 -0
- package/dist/client/internal/account.d.ts +14 -0
- package/dist/client/internal/account.d.ts.map +1 -0
- package/dist/client/internal/account.js +3 -0
- package/dist/client/internal/account.js.map +1 -0
- package/dist/client/internal/api.d.ts +106 -0
- package/dist/client/internal/api.d.ts.map +1 -0
- package/dist/client/internal/api.js +129 -0
- package/dist/client/internal/api.js.map +1 -0
- package/dist/client/internal/headless.d.ts +33 -0
- package/dist/client/internal/headless.d.ts.map +1 -0
- package/dist/client/internal/headless.js +46 -0
- package/dist/client/internal/headless.js.map +1 -0
- package/dist/client/internal/indexedDb.d.ts +9 -0
- package/dist/client/internal/indexedDb.d.ts.map +1 -0
- package/dist/client/internal/indexedDb.js +32 -0
- package/dist/client/internal/indexedDb.js.map +1 -0
- package/dist/client/internal/request.d.ts +58 -0
- package/dist/client/internal/request.d.ts.map +1 -0
- package/dist/client/internal/request.js +45 -0
- package/dist/client/internal/request.js.map +1 -0
- package/dist/client/internal/store.d.ts +12 -0
- package/dist/client/internal/store.d.ts.map +1 -0
- package/dist/client/internal/store.js +15 -0
- package/dist/client/internal/store.js.map +1 -0
- package/dist/client.d.ts +20 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +20 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/Apps.d.ts +3051 -0
- package/dist/internal/Apps.d.ts.map +1 -0
- package/dist/internal/Apps.js +472 -0
- package/dist/internal/Apps.js.map +1 -0
- package/dist/internal/Auth.d.ts +4058 -0
- package/dist/internal/Auth.d.ts.map +1 -0
- package/dist/internal/Auth.js +137 -0
- package/dist/internal/Auth.js.map +1 -0
- package/dist/internal/Authorize.d.ts +532 -0
- package/dist/internal/Authorize.d.ts.map +1 -0
- package/dist/internal/Authorize.js +326 -0
- package/dist/internal/Authorize.js.map +1 -0
- package/dist/internal/Device.d.ts +371 -0
- package/dist/internal/Device.d.ts.map +1 -0
- package/dist/internal/Device.js +271 -0
- package/dist/internal/Device.js.map +1 -0
- package/dist/internal/Env.d.ts +57 -0
- package/dist/internal/Env.d.ts.map +1 -0
- package/dist/internal/Env.js +2 -0
- package/dist/internal/Env.js.map +1 -0
- package/dist/internal/ErrorResponse.d.ts +609 -0
- package/dist/internal/ErrorResponse.d.ts.map +1 -0
- package/dist/internal/ErrorResponse.js +679 -0
- package/dist/internal/ErrorResponse.js.map +1 -0
- package/dist/internal/Id.d.ts +10 -0
- package/dist/internal/Id.d.ts.map +1 -0
- package/dist/internal/Id.js +34 -0
- package/dist/internal/Id.js.map +1 -0
- package/dist/internal/KeyAuthorization.d.ts +1456 -0
- package/dist/internal/KeyAuthorization.d.ts.map +1 -0
- package/dist/internal/KeyAuthorization.js +1030 -0
- package/dist/internal/KeyAuthorization.js.map +1 -0
- package/dist/internal/Limits.d.ts +65 -0
- package/dist/internal/Limits.d.ts.map +1 -0
- package/dist/internal/Limits.js +35 -0
- package/dist/internal/Limits.js.map +1 -0
- package/dist/internal/Log.d.ts +49 -0
- package/dist/internal/Log.d.ts.map +1 -0
- package/dist/internal/Log.js +101 -0
- package/dist/internal/Log.js.map +1 -0
- package/dist/internal/LogLine.d.ts +33 -0
- package/dist/internal/LogLine.d.ts.map +1 -0
- package/dist/internal/LogLine.js +56 -0
- package/dist/internal/LogLine.js.map +1 -0
- package/dist/internal/Migrations.d.ts +19 -0
- package/dist/internal/Migrations.d.ts.map +1 -0
- package/dist/internal/Migrations.js +57 -0
- package/dist/internal/Migrations.js.map +1 -0
- package/dist/internal/Owner.d.ts +146 -0
- package/dist/internal/Owner.d.ts.map +1 -0
- package/dist/internal/Owner.js +65 -0
- package/dist/internal/Owner.js.map +1 -0
- package/dist/internal/Passkey.d.ts +528 -0
- package/dist/internal/Passkey.d.ts.map +1 -0
- package/dist/internal/Passkey.js +658 -0
- package/dist/internal/Passkey.js.map +1 -0
- package/dist/internal/PendingKey.d.ts +49 -0
- package/dist/internal/PendingKey.d.ts.map +1 -0
- package/dist/internal/PendingKey.js +58 -0
- package/dist/internal/PendingKey.js.map +1 -0
- package/dist/internal/Privy.d.ts +105 -0
- package/dist/internal/Privy.d.ts.map +1 -0
- package/dist/internal/Privy.js +224 -0
- package/dist/internal/Privy.js.map +1 -0
- package/dist/internal/RateLimit.d.ts +190 -0
- package/dist/internal/RateLimit.d.ts.map +1 -0
- package/dist/internal/RateLimit.js +148 -0
- package/dist/internal/RateLimit.js.map +1 -0
- package/dist/internal/Realm.d.ts +281 -0
- package/dist/internal/Realm.d.ts.map +1 -0
- package/dist/internal/Realm.js +477 -0
- package/dist/internal/Realm.js.map +1 -0
- package/dist/internal/RequestId.d.ts +16 -0
- package/dist/internal/RequestId.d.ts.map +1 -0
- package/dist/internal/RequestId.js +78 -0
- package/dist/internal/RequestId.js.map +1 -0
- package/dist/internal/SigningKey.d.ts +115 -0
- package/dist/internal/SigningKey.d.ts.map +1 -0
- package/dist/internal/SigningKey.js +197 -0
- package/dist/internal/SigningKey.js.map +1 -0
- package/dist/internal/TestInbox.d.ts +42 -0
- package/dist/internal/TestInbox.d.ts.map +1 -0
- package/dist/internal/TestInbox.js +20 -0
- package/dist/internal/TestInbox.js.map +1 -0
- package/dist/internal/Timing.d.ts +51 -0
- package/dist/internal/Timing.d.ts.map +1 -0
- package/dist/internal/Timing.js +103 -0
- package/dist/internal/Timing.js.map +1 -0
- package/dist/internal/Validation.d.ts +52 -0
- package/dist/internal/Validation.d.ts.map +1 -0
- package/dist/internal/Validation.js +22 -0
- package/dist/internal/Validation.js.map +1 -0
- package/dist/internal/Wallet.d.ts +37 -0
- package/dist/internal/Wallet.d.ts.map +1 -0
- package/dist/internal/Wallet.js +43 -0
- package/dist/internal/Wallet.js.map +1 -0
- package/dist/worker.d.ts +12 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +12 -0
- package/dist/worker.js.map +1 -0
- package/package.json +82 -0
- package/src/Api.ts +151 -0
- package/src/App.ts +56 -0
- package/src/api/account.ts +311 -0
- package/src/api/authenticate.ts +1290 -0
- package/src/api/authorize.ts +1030 -0
- package/src/api/device.ts +874 -0
- package/src/api/health.ts +72 -0
- package/src/api/lib/AccountStep.ts +335 -0
- package/src/api/lib/Auth.ts +134 -0
- package/src/api/lib/Consent.ts +339 -0
- package/src/api/lib/Cors.ts +107 -0
- package/src/api/lib/Database.ts +10 -0
- package/src/api/lib/DeviceRequest.ts +265 -0
- package/src/api/lib/FirstAccount.ts +90 -0
- package/src/api/lib/KeySigner.ts +393 -0
- package/src/api/lib/PasskeyLink.ts +162 -0
- package/src/api/lib/Session.ts +34 -0
- package/src/api/lib/SignInConsent.ts +316 -0
- package/src/api/oauth.ts +1282 -0
- package/src/api/provider.ts +441 -0
- package/src/app/components/Button.tsx +128 -0
- package/src/app/components/CodeInput.tsx +186 -0
- package/src/app/components/ErrorMessage.tsx +66 -0
- package/src/app/components/Grant.tsx +323 -0
- package/src/app/components/Input.tsx +48 -0
- package/src/app/components/Tooltip.tsx +45 -0
- package/src/app/components/icons/BRLA.png +0 -0
- package/src/app/components/icons/BRZ.svg +1 -0
- package/src/app/components/icons/CHFAU.png +0 -0
- package/src/app/components/icons/DLUSD.png +0 -0
- package/src/app/components/icons/EURAU.svg +1 -0
- package/src/app/components/icons/EURC.e.svg +1 -0
- package/src/app/components/icons/GBPA.svg +4 -0
- package/src/app/components/icons/GUSD.svg +1 -0
- package/src/app/components/icons/MACH.svg +4 -0
- package/src/app/components/icons/OUSD.svg +5 -0
- package/src/app/components/icons/PRIME.svg +14 -0
- package/src/app/components/icons/SBC.svg +1 -0
- package/src/app/components/icons/SEKAU.svg +5 -0
- package/src/app/components/icons/USD1.svg +30 -0
- package/src/app/components/icons/USDB.svg +11 -0
- package/src/app/components/icons/USDC.e.svg +1 -0
- package/src/app/components/icons/USDT0.svg +1 -0
- package/src/app/components/icons/USDY.svg +16 -0
- package/src/app/components/icons/USDe.svg +1 -0
- package/src/app/components/icons/YLDS.svg +3 -0
- package/src/app/components/icons/alphaUSD.svg +1 -0
- package/src/app/components/icons/betaUSD.svg +1 -0
- package/src/app/components/icons/cUSD.svg +1 -0
- package/src/app/components/icons/cbBTC.svg +1 -0
- package/src/app/components/icons/frxUSD.svg +1 -0
- package/src/app/components/icons/goUSD.svg +5 -0
- package/src/app/components/icons/iUSD.svg +1 -0
- package/src/app/components/icons/pathUSD.svg +25 -0
- package/src/app/components/icons/rUSD.svg +1 -0
- package/src/app/components/icons/reUSD.svg +1 -0
- package/src/app/components/icons/sUSDe.svg +1 -0
- package/src/app/components/icons/siUSD.svg +1 -0
- package/src/app/components/icons/stcUSD.svg +1 -0
- package/src/app/components/icons/syrupUSDC.svg +5 -0
- package/src/app/components/icons/thetaUSD.svg +1 -0
- package/src/app/components/icons/wYLDS.svg +10 -0
- package/src/app/components/icons/wsrUSD.svg +1 -0
- package/src/app/components/logos/OUSD.dark.svg +17 -0
- package/src/app/components/logos/OUSD.light.svg +17 -0
- package/src/app/crons/cleanup.ts +42 -0
- package/src/app/db/auth.ts +416 -0
- package/src/app/db/migrations/0000_better_auth.sql +53 -0
- package/src/app/db/migrations/0001_oauth_provider.sql +162 -0
- package/src/app/db/migrations/0002_device_code.sql +17 -0
- package/src/app/db/migrations/0003_realms.sql +27 -0
- package/src/app/db/migrations/0004_default_realm.sql +2 -0
- package/src/app/db/migrations/0005_passkeys.sql +30 -0
- package/src/app/db/migrations/0006_first_accounts.sql +9 -0
- package/src/app/db/migrations/0007_pending_keys.sql +13 -0
- package/src/app/db/migrations/0008_secp256k1_owners.sql +18 -0
- package/src/app/db/migrations/0009_device_requests.sql +8 -0
- package/src/app/db/migrations/0010_device_keys.sql +4 -0
- package/src/app/db/migrations/meta/0000_snapshot.json +362 -0
- package/src/app/db/migrations/meta/0001_snapshot.json +1487 -0
- package/src/app/db/migrations/meta/0002_snapshot.json +1603 -0
- package/src/app/db/migrations/meta/0003_snapshot.json +1760 -0
- package/src/app/db/migrations/meta/0004_snapshot.json +1760 -0
- package/src/app/db/migrations/meta/0005_snapshot.json +1911 -0
- package/src/app/db/migrations/meta/0006_snapshot.json +1967 -0
- package/src/app/db/migrations/meta/0007_snapshot.json +2047 -0
- package/src/app/db/migrations/meta/0008_snapshot.json +2157 -0
- package/src/app/db/migrations/meta/0009_snapshot.json +2207 -0
- package/src/app/db/migrations/meta/0010_snapshot.json +2231 -0
- package/src/app/db/migrations/meta/_journal.json +83 -0
- package/src/app/db/schema.ts +218 -0
- package/src/app/env.ts +49 -0
- package/src/app/lib/Client.ts +82 -0
- package/src/app/lib/Loader.ts +24 -0
- package/src/app/package.json +8 -0
- package/src/app/routeTree.gen.ts +198 -0
- package/src/app/router.tsx +48 -0
- package/src/app/routes/[_].flows.tsx +3001 -0
- package/src/app/routes/__root.tsx +91 -0
- package/src/app/routes/authorize.tsx +197 -0
- package/src/app/routes/choose-account.tsx +111 -0
- package/src/app/routes/deposit.tsx +105 -0
- package/src/app/routes/device.tsx +227 -0
- package/src/app/routes/index.tsx +115 -0
- package/src/app/routes/login.tsx +506 -0
- package/src/app/screens/Account.tsx +347 -0
- package/src/app/screens/Approval.tsx +276 -0
- package/src/app/screens/ChooseAccount.tsx +240 -0
- package/src/app/screens/Deposit.tsx +762 -0
- package/src/app/screens/DeviceApproval.tsx +480 -0
- package/src/app/screens/SignIn.tsx +362 -0
- package/src/app/screens/chains/base.svg +3 -0
- package/src/app/screens/chains/ethereum.svg +11 -0
- package/src/app/screens/chains/solana.svg +4 -0
- package/src/app/screens/chains/tempo.svg +4 -0
- package/src/app/server.ts +204 -0
- package/src/app/vite.config.ts +95 -0
- package/src/app/void.config.ts +29 -0
- package/src/app/zyzz.config.ts +274 -0
- package/src/cli/Admin.ts +73 -0
- package/src/cli/Apps.ts +29 -0
- package/src/cli/Cli.ts +42 -0
- package/src/cli/Project.ts +117 -0
- package/src/cli/Realms.ts +50 -0
- package/src/cli/Session.ts +239 -0
- package/src/cli/User.ts +45 -0
- package/src/cli/V1.ts +57 -0
- package/src/cli/bin.ts +44 -0
- package/src/cli/commands/admin/apps/create.ts +101 -0
- package/src/cli/commands/admin/apps/delete.ts +38 -0
- package/src/cli/commands/admin/apps/index.ts +15 -0
- package/src/cli/commands/admin/apps/list.ts +25 -0
- package/src/cli/commands/admin/apps/rotate-secret.ts +47 -0
- package/src/cli/commands/admin/apps/update.ts +86 -0
- package/src/cli/commands/admin/index.ts +14 -0
- package/src/cli/commands/admin/migrate.ts +16 -0
- package/src/cli/commands/admin/realms/add.ts +40 -0
- package/src/cli/commands/admin/realms/index.ts +14 -0
- package/src/cli/commands/admin/realms/list.ts +38 -0
- package/src/cli/commands/admin/realms/passkeys/index.ts +15 -0
- package/src/cli/commands/admin/realms/passkeys/set.ts +44 -0
- package/src/cli/commands/admin/realms/privy/index.ts +14 -0
- package/src/cli/commands/admin/realms/privy/set.ts +69 -0
- package/src/cli/commands/admin/realms/remove.ts +33 -0
- package/src/cli/commands/admin/realms/secp256k1/disable.ts +40 -0
- package/src/cli/commands/admin/realms/secp256k1/enable.ts +40 -0
- package/src/cli/commands/admin/realms/secp256k1/index.ts +19 -0
- package/src/cli/commands/admin/realms/set.ts +46 -0
- package/src/cli/commands/admin/rotate-key.ts +47 -0
- package/src/cli/commands/init.ts +42 -0
- package/src/cli/commands/login.ts +32 -0
- package/src/cli/commands/logout.ts +19 -0
- package/src/cli/commands/whoami.ts +23 -0
- package/src/client/Actions.ts +168 -0
- package/src/client/Auth.ts +285 -0
- package/src/client/Authorization.ts +34 -0
- package/src/client/Decorator.ts +410 -0
- package/src/client/Key.ts +140 -0
- package/src/client/Pending.ts +46 -0
- package/src/client/Permissions.ts +39 -0
- package/src/client/Provider.ts +18 -0
- package/src/client/Step.ts +24 -0
- package/src/client/Storage.ts +29 -0
- package/src/client/TempoAccount.ts +42 -0
- package/src/client/Tokens.ts +27 -0
- package/src/client/User.ts +23 -0
- package/src/client/actions/account.ts +57 -0
- package/src/client/actions/device.ts +151 -0
- package/src/client/actions/email.ts +141 -0
- package/src/client/actions/oauth.ts +182 -0
- package/src/client/actions/passkey.ts +141 -0
- package/src/client/actions/provider.ts +70 -0
- package/src/client/actions/realm.ts +36 -0
- package/src/client/actions/redirect.ts +408 -0
- package/src/client/internal/accessKey.ts +54 -0
- package/src/client/internal/account.ts +15 -0
- package/src/client/internal/api.ts +224 -0
- package/src/client/internal/headless.ts +77 -0
- package/src/client/internal/indexedDb.ts +44 -0
- package/src/client/internal/request.ts +71 -0
- package/src/client/internal/store.ts +20 -0
- package/src/client.ts +19 -0
- package/src/index.ts +6 -0
- package/src/internal/Apps.ts +718 -0
- package/src/internal/Auth.ts +203 -0
- package/src/internal/Authorize.ts +424 -0
- package/src/internal/Balance.ts +168 -0
- package/src/internal/BodyLimit.ts +36 -0
- package/src/internal/Chain.ts +16 -0
- package/src/internal/Device.ts +469 -0
- package/src/internal/Env.ts +58 -0
- package/src/internal/ErrorResponse.ts +854 -0
- package/src/internal/Id.ts +41 -0
- package/src/internal/KeyAuthorization.ts +1339 -0
- package/src/internal/Limits.ts +39 -0
- package/src/internal/Log.ts +178 -0
- package/src/internal/LogLine.ts +87 -0
- package/src/internal/Logout.ts +336 -0
- package/src/internal/Migrations.ts +86 -0
- package/src/internal/OpenApi.ts +300 -0
- package/src/internal/Owner.ts +211 -0
- package/src/internal/Passkey.ts +1052 -0
- package/src/internal/PendingKey.ts +104 -0
- package/src/internal/Privy.ts +402 -0
- package/src/internal/Provider.ts +125 -0
- package/src/internal/RateLimit.ts +259 -0
- package/src/internal/Realm.ts +768 -0
- package/src/internal/RequestId.ts +118 -0
- package/src/internal/SignInGrant.ts +168 -0
- package/src/internal/SigningKey.ts +286 -0
- package/src/internal/TempoAccount.ts +342 -0
- package/src/internal/TestInbox.ts +51 -0
- package/src/internal/Timing.ts +158 -0
- package/src/internal/Validation.ts +52 -0
- package/src/internal/Wallet.ts +62 -0
- package/src/internal/owners/Passkey.ts +72 -0
- package/src/internal/owners/Privy.ts +81 -0
- package/src/internal/owners/Secp256k1.ts +143 -0
- package/src/types/app.d.ts +19 -0
- package/src/worker.ts +11 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The document of every page: its language, the theme tokens on the root element, the head, and the
|
|
3
|
+
* API and query clients that every page shares. The `chain` search parameter stays on every page
|
|
4
|
+
* that the router opens.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
|
8
|
+
import {
|
|
9
|
+
createRootRoute,
|
|
10
|
+
HeadContent,
|
|
11
|
+
Outlet,
|
|
12
|
+
retainSearchParams,
|
|
13
|
+
Scripts,
|
|
14
|
+
} from '@tanstack/react-router'
|
|
15
|
+
import { type ReactNode, useState } from 'react'
|
|
16
|
+
import reset from 'zyzz/reset.css?url'
|
|
17
|
+
import * as Chain from '../../internal/Chain.js'
|
|
18
|
+
import * as Client from '../lib/Client.js'
|
|
19
|
+
import { script, vars } from '../zyzz.config.js'
|
|
20
|
+
|
|
21
|
+
export const Route = createRootRoute({
|
|
22
|
+
component: Root,
|
|
23
|
+
head: () => ({
|
|
24
|
+
links: [
|
|
25
|
+
{ href: reset, rel: 'stylesheet' },
|
|
26
|
+
// The pages have no icon, so an empty one keeps the browser from requesting `/favicon.ico`.
|
|
27
|
+
{ href: 'data:,', rel: 'icon' },
|
|
28
|
+
],
|
|
29
|
+
meta: [
|
|
30
|
+
{ charSet: 'utf-8' },
|
|
31
|
+
{ content: 'width=device-width, initial-scale=1', name: 'viewport' },
|
|
32
|
+
{ title: 'Tempo ID' },
|
|
33
|
+
{ content: 'Sign in to Tempo.', name: 'description' },
|
|
34
|
+
],
|
|
35
|
+
// Restores a saved color scheme before the first paint.
|
|
36
|
+
scripts: [{ children: script() }],
|
|
37
|
+
}),
|
|
38
|
+
// A chosen chain stays on every page that the router opens.
|
|
39
|
+
search: { middlewares: [retainSearchParams(['chain'])] },
|
|
40
|
+
shellComponent: Document,
|
|
41
|
+
validateSearch: (search: Record<string, unknown>): Search => {
|
|
42
|
+
// The router merges each route's search over the parsed query, so an invalid value is
|
|
43
|
+
// replaced, not left in place, and the retained parameter never carries it.
|
|
44
|
+
const chain = Chain.schema.safeParse(search.chain)
|
|
45
|
+
return { chain: chain.success ? chain.data : undefined }
|
|
46
|
+
},
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
/** The search parameters that every page reads. */
|
|
50
|
+
type Search = {
|
|
51
|
+
/** The chain whose balances pages show, in place of Tempo mainnet. */
|
|
52
|
+
chain?: Chain.Chain | undefined
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Renders the page with the clients that every page shares. */
|
|
56
|
+
function Root() {
|
|
57
|
+
// One of each for the document's lifetime, so neither holds state of another visitor.
|
|
58
|
+
const [client] = useState(Client.create)
|
|
59
|
+
const [queryClient] = useState(() => new QueryClient())
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<Client.Context value={client}>
|
|
63
|
+
<QueryClientProvider client={queryClient}>
|
|
64
|
+
<Outlet />
|
|
65
|
+
</QueryClientProvider>
|
|
66
|
+
</Client.Context>
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Renders the HTML document around the page. */
|
|
71
|
+
function Document(props: Document.Props) {
|
|
72
|
+
return (
|
|
73
|
+
// The scheme script changes the root element's classes before React hydrates.
|
|
74
|
+
<html className={vars().className} lang="en" suppressHydrationWarning>
|
|
75
|
+
<head>
|
|
76
|
+
<HeadContent />
|
|
77
|
+
</head>
|
|
78
|
+
<body>
|
|
79
|
+
{props.children}
|
|
80
|
+
<Scripts />
|
|
81
|
+
</body>
|
|
82
|
+
</html>
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
declare namespace Document {
|
|
87
|
+
type Props = {
|
|
88
|
+
/** The page. */
|
|
89
|
+
children: ReactNode
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The approval page: the signed-in user approves or denies an app's authorization request, and the
|
|
3
|
+
* browser returns to the app's redirect. A passkey-owned account signs the key with its passkey in
|
|
4
|
+
* this browser, which takes a second request.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { useMutation } from '@tanstack/react-query'
|
|
8
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
9
|
+
import { parseResponse } from 'hono/client'
|
|
10
|
+
import { Authentication } from 'webauthx/client'
|
|
11
|
+
import * as Client from '../lib/Client.js'
|
|
12
|
+
import * as Loader from '../lib/Loader.js'
|
|
13
|
+
import { Approval, InvalidRequest } from '../screens/Approval.js'
|
|
14
|
+
import { style } from '../zyzz.config.js'
|
|
15
|
+
|
|
16
|
+
/** Wraps a failure of the browser's passkey ceremony, which reaches no API. */
|
|
17
|
+
class CeremonyError extends Error {
|
|
18
|
+
override name = 'Page.CeremonyError'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const Route = createFileRoute('/authorize')({
|
|
22
|
+
// The route splitter drops the style namespace, so the component stays in this chunk.
|
|
23
|
+
codeSplitGroupings: [],
|
|
24
|
+
component: () => <Page {...Route.useLoaderData()} />,
|
|
25
|
+
/**
|
|
26
|
+
* Sends an app's request without Better Auth's signature to `/oauth2/authorize`, which takes the
|
|
27
|
+
* same query and returns the browser here signed. The request gains `response_type=code` and
|
|
28
|
+
* `code_challenge_method=S256` when it names neither, since `/oauth2/authorize` requires both.
|
|
29
|
+
* Sends a visitor without a session to sign-in, with the query unchanged, so the sign-in
|
|
30
|
+
* continues the request. Otherwise returns the request that `GET /v1/authorize/request` reads,
|
|
31
|
+
* and redirects a key that Tempo ID refuses to the app with the refusal.
|
|
32
|
+
*/
|
|
33
|
+
loader: async (match): Promise<Page.Props> => {
|
|
34
|
+
const { searchStr } = match.location
|
|
35
|
+
// Better Auth reads the query with `URLSearchParams`, so the page reads it the same way, and a
|
|
36
|
+
// malformed escape cannot show one request and approve another.
|
|
37
|
+
const query = new URLSearchParams(searchStr)
|
|
38
|
+
if (!query.get('sig')) {
|
|
39
|
+
const forwarded = new URLSearchParams(query)
|
|
40
|
+
if (!forwarded.has('code_challenge_method'))
|
|
41
|
+
forwarded.set('code_challenge_method', 'S256')
|
|
42
|
+
if (!forwarded.has('response_type'))
|
|
43
|
+
forwarded.set('response_type', 'code')
|
|
44
|
+
Loader.redirect({
|
|
45
|
+
document: true,
|
|
46
|
+
href: `/oauth2/authorize?${forwarded}`,
|
|
47
|
+
})
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const client = Client.create()
|
|
51
|
+
const result = await (async () => {
|
|
52
|
+
try {
|
|
53
|
+
return await parseResponse(
|
|
54
|
+
client.v1.authorize.request.$get({
|
|
55
|
+
query: { oauth_query: query.toString() },
|
|
56
|
+
}),
|
|
57
|
+
)
|
|
58
|
+
} catch (error) {
|
|
59
|
+
if (Client.reason(error) === 'session_required')
|
|
60
|
+
Loader.redirect({ href: `/login${searchStr}` })
|
|
61
|
+
throw error
|
|
62
|
+
}
|
|
63
|
+
})()
|
|
64
|
+
if ('redirect' in result)
|
|
65
|
+
Loader.redirect({ document: true, href: result.redirect })
|
|
66
|
+
return { request: result.request }
|
|
67
|
+
},
|
|
68
|
+
// The loader reads the whole query, so a change to any parameter loads the page again.
|
|
69
|
+
loaderDeps: (match) => ({ search: match.search }),
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
/** Renders the page. */
|
|
73
|
+
function Page(props: Page.Props) {
|
|
74
|
+
const client = Client.use()
|
|
75
|
+
const consent = useMutation({
|
|
76
|
+
async mutationFn(variables: { accept: boolean }) {
|
|
77
|
+
const json = {
|
|
78
|
+
accept: variables.accept,
|
|
79
|
+
// Approval signs for the account that the page shows.
|
|
80
|
+
...(props.request?.key?.account
|
|
81
|
+
? { account: props.request.key.account }
|
|
82
|
+
: {}),
|
|
83
|
+
oauth_query: window.location.search.slice(1),
|
|
84
|
+
session_id: props.request?.session ?? '',
|
|
85
|
+
}
|
|
86
|
+
const decided = await parseResponse(
|
|
87
|
+
client.v1.authorize.consent.$post({ json }),
|
|
88
|
+
)
|
|
89
|
+
if (!('step' in decided)) return decided
|
|
90
|
+
|
|
91
|
+
// The passkey signs the key authorization's digest, which the step's options carry.
|
|
92
|
+
const assertion = await Authentication.sign({
|
|
93
|
+
options: { publicKey: decided.step.options.publicKey },
|
|
94
|
+
}).catch((error: unknown) => {
|
|
95
|
+
throw new CeremonyError('Passkey ceremony failed.', { cause: error })
|
|
96
|
+
})
|
|
97
|
+
const signed = await parseResponse(
|
|
98
|
+
client.v1.authorize.consent.$post({
|
|
99
|
+
json: { ...json, passkey: { assertion } },
|
|
100
|
+
}),
|
|
101
|
+
)
|
|
102
|
+
if ('step' in signed)
|
|
103
|
+
throw new Error('The approval requested a second passkey step.')
|
|
104
|
+
return signed
|
|
105
|
+
},
|
|
106
|
+
// Without a session, the page's loader sends the browser to sign-in, which continues the request.
|
|
107
|
+
onError: (error) => {
|
|
108
|
+
if (Client.reason(error) === 'session_required') window.location.reload()
|
|
109
|
+
},
|
|
110
|
+
onSuccess: (data) => window.location.assign(data.redirect),
|
|
111
|
+
})
|
|
112
|
+
// The decision holds both buttons until the browser leaves, after the request succeeds too.
|
|
113
|
+
const decided = consent.isPending || consent.isSuccess
|
|
114
|
+
|
|
115
|
+
return (
|
|
116
|
+
<main {...styles.page()}>
|
|
117
|
+
{props.request ? (
|
|
118
|
+
<Approval
|
|
119
|
+
app={props.request.app}
|
|
120
|
+
approving={decided && consent.variables.accept}
|
|
121
|
+
denying={decided && !consent.variables.accept}
|
|
122
|
+
destination={props.request.destination}
|
|
123
|
+
email={props.request.email}
|
|
124
|
+
error={
|
|
125
|
+
consent.error &&
|
|
126
|
+
Client.reason(consent.error) !== 'webauthn_required'
|
|
127
|
+
? message(consent.error)
|
|
128
|
+
: undefined
|
|
129
|
+
}
|
|
130
|
+
keyAuthorization={props.request.key}
|
|
131
|
+
onApprove={() => consent.mutate({ accept: true })}
|
|
132
|
+
onDeny={() => consent.mutate({ accept: false })}
|
|
133
|
+
// The API's refusal names the other flows, and the screen states the step here instead.
|
|
134
|
+
refusal={
|
|
135
|
+
Client.reason(consent.error) === 'webauthn_required'
|
|
136
|
+
? 'passkey'
|
|
137
|
+
: undefined
|
|
138
|
+
}
|
|
139
|
+
/>
|
|
140
|
+
) : (
|
|
141
|
+
<InvalidRequest />
|
|
142
|
+
)}
|
|
143
|
+
</main>
|
|
144
|
+
)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
declare namespace Page {
|
|
148
|
+
type Props = {
|
|
149
|
+
/**
|
|
150
|
+
* The request that the page shows, or `null` for a forged or expired query or a request without
|
|
151
|
+
* a known app.
|
|
152
|
+
*/
|
|
153
|
+
request: {
|
|
154
|
+
/** The app's display name. */
|
|
155
|
+
app: string
|
|
156
|
+
/** The host of the app's redirect URI, or its scheme for a native app. */
|
|
157
|
+
destination: string
|
|
158
|
+
/** The signed-in user's address. */
|
|
159
|
+
email: string
|
|
160
|
+
/** The key authorization that the request carries, if any. */
|
|
161
|
+
key?: Approval.Key | undefined
|
|
162
|
+
/** The ID of the signed-in session, which the decision names. */
|
|
163
|
+
session: string
|
|
164
|
+
} | null
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Returns the message to show for `error`. A ceremony that the user cancels, or that times out,
|
|
170
|
+
* fails with a `NotAllowedError` from the browser, which the passkey library wraps in its own error.
|
|
171
|
+
* A refused assertion takes a new passkey step, which the next approval starts.
|
|
172
|
+
*/
|
|
173
|
+
function message(error: unknown) {
|
|
174
|
+
if (Client.reason(error) === 'webauthn_rejected')
|
|
175
|
+
return 'Your passkey did not sign the approval. Approve again, or deny the request.'
|
|
176
|
+
if (!(error instanceof CeremonyError)) return Client.message(error)
|
|
177
|
+
if (names(error).includes('NotAllowedError'))
|
|
178
|
+
return 'The passkey request was canceled. Approve again, or deny the request.'
|
|
179
|
+
return 'Your passkey did not sign the approval. Approve again, or deny the request.'
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** Returns the names of `error` and of each error in its chain of causes. */
|
|
183
|
+
function names(error: unknown): readonly string[] {
|
|
184
|
+
if (!(error instanceof Error)) return []
|
|
185
|
+
return [error.name, ...names(error.cause)]
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
namespace styles {
|
|
189
|
+
export const page = style({
|
|
190
|
+
alignItems: 'center',
|
|
191
|
+
display: 'flex',
|
|
192
|
+
justifyContent: 'center',
|
|
193
|
+
minHeight: 'screen',
|
|
194
|
+
paddingBlock: 16,
|
|
195
|
+
paddingInline: 4,
|
|
196
|
+
})
|
|
197
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The account step: the signed-in user chooses the Tempo Account that an app uses, and the app's
|
|
3
|
+
* authorization continues.
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { useMutation } from '@tanstack/react-query'
|
|
7
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
8
|
+
import { parseResponse } from 'hono/client'
|
|
9
|
+
import { ErrorMessage } from '../components/ErrorMessage.js'
|
|
10
|
+
import * as Client from '../lib/Client.js'
|
|
11
|
+
import * as Loader from '../lib/Loader.js'
|
|
12
|
+
import { InvalidRequest } from '../screens/Approval.js'
|
|
13
|
+
import { ChooseAccount } from '../screens/ChooseAccount.js'
|
|
14
|
+
import { style } from '../zyzz.config.js'
|
|
15
|
+
|
|
16
|
+
export const Route = createFileRoute('/choose-account')({
|
|
17
|
+
// The route splitter drops the style namespace, so the component stays in this chunk.
|
|
18
|
+
codeSplitGroupings: [],
|
|
19
|
+
component: () => <Page {...Route.useLoaderData()} />,
|
|
20
|
+
/**
|
|
21
|
+
* Sends a request without Better Auth's signature to `/oauth2/authorize`, and a visitor without a
|
|
22
|
+
* session to sign-in, each with the query unchanged. Otherwise returns the account step that
|
|
23
|
+
* `GET /v1/authorize/accounts` reads, or the refusal's message, such as for a spent account limit.
|
|
24
|
+
*/
|
|
25
|
+
loader: async (match): Promise<Page.Props> => {
|
|
26
|
+
const { searchStr } = match.location
|
|
27
|
+
const query = new URLSearchParams(searchStr)
|
|
28
|
+
if (!query.get('sig'))
|
|
29
|
+
Loader.redirect({ document: true, href: `/oauth2/authorize${searchStr}` })
|
|
30
|
+
|
|
31
|
+
const client = Client.create()
|
|
32
|
+
try {
|
|
33
|
+
const found = await parseResponse(
|
|
34
|
+
client.v1.authorize.accounts.$get({
|
|
35
|
+
query: { oauth_query: query.toString() },
|
|
36
|
+
}),
|
|
37
|
+
)
|
|
38
|
+
return { error: null, request: found.request }
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (Client.reason(error) === 'session_required')
|
|
41
|
+
Loader.redirect({ href: `/login${searchStr}` })
|
|
42
|
+
return { error: Client.message(error), request: null }
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
// The loader reads the whole query, so a change to any parameter loads the page again.
|
|
46
|
+
loaderDeps: (match) => ({ search: match.search }),
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
/** Renders the page. */
|
|
50
|
+
function Page(props: Page.Props) {
|
|
51
|
+
const client = Client.use()
|
|
52
|
+
const select = useMutation({
|
|
53
|
+
mutationFn: (variables: { account: `0x${string}` }) =>
|
|
54
|
+
parseResponse(
|
|
55
|
+
client.v1.authorize.account.$post({
|
|
56
|
+
json: {
|
|
57
|
+
account: variables.account,
|
|
58
|
+
oauth_query: window.location.search.slice(1),
|
|
59
|
+
},
|
|
60
|
+
}),
|
|
61
|
+
),
|
|
62
|
+
onSuccess: (data) => window.location.assign(data.redirect),
|
|
63
|
+
})
|
|
64
|
+
// The choice holds every row until the browser leaves, after the request succeeds too.
|
|
65
|
+
const selecting =
|
|
66
|
+
select.isPending || select.isSuccess ? select.variables.account : undefined
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<main {...styles.page()}>
|
|
70
|
+
{(() => {
|
|
71
|
+
if (props.error)
|
|
72
|
+
return <ErrorMessage align="center">{props.error}</ErrorMessage>
|
|
73
|
+
if (!props.request) return <InvalidRequest />
|
|
74
|
+
return (
|
|
75
|
+
<ChooseAccount
|
|
76
|
+
accounts={props.request.accounts}
|
|
77
|
+
app={props.request.app}
|
|
78
|
+
error={select.error ? Client.message(select.error) : undefined}
|
|
79
|
+
onChoose={(account) => select.mutate({ account })}
|
|
80
|
+
selecting={selecting}
|
|
81
|
+
/>
|
|
82
|
+
)
|
|
83
|
+
})()}
|
|
84
|
+
</main>
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
declare namespace Page {
|
|
89
|
+
type Props = {
|
|
90
|
+
/** Why the step failed to load, such as a spent account limit, or `null` when it loaded. */
|
|
91
|
+
error: string | null
|
|
92
|
+
/** The step that the page shows, or `null` for a forged or expired query or a request without a known app. */
|
|
93
|
+
request: {
|
|
94
|
+
/** The user's accounts in the app's realms, oldest first. */
|
|
95
|
+
accounts: ChooseAccount.Props['accounts']
|
|
96
|
+
/** The app's display name. */
|
|
97
|
+
app: string
|
|
98
|
+
} | null
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
namespace styles {
|
|
103
|
+
export const page = style({
|
|
104
|
+
alignItems: 'center',
|
|
105
|
+
display: 'flex',
|
|
106
|
+
justifyContent: 'center',
|
|
107
|
+
minHeight: 'screen',
|
|
108
|
+
paddingBlock: 16,
|
|
109
|
+
paddingInline: 4,
|
|
110
|
+
})
|
|
111
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/** The deposit page: how to send stablecoins to one of the signed-in user's Tempo Accounts. @module */
|
|
2
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
3
|
+
import { parseResponse } from 'hono/client'
|
|
4
|
+
import * as Client from '../lib/Client.js'
|
|
5
|
+
import * as Loader from '../lib/Loader.js'
|
|
6
|
+
import { Deposit } from '../screens/Deposit.js'
|
|
7
|
+
import { style } from '../zyzz.config.js'
|
|
8
|
+
|
|
9
|
+
export const Route = createFileRoute('/deposit')({
|
|
10
|
+
// The route splitter drops the style namespace, so the component stays in this chunk.
|
|
11
|
+
codeSplitGroupings: [],
|
|
12
|
+
component: () => <Page {...Route.useLoaderData()} />,
|
|
13
|
+
/**
|
|
14
|
+
* Redirects a visitor without a session to sign-in. Otherwise returns the method that the query
|
|
15
|
+
* names, and the account at the query's `address` when it is one of the user's accounts in the
|
|
16
|
+
* `default` realm. For another address, a spent account limit, or a failed read, it returns
|
|
17
|
+
* `address: null` with the reason. The page creates no account.
|
|
18
|
+
*/
|
|
19
|
+
loader: async (match): Promise<Page.Props> => {
|
|
20
|
+
const client = Client.create()
|
|
21
|
+
const session = await parseResponse(client.v1.auth.session.$get())
|
|
22
|
+
// The sign-in page's query leaves the address out.
|
|
23
|
+
if (!session.user) Loader.redirect({ href: '/login' })
|
|
24
|
+
|
|
25
|
+
const { address, method } = match.deps
|
|
26
|
+
const shown = method === 'tempo' ? method : null
|
|
27
|
+
const account = await parseResponse(
|
|
28
|
+
client.v1.account.$get({ query: {} }),
|
|
29
|
+
).catch((error: unknown) => ({ error }))
|
|
30
|
+
if ('error' in account)
|
|
31
|
+
return {
|
|
32
|
+
address: null,
|
|
33
|
+
error:
|
|
34
|
+
Client.reason(account.error) === 'rate_limited'
|
|
35
|
+
? Client.message(account.error)
|
|
36
|
+
: 'Your wallets failed to load. Reload the page to try again.',
|
|
37
|
+
method: shown,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Only one of the user's own accounts receives a deposit through this page.
|
|
41
|
+
const found = account.tempo.find(
|
|
42
|
+
(entry) => entry.address.toLowerCase() === address?.toLowerCase(),
|
|
43
|
+
)
|
|
44
|
+
if (!found)
|
|
45
|
+
return {
|
|
46
|
+
address: null,
|
|
47
|
+
error:
|
|
48
|
+
'This wallet was not found. Go back to your account, then choose Deposit.',
|
|
49
|
+
method: shown,
|
|
50
|
+
}
|
|
51
|
+
return { address: found.address, error: null, method: shown }
|
|
52
|
+
},
|
|
53
|
+
loaderDeps: (match: { search: Search }) => ({
|
|
54
|
+
address: match.search.address,
|
|
55
|
+
method: match.search.method,
|
|
56
|
+
}),
|
|
57
|
+
validateSearch: (search: Record<string, unknown>): Search => ({
|
|
58
|
+
...(typeof search.address === 'string' ? { address: search.address } : {}),
|
|
59
|
+
...(typeof search.method === 'string' ? { method: search.method } : {}),
|
|
60
|
+
}),
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
/** The search parameters that the page reads. */
|
|
64
|
+
type Search = {
|
|
65
|
+
/** The account that receives the deposit. */
|
|
66
|
+
address?: string | undefined
|
|
67
|
+
/** The method that the page shows, such as `tempo`, or the list of networks without one. */
|
|
68
|
+
method?: string | undefined
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Renders the page. */
|
|
72
|
+
function Page(props: Page.Props) {
|
|
73
|
+
return (
|
|
74
|
+
<main {...styles.page()} aria-label="Deposit">
|
|
75
|
+
<Deposit
|
|
76
|
+
address={props.address ?? undefined}
|
|
77
|
+
error={props.error ?? undefined}
|
|
78
|
+
method={props.method ?? undefined}
|
|
79
|
+
/>
|
|
80
|
+
</main>
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
declare namespace Page {
|
|
85
|
+
type Props = {
|
|
86
|
+
/** The account that receives the deposit, or `null` when the query names none of the user's. */
|
|
87
|
+
address: `0x${string}` | null
|
|
88
|
+
/** Why the page shows no address, or `null` when it shows one. */
|
|
89
|
+
error: string | null
|
|
90
|
+
/** The method that the page shows, or `null` for the list of networks. */
|
|
91
|
+
method: 'tempo' | null
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
namespace styles {
|
|
96
|
+
// Content starts at the same height as on the account page, so the titles line up.
|
|
97
|
+
export const page = style({
|
|
98
|
+
alignItems: 'flex-start',
|
|
99
|
+
display: 'flex',
|
|
100
|
+
justifyContent: 'center',
|
|
101
|
+
minHeight: 'screen',
|
|
102
|
+
paddingBlock: 16,
|
|
103
|
+
paddingInline: 4,
|
|
104
|
+
})
|
|
105
|
+
}
|