tapimo 0.0.2 → 0.2.0
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 +38 -16
- package/dist/ApiKey.d.ts +14 -11
- package/dist/ApiKey.d.ts.map +1 -1
- package/dist/ApiKey.js +11 -12
- package/dist/ApiKey.js.map +1 -1
- package/dist/ApiKeys.d.ts +207 -0
- package/dist/ApiKeys.d.ts.map +1 -0
- package/dist/ApiKeys.js +282 -0
- package/dist/ApiKeys.js.map +1 -0
- package/dist/App.d.ts +6771 -3819
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +145 -317
- package/dist/App.js.map +1 -1
- package/dist/Handler.d.ts +86 -0
- package/dist/Handler.d.ts.map +1 -0
- package/dist/Handler.js +83 -0
- package/dist/Handler.js.map +1 -0
- package/dist/Scope.d.ts +14 -4
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +16 -4
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.d.ts +5 -7
- package/dist/Webhooks.d.ts.map +1 -1
- package/dist/Webhooks.js +11 -4
- package/dist/Webhooks.js.map +1 -1
- package/dist/admin/Access.d.ts +1 -3
- package/dist/admin/Access.d.ts.map +1 -1
- package/dist/admin/Access.js +1 -3
- package/dist/admin/Access.js.map +1 -1
- package/dist/admin/App.d.ts +167 -205
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +2 -4
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +105 -5
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +75 -9
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/scopes.d.ts +6 -0
- package/dist/admin/apps/scopes.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +35 -149
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +18 -39
- package/dist/admin/apps/verified-tokens.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.js +1 -1
- package/dist/apps/data/App.d.ts +19176 -0
- package/dist/apps/data/App.d.ts.map +1 -0
- package/dist/apps/data/App.js +236 -0
- package/dist/apps/data/App.js.map +1 -0
- package/dist/apps/data/index.d.ts +3 -0
- package/dist/apps/data/index.d.ts.map +1 -0
- package/dist/apps/data/index.js +3 -0
- package/dist/apps/data/index.js.map +1 -0
- package/dist/apps/{activities.d.ts → data/routes/activities.d.ts} +32 -32
- package/dist/apps/{activities.d.ts.map → data/routes/activities.d.ts.map} +1 -1
- package/dist/apps/{activities.js → data/routes/activities.js} +13 -13
- package/dist/apps/data/routes/activities.js.map +1 -0
- package/dist/apps/{addresses.d.ts → data/routes/addresses.d.ts} +22 -22
- package/dist/apps/{addresses.d.ts.map → data/routes/addresses.d.ts.map} +1 -1
- package/dist/apps/{addresses.js → data/routes/addresses.js} +5 -5
- package/dist/apps/data/routes/addresses.js.map +1 -0
- package/dist/apps/{balances.d.ts → data/routes/balances.d.ts} +49 -49
- package/dist/apps/data/routes/balances.d.ts.map +1 -0
- package/dist/apps/{balances.js → data/routes/balances.js} +42 -11
- package/dist/apps/data/routes/balances.js.map +1 -0
- package/dist/apps/{blocks.d.ts → data/routes/blocks.d.ts} +47 -47
- package/dist/apps/data/routes/blocks.d.ts.map +1 -0
- package/dist/apps/{blocks.js → data/routes/blocks.js} +13 -13
- package/dist/apps/data/routes/blocks.js.map +1 -0
- package/dist/apps/{coingecko.d.ts → data/routes/coingecko.d.ts} +183 -183
- package/dist/apps/data/routes/coingecko.d.ts.map +1 -0
- package/dist/apps/{coingecko.js → data/routes/coingecko.js} +13 -13
- package/dist/apps/data/routes/coingecko.js.map +1 -0
- package/dist/apps/{exchanges.d.ts → data/routes/exchanges.d.ts} +460 -460
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -0
- package/dist/apps/{exchanges.js → data/routes/exchanges.js} +19 -19
- package/dist/apps/data/routes/exchanges.js.map +1 -0
- package/dist/apps/{fee-amm.d.ts → data/routes/fee-amm.d.ts} +94 -94
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -0
- package/dist/apps/{fee-amm.js → data/routes/fee-amm.js} +17 -17
- package/dist/apps/data/routes/fee-amm.js.map +1 -0
- package/dist/apps/{indexer.d.ts → data/routes/indexer.d.ts} +4 -4
- package/dist/apps/data/routes/indexer.d.ts.map +1 -0
- package/dist/apps/{indexer.js → data/routes/indexer.js} +13 -9
- package/dist/apps/data/routes/indexer.js.map +1 -0
- package/dist/apps/{receipts.d.ts → data/routes/receipts.d.ts} +6 -6
- package/dist/apps/data/routes/receipts.d.ts.map +1 -0
- package/dist/apps/{receipts.js → data/routes/receipts.js} +12 -12
- package/dist/apps/data/routes/receipts.js.map +1 -0
- package/dist/apps/{rpc.d.ts → data/routes/rpc.d.ts} +4 -4
- package/dist/apps/data/routes/rpc.d.ts.map +1 -0
- package/dist/apps/{rpc.js → data/routes/rpc.js} +6 -6
- package/dist/apps/data/routes/rpc.js.map +1 -0
- package/dist/apps/{tokenlist.d.ts → data/routes/tokenlist.d.ts} +4 -4
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -0
- package/dist/apps/{tokenlist.js → data/routes/tokenlist.js} +8 -8
- package/dist/apps/data/routes/tokenlist.js.map +1 -0
- package/dist/apps/{tokens.d.ts → data/routes/tokens.d.ts} +11 -11
- package/dist/apps/data/routes/tokens.d.ts.map +1 -0
- package/dist/apps/{tokens.js → data/routes/tokens.js} +19 -19
- package/dist/apps/data/routes/tokens.js.map +1 -0
- package/dist/apps/{transactions.d.ts → data/routes/transactions.d.ts} +288 -288
- package/dist/apps/data/routes/transactions.d.ts.map +1 -0
- package/dist/apps/{transactions.js → data/routes/transactions.js} +13 -13
- package/dist/apps/data/routes/transactions.js.map +1 -0
- package/dist/apps/{transfers.d.ts → data/routes/transfers.d.ts} +35 -35
- package/dist/apps/data/routes/transfers.d.ts.map +1 -0
- package/dist/apps/{transfers.js → data/routes/transfers.js} +13 -13
- package/dist/apps/data/routes/transfers.js.map +1 -0
- package/dist/apps/{verified-tokens.d.ts → data/routes/verified-tokens.d.ts} +42 -42
- package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -0
- package/dist/apps/{verified-tokens.js → data/routes/verified-tokens.js} +9 -9
- package/dist/apps/data/routes/verified-tokens.js.map +1 -0
- package/dist/apps/{webhooks.d.ts → data/routes/webhooks.d.ts} +66 -63
- package/dist/apps/{webhooks.d.ts.map → data/routes/webhooks.d.ts.map} +1 -1
- package/dist/apps/{webhooks.js → data/routes/webhooks.js} +67 -59
- package/dist/apps/data/routes/webhooks.js.map +1 -0
- package/dist/apps/docs/App.d.ts +27 -0
- package/dist/apps/docs/App.d.ts.map +1 -0
- package/dist/apps/docs/App.js +122 -0
- package/dist/apps/docs/App.js.map +1 -0
- package/dist/{internal/OpenApi.fonts.d.ts → apps/docs/fonts.d.ts} +1 -1
- package/dist/apps/docs/fonts.d.ts.map +1 -0
- package/dist/{internal/OpenApi.fonts.js → apps/docs/fonts.js} +1 -1
- package/dist/apps/docs/fonts.js.map +1 -0
- package/dist/apps/docs/index.d.ts +2 -0
- package/dist/apps/docs/index.d.ts.map +1 -0
- package/dist/apps/docs/index.js +2 -0
- package/dist/apps/docs/index.js.map +1 -0
- package/dist/{internal/OpenApi.logo.d.ts → apps/docs/logo.d.ts} +1 -1
- package/dist/apps/docs/logo.d.ts.map +1 -0
- package/dist/{internal/OpenApi.logo.js → apps/docs/logo.js} +1 -1
- package/dist/apps/docs/logo.js.map +1 -0
- package/dist/apps/index.d.ts +4 -0
- package/dist/apps/index.d.ts.map +1 -0
- package/dist/apps/index.js +4 -0
- package/dist/apps/index.js.map +1 -0
- package/dist/apps/metadata.d.ts +7 -0
- package/dist/apps/metadata.d.ts.map +1 -0
- package/dist/apps/metadata.js +15 -0
- package/dist/apps/metadata.js.map +1 -0
- package/dist/apps/platform/App.d.ts +2985 -0
- package/dist/apps/platform/App.d.ts.map +1 -0
- package/dist/apps/platform/App.js +74 -0
- package/dist/apps/platform/App.js.map +1 -0
- package/dist/apps/platform/index.d.ts +2 -0
- package/dist/apps/platform/index.d.ts.map +1 -0
- package/dist/apps/platform/index.js +2 -0
- package/dist/apps/platform/index.js.map +1 -0
- package/dist/apps/platform/routes/api-keys.d.ts +681 -0
- package/dist/apps/platform/routes/api-keys.d.ts.map +1 -0
- package/dist/apps/platform/routes/api-keys.js +328 -0
- package/dist/apps/platform/routes/api-keys.js.map +1 -0
- package/dist/apps/platform/routes/invitations.d.ts +733 -0
- package/dist/apps/platform/routes/invitations.d.ts.map +1 -0
- package/dist/apps/platform/routes/invitations.js +413 -0
- package/dist/apps/platform/routes/invitations.js.map +1 -0
- package/dist/apps/platform/routes/me.d.ts +95 -0
- package/dist/apps/platform/routes/me.d.ts.map +1 -0
- package/dist/apps/platform/routes/me.js +81 -0
- package/dist/apps/platform/routes/me.js.map +1 -0
- package/dist/apps/platform/routes/members.d.ts +554 -0
- package/dist/apps/platform/routes/members.d.ts.map +1 -0
- package/dist/apps/platform/routes/members.js +251 -0
- package/dist/apps/platform/routes/members.js.map +1 -0
- package/dist/apps/platform/routes/orgs.d.ts +582 -0
- package/dist/apps/platform/routes/orgs.d.ts.map +1 -0
- package/dist/apps/platform/routes/orgs.js +265 -0
- package/dist/apps/platform/routes/orgs.js.map +1 -0
- package/dist/apps/platform/routes/projects.d.ts +740 -0
- package/dist/apps/platform/routes/projects.d.ts.map +1 -0
- package/dist/apps/platform/routes/projects.js +286 -0
- package/dist/apps/platform/routes/projects.js.map +1 -0
- package/dist/apps/relay/App.d.ts +41 -0
- package/dist/apps/relay/App.d.ts.map +1 -0
- package/dist/apps/relay/App.js +103 -0
- package/dist/apps/relay/App.js.map +1 -0
- package/dist/apps/relay/Sponsorships.d.ts +107 -0
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -0
- package/dist/apps/relay/Sponsorships.js +193 -0
- package/dist/apps/relay/Sponsorships.js.map +1 -0
- package/dist/apps/relay/index.d.ts +3 -0
- package/dist/apps/relay/index.d.ts.map +1 -0
- package/dist/apps/relay/index.js +3 -0
- package/dist/apps/relay/index.js.map +1 -0
- package/dist/{Cli.d.ts → cli/Cli.d.ts} +13 -2
- package/dist/cli/Cli.d.ts.map +1 -0
- package/dist/cli/Cli.js +19 -0
- package/dist/cli/Cli.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 +4 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +15 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +60 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cloudflare.d.ts +7 -0
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +9 -0
- package/dist/cloudflare.js.map +1 -1
- package/dist/db/Db.d.ts +113 -0
- package/dist/db/Db.d.ts.map +1 -0
- package/dist/db/Db.js +402 -0
- package/dist/db/Db.js.map +1 -0
- package/dist/db/Schema.d.ts +168 -0
- package/dist/db/Schema.d.ts.map +1 -0
- package/dist/db/Schema.js +229 -0
- package/dist/db/Schema.js.map +1 -0
- package/dist/db/tables/invitations.d.ts +84 -0
- package/dist/db/tables/invitations.d.ts.map +1 -0
- package/dist/db/tables/invitations.js +165 -0
- package/dist/db/tables/invitations.js.map +1 -0
- package/dist/db/tables/memberships.d.ts +108 -0
- package/dist/db/tables/memberships.d.ts.map +1 -0
- package/dist/db/tables/memberships.js +153 -0
- package/dist/db/tables/memberships.js.map +1 -0
- package/dist/db/tables/organizations.d.ts +123 -0
- package/dist/db/tables/organizations.d.ts.map +1 -0
- package/dist/db/tables/organizations.js +170 -0
- package/dist/db/tables/organizations.js.map +1 -0
- package/dist/db/tables/projects.d.ts +65 -0
- package/dist/db/tables/projects.d.ts.map +1 -0
- package/dist/db/tables/projects.js +75 -0
- package/dist/db/tables/projects.js.map +1 -0
- package/dist/db/tables/sponsoredTransactions.d.ts +120 -0
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -0
- package/dist/db/tables/sponsoredTransactions.js +161 -0
- package/dist/db/tables/sponsoredTransactions.js.map +1 -0
- package/dist/db/tables/users.d.ts +48 -0
- package/dist/db/tables/users.d.ts.map +1 -0
- package/dist/db/tables/users.js +65 -0
- package/dist/db/tables/users.js.map +1 -0
- package/dist/db/tables/verifiedTokens.d.ts +53 -0
- package/dist/db/tables/verifiedTokens.d.ts.map +1 -0
- package/dist/db/tables/verifiedTokens.js +74 -0
- package/dist/db/tables/verifiedTokens.js.map +1 -0
- package/dist/db/tables/webhookDeliveries.d.ts +71 -0
- package/dist/db/tables/webhookDeliveries.d.ts.map +1 -0
- package/dist/db/tables/webhookDeliveries.js +119 -0
- package/dist/db/tables/webhookDeliveries.js.map +1 -0
- package/dist/db/tables/webhookSubscriptions.d.ts +158 -0
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -0
- package/dist/db/tables/webhookSubscriptions.js +272 -0
- package/dist/db/tables/webhookSubscriptions.js.map +1 -0
- package/dist/handlers/internal/executionError.d.ts +25 -0
- package/dist/handlers/internal/executionError.d.ts.map +1 -0
- package/dist/handlers/internal/executionError.js +186 -0
- package/dist/handlers/internal/executionError.js.map +1 -0
- package/dist/handlers/internal/multisig.d.ts +233 -0
- package/dist/handlers/internal/multisig.d.ts.map +1 -0
- package/dist/handlers/internal/multisig.js +542 -0
- package/dist/handlers/internal/multisig.js.map +1 -0
- package/dist/handlers/internal/requestListener.d.ts +124 -0
- package/dist/handlers/internal/requestListener.d.ts.map +1 -0
- package/dist/handlers/internal/requestListener.js +173 -0
- package/dist/handlers/internal/requestListener.js.map +1 -0
- package/dist/handlers/internal/sponsorship.d.ts +113 -0
- package/dist/handlers/internal/sponsorship.d.ts.map +1 -0
- package/dist/handlers/internal/sponsorship.js +128 -0
- package/dist/handlers/internal/sponsorship.js.map +1 -0
- package/dist/handlers/internal/types.d.ts +284 -0
- package/dist/handlers/internal/types.d.ts.map +1 -0
- package/dist/handlers/internal/types.js +2 -0
- package/dist/handlers/internal/types.js.map +1 -0
- package/dist/handlers/internal/utils.d.ts +34 -0
- package/dist/handlers/internal/utils.d.ts.map +1 -0
- package/dist/handlers/internal/utils.js +131 -0
- package/dist/handlers/internal/utils.js.map +1 -0
- package/dist/handlers/relay.d.ts +123 -0
- package/dist/handlers/relay.d.ts.map +1 -0
- package/dist/handlers/relay.js +1278 -0
- package/dist/handlers/relay.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/Auth.d.ts +224 -16
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +572 -33
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Log.d.ts +7 -3
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +4 -0
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +0 -19
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +0 -57
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/RpcSchema.d.ts +10 -0
- package/dist/internal/RpcSchema.d.ts.map +1 -0
- package/dist/internal/RpcSchema.js +2 -0
- package/dist/internal/RpcSchema.js.map +1 -0
- package/dist/internal/Store.d.ts +49 -4
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +81 -5
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/VerifiedTokens.d.ts +15 -34
- package/dist/internal/VerifiedTokens.d.ts.map +1 -1
- package/dist/internal/VerifiedTokens.js +115 -159
- package/dist/internal/VerifiedTokens.js.map +1 -1
- package/dist/internal/Viem.d.ts +84 -0
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Webhooks.d.ts +50 -36
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +92 -205
- package/dist/internal/Webhooks.js.map +1 -1
- package/package.json +37 -6
- package/src/ApiKey.test.ts +3 -3
- package/src/ApiKey.ts +11 -12
- package/src/ApiKeys.test.ts +278 -0
- package/src/ApiKeys.ts +358 -0
- package/src/App.test-d.ts +1 -1
- package/src/App.test.ts +40508 -19083
- package/src/App.ts +239 -416
- package/src/Client.test-d.ts +307 -16
- package/src/Handler.ts +154 -0
- package/src/Scope.ts +17 -4
- package/src/Webhooks.test.ts +8 -7
- package/src/Webhooks.ts +13 -7
- package/src/admin/Access.ts +1 -3
- package/src/admin/App.ts +19 -24
- package/src/admin/apps/api-keys.test.ts +70 -18
- package/src/admin/apps/api-keys.ts +92 -9
- package/src/admin/apps/scopes.test.ts +8 -0
- package/src/admin/apps/verified-tokens.test.ts +3 -30
- package/src/admin/apps/verified-tokens.ts +18 -37
- package/src/admin/ui.generated.ts +1 -1
- package/src/apps/composition.test.ts +66 -0
- package/src/apps/data/App.ts +295 -0
- package/src/apps/data/index.ts +2 -0
- package/src/apps/{activities.test.ts → data/routes/activities.test.ts} +3 -3
- package/src/apps/{activities.ts → data/routes/activities.ts} +15 -15
- package/src/apps/{addresses.ts → data/routes/addresses.ts} +6 -6
- package/src/apps/{balances.test.ts → data/routes/balances.test.ts} +6 -5
- package/src/apps/{balances.ts → data/routes/balances.ts} +46 -12
- package/src/apps/{blocks.test.ts → data/routes/blocks.test.ts} +4 -4
- package/src/apps/{blocks.ts → data/routes/blocks.ts} +14 -14
- package/src/apps/{coingecko.test.ts → data/routes/coingecko.test.ts} +2 -2
- package/src/apps/{coingecko.ts → data/routes/coingecko.ts} +14 -14
- package/src/apps/{exchanges.test.ts → data/routes/exchanges.test.ts} +2 -2
- package/src/apps/{exchanges.ts → data/routes/exchanges.ts} +20 -20
- package/src/apps/{fee-amm.test.ts → data/routes/fee-amm.test.ts} +3 -3
- package/src/apps/{fee-amm.ts → data/routes/fee-amm.ts} +18 -18
- package/src/apps/{indexer.test.ts → data/routes/indexer.test.ts} +27 -6
- package/src/apps/{indexer.ts → data/routes/indexer.ts} +13 -10
- package/src/apps/{receipts.test.ts → data/routes/receipts.test.ts} +4 -4
- package/src/apps/{receipts.ts → data/routes/receipts.ts} +13 -13
- package/src/apps/{rpc.test.ts → data/routes/rpc.test.ts} +142 -13
- package/src/apps/{rpc.ts → data/routes/rpc.ts} +7 -7
- package/src/apps/{tokenlist.test.ts → data/routes/tokenlist.test.ts} +8 -10
- package/src/apps/{tokenlist.ts → data/routes/tokenlist.ts} +9 -9
- package/src/apps/{tokens.test.ts → data/routes/tokens.test.ts} +6 -5
- package/src/apps/{tokens.ts → data/routes/tokens.ts} +20 -20
- package/src/apps/{transactions.test.ts → data/routes/transactions.test.ts} +4 -4
- package/src/apps/{transactions.ts → data/routes/transactions.ts} +15 -15
- package/src/apps/{transfers.test.ts → data/routes/transfers.test.ts} +3 -3
- package/src/apps/{transfers.ts → data/routes/transfers.ts} +15 -15
- package/src/apps/{verified-tokens.test.ts → data/routes/verified-tokens.test.ts} +27 -15
- package/src/apps/{verified-tokens.ts → data/routes/verified-tokens.ts} +10 -10
- package/src/apps/{webhooks.test.ts → data/routes/webhooks.test.ts} +137 -150
- package/src/apps/{webhooks.ts → data/routes/webhooks.ts} +83 -81
- package/src/apps/docs/App.ts +136 -0
- package/src/apps/docs/index.ts +1 -0
- package/src/apps/index.ts +3 -0
- package/src/apps/metadata.ts +23 -0
- package/src/apps/platform/App.ts +130 -0
- package/src/apps/platform/index.ts +1 -0
- package/src/apps/platform/routes/api-keys.test.ts +330 -0
- package/src/apps/platform/routes/api-keys.ts +427 -0
- package/src/apps/platform/routes/invitations.test.ts +361 -0
- package/src/apps/platform/routes/invitations.ts +519 -0
- package/src/apps/platform/routes/me.test.ts +121 -0
- package/src/apps/platform/routes/me.ts +106 -0
- package/src/apps/platform/routes/members.test.ts +195 -0
- package/src/apps/platform/routes/members.ts +313 -0
- package/src/apps/platform/routes/orgs.test.ts +313 -0
- package/src/apps/platform/routes/orgs.ts +343 -0
- package/src/apps/platform/routes/projects.test.ts +181 -0
- package/src/apps/platform/routes/projects.ts +367 -0
- package/src/apps/relay/App.test.ts +484 -0
- package/src/apps/relay/App.ts +128 -0
- package/src/apps/relay/Sponsorships.test.ts +375 -0
- package/src/apps/relay/Sponsorships.ts +305 -0
- package/src/apps/relay/index.ts +2 -0
- package/src/{Cli.test.ts → cli/Cli.test.ts} +10 -9
- package/src/{Cli.ts → cli/Cli.ts} +16 -9
- package/src/cli/bin.ts +4 -0
- package/src/cli/commands/admin.test.ts +71 -0
- package/src/cli/commands/admin.ts +60 -0
- package/src/cloudflare.ts +10 -0
- package/src/db/Db.test.ts +84 -0
- package/src/db/Db.ts +542 -0
- package/src/db/Schema.ts +301 -0
- package/src/db/tables/invitations.ts +198 -0
- package/src/db/tables/memberships.ts +208 -0
- package/src/db/tables/organizations.test.ts +160 -0
- package/src/db/tables/organizations.ts +232 -0
- package/src/db/tables/projects.ts +107 -0
- package/src/db/tables/sponsoredTransactions.test.ts +218 -0
- package/src/db/tables/sponsoredTransactions.ts +236 -0
- package/src/db/tables/users.ts +85 -0
- package/src/db/tables/verifiedTokens.ts +111 -0
- package/src/db/tables/webhookDeliveries.ts +159 -0
- package/src/db/tables/webhookSubscriptions.ts +358 -0
- package/src/handlers/internal/executionError.ts +207 -0
- package/src/handlers/internal/multisig.test.ts +818 -0
- package/src/handlers/internal/multisig.ts +823 -0
- package/src/handlers/internal/requestListener.ts +273 -0
- package/src/handlers/internal/sponsorship.ts +245 -0
- package/src/handlers/internal/types.ts +378 -0
- package/src/handlers/internal/utils.ts +153 -0
- package/src/handlers/relay.test.ts +2035 -0
- package/src/handlers/relay.ts +1623 -0
- package/src/index.ts +4 -2
- package/src/internal/Auth.test.ts +337 -21
- package/src/internal/Auth.ts +783 -44
- package/src/internal/Cursor.test.ts +3 -2
- package/src/internal/Log.test.ts +1 -1
- package/src/internal/Log.ts +11 -3
- package/src/internal/MetricSink.ts +1 -1
- package/src/internal/OpenApi.ts +0 -59
- package/src/internal/RateLimit.test.ts +1 -1
- package/src/internal/RpcSchema.ts +10 -0
- package/src/internal/Store.test.ts +150 -10
- package/src/internal/Store.ts +136 -11
- package/src/internal/Tidx.local.test.ts +1 -1
- package/src/internal/VerifiedTokens.test.ts +99 -115
- package/src/internal/VerifiedTokens.ts +123 -175
- package/src/internal/WebhookDestination.test.ts +1 -1
- package/src/internal/Webhooks.test.ts +111 -111
- package/src/internal/Webhooks.ts +103 -221
- package/dist/ApiKeySource.d.ts +0 -166
- package/dist/ApiKeySource.d.ts.map +0 -1
- package/dist/ApiKeySource.js +0 -234
- package/dist/ApiKeySource.js.map +0 -1
- package/dist/Cli.d.ts.map +0 -1
- package/dist/Cli.js +0 -13
- package/dist/Cli.js.map +0 -1
- package/dist/apps/activities.js.map +0 -1
- package/dist/apps/addresses.js.map +0 -1
- package/dist/apps/balances.d.ts.map +0 -1
- package/dist/apps/balances.js.map +0 -1
- package/dist/apps/blocks.d.ts.map +0 -1
- package/dist/apps/blocks.js.map +0 -1
- package/dist/apps/coingecko.d.ts.map +0 -1
- package/dist/apps/coingecko.js.map +0 -1
- package/dist/apps/exchanges.d.ts.map +0 -1
- package/dist/apps/exchanges.js.map +0 -1
- package/dist/apps/fee-amm.d.ts.map +0 -1
- package/dist/apps/fee-amm.js.map +0 -1
- package/dist/apps/indexer.d.ts.map +0 -1
- package/dist/apps/indexer.js.map +0 -1
- package/dist/apps/receipts.d.ts.map +0 -1
- package/dist/apps/receipts.js.map +0 -1
- package/dist/apps/rpc.d.ts.map +0 -1
- package/dist/apps/rpc.js.map +0 -1
- package/dist/apps/tokenlist.d.ts.map +0 -1
- package/dist/apps/tokenlist.js.map +0 -1
- package/dist/apps/tokens.d.ts.map +0 -1
- package/dist/apps/tokens.js.map +0 -1
- package/dist/apps/transactions.d.ts.map +0 -1
- package/dist/apps/transactions.js.map +0 -1
- package/dist/apps/transfers.d.ts.map +0 -1
- package/dist/apps/transfers.js.map +0 -1
- package/dist/apps/verified-tokens.d.ts.map +0 -1
- package/dist/apps/verified-tokens.js.map +0 -1
- package/dist/apps/webhooks.js.map +0 -1
- package/dist/internal/OpenApi.fonts.d.ts.map +0 -1
- package/dist/internal/OpenApi.fonts.js.map +0 -1
- package/dist/internal/OpenApi.logo.d.ts.map +0 -1
- package/dist/internal/OpenApi.logo.js.map +0 -1
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000000.svg +0 -1
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000001.svg +0 -1
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000002.svg +0 -1
- package/seeds/31318/icons/0x20c0000000000000000000000000000000000003.svg +0 -1
- package/seeds/31318/verified-tokens.json +0 -30
- package/seeds/4217/icons/0x20c0000000000000000000000000000000000000.svg +0 -25
- package/seeds/4217/icons/0x20c000000000000000000000048c8f36df1c9a4a.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000000520792dcccccccc.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000000a6da882d075a4c3.svg +0 -4
- package/seeds/4217/icons/0x20c000000000000000000000111111111e910f0f.svg +0 -30
- package/seeds/4217/icons/0x20c00000000000000000000014f22ca97301eb73.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000001621e21f71cf12fb.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000002f52d5cc21a3207b.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000003158081efd85bfc2.svg +0 -11
- package/seeds/4217/icons/0x20c0000000000000000000003554d28269e0f3c2.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000383a23bacb546ab9.svg +0 -1
- package/seeds/4217/icons/0x20c00000000000000000000042109aef2f8b28e1.png +0 -0
- package/seeds/4217/icons/0x20c0000000000000000000005c0bac7cef389a11.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000006fd9a167923ba194.png +0 -0
- package/seeds/4217/icons/0x20c0000000000000000000007f7ba549dd0251b9.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000008191667423f70e67.svg +0 -5
- package/seeds/4217/icons/0x20c0000000000000000000008ee4fcff88888888.svg +0 -1
- package/seeds/4217/icons/0x20c0000000000000000000009a4a4b17e0dc6651.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000ab02d39df30bd17e.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000ae247a1130450f09.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000aeed2ec36a54d0e5.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000b9537d11c60e8b50.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000bd95bfb69fbe6ce3.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000c412ec89d0c08be5.svg +0 -1
- package/seeds/4217/icons/0x20c000000000000000000000f047dd7018e50367.png +0 -0
- package/seeds/4217/verified-tokens.json +0 -177
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000000.svg +0 -25
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000001.svg +0 -1
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000002.svg +0 -1
- package/seeds/42431/icons/0x20c0000000000000000000000000000000000003.svg +0 -1
- package/seeds/42431/icons/0x20c0000000000000000000009e8d7eb59b783726.svg +0 -1
- package/seeds/42431/icons/0x20c000000000000000000000d72572838bbee59c.svg +0 -1
- package/seeds/42431/verified-tokens.json +0 -44
- package/seeds/openrpc/README.md +0 -27
- package/seeds/openrpc/execution-apis.json +0 -8989
- package/src/ApiKeySource.test-d.ts +0 -11
- package/src/ApiKeySource.test.ts +0 -295
- package/src/ApiKeySource.ts +0 -303
- /package/src/{internal/OpenApi.fonts.ts → apps/docs/fonts.ts} +0 -0
- /package/src/{internal/OpenApi.logo.ts → apps/docs/logo.ts} +0 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import * as z from 'zod/mini';
|
|
2
|
+
// Row schemas for database tables (`zod/mini`), the source of truth each
|
|
3
|
+
// `tables/` module derives its `Table` type from. Nullable fields map to
|
|
4
|
+
// nullable columns; the domain layer converts `null` back to absent fields.
|
|
5
|
+
// Domain-owned unions and jsonb values stay typed by their owning module via
|
|
6
|
+
// `z.custom` (type-only imports) so the two cannot drift.
|
|
7
|
+
/** A pending, expiring offer of organization membership. */
|
|
8
|
+
export const Invitation = z.object({
|
|
9
|
+
acceptedAt: z
|
|
10
|
+
.nullable(z.string())
|
|
11
|
+
.check(z.describe('When the invitation was accepted (ISO 8601), or null while pending.')),
|
|
12
|
+
createdAt: z.string().check(z.describe('When the invitation was created (ISO 8601).')),
|
|
13
|
+
email: z
|
|
14
|
+
.string()
|
|
15
|
+
.check(z.describe('Invitee email (stored lowercase); matched against verified emails.')),
|
|
16
|
+
expiresAt: z.string().check(z.describe('When the invitation expires (ISO 8601).')),
|
|
17
|
+
id: z
|
|
18
|
+
.string()
|
|
19
|
+
.check(z.describe('Opaque invitation id (`inv_…`).'), z.meta({ examples: ['inv_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
20
|
+
invitedBy: z.string().check(z.describe('User id (`usr_…`) that created the invitation.')),
|
|
21
|
+
orgId: z.string().check(z.describe('Organization id (`org_…`) the invitation joins.')),
|
|
22
|
+
revokedAt: z
|
|
23
|
+
.nullable(z.string())
|
|
24
|
+
.check(z.describe('When the invitation was revoked (ISO 8601), or null.')),
|
|
25
|
+
role: z
|
|
26
|
+
.enum(['admin', 'member', 'owner'])
|
|
27
|
+
.check(z.describe('Role granted when the invitation is accepted.')),
|
|
28
|
+
});
|
|
29
|
+
/** A user's role within an organization. */
|
|
30
|
+
export const Membership = z.object({
|
|
31
|
+
createdAt: z.string().check(z.describe('When the membership was created (ISO 8601).')),
|
|
32
|
+
orgId: z.string().check(z.describe('Organization id (`org_…`).')),
|
|
33
|
+
role: z
|
|
34
|
+
.enum(['admin', 'member', 'owner'])
|
|
35
|
+
.check(z.describe("The member's role within the organization.")),
|
|
36
|
+
updatedAt: z.string().check(z.describe('When the membership was last updated (ISO 8601).')),
|
|
37
|
+
userId: z.string().check(z.describe('Member user id (`usr_…`).')),
|
|
38
|
+
});
|
|
39
|
+
/** An organization, the top-level tenant that owns API keys. */
|
|
40
|
+
export const Organization = z.object({
|
|
41
|
+
createdAt: z.string().check(z.describe('When the organization was created (ISO 8601).')),
|
|
42
|
+
createdBy: z
|
|
43
|
+
.nullable(z.string())
|
|
44
|
+
.check(z.describe('Identity that created the organization (e.g. admin email), or null.')),
|
|
45
|
+
id: z
|
|
46
|
+
.string()
|
|
47
|
+
.check(z.describe('Opaque organization id (`org_…`).'), z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
48
|
+
name: z
|
|
49
|
+
.string()
|
|
50
|
+
.check(z.describe('Human-readable organization name.'), z.meta({ examples: ['Acme, Inc.'] })),
|
|
51
|
+
updatedAt: z.string().check(z.describe('When the organization was last updated (ISO 8601).')),
|
|
52
|
+
userId: z
|
|
53
|
+
.nullable(z.string())
|
|
54
|
+
.check(z.describe('Owning user id (`usr_…`), or null for organizations created by the super admin.')),
|
|
55
|
+
});
|
|
56
|
+
/** A project: an app or integration within an organization. */
|
|
57
|
+
export const Project = z.object({
|
|
58
|
+
createdAt: z.string().check(z.describe('When the project was created (ISO 8601).')),
|
|
59
|
+
id: z
|
|
60
|
+
.string()
|
|
61
|
+
.check(z.describe('Opaque project id (`prj_…`).'), z.meta({ examples: ['prj_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
62
|
+
name: z
|
|
63
|
+
.string()
|
|
64
|
+
.check(z.describe('Human-readable project name.'), z.meta({ examples: ['Checkout'] })),
|
|
65
|
+
orgId: z.string().check(z.describe('Owning organization id (`org_…`).')),
|
|
66
|
+
updatedAt: z.string().check(z.describe('When the project was last updated (ISO 8601).')),
|
|
67
|
+
});
|
|
68
|
+
/** A transaction sponsored by the managed fee payer — the billable unit of fee payer spend. */
|
|
69
|
+
export const SponsoredTransaction = z.object({
|
|
70
|
+
apiKeyId: z.string().check(z.describe('API key id (`key_…`) that requested sponsorship.')),
|
|
71
|
+
billable: z
|
|
72
|
+
.boolean()
|
|
73
|
+
.check(z.describe('Whether the sponsorship accrues billable spend; false for sandbox.')),
|
|
74
|
+
chainId: z.number().check(z.describe('Chain the sponsored transaction targets.')),
|
|
75
|
+
createdAt: z.string().check(z.describe('When the sponsorship was recorded (ISO 8601).')),
|
|
76
|
+
environment: z
|
|
77
|
+
.enum(['production', 'sandbox'])
|
|
78
|
+
.check(z.describe('Key environment the sponsorship was requested under.')),
|
|
79
|
+
feeAmount: z
|
|
80
|
+
.nullable(z.string())
|
|
81
|
+
.check(z.describe('Actual fee paid in fee-token base units, or null until finalized.')),
|
|
82
|
+
feeToken: z
|
|
83
|
+
.nullable(z.string())
|
|
84
|
+
.check(z.describe('Fee token address, or null when the chain default applied.')),
|
|
85
|
+
finalizedAt: z
|
|
86
|
+
.nullable(z.string())
|
|
87
|
+
.check(z.describe('When the sponsorship reached a terminal status (ISO 8601), or null.')),
|
|
88
|
+
id: z
|
|
89
|
+
.string()
|
|
90
|
+
.check(z.describe('Opaque sponsored-transaction id (`stx_…`).'), z.meta({ examples: ['stx_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
91
|
+
orgId: z.string().check(z.describe('Organization id (`org_…`) the spend attributes to.')),
|
|
92
|
+
projectId: z.string().check(z.describe('Project id (`prj_…`) the spend attributes to.')),
|
|
93
|
+
signPayload: z
|
|
94
|
+
.string()
|
|
95
|
+
.check(z.describe('Fee-payer sign payload — a stable identity for the sponsored envelope.')),
|
|
96
|
+
status: z
|
|
97
|
+
.enum(['failed', 'finalized', 'pending'])
|
|
98
|
+
.check(z.describe('Pending until a receipt finalizes it or the pending TTL fails it.')),
|
|
99
|
+
transaction: z
|
|
100
|
+
.string()
|
|
101
|
+
.check(z.describe('Serialized sponsored transaction, kept for durable observability.')),
|
|
102
|
+
transactionHash: z
|
|
103
|
+
.nullable(z.string())
|
|
104
|
+
.check(z.describe('Transaction hash, or null for fill intents until reconciled.')),
|
|
105
|
+
});
|
|
106
|
+
/** A developer identity. */
|
|
107
|
+
export const User = z.object({
|
|
108
|
+
address: z
|
|
109
|
+
.nullable(z.string())
|
|
110
|
+
.check(z.describe('Wallet address that signs in as this user (stored lowercase), or null for non-wallet identities.')),
|
|
111
|
+
createdAt: z.string().check(z.describe('When the user was created (ISO 8601).')),
|
|
112
|
+
email: z
|
|
113
|
+
.nullable(z.string())
|
|
114
|
+
.check(z.describe('Verified email from the wallet identity token, or null.')),
|
|
115
|
+
id: z
|
|
116
|
+
.string()
|
|
117
|
+
.check(z.describe('Opaque user id (`usr_…`).'), z.meta({ examples: ['usr_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
118
|
+
updatedAt: z.string().check(z.describe('When the user was last updated (ISO 8601).')),
|
|
119
|
+
});
|
|
120
|
+
/**
|
|
121
|
+
* A verified token: one row per curated token, ordered by `position` (list
|
|
122
|
+
* order is canonical and surfaced to clients). Addresses are stored lowercase;
|
|
123
|
+
* case-insensitive symbol uniqueness is enforced by a functional index on
|
|
124
|
+
* `lower(symbol)`.
|
|
125
|
+
*/
|
|
126
|
+
export const VerifiedToken = z.object({
|
|
127
|
+
address: z.string().check(z.describe('Verified TIP-20 token contract address (lowercase).')),
|
|
128
|
+
chainId: z.number().check(z.int(), z.describe('Chain the token belongs to.')),
|
|
129
|
+
currency: z.string().check(z.describe('Display currency, e.g. `USD`.')),
|
|
130
|
+
decimals: z.number().check(z.int(), z.describe('Decimal precision.')),
|
|
131
|
+
logoUri: z.nullable(z.string()).check(z.describe('Curated HTTPS logo URL, or null.')),
|
|
132
|
+
name: z.string().check(z.describe('Display name.')),
|
|
133
|
+
position: z
|
|
134
|
+
.number()
|
|
135
|
+
.check(z.int(), z.describe("Zero-based position in the chain's canonical list order.")),
|
|
136
|
+
symbol: z.string().check(z.describe('Ticker symbol.'), z.meta({ examples: ['USDC'] })),
|
|
137
|
+
});
|
|
138
|
+
/**
|
|
139
|
+
* A chain's verified-token list metadata — the opaque `version` that drives
|
|
140
|
+
* the soft-refresh cache and `If-Match` preconditions, bumped on every publish.
|
|
141
|
+
*/
|
|
142
|
+
export const VerifiedTokenList = z.object({
|
|
143
|
+
chainId: z.number().check(z.int(), z.describe('Chain the list belongs to.')),
|
|
144
|
+
updatedAt: z.string().check(z.describe('ISO timestamp of the last publish.')),
|
|
145
|
+
version: z
|
|
146
|
+
.string()
|
|
147
|
+
.check(z.describe('Opaque list version (`<epoch-ms>_<hex>`); changes on every publish.')),
|
|
148
|
+
});
|
|
149
|
+
/**
|
|
150
|
+
* A webhook subscription. The `Webhooks.Owner` union maps to (`ownerType`,
|
|
151
|
+
* `ownerId`); jsonb object columns round-trip as parsed values. `pollerCursor`
|
|
152
|
+
* replaces the old per-subscription cursor key.
|
|
153
|
+
*/
|
|
154
|
+
export const WebhookSubscription = z.object({
|
|
155
|
+
chainId: z.number().check(z.int(), z.describe('Chain the subscription listens on.')),
|
|
156
|
+
context: z
|
|
157
|
+
.nullable(z.custom())
|
|
158
|
+
.check(z.describe('Human context (`jsonb`), or null.')),
|
|
159
|
+
createdAt: z.string().check(z.describe('ISO timestamp of creation.')),
|
|
160
|
+
destination: z
|
|
161
|
+
.custom()
|
|
162
|
+
.check(z.describe('Delivery destination (`jsonb`).')),
|
|
163
|
+
eventType: z
|
|
164
|
+
.custom()
|
|
165
|
+
.check(z.describe('Event type the subscription listens to.')),
|
|
166
|
+
expiresAt: z
|
|
167
|
+
.nullable(z.string())
|
|
168
|
+
.check(z.describe('ISO expiry timestamp (MPP-owned subscriptions), or null.')),
|
|
169
|
+
failureCount: z
|
|
170
|
+
.number()
|
|
171
|
+
.check(z.int(), z.describe('Consecutive delivery failures; drives auto-disable.')),
|
|
172
|
+
filters: z
|
|
173
|
+
.custom()
|
|
174
|
+
.check(z.describe('Event-type-specific filter predicates (`jsonb`).')),
|
|
175
|
+
id: z
|
|
176
|
+
.string()
|
|
177
|
+
.check(z.describe('Subscription id (`wh_…`, lexically time-ordered).'), z.meta({ examples: ['wh_0000019c1a2b3c4d5e6f7g8h'] })),
|
|
178
|
+
lastDeliveryAt: z
|
|
179
|
+
.nullable(z.string())
|
|
180
|
+
.check(z.describe('ISO timestamp of the last successful delivery, or null.')),
|
|
181
|
+
ownerId: z
|
|
182
|
+
.string()
|
|
183
|
+
.check(z.describe('Owner identifier: `orgId` for `api_key` owners, `payer` for `mpp`.')),
|
|
184
|
+
ownerType: z.custom().check(z.describe('Owner kind.')),
|
|
185
|
+
pollerCursor: z
|
|
186
|
+
.nullable(z.string())
|
|
187
|
+
.check(z.describe('Poller keyset cursor, or null before the first tick.')),
|
|
188
|
+
secret: z.string().check(z.describe('HMAC signing secret.')),
|
|
189
|
+
status: z.custom().check(z.describe('Lifecycle status.')),
|
|
190
|
+
updatedAt: z
|
|
191
|
+
.string()
|
|
192
|
+
.check(z.describe('ISO timestamp of the last mutation (`pollerCursor` writes excluded).')),
|
|
193
|
+
});
|
|
194
|
+
/**
|
|
195
|
+
* A webhook delivery attempt. Rows are invisible past `expiresAt` (the
|
|
196
|
+
* retention deadline that replaces the old store TTL) and pruned by the
|
|
197
|
+
* poller; deleting a subscription cascades to its rows.
|
|
198
|
+
*/
|
|
199
|
+
export const WebhookDelivery = z.object({
|
|
200
|
+
attempt: z
|
|
201
|
+
.number()
|
|
202
|
+
.check(z.int(), z.describe('Consecutive attempt number (1-based) at the time of the delivery.')),
|
|
203
|
+
createdAt: z.string().check(z.describe('ISO timestamp the attempt was recorded.')),
|
|
204
|
+
envelope: z
|
|
205
|
+
.custom()
|
|
206
|
+
.check(z.describe('The exact envelope that was sent (`jsonb`), for verbatim replay.')),
|
|
207
|
+
error: z
|
|
208
|
+
.nullable(z.string())
|
|
209
|
+
.check(z.describe('Failure reason when `status` is `failed`, or null.')),
|
|
210
|
+
eventId: z.string().check(z.describe('Idempotent event id the delivery carried (`evt_…`).')),
|
|
211
|
+
expiresAt: z
|
|
212
|
+
.string()
|
|
213
|
+
.check(z.describe('ISO retention deadline; rows past it are invisible and pruned.')),
|
|
214
|
+
id: z
|
|
215
|
+
.string()
|
|
216
|
+
.check(z.describe('Delivery id (`whd_…`, lexically time-ordered).'), z.meta({ examples: ['whd_0000019c1a2b3c4d5e6f7g8h'] })),
|
|
217
|
+
requestUrl: z.string().check(z.describe('Subscriber callback URL the attempt targeted.')),
|
|
218
|
+
responseMs: z
|
|
219
|
+
.nullable(z.number())
|
|
220
|
+
.check(z.describe('Wall-clock duration of the attempt in ms, or null.')),
|
|
221
|
+
responseStatus: z
|
|
222
|
+
.nullable(z.number())
|
|
223
|
+
.check(z.describe('HTTP response status, or null when no response was received.')),
|
|
224
|
+
status: z.custom().check(z.describe('Outcome status.')),
|
|
225
|
+
subscriptionId: z
|
|
226
|
+
.string()
|
|
227
|
+
.check(z.describe('Owning subscription id (`wh_…`); FK with `ON DELETE CASCADE`.')),
|
|
228
|
+
});
|
|
229
|
+
//# sourceMappingURL=Schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Schema.js","sourceRoot":"","sources":["../../src/db/Schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAI7B,yEAAyE;AACzE,yEAAyE;AACzE,4EAA4E;AAC5E,6EAA6E;AAC7E,0DAA0D;AAE1D,4DAA4D;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,UAAU,EAAE,CAAC;SACV,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,qEAAqE,CAAC,CAAC;IAC3F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC,CAAC;IACtF,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,oEAAoE,CAAC,CAAC;IAC1F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;IAClF,EAAE,EAAE,CAAC;SACF,MAAM,EAAE;SACR,KAAK,CACJ,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAC7C,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,8BAA8B,CAAC,EAAE,CAAC,CACvD;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC,CAAC;IACzF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,iDAAiD,CAAC,CAAC;IACtF,SAAS,EAAE,CAAC;SACT,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,sDAAsD,CAAC,CAAC;IAC5E,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;SAClC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC,CAAC;CACtE,CAAC,CAAA;AAKF,4CAA4C;AAC5C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC,CAAC;IACtF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IACjE,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;SAClC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC,CAAC;IAClE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,kDAAkD,CAAC,CAAC;IAC3F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC;CAClE,CAAC,CAAA;AAKF,gEAAgE;AAChE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC,CAAC;IACxF,SAAS,EAAE,CAAC;SACT,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,qEAAqE,CAAC,CAAC;IAC3F,EAAE,EAAE,CAAC;SACF,MAAM,EAAE;SACR,KAAK,CACJ,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAC/C,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,8BAA8B,CAAC,EAAE,CAAC,CACvD;IACH,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,oDAAoD,CAAC,CAAC;IAC7F,MAAM,EAAE,CAAC;SACN,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CACJ,CAAC,CAAC,QAAQ,CAAC,iFAAiF,CAAC,CAC9F;CACJ,CAAC,CAAA;AAKF,+DAA+D;AAC/D,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC,CAAC;IACnF,EAAE,EAAE,CAAC;SACF,MAAM,EAAE;SACR,KAAK,CACJ,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAC1C,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,8BAA8B,CAAC,EAAE,CAAC,CACvD;IACH,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC;IACxE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC,CAAC;CACzF,CAAC,CAAA;AAKF,+FAA+F;AAC/F,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,kDAAkD,CAAC,CAAC;IAC1F,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,oEAAoE,CAAC,CAAC;IAC1F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC,CAAC;IACjF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC,CAAC;IACxF,WAAW,EAAE,CAAC;SACX,IAAI,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;SAC/B,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,sDAAsD,CAAC,CAAC;IAC5E,SAAS,EAAE,CAAC;SACT,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,mEAAmE,CAAC,CAAC;IACzF,QAAQ,EAAE,CAAC;SACR,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,4DAA4D,CAAC,CAAC;IAClF,WAAW,EAAE,CAAC;SACX,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,qEAAqE,CAAC,CAAC;IAC3F,EAAE,EAAE,CAAC;SACF,MAAM,EAAE;SACR,KAAK,CACJ,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC,EACxD,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,8BAA8B,CAAC,EAAE,CAAC,CACvD;IACH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,oDAAoD,CAAC,CAAC;IACzF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC,CAAC;IACxF,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,wEAAwE,CAAC,CAAC;IAC9F,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;SACxC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,mEAAmE,CAAC,CAAC;IACzF,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,mEAAmE,CAAC,CAAC;IACzF,eAAe,EAAE,CAAC;SACf,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,8DAA8D,CAAC,CAAC;CACrF,CAAC,CAAA;AAKF,4BAA4B;AAC5B,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,CAAC;SACP,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CACJ,CAAC,CAAC,QAAQ,CACR,kGAAkG,CACnG,CACF;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC;IAChF,KAAK,EAAE,CAAC;SACL,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,yDAAyD,CAAC,CAAC;IAC/E,EAAE,EAAE,CAAC;SACF,MAAM,EAAE;SACR,KAAK,CACJ,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EACvC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,8BAA8B,CAAC,EAAE,CAAC,CACvD;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC,CAAC;CACtF,CAAC,CAAA;AAKF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;IAC5F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;IAC7E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC;IACvE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACrE,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC;IACrF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACnD,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,0DAA0D,CAAC,CAAC;IACzF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;CACvF,CAAC,CAAA;AAKF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IAC5E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC;IAC7E,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,qEAAqE,CAAC,CAAC;CAC5F,CAAC,CAAA;AAKF;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC;IACpF,OAAO,EAAE,CAAC;SACP,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAoB,CAAC;SACtC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC;IACzD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IACrE,WAAW,EAAE,CAAC;SACX,MAAM,EAAwB;SAC9B,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;IACvD,SAAS,EAAE,CAAC;SACT,MAAM,EAAsB;SAC5B,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;IAC/D,SAAS,EAAE,CAAC;SACT,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,0DAA0D,CAAC,CAAC;IAChF,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;IACpF,OAAO,EAAE,CAAC;SACP,MAAM,EAAoC;SAC1C,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,kDAAkD,CAAC,CAAC;IACxE,EAAE,EAAE,CAAC;SACF,MAAM,EAAE;SACR,KAAK,CACJ,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC,EAC/D,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,6BAA6B,CAAC,EAAE,CAAC,CACtD;IACH,cAAc,EAAE,CAAC;SACd,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,yDAAyD,CAAC,CAAC;IAC/E,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,oEAAoE,CAAC,CAAC;IAC1F,SAAS,EAAE,CAAC,CAAC,MAAM,EAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC9E,YAAY,EAAE,CAAC;SACZ,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,sDAAsD,CAAC,CAAC;IAC5E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,sEAAsE,CAAC,CAAC;CAC7F,CAAC,CAAA;AAKF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,KAAK,CACJ,CAAC,CAAC,GAAG,EAAE,EACP,CAAC,CAAC,QAAQ,CAAC,mEAAmE,CAAC,CAChF;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC,CAAC;IAClF,QAAQ,EAAE,CAAC;SACR,MAAM,EAAqB;SAC3B,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,kEAAkE,CAAC,CAAC;IACxF,KAAK,EAAE,CAAC;SACL,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,oDAAoD,CAAC,CAAC;IAC1E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;IAC5F,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,gEAAgE,CAAC,CAAC;IACtF,EAAE,EAAE,CAAC;SACF,MAAM,EAAE;SACR,KAAK,CACJ,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC,EAC5D,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,8BAA8B,CAAC,EAAE,CAAC,CACvD;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC,CAAC;IACzF,UAAU,EAAE,CAAC;SACV,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,oDAAoD,CAAC,CAAC;IAC1E,cAAc,EAAE,CAAC;SACd,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACpB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,8DAA8D,CAAC,CAAC;IACpF,MAAM,EAAE,CAAC,CAAC,MAAM,EAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAChF,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,+DAA+D,CAAC,CAAC;CACtF,CAAC,CAAA"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { Selectable } from 'kysely';
|
|
2
|
+
import type * as Db from '../Db.js';
|
|
3
|
+
import type * as db_Schema from '../Schema.js';
|
|
4
|
+
import * as Memberships from './memberships.js';
|
|
5
|
+
/** Columns of the `invitations` table, derived from `Schema.Invitation`. */
|
|
6
|
+
export type Table = db_Schema.Invitation;
|
|
7
|
+
/** A stored invitation row. */
|
|
8
|
+
export type Record = Selectable<Table>;
|
|
9
|
+
/**
|
|
10
|
+
* Inserts an invitation and returns the stored record. Emails are stored
|
|
11
|
+
* lowercase so matching against verified emails is case-insensitive. Re-inviting
|
|
12
|
+
* a live (pending) (org, email) refreshes that row — role, inviter, expiry —
|
|
13
|
+
* rather than accumulating duplicates, matching the `invitations_pending_unique`
|
|
14
|
+
* partial index.
|
|
15
|
+
*
|
|
16
|
+
* @param db - The database.
|
|
17
|
+
* @param input - The invitation to insert.
|
|
18
|
+
* @returns The stored record.
|
|
19
|
+
*/
|
|
20
|
+
export declare function create(db: Db.Db, input: create.Input): Promise<Record>;
|
|
21
|
+
export declare namespace create {
|
|
22
|
+
/** Fields accepted when inserting an invitation. */
|
|
23
|
+
type Input = {
|
|
24
|
+
/** Invitee email. */
|
|
25
|
+
email: string;
|
|
26
|
+
/** When the invitation expires (ISO 8601). */
|
|
27
|
+
expiresAt: string;
|
|
28
|
+
/** User id (`usr_…`) creating the invitation. */
|
|
29
|
+
invitedBy: string;
|
|
30
|
+
/** Organization id (`org_…`) the invitation joins. */
|
|
31
|
+
orgId: string;
|
|
32
|
+
/** Role granted on accept. */
|
|
33
|
+
role: Memberships.Role;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Reads an invitation by id.
|
|
38
|
+
*
|
|
39
|
+
* @param db - The database.
|
|
40
|
+
* @param id - The invitation id (`inv_…`).
|
|
41
|
+
* @returns The record, or `undefined` when absent.
|
|
42
|
+
*/
|
|
43
|
+
export declare function get(db: Db.Db, id: string): Promise<Record | undefined>;
|
|
44
|
+
/**
|
|
45
|
+
* Lists an organization's pending invitations (unaccepted, unrevoked,
|
|
46
|
+
* unexpired), newest first.
|
|
47
|
+
*
|
|
48
|
+
* @param db - The database.
|
|
49
|
+
* @param orgId - The organization id (`org_…`).
|
|
50
|
+
* @returns The records.
|
|
51
|
+
*/
|
|
52
|
+
export declare function listByOrg(db: Db.Db, orgId: string): Promise<Record[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Lists pending invitations addressed to an email, joined with the inviting
|
|
55
|
+
* organization's name, newest first.
|
|
56
|
+
*
|
|
57
|
+
* @param db - The database.
|
|
58
|
+
* @param email - The invitee email (matched lowercase).
|
|
59
|
+
* @returns The records with `orgName` from the organization row.
|
|
60
|
+
*/
|
|
61
|
+
export declare function listByEmail(db: Db.Db, email: string): Promise<(Record & {
|
|
62
|
+
orgName: string;
|
|
63
|
+
})[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Revokes a pending invitation.
|
|
66
|
+
*
|
|
67
|
+
* @param db - The database.
|
|
68
|
+
* @param id - The invitation id (`inv_…`).
|
|
69
|
+
* @returns The revoked record, or `undefined` when absent or already settled.
|
|
70
|
+
*/
|
|
71
|
+
export declare function revoke(db: Db.Db, id: string): Promise<Record | undefined>;
|
|
72
|
+
/**
|
|
73
|
+
* Accepts a pending invitation into a membership, atomically: the conditional
|
|
74
|
+
* update settles the invitation exactly once (double accepts lose the race).
|
|
75
|
+
* A new member is inserted at the invited role; an existing member is only ever
|
|
76
|
+
* elevated to it — accepting never demotes (which could strip the last owner).
|
|
77
|
+
*
|
|
78
|
+
* @param db - The database.
|
|
79
|
+
* @param id - The invitation id (`inv_…`).
|
|
80
|
+
* @param userId - The accepting user id (`usr_…`).
|
|
81
|
+
* @returns The accepted record, or `undefined` when absent, settled, or expired.
|
|
82
|
+
*/
|
|
83
|
+
export declare function accept(db: Db.Db, id: string, userId: string): Promise<Record | undefined>;
|
|
84
|
+
//# sourceMappingURL=invitations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invitations.d.ts","sourceRoot":"","sources":["../../../src/db/tables/invitations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAGxC,OAAO,KAAK,KAAK,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,KAAK,SAAS,MAAM,cAAc,CAAA;AAC9C,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAE/C,4EAA4E;AAC5E,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAA;AAExC,+BAA+B;AAC/B,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;AAEtC;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BtE;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,oDAAoD;IACpD,KAAK,KAAK,GAAG;QACX,qBAAqB;QACrB,KAAK,EAAE,MAAM,CAAA;QACb,8CAA8C;QAC9C,SAAS,EAAE,MAAM,CAAA;QACjB,iDAAiD;QACjD,SAAS,EAAE,MAAM,CAAA;QACjB,sDAAsD;QACtD,KAAK,EAAE,MAAM,CAAA;QACb,8BAA8B;QAC9B,IAAI,EAAE,WAAW,CAAC,IAAI,CAAA;KACvB,CAAA;CACF;AAED;;;;;;GAMG;AACH,wBAAgB,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEtE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAErE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,CAAC,CAY/F;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAUzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAyCzF"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { nanoid } from 'nanoid';
|
|
2
|
+
import * as Memberships from './memberships.js';
|
|
3
|
+
/**
|
|
4
|
+
* Inserts an invitation and returns the stored record. Emails are stored
|
|
5
|
+
* lowercase so matching against verified emails is case-insensitive. Re-inviting
|
|
6
|
+
* a live (pending) (org, email) refreshes that row — role, inviter, expiry —
|
|
7
|
+
* rather than accumulating duplicates, matching the `invitations_pending_unique`
|
|
8
|
+
* partial index.
|
|
9
|
+
*
|
|
10
|
+
* @param db - The database.
|
|
11
|
+
* @param input - The invitation to insert.
|
|
12
|
+
* @returns The stored record.
|
|
13
|
+
*/
|
|
14
|
+
export function create(db, input) {
|
|
15
|
+
const now = new Date().toISOString();
|
|
16
|
+
return db.kysely
|
|
17
|
+
.insertInto('invitations')
|
|
18
|
+
.values({
|
|
19
|
+
acceptedAt: null,
|
|
20
|
+
createdAt: now,
|
|
21
|
+
email: input.email.toLowerCase(),
|
|
22
|
+
expiresAt: input.expiresAt,
|
|
23
|
+
id: `inv_${nanoid()}`,
|
|
24
|
+
invitedBy: input.invitedBy,
|
|
25
|
+
orgId: input.orgId,
|
|
26
|
+
revokedAt: null,
|
|
27
|
+
role: input.role,
|
|
28
|
+
})
|
|
29
|
+
.onConflict((oc) => oc
|
|
30
|
+
.columns(['orgId', 'email'])
|
|
31
|
+
.where('acceptedAt', 'is', null)
|
|
32
|
+
.where('revokedAt', 'is', null)
|
|
33
|
+
.doUpdateSet({
|
|
34
|
+
createdAt: now,
|
|
35
|
+
expiresAt: input.expiresAt,
|
|
36
|
+
invitedBy: input.invitedBy,
|
|
37
|
+
role: input.role,
|
|
38
|
+
}))
|
|
39
|
+
.returningAll()
|
|
40
|
+
.executeTakeFirstOrThrow();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Reads an invitation by id.
|
|
44
|
+
*
|
|
45
|
+
* @param db - The database.
|
|
46
|
+
* @param id - The invitation id (`inv_…`).
|
|
47
|
+
* @returns The record, or `undefined` when absent.
|
|
48
|
+
*/
|
|
49
|
+
export function get(db, id) {
|
|
50
|
+
return db.kysely.selectFrom('invitations').selectAll().where('id', '=', id).executeTakeFirst();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Lists an organization's pending invitations (unaccepted, unrevoked,
|
|
54
|
+
* unexpired), newest first.
|
|
55
|
+
*
|
|
56
|
+
* @param db - The database.
|
|
57
|
+
* @param orgId - The organization id (`org_…`).
|
|
58
|
+
* @returns The records.
|
|
59
|
+
*/
|
|
60
|
+
export function listByOrg(db, orgId) {
|
|
61
|
+
return pending(db).where('orgId', '=', orgId).orderBy('createdAt', 'desc').execute();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Lists pending invitations addressed to an email, joined with the inviting
|
|
65
|
+
* organization's name, newest first.
|
|
66
|
+
*
|
|
67
|
+
* @param db - The database.
|
|
68
|
+
* @param email - The invitee email (matched lowercase).
|
|
69
|
+
* @returns The records with `orgName` from the organization row.
|
|
70
|
+
*/
|
|
71
|
+
export function listByEmail(db, email) {
|
|
72
|
+
return db.kysely
|
|
73
|
+
.selectFrom('invitations')
|
|
74
|
+
.innerJoin('organizations', 'organizations.id', 'invitations.orgId')
|
|
75
|
+
.where('invitations.acceptedAt', 'is', null)
|
|
76
|
+
.where('invitations.revokedAt', 'is', null)
|
|
77
|
+
.where('invitations.expiresAt', '>', new Date().toISOString())
|
|
78
|
+
.where('invitations.email', '=', email.toLowerCase())
|
|
79
|
+
.selectAll('invitations')
|
|
80
|
+
.select('organizations.name as orgName')
|
|
81
|
+
.orderBy('invitations.createdAt', 'desc')
|
|
82
|
+
.execute();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Revokes a pending invitation.
|
|
86
|
+
*
|
|
87
|
+
* @param db - The database.
|
|
88
|
+
* @param id - The invitation id (`inv_…`).
|
|
89
|
+
* @returns The revoked record, or `undefined` when absent or already settled.
|
|
90
|
+
*/
|
|
91
|
+
export function revoke(db, id) {
|
|
92
|
+
const now = new Date().toISOString();
|
|
93
|
+
return db.kysely
|
|
94
|
+
.updateTable('invitations')
|
|
95
|
+
.set({ revokedAt: now })
|
|
96
|
+
.where('id', '=', id)
|
|
97
|
+
.where('acceptedAt', 'is', null)
|
|
98
|
+
.where('revokedAt', 'is', null)
|
|
99
|
+
.returningAll()
|
|
100
|
+
.executeTakeFirst();
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Accepts a pending invitation into a membership, atomically: the conditional
|
|
104
|
+
* update settles the invitation exactly once (double accepts lose the race).
|
|
105
|
+
* A new member is inserted at the invited role; an existing member is only ever
|
|
106
|
+
* elevated to it — accepting never demotes (which could strip the last owner).
|
|
107
|
+
*
|
|
108
|
+
* @param db - The database.
|
|
109
|
+
* @param id - The invitation id (`inv_…`).
|
|
110
|
+
* @param userId - The accepting user id (`usr_…`).
|
|
111
|
+
* @returns The accepted record, or `undefined` when absent, settled, or expired.
|
|
112
|
+
*/
|
|
113
|
+
export function accept(db, id, userId) {
|
|
114
|
+
const now = new Date().toISOString();
|
|
115
|
+
return db.kysely.transaction().execute(async (trx) => {
|
|
116
|
+
const invitation = await trx
|
|
117
|
+
.updateTable('invitations')
|
|
118
|
+
.set({ acceptedAt: now })
|
|
119
|
+
.where('id', '=', id)
|
|
120
|
+
.where('acceptedAt', 'is', null)
|
|
121
|
+
.where('revokedAt', 'is', null)
|
|
122
|
+
.where('expiresAt', '>', now)
|
|
123
|
+
.returningAll()
|
|
124
|
+
.executeTakeFirst();
|
|
125
|
+
if (!invitation)
|
|
126
|
+
return undefined;
|
|
127
|
+
const existing = await trx
|
|
128
|
+
.selectFrom('memberships')
|
|
129
|
+
.selectAll()
|
|
130
|
+
.where('orgId', '=', invitation.orgId)
|
|
131
|
+
.where('userId', '=', userId)
|
|
132
|
+
.executeTakeFirst();
|
|
133
|
+
if (!existing)
|
|
134
|
+
await trx
|
|
135
|
+
.insertInto('memberships')
|
|
136
|
+
.values({
|
|
137
|
+
createdAt: now,
|
|
138
|
+
orgId: invitation.orgId,
|
|
139
|
+
role: invitation.role,
|
|
140
|
+
updatedAt: now,
|
|
141
|
+
userId,
|
|
142
|
+
})
|
|
143
|
+
// A concurrent accept/join could insert first; keep that membership.
|
|
144
|
+
.onConflict((oc) => oc.columns(['orgId', 'userId']).doNothing())
|
|
145
|
+
.execute();
|
|
146
|
+
else if (Memberships.rank[invitation.role] > Memberships.rank[existing.role])
|
|
147
|
+
await trx
|
|
148
|
+
.updateTable('memberships')
|
|
149
|
+
.set({ role: invitation.role, updatedAt: now })
|
|
150
|
+
.where('orgId', '=', invitation.orgId)
|
|
151
|
+
.where('userId', '=', userId)
|
|
152
|
+
.execute();
|
|
153
|
+
return invitation;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/** Base query selecting pending invitations (unaccepted, unrevoked, unexpired). */
|
|
157
|
+
function pending(db) {
|
|
158
|
+
return db.kysely
|
|
159
|
+
.selectFrom('invitations')
|
|
160
|
+
.selectAll()
|
|
161
|
+
.where('acceptedAt', 'is', null)
|
|
162
|
+
.where('revokedAt', 'is', null)
|
|
163
|
+
.where('expiresAt', '>', new Date().toISOString());
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=invitations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invitations.js","sourceRoot":"","sources":["../../../src/db/tables/invitations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { Selectable } from 'kysely';
|
|
2
|
+
import type * as Db from '../Db.js';
|
|
3
|
+
import type * as db_Schema from '../Schema.js';
|
|
4
|
+
/** Columns of the `memberships` table, derived from `Schema.Membership`. */
|
|
5
|
+
export type Table = db_Schema.Membership;
|
|
6
|
+
/** A stored membership row. */
|
|
7
|
+
export type Record = Selectable<Table>;
|
|
8
|
+
/** A membership role. */
|
|
9
|
+
export type Role = Record['role'];
|
|
10
|
+
/** Fixed membership roles, least to most privileged. */
|
|
11
|
+
export declare const roles: readonly ["member", "admin", "owner"];
|
|
12
|
+
/** Privilege rank per role; higher ranks satisfy lower minimums. */
|
|
13
|
+
export declare const rank: {
|
|
14
|
+
readonly admin: 1;
|
|
15
|
+
readonly member: 0;
|
|
16
|
+
readonly owner: 2;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Inserts a membership and returns the stored record.
|
|
20
|
+
*
|
|
21
|
+
* @param db - The database.
|
|
22
|
+
* @param input - The membership to insert.
|
|
23
|
+
* @returns The stored record.
|
|
24
|
+
*/
|
|
25
|
+
export declare function create(db: Db.Db, input: create.Input): Promise<Record>;
|
|
26
|
+
export declare namespace create {
|
|
27
|
+
/** Fields accepted when inserting a membership. */
|
|
28
|
+
type Input = {
|
|
29
|
+
/** Organization id (`org_…`). */
|
|
30
|
+
orgId: string;
|
|
31
|
+
/** Granted role. */
|
|
32
|
+
role: Role;
|
|
33
|
+
/** Member user id (`usr_…`). */
|
|
34
|
+
userId: string;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Reads one user's membership in an organization.
|
|
39
|
+
*
|
|
40
|
+
* @param db - The database.
|
|
41
|
+
* @param orgId - The organization id (`org_…`).
|
|
42
|
+
* @param userId - The member user id (`usr_…`).
|
|
43
|
+
* @returns The record, or `undefined` when absent.
|
|
44
|
+
*/
|
|
45
|
+
export declare function get(db: Db.Db, orgId: string, userId: string): Promise<Record | undefined>;
|
|
46
|
+
/**
|
|
47
|
+
* Lists an organization's memberships, oldest first (stable member ordering).
|
|
48
|
+
*
|
|
49
|
+
* @param db - The database.
|
|
50
|
+
* @param orgId - The organization id (`org_…`).
|
|
51
|
+
* @returns The records.
|
|
52
|
+
*/
|
|
53
|
+
export declare function listByOrg(db: Db.Db, orgId: string): Promise<Record[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Lists an organization's memberships joined with member identity (address,
|
|
56
|
+
* email), oldest first.
|
|
57
|
+
*
|
|
58
|
+
* @param db - The database.
|
|
59
|
+
* @param orgId - The organization id (`org_…`).
|
|
60
|
+
* @returns The records with `address`/`email` from the member's user row.
|
|
61
|
+
*/
|
|
62
|
+
export declare function listByOrgDetailed(db: Db.Db, orgId: string): Promise<(Record & {
|
|
63
|
+
address: string | null;
|
|
64
|
+
email: string | null;
|
|
65
|
+
})[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Changes a member's role atomically, refusing to demote the last owner. The
|
|
68
|
+
* org's owner rows are locked for the transaction, so a concurrent demotion or
|
|
69
|
+
* removal cannot race two guards into leaving the organization ownerless.
|
|
70
|
+
*
|
|
71
|
+
* @param db - The database.
|
|
72
|
+
* @param orgId - The organization id (`org_…`).
|
|
73
|
+
* @param userId - The member user id (`usr_…`).
|
|
74
|
+
* @param input - The fields to update.
|
|
75
|
+
* @returns The updated record, or an `error` when absent or the last owner.
|
|
76
|
+
*/
|
|
77
|
+
export declare function update(db: Db.Db, orgId: string, userId: string, input: update.Input): Promise<update.Result>;
|
|
78
|
+
export declare namespace update {
|
|
79
|
+
/** Mutable membership fields. */
|
|
80
|
+
type Input = {
|
|
81
|
+
/** New role. */
|
|
82
|
+
role: Role;
|
|
83
|
+
};
|
|
84
|
+
/** Outcome of a guarded role change. */
|
|
85
|
+
type Result = {
|
|
86
|
+
error: 'last_owner' | 'not_found';
|
|
87
|
+
record?: undefined;
|
|
88
|
+
} | {
|
|
89
|
+
error?: undefined;
|
|
90
|
+
record: Record;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Deletes a membership atomically, refusing to remove the last owner. Locks
|
|
95
|
+
* the org's owner rows for the transaction (see {@link update}) so concurrent
|
|
96
|
+
* removals cannot race the organization ownerless.
|
|
97
|
+
*
|
|
98
|
+
* @param db - The database.
|
|
99
|
+
* @param orgId - The organization id (`org_…`).
|
|
100
|
+
* @param userId - The member user id (`usr_…`).
|
|
101
|
+
* @returns `removed` on success, otherwise why the removal was refused.
|
|
102
|
+
*/
|
|
103
|
+
export declare function remove(db: Db.Db, orgId: string, userId: string): Promise<remove.Result>;
|
|
104
|
+
export declare namespace remove {
|
|
105
|
+
/** Outcome of a guarded removal. */
|
|
106
|
+
type Result = 'last_owner' | 'not_found' | 'removed';
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=memberships.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memberships.d.ts","sourceRoot":"","sources":["../../../src/db/tables/memberships.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAExC,OAAO,KAAK,KAAK,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,KAAK,KAAK,SAAS,MAAM,cAAc,CAAA;AAE9C,4EAA4E;AAC5E,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAA;AAExC,+BAA+B;AAC/B,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;AAEtC,yBAAyB;AACzB,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;AAEjC,wDAAwD;AACxD,eAAO,MAAM,KAAK,uCAAkE,CAAA;AAEpF,oEAAoE;AACpE,eAAO,MAAM,IAAI;oBAAY,CAAC;qBAAU,CAAC;oBAAS,CAAC;CAAgD,CAAA;AAEnG;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAatE;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,mDAAmD;IACnD,KAAK,KAAK,GAAG;QACX,iCAAiC;QACjC,KAAK,EAAE,MAAM,CAAA;QACb,oBAAoB;QACpB,IAAI,EAAE,IAAI,CAAA;QACV,gCAAgC;QAChC,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED;;;;;;;GAOG;AACH,wBAAgB,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAOzF;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOrE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,EAAE,CAAC,EAAE,EACT,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,CAAC,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,EAAE,CAAC,CASxE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CACpB,EAAE,EAAE,EAAE,CAAC,EAAE,EACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,KAAK,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CA4BxB;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,iCAAiC;IACjC,KAAK,KAAK,GAAG;QACX,gBAAgB;QAChB,IAAI,EAAE,IAAI,CAAA;KACX,CAAA;IAED,wCAAwC;IACxC,KAAK,MAAM,GACP;QAAE,KAAK,EAAE,YAAY,GAAG,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,SAAS,CAAA;KAAE,GACzD;QAAE,KAAK,CAAC,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1C;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAwBvF;AAED,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,oCAAoC;IACpC,KAAK,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,CAAA;CACrD"}
|