@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,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Void configuration of the Tempo ID app: its database, bindings, and rate limits. A Worker that
|
|
3
|
+
* runs the built app through `App.create` declares the same bindings in its own Wrangler config.
|
|
4
|
+
* Void loads this file with Node, outside Vite, so it imports no other module.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { defineConfig } from 'void/config'
|
|
8
|
+
import { limits } from '../internal/Limits.js'
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
cloudflare: {
|
|
12
|
+
// Void's dev inbox reaches the dev server through the assets binding, which a deployment binds
|
|
13
|
+
// under the same name.
|
|
14
|
+
assets: { binding: 'ASSETS' },
|
|
15
|
+
ratelimits: Object.entries(limits).map(([name, limit]) => ({
|
|
16
|
+
name,
|
|
17
|
+
namespace_id: limit.namespace,
|
|
18
|
+
simple: { limit: limit.limit, period: limit.period },
|
|
19
|
+
})),
|
|
20
|
+
// `/health` reports the version that served the request.
|
|
21
|
+
version_metadata: { binding: 'CF_VERSION_METADATA' },
|
|
22
|
+
},
|
|
23
|
+
database: 'pg',
|
|
24
|
+
// The sender in `vp dev`. `App.create` names each deployment's own.
|
|
25
|
+
email: { from: 'Tempo ID <noreply@id.tehq.dev>' },
|
|
26
|
+
// Void infers bindings only from its convention folders, and `lib/Auth.ts` reads the database and email.
|
|
27
|
+
inference: { bindings: { db: true, email: true } },
|
|
28
|
+
worker: { compatibility_date: '2026-02-24' },
|
|
29
|
+
})
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configures styling: zyzz's default tokens extended with Tempo ID's own, the Pilat and Geist Mono
|
|
3
|
+
* faces their stacks name, and document styles.
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { defineConfig, extendVars } from 'zyzz'
|
|
7
|
+
import { vars as defaults } from 'zyzz/default'
|
|
8
|
+
import { fontFace, global, keyframes } from 'zyzz/web'
|
|
9
|
+
|
|
10
|
+
/** A short sideways shake that marks a refused code. `animate.nudge` names it by its ID. */
|
|
11
|
+
const nudge = keyframes(
|
|
12
|
+
{
|
|
13
|
+
'0%, 100%': { transform: 'translateX(0)' },
|
|
14
|
+
'20%': { transform: 'translateX(-6px)' },
|
|
15
|
+
'40%': { transform: 'translateX(5px)' },
|
|
16
|
+
'60%': { transform: 'translateX(-3px)' },
|
|
17
|
+
'80%': { transform: 'translateX(2px)' },
|
|
18
|
+
},
|
|
19
|
+
{ id: 'tempo-id/nudge' },
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
// The `animate.nudge` token names the keyframes as text, so nothing else reads the constant.
|
|
23
|
+
void nudge
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Tokens Tempo ID adds to the default set, or replaces in it. Add a token here rather than writing
|
|
27
|
+
* a custom value. The neutrals follow Link: controls and lists are gray fills on a near-white page,
|
|
28
|
+
* with few borders.
|
|
29
|
+
*/
|
|
30
|
+
const tokens = extendVars(
|
|
31
|
+
defaults,
|
|
32
|
+
{
|
|
33
|
+
animate: {
|
|
34
|
+
nudge:
|
|
35
|
+
'z-kid-tempo_2d_id_2f_nudge 400ms cubic-bezier(0.36, 0.07, 0.19, 0.97)',
|
|
36
|
+
},
|
|
37
|
+
// A code box, slightly taller than wide.
|
|
38
|
+
aspect: { code: '6 / 7' },
|
|
39
|
+
backgroundImage: {
|
|
40
|
+
// A white sheen from the top, which gives a solid button fill depth in both schemes.
|
|
41
|
+
sheen:
|
|
42
|
+
'linear-gradient(180deg, rgb(255 255 255 / 0.16), rgb(255 255 255 / 0))',
|
|
43
|
+
},
|
|
44
|
+
color: {
|
|
45
|
+
background: {
|
|
46
|
+
primary: { dark: '#0f0f0f', light: '#fdfdfd' },
|
|
47
|
+
surface: { dark: '#1a1a1a', light: '#ffffff' },
|
|
48
|
+
},
|
|
49
|
+
foreground: { dark: '#f5f5f5', light: '#1a1a1a' },
|
|
50
|
+
gray: {
|
|
51
|
+
// The fill of inputs, code boxes, and grouped lists.
|
|
52
|
+
100: { dark: '#1f1f1f', light: '#f5f5f5' },
|
|
53
|
+
// The fill of a hovered row or control.
|
|
54
|
+
200: { dark: '#2a2a2a', light: '#ededed' },
|
|
55
|
+
400: { dark: '#2e2e2e', light: '#e5e5e5' },
|
|
56
|
+
900: { dark: '#a3a3a3', light: '#6b6b6b' },
|
|
57
|
+
// The hover fill of a `foreground` button.
|
|
58
|
+
950: { dark: '#d6d6d6', light: '#333333' },
|
|
59
|
+
},
|
|
60
|
+
transparent: 'transparent',
|
|
61
|
+
},
|
|
62
|
+
fontFamily: {
|
|
63
|
+
sans: 'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
64
|
+
},
|
|
65
|
+
letterSpacing: {
|
|
66
|
+
// A lone wallet's balance, which tracks tighter than its heading style.
|
|
67
|
+
balance: '-0.03em',
|
|
68
|
+
// The deposit screen's title.
|
|
69
|
+
title: '-0.02em',
|
|
70
|
+
},
|
|
71
|
+
radius: { full: '9999px' },
|
|
72
|
+
spacing: {
|
|
73
|
+
auto: 'auto',
|
|
74
|
+
// A negative inset that extends an icon control's hit area past the icon.
|
|
75
|
+
bleed: '-0.75rem',
|
|
76
|
+
// A smaller bleed, for an icon control beside text in a row.
|
|
77
|
+
bleedSmall: '-0.375rem',
|
|
78
|
+
full: '100%',
|
|
79
|
+
max: 'max-content',
|
|
80
|
+
// Negative insets that hang an icon control's glyph past the content edge, on phones and wider screens.
|
|
81
|
+
outdent: '-1rem',
|
|
82
|
+
outdentWide: '-3.5rem',
|
|
83
|
+
// A negative margin that overlaps stacked token icons.
|
|
84
|
+
overlap: '-0.375rem',
|
|
85
|
+
// The text of the flows canvas: at most 36rem, and within the viewport less the canvas's inset.
|
|
86
|
+
readable: 'min(36rem, calc(100vw - 2rem))',
|
|
87
|
+
screen: '100dvh',
|
|
88
|
+
},
|
|
89
|
+
// The default typography names Geist as text, not as a token, so each style in use names the
|
|
90
|
+
// Pilat stack again. Theme data takes only literals.
|
|
91
|
+
typography: {
|
|
92
|
+
button: {
|
|
93
|
+
14: {
|
|
94
|
+
fontFamily:
|
|
95
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
96
|
+
},
|
|
97
|
+
16: {
|
|
98
|
+
fontFamily:
|
|
99
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
copy: {
|
|
103
|
+
// Listing a size drops its nested styles, so `copy.13` restores the default mono style.
|
|
104
|
+
13: {
|
|
105
|
+
fontFamily:
|
|
106
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
107
|
+
mono: {
|
|
108
|
+
fontFamily:
|
|
109
|
+
'"Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',
|
|
110
|
+
fontSize: '13px',
|
|
111
|
+
fontWeight: 400,
|
|
112
|
+
letterSpacing: '0px',
|
|
113
|
+
lineHeight: '18px',
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
14: {
|
|
117
|
+
fontFamily:
|
|
118
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
119
|
+
},
|
|
120
|
+
16: {
|
|
121
|
+
fontFamily:
|
|
122
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
123
|
+
strong: {
|
|
124
|
+
fontFamily:
|
|
125
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
// Pilat's headings track at -0.015em, as in `@tempoxyz/ds`.
|
|
130
|
+
heading: {
|
|
131
|
+
16: {
|
|
132
|
+
fontFamily:
|
|
133
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
134
|
+
letterSpacing: '-0.24px',
|
|
135
|
+
},
|
|
136
|
+
20: {
|
|
137
|
+
fontFamily:
|
|
138
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
139
|
+
letterSpacing: '-0.3px',
|
|
140
|
+
},
|
|
141
|
+
24: {
|
|
142
|
+
fontFamily:
|
|
143
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
144
|
+
letterSpacing: '-0.36px',
|
|
145
|
+
},
|
|
146
|
+
32: {
|
|
147
|
+
fontFamily:
|
|
148
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
149
|
+
letterSpacing: '-0.48px',
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
label: {
|
|
153
|
+
12: {
|
|
154
|
+
fontFamily:
|
|
155
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
156
|
+
// The deposit address. Listing `label.12` again drops its nested styles, so this restores
|
|
157
|
+
// the default mono style.
|
|
158
|
+
mono: {
|
|
159
|
+
fontFamily:
|
|
160
|
+
'"Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',
|
|
161
|
+
fontSize: '12px',
|
|
162
|
+
fontWeight: 400,
|
|
163
|
+
letterSpacing: '0px',
|
|
164
|
+
lineHeight: '16px',
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
14: {
|
|
168
|
+
fontFamily:
|
|
169
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
170
|
+
},
|
|
171
|
+
16: {
|
|
172
|
+
fontFamily:
|
|
173
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
174
|
+
},
|
|
175
|
+
20: {
|
|
176
|
+
fontFamily:
|
|
177
|
+
'Pilat, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
{ id: 'tempo-id/vars' },
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Tokens for a third-party app's own interface, which only the flows canvas uses, beside Tempo ID's
|
|
187
|
+
* pages. A food-delivery brand's red, soft grays, and pill corners set the app's screens apart.
|
|
188
|
+
*/
|
|
189
|
+
const thirdParty = extendVars(
|
|
190
|
+
tokens,
|
|
191
|
+
{
|
|
192
|
+
color: {
|
|
193
|
+
background: {
|
|
194
|
+
primary: { dark: '#121212', light: '#ffffff' },
|
|
195
|
+
surface: { dark: '#1e1e1e', light: '#ffffff' },
|
|
196
|
+
},
|
|
197
|
+
blue: { 700: { dark: '#6b9bf2', light: '#4f86ec' } },
|
|
198
|
+
foreground: { dark: '#f5f5f5', light: '#191919' },
|
|
199
|
+
gray: {
|
|
200
|
+
100: { dark: '#2a2a2a', light: '#f5f5f5' },
|
|
201
|
+
400: { dark: '#3a3a3a', light: '#e7e7e7' },
|
|
202
|
+
900: { dark: '#b3b3b3', light: '#606060' },
|
|
203
|
+
},
|
|
204
|
+
red: { 700: { dark: '#ff4a2b', light: '#eb1700' } },
|
|
205
|
+
},
|
|
206
|
+
radius: { lg: '1.25rem', md: '1rem' },
|
|
207
|
+
},
|
|
208
|
+
{ id: 'tempo-id/third-party' },
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* The style helpers and tokens that pages and components use. `vars({ set: 'thirdParty' })`
|
|
213
|
+
* applies the third-party tokens to a section.
|
|
214
|
+
*/
|
|
215
|
+
export const { appearance, script, style, variants, vars } = defineConfig({
|
|
216
|
+
defaultVars: 'default',
|
|
217
|
+
id: 'tempo-id',
|
|
218
|
+
vars: { default: tokens, thirdParty },
|
|
219
|
+
})
|
|
220
|
+
|
|
221
|
+
fontFace({
|
|
222
|
+
fontDisplay: 'swap',
|
|
223
|
+
fontFamily: 'Pilat',
|
|
224
|
+
fontStyle: 'normal',
|
|
225
|
+
fontWeight: 400,
|
|
226
|
+
src: 'url("@tempoxyz/ds/fonts/Pilat-Regular.woff2") format("woff2")',
|
|
227
|
+
})
|
|
228
|
+
|
|
229
|
+
fontFace({
|
|
230
|
+
fontDisplay: 'swap',
|
|
231
|
+
fontFamily: 'Pilat',
|
|
232
|
+
fontStyle: 'normal',
|
|
233
|
+
fontWeight: 500,
|
|
234
|
+
src: 'url("@tempoxyz/ds/fonts/Pilat-Book.woff2") format("woff2")',
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
fontFace({
|
|
238
|
+
fontDisplay: 'swap',
|
|
239
|
+
fontFamily: 'Pilat',
|
|
240
|
+
fontStyle: 'normal',
|
|
241
|
+
fontWeight: 600,
|
|
242
|
+
src: 'url("@tempoxyz/ds/fonts/Pilat-Demi.woff2") format("woff2")',
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
fontFace({
|
|
246
|
+
fontDisplay: 'swap',
|
|
247
|
+
fontFamily: 'Pilat',
|
|
248
|
+
fontStyle: 'normal',
|
|
249
|
+
fontWeight: 700,
|
|
250
|
+
src: 'url("@tempoxyz/ds/fonts/Pilat-Bold.woff2") format("woff2")',
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
fontFace({
|
|
254
|
+
fontDisplay: 'swap',
|
|
255
|
+
fontFamily: 'Geist Mono',
|
|
256
|
+
fontStyle: 'normal',
|
|
257
|
+
fontWeight: '100 900',
|
|
258
|
+
src: 'url("@fontsource-variable/geist-mono/files/geist-mono-latin-wght-normal.woff2") format("woff2")',
|
|
259
|
+
})
|
|
260
|
+
|
|
261
|
+
global({
|
|
262
|
+
'html, body': {
|
|
263
|
+
backgroundColor: vars.color.background.primary,
|
|
264
|
+
color: vars.color.foreground,
|
|
265
|
+
},
|
|
266
|
+
body: {
|
|
267
|
+
fontFamily: vars.fontFamily.sans,
|
|
268
|
+
MozOsxFontSmoothing: 'grayscale',
|
|
269
|
+
WebkitFontSmoothing: 'antialiased',
|
|
270
|
+
},
|
|
271
|
+
'button, input': { font: 'inherit' },
|
|
272
|
+
'code, pre': { fontFamily: vars.fontFamily.mono },
|
|
273
|
+
html: { colorScheme: 'light dark' },
|
|
274
|
+
})
|
package/src/cli/Admin.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the `tempo-id admin` commands share: the options and variables that name the database, and
|
|
3
|
+
* the loaders of the app and realm commands' modules. incur imports every command when the CLI
|
|
4
|
+
* starts, so this module imports only incur, and each module loads only when its commands run.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'incur'
|
|
8
|
+
|
|
9
|
+
/** The variables that name the database. */
|
|
10
|
+
export const env = z.object({
|
|
11
|
+
DATABASE_URL: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe(
|
|
15
|
+
'Postgres connection string. Used when --database-url is omitted.',
|
|
16
|
+
),
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
/** The error for a command without a database URL. */
|
|
20
|
+
export const missingDatabaseUrl = {
|
|
21
|
+
code: 'missing_database_url',
|
|
22
|
+
message:
|
|
23
|
+
'Missing database URL. Set --database-url or DATABASE_URL to a direct Postgres connection string.',
|
|
24
|
+
} as const
|
|
25
|
+
|
|
26
|
+
/** The error for an app, realm, or signing key command without one of its optional peers. */
|
|
27
|
+
export const missingPeers = {
|
|
28
|
+
code: 'missing_peer',
|
|
29
|
+
message:
|
|
30
|
+
'Missing peer dependencies. Install better-auth, @better-auth/core, @better-auth/oauth-provider, drizzle-orm, and zod to run the admin apps, realms, and rotate-key commands.',
|
|
31
|
+
} as const
|
|
32
|
+
|
|
33
|
+
/** The options that name the database. */
|
|
34
|
+
export const options = z.object({
|
|
35
|
+
databaseUrl: z
|
|
36
|
+
.string()
|
|
37
|
+
.optional()
|
|
38
|
+
.describe('Postgres connection string. Overrides DATABASE_URL.'),
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Loads the module that the app and signing key commands share, or returns `undefined` when one of
|
|
43
|
+
* its optional peers is not installed.
|
|
44
|
+
*/
|
|
45
|
+
export async function loadApps() {
|
|
46
|
+
// A dynamic import, since the module needs optional peers that the other commands do not.
|
|
47
|
+
return await optional(import('./Apps.js'))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Loads the module that the realm commands share, or returns `undefined` when one of its optional
|
|
52
|
+
* peers is not installed.
|
|
53
|
+
*/
|
|
54
|
+
export async function loadRealms() {
|
|
55
|
+
// A dynamic import, since the module needs optional peers that the other commands do not.
|
|
56
|
+
return await optional(import('./Realms.js'))
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Returns the module that `promise` loads, or `undefined` when one of its packages is missing. */
|
|
60
|
+
export async function optional<module>(promise: Promise<module>) {
|
|
61
|
+
try {
|
|
62
|
+
return await promise
|
|
63
|
+
} catch (error) {
|
|
64
|
+
if (
|
|
65
|
+
error instanceof Error &&
|
|
66
|
+
'code' in error &&
|
|
67
|
+
error.code === 'ERR_MODULE_NOT_FOUND' &&
|
|
68
|
+
error.message.startsWith('Cannot find package')
|
|
69
|
+
)
|
|
70
|
+
return undefined
|
|
71
|
+
throw error
|
|
72
|
+
}
|
|
73
|
+
}
|
package/src/cli/Apps.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the `tempo-id admin apps` and `admin rotate-key` commands share: `Apps`, `SigningKey`, a
|
|
3
|
+
* Drizzle connection to the database, and the codes of the refusals that both throw. It needs the
|
|
4
|
+
* `better-auth`, `@better-auth/core`, `@better-auth/oauth-provider`, `drizzle-orm`, and `zod` peers,
|
|
5
|
+
* so the commands load it with `Admin.loadApps`.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import * as Apps from '../internal/Apps.js'
|
|
9
|
+
import * as SigningKey from '../internal/SigningKey.js'
|
|
10
|
+
|
|
11
|
+
export * as Apps from '../internal/Apps.js'
|
|
12
|
+
export * as SigningKey from '../internal/SigningKey.js'
|
|
13
|
+
export { connect } from './Realms.js'
|
|
14
|
+
|
|
15
|
+
/** Returns the error code and message for a refusal from `Apps` or `SigningKey`, or `undefined` for another error. */
|
|
16
|
+
export function error(error: unknown) {
|
|
17
|
+
const code = (() => {
|
|
18
|
+
if (error instanceof Apps.ExistsError) return 'app_exists'
|
|
19
|
+
if (error instanceof Apps.InvalidError) return 'invalid_app'
|
|
20
|
+
if (error instanceof Apps.NotFoundError) return 'unknown_app'
|
|
21
|
+
if (error instanceof Apps.PublicError) return 'public_app'
|
|
22
|
+
if (error instanceof SigningKey.FullError) return 'too_many_signing_keys'
|
|
23
|
+
if (error instanceof SigningKey.MissingError) return 'missing_signing_key'
|
|
24
|
+
if (error instanceof SigningKey.SecretError) return 'invalid_secret'
|
|
25
|
+
return undefined
|
|
26
|
+
})()
|
|
27
|
+
if (!code || !(error instanceof Error)) return undefined
|
|
28
|
+
return { code, message: error.message }
|
|
29
|
+
}
|
package/src/cli/Cli.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `tempo-id` CLI. Each command is a file in `commands/`, which incur routes by its path, such as
|
|
3
|
+
* `commands/admin/migrate.ts` for `tempo-id admin migrate`. `init` and `admin` work offline. `login`,
|
|
4
|
+
* `logout`, `whoami`, and the `v1` group reach Tempo ID over HTTP.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import * as Fs from 'node:fs'
|
|
8
|
+
import * as Path from 'node:path'
|
|
9
|
+
import { Cli as incur_Cli } from 'incur'
|
|
10
|
+
import type * as V1 from './V1.js'
|
|
11
|
+
|
|
12
|
+
/** The package's version, from its `package.json` one folder above `src/` or `dist/`. */
|
|
13
|
+
const version = (
|
|
14
|
+
JSON.parse(
|
|
15
|
+
Fs.readFileSync(
|
|
16
|
+
Path.join(import.meta.dirname, '..', '..', 'package.json'),
|
|
17
|
+
'utf8',
|
|
18
|
+
),
|
|
19
|
+
) as { version: string }
|
|
20
|
+
).version
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Returns the `tempo-id` CLI, with the commands in `commands/`, and with `v1`, the group that
|
|
24
|
+
* `V1.load` returns.
|
|
25
|
+
*/
|
|
26
|
+
export function create(options: create.Options = {}) {
|
|
27
|
+
const cli = incur_Cli
|
|
28
|
+
.create('tempo-id', {
|
|
29
|
+
description: 'Create and operate Tempo ID projects.',
|
|
30
|
+
version,
|
|
31
|
+
})
|
|
32
|
+
.fs(new URL('./commands/', import.meta.url))
|
|
33
|
+
if (!options.v1) return cli
|
|
34
|
+
return cli.command('v1', options.v1)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export declare namespace create {
|
|
38
|
+
type Options = {
|
|
39
|
+
/** The `v1` group, from the deployment's OpenAPI document. Absent, the CLI has no `v1` group. */
|
|
40
|
+
v1?: Awaited<ReturnType<typeof V1.load>> | undefined
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writes a Tempo ID Worker project: a Worker that runs `App.create`, and the Wrangler config that
|
|
3
|
+
* declares the bindings the app reads, as `apps/id` holds them.
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import * as Fs from 'node:fs'
|
|
7
|
+
import * as Path from 'node:path'
|
|
8
|
+
import * as Limits from '../internal/Limits.js'
|
|
9
|
+
|
|
10
|
+
/** The package's own `package.json`, two folders above `src/cli/` or `dist/cli/`. */
|
|
11
|
+
const manifest = JSON.parse(
|
|
12
|
+
Fs.readFileSync(
|
|
13
|
+
Path.join(import.meta.dirname, '..', '..', 'package.json'),
|
|
14
|
+
'utf8',
|
|
15
|
+
),
|
|
16
|
+
) as { version: string }
|
|
17
|
+
|
|
18
|
+
/** The Wrangler version a project deploys with. */
|
|
19
|
+
const wrangler = '4.151.0'
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Writes the project's files into `options.root`, skipping any that exist. Returns the paths it
|
|
23
|
+
* wrote.
|
|
24
|
+
*/
|
|
25
|
+
export function init(options: init.Options) {
|
|
26
|
+
const { from, root, url } = options
|
|
27
|
+
const name = options.name ?? Path.basename(Path.resolve(root))
|
|
28
|
+
|
|
29
|
+
const files = {
|
|
30
|
+
'.gitignore': ['.dev.vars', '.wrangler', 'node_modules', ''].join('\n'),
|
|
31
|
+
'package.json': `${JSON.stringify(
|
|
32
|
+
{
|
|
33
|
+
name,
|
|
34
|
+
private: true,
|
|
35
|
+
type: 'module',
|
|
36
|
+
scripts: { deploy: 'wrangler deploy', dev: 'wrangler dev' },
|
|
37
|
+
dependencies: { '@tempoxyz/id': `^${manifest.version}` },
|
|
38
|
+
devDependencies: { wrangler },
|
|
39
|
+
},
|
|
40
|
+
null,
|
|
41
|
+
2,
|
|
42
|
+
)}\n`,
|
|
43
|
+
'worker.ts': [
|
|
44
|
+
'/** Runs Tempo ID on this host. @module */',
|
|
45
|
+
"import { App } from '@tempoxyz/id/worker'",
|
|
46
|
+
'',
|
|
47
|
+
'export default App.create()',
|
|
48
|
+
'',
|
|
49
|
+
].join('\n'),
|
|
50
|
+
'wrangler.jsonc': [
|
|
51
|
+
'{',
|
|
52
|
+
' "$schema": "node_modules/wrangler/config-schema.json",',
|
|
53
|
+
` "name": ${JSON.stringify(name)},`,
|
|
54
|
+
' "main": "worker.ts",',
|
|
55
|
+
' "compatibility_date": "2026-02-24",',
|
|
56
|
+
' "compatibility_flags": ["nodejs_compat"],',
|
|
57
|
+
" // The app's client scripts and styles, from the package.",
|
|
58
|
+
' "assets": {',
|
|
59
|
+
' "binding": "ASSETS",',
|
|
60
|
+
' "directory": "node_modules/@tempoxyz/id/dist/app/client",',
|
|
61
|
+
' "run_worker_first": ["/**"],',
|
|
62
|
+
' },',
|
|
63
|
+
' // Postgres. Create a Hyperdrive configuration with `wrangler hyperdrive create`, and set its ID.',
|
|
64
|
+
' "hyperdrive": [',
|
|
65
|
+
' {',
|
|
66
|
+
' "binding": "HYPERDRIVE",',
|
|
67
|
+
' "id": "<hyperdrive-id>",',
|
|
68
|
+
' "localConnectionString": "postgresql://localhost:5432/tempo_id",',
|
|
69
|
+
' },',
|
|
70
|
+
' ],',
|
|
71
|
+
' // Each limit counts per Cloudflare location over its period, in seconds.',
|
|
72
|
+
' "ratelimits": [',
|
|
73
|
+
...Object.entries(Limits.limits).map(
|
|
74
|
+
([binding, limit]) =>
|
|
75
|
+
` { "name": "${binding}", "namespace_id": "${limit.namespace}", "simple": { "limit": ${limit.limit}, "period": ${limit.period} } },`,
|
|
76
|
+
),
|
|
77
|
+
' ],',
|
|
78
|
+
' // Set it with `wrangler secret put SECRET`, from `openssl rand -base64 32`.',
|
|
79
|
+
' "secrets": { "required": ["SECRET"] },',
|
|
80
|
+
" // Sign-in codes. The sender's domain needs Cloudflare Email Sending on the account.",
|
|
81
|
+
' "send_email": [{ "name": "SEND_EMAIL" }],',
|
|
82
|
+
' // The cleanup of expired rows.',
|
|
83
|
+
' "triggers": { "crons": ["0 * * * *"] },',
|
|
84
|
+
' "vars": {',
|
|
85
|
+
` "EMAIL_FROM": ${JSON.stringify(from)},`,
|
|
86
|
+
` "URL": ${JSON.stringify(url)},`,
|
|
87
|
+
' },',
|
|
88
|
+
' "version_metadata": { "binding": "CF_VERSION_METADATA" },',
|
|
89
|
+
'}',
|
|
90
|
+
'',
|
|
91
|
+
].join('\n'),
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const written: string[] = []
|
|
95
|
+
for (const [path, content] of Object.entries(files)) {
|
|
96
|
+
const target = Path.join(root, path)
|
|
97
|
+
if (Fs.existsSync(target)) continue
|
|
98
|
+
Fs.mkdirSync(Path.dirname(target), { recursive: true })
|
|
99
|
+
Fs.writeFileSync(target, content)
|
|
100
|
+
written.push(path)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return { paths: written }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export declare namespace init {
|
|
107
|
+
type Options = {
|
|
108
|
+
/** The sender of every email, such as `Tempo ID <noreply@id.example.com>`. */
|
|
109
|
+
from: string
|
|
110
|
+
/** The project's package name and Worker name. Defaults to the folder's name. */
|
|
111
|
+
name?: string | undefined
|
|
112
|
+
/** The project's folder, which need not exist. */
|
|
113
|
+
root: string
|
|
114
|
+
/** Tempo ID's origin, such as `https://id.example.com`, and every token's `iss`. */
|
|
115
|
+
url: string
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the `tempo-id admin realms` commands share: `Realm`, a Drizzle connection to the database,
|
|
3
|
+
* and the codes of the refusals that `Realm` throws. It needs the `better-auth`, `drizzle-orm`, and
|
|
4
|
+
* `zod` peers, so the commands load it with `Admin.loadRealms`.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { drizzle } from 'drizzle-orm/node-postgres'
|
|
8
|
+
import pg from 'pg'
|
|
9
|
+
import * as Schema from '../app/db/schema.js'
|
|
10
|
+
import * as Realm from '../internal/Realm.js'
|
|
11
|
+
|
|
12
|
+
export * as Realm from '../internal/Realm.js'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Connects to the database at `connectionString` directly, never through Hyperdrive. Call `end` once
|
|
16
|
+
* the command is done with it.
|
|
17
|
+
*/
|
|
18
|
+
export function connect(options: connect.Options) {
|
|
19
|
+
const pool = new pg.Pool({
|
|
20
|
+
connectionString: options.connectionString,
|
|
21
|
+
max: 1,
|
|
22
|
+
})
|
|
23
|
+
return {
|
|
24
|
+
db: drizzle({ client: pool, schema: Schema }),
|
|
25
|
+
end: () => pool.end(),
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export declare namespace connect {
|
|
30
|
+
type Options = {
|
|
31
|
+
/** A direct Postgres connection string. */
|
|
32
|
+
connectionString: string
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Returns the error code and message for a refusal from `Realm`, or `undefined` for another error. */
|
|
37
|
+
export function error(error: unknown) {
|
|
38
|
+
const code = (() => {
|
|
39
|
+
if (error instanceof Realm.InUseError) return 'realm_in_use'
|
|
40
|
+
if (error instanceof Realm.InvalidError) return 'invalid_realm'
|
|
41
|
+
if (error instanceof Realm.NotFoundAppError) return 'unknown_app'
|
|
42
|
+
if (error instanceof Realm.NotFoundError) return 'unknown_realm'
|
|
43
|
+
if (error instanceof Realm.TakenError) return 'realm_exists'
|
|
44
|
+
if (error instanceof Realm.TakenPasskeysError) return 'relying_party_taken'
|
|
45
|
+
if (error instanceof Realm.TakenPrivyAppError) return 'privy_app_taken'
|
|
46
|
+
return undefined
|
|
47
|
+
})()
|
|
48
|
+
if (!code || !(error instanceof Error)) return undefined
|
|
49
|
+
return { code, message: error.message }
|
|
50
|
+
}
|