tapimo 0.10.2 → 0.12.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/dist/App.d.ts +4896 -2166
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +2 -2
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts +15 -0
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +7 -0
- package/dist/Assets.js.map +1 -1
- package/dist/Webhooks.d.ts +0 -75
- package/dist/Webhooks.d.ts.map +1 -1
- package/dist/Webhooks.js +1 -143
- package/dist/Webhooks.js.map +1 -1
- package/dist/admin/App.d.ts +127 -78
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +115 -1
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +59 -6
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +3 -3
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +4 -2
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +83 -83
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +151 -151
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/apps/data/App.d.ts +5924 -4310
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +61 -9
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/ZoneSelection.d.ts +62 -0
- package/dist/apps/data/ZoneSelection.d.ts.map +1 -0
- package/dist/apps/data/ZoneSelection.js +44 -0
- package/dist/apps/data/ZoneSelection.js.map +1 -0
- package/dist/apps/data/routes/activities.d.ts +2368 -5
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +423 -114
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +131 -0
- package/dist/apps/data/routes/addresses.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.d.ts +25 -25
- package/dist/apps/data/routes/balances.js +1 -1
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +1 -1
- package/dist/apps/data/routes/blocks.js +1 -1
- package/dist/apps/data/routes/blocks.js.map +1 -1
- package/dist/apps/data/routes/earn.d.ts +135 -10
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +157 -25
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts +829 -123
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +16 -13
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +26 -26
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +9 -11
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +54 -54
- package/dist/apps/data/routes/receipts.js +1 -1
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.js +24 -10
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +12 -12
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +16 -15
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +17 -3
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +34 -15
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +1 -1
- package/dist/apps/data/routes/transactions.js +1 -1
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +13 -13
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +7 -9
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +21 -21
- package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
- package/dist/apps/data/routes/webhooks.d.ts +1011 -151
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +126 -739
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +15 -15
- package/dist/apps/funding/App.d.ts +27 -27
- package/dist/apps/funding/routes/chains.d.ts.map +1 -1
- package/dist/apps/funding/routes/chains.js +5 -4
- package/dist/apps/funding/routes/chains.js.map +1 -1
- package/dist/apps/funding/routes/deposit-addresses.d.ts +18 -18
- package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/funding/routes/deposit-addresses.js +8 -8
- package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/funding/routes/providers.d.ts.map +1 -1
- package/dist/apps/funding/routes/providers.js +3 -2
- package/dist/apps/funding/routes/providers.js.map +1 -1
- package/dist/apps/funding/routes/quotes.d.ts.map +1 -1
- package/dist/apps/funding/routes/quotes.js +2 -2
- package/dist/apps/funding/routes/quotes.js.map +1 -1
- package/dist/apps/funding/routes/transfers.d.ts +33 -33
- package/dist/apps/management/App.d.ts +1433 -322
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +19 -6
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +154 -94
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +76 -30
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +103 -30
- package/dist/apps/management/routes/billing.d.ts.map +1 -1
- package/dist/apps/management/routes/billing.js +91 -32
- package/dist/apps/management/routes/billing.js.map +1 -1
- package/dist/apps/management/routes/faucet.d.ts +12 -12
- package/dist/apps/management/routes/faucet.d.ts.map +1 -1
- package/dist/apps/management/routes/faucet.js +23 -12
- package/dist/apps/management/routes/faucet.js.map +1 -1
- package/dist/apps/management/routes/invitations.d.ts +46 -13
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +79 -29
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +128 -83
- package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
- package/dist/apps/management/routes/invite-links.js +100 -41
- package/dist/apps/management/routes/invite-links.js.map +1 -1
- package/dist/apps/management/routes/me.d.ts +5 -5
- package/dist/apps/management/routes/me.d.ts.map +1 -1
- package/dist/apps/management/routes/me.js +14 -10
- package/dist/apps/management/routes/me.js.map +1 -1
- package/dist/apps/management/routes/members.d.ts +68 -47
- package/dist/apps/management/routes/members.d.ts.map +1 -1
- package/dist/apps/management/routes/members.js +37 -18
- package/dist/apps/management/routes/members.js.map +1 -1
- package/dist/apps/management/routes/orgs.d.ts +48 -8
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +48 -19
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +130 -68
- package/dist/apps/management/routes/projects.d.ts.map +1 -1
- package/dist/apps/management/routes/projects.js +72 -21
- package/dist/apps/management/routes/projects.js.map +1 -1
- package/dist/apps/management/routes/scopes.d.ts.map +1 -1
- package/dist/apps/management/routes/scopes.js +8 -5
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts +38 -38
- package/dist/apps/management/routes/usage.d.ts.map +1 -1
- package/dist/apps/management/routes/usage.js +41 -31
- package/dist/apps/management/routes/usage.js.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.d.ts +34 -6
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.js +36 -17
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
- package/dist/apps/management/routes/webhooks.d.ts +1186 -197
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +106 -38
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Adapter.js +12 -0
- package/dist/apps/mpp/internal/Adapter.js.map +1 -1
- package/dist/db/Db.d.ts +2 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +61 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +30 -2
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +28 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +5 -0
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
- package/dist/db/tables/webhookDeliveries.js +10 -0
- package/dist/db/tables/webhookDeliveries.js.map +1 -1
- package/dist/db/tables/webhookQueueCompletions.d.ts +15 -0
- package/dist/db/tables/webhookQueueCompletions.d.ts.map +1 -0
- package/dist/db/tables/webhookQueueCompletions.js +32 -0
- package/dist/db/tables/webhookQueueCompletions.js.map +1 -0
- package/dist/db/tables/webhookQueueEvents.d.ts +16 -20
- package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
- package/dist/db/tables/webhookQueueEvents.js +68 -43
- package/dist/db/tables/webhookQueueEvents.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +47 -72
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +92 -105
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/internal/Auth.d.ts +8 -1
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +13 -3
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +11 -7
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +41 -2
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +167 -0
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/MetricSink.d.ts +35 -125
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +50 -121
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +26 -22
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +128 -39
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Response.d.ts +13 -8
- package/dist/internal/Response.d.ts.map +1 -1
- package/dist/internal/Response.js +16 -5
- package/dist/internal/Response.js.map +1 -1
- package/dist/internal/Schema.d.ts +8 -8
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +10 -9
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +15 -6
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +45 -15
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +2 -0
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +16 -4
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/WebhookTransfer.d.ts +1 -55
- package/dist/internal/WebhookTransfer.d.ts.map +1 -1
- package/dist/internal/WebhookTransfer.js +1 -239
- package/dist/internal/WebhookTransfer.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +112 -56
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +124 -93
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/funding/Deposit.d.ts +2 -2
- package/dist/internal/funding/Deposit.d.ts.map +1 -1
- package/dist/internal/funding/Deposit.js +9 -8
- package/dist/internal/funding/Deposit.js.map +1 -1
- package/dist/internal/funding/DepositAddress.d.ts +4 -4
- package/dist/internal/funding/DepositAddress.d.ts.map +1 -1
- package/dist/internal/funding/DepositAddress.js +9 -8
- package/dist/internal/funding/DepositAddress.js.map +1 -1
- package/dist/internal/funding/DepositWebhook.d.ts +25 -0
- package/dist/internal/funding/DepositWebhook.d.ts.map +1 -0
- package/dist/internal/funding/DepositWebhook.js +74 -0
- package/dist/internal/funding/DepositWebhook.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -1
- package/dist/internal/funding/Provider.js +13 -12
- package/dist/internal/funding/Provider.js.map +1 -1
- package/dist/internal/funding/Reconciliation.d.ts +6 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -1
- package/dist/internal/funding/Reconciliation.js +42 -10
- package/dist/internal/funding/Reconciliation.js.map +1 -1
- package/dist/internal/funding/index.d.ts +1 -0
- package/dist/internal/funding/index.d.ts.map +1 -1
- package/dist/internal/funding/index.js +1 -0
- package/dist/internal/funding/index.js.map +1 -1
- package/dist/internal/funding/providers/stargate.d.ts +19 -0
- package/dist/internal/funding/providers/stargate.d.ts.map +1 -0
- package/dist/internal/funding/providers/stargate.js +143 -0
- package/dist/internal/funding/providers/stargate.js.map +1 -0
- package/dist/internal/webhookDestinations/slack.d.ts.map +1 -1
- package/dist/internal/webhookDestinations/slack.js +16 -0
- package/dist/internal/webhookDestinations/slack.js.map +1 -1
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +2 -2
- package/src/App.test.ts +48 -0
- package/src/App.ts +7 -2
- package/src/Assets.test.ts +18 -0
- package/src/Assets.ts +22 -0
- package/src/Client.test-d.ts +287 -17
- package/src/Webhooks.ts +1 -220
- package/src/admin/apps/earn-vaults.test.ts +143 -0
- package/src/admin/apps/earn-vaults.ts +83 -6
- package/src/admin/apps/organizations.ts +6 -2
- package/src/admin/ui/src/routes/api-keys.tsx +36 -0
- package/src/admin/ui.generated.ts +151 -189
- package/src/apps/data/App.test.ts +31 -0
- package/src/apps/data/App.ts +64 -10
- package/src/apps/data/ZoneSelection.test.ts +196 -0
- package/src/apps/data/ZoneSelection.ts +108 -0
- package/src/apps/data/routes/activities.test.ts +435 -12
- package/src/apps/data/routes/activities.ts +562 -125
- package/src/apps/data/routes/balances.ts +1 -1
- package/src/apps/data/routes/blocks.ts +1 -1
- package/src/apps/data/routes/earn.test.ts +183 -23
- package/src/apps/data/routes/earn.ts +225 -29
- package/src/apps/data/routes/earn.zone-access.test.ts +46 -0
- package/src/apps/data/routes/exchanges.test.ts +31 -1
- package/src/apps/data/routes/exchanges.ts +19 -15
- package/src/apps/data/routes/fee-amm.ts +18 -11
- package/src/apps/data/routes/receipts.ts +1 -1
- package/src/apps/data/routes/rpc.test.ts +75 -0
- package/src/apps/data/routes/rpc.ts +23 -9
- package/src/apps/data/routes/tokenlist.ts +21 -18
- package/src/apps/data/routes/tokens.test.ts +29 -0
- package/src/apps/data/routes/tokens.ts +38 -15
- package/src/apps/data/routes/transactions.ts +1 -1
- package/src/apps/data/routes/transfers.test.ts +3 -3
- package/src/apps/data/routes/transfers.ts +12 -9
- package/src/apps/data/routes/webhooks.test.ts +179 -1497
- package/src/apps/data/routes/webhooks.ts +156 -976
- package/src/apps/data/routes/zones.test.ts +19 -13
- package/src/apps/funding/routes/chains.test.ts +211 -7
- package/src/apps/funding/routes/chains.ts +19 -12
- package/src/apps/funding/routes/deposit-addresses.test.ts +394 -0
- package/src/apps/funding/routes/deposit-addresses.ts +84 -72
- package/src/apps/funding/routes/providers.ts +9 -5
- package/src/apps/funding/routes/quotes.test.ts +46 -0
- package/src/apps/funding/routes/quotes.ts +8 -5
- package/src/apps/funding/routes/transfers.test.ts +35 -32
- package/src/apps/management/Billing.test.ts +26 -0
- package/src/apps/management/Billing.ts +24 -7
- package/src/apps/management/routes/api-keys.test.ts +178 -0
- package/src/apps/management/routes/api-keys.ts +203 -144
- package/src/apps/management/routes/billing.test.ts +209 -0
- package/src/apps/management/routes/billing.ts +254 -177
- package/src/apps/management/routes/faucet.test.ts +39 -0
- package/src/apps/management/routes/faucet.ts +75 -41
- package/src/apps/management/routes/invitations.test.ts +216 -0
- package/src/apps/management/routes/invitations.ts +186 -109
- package/src/apps/management/routes/invite-links.test.ts +263 -1
- package/src/apps/management/routes/invite-links.ts +295 -214
- package/src/apps/management/routes/me.test.ts +49 -0
- package/src/apps/management/routes/me.ts +42 -32
- package/src/apps/management/routes/members.test.ts +124 -1
- package/src/apps/management/routes/members.ts +81 -51
- package/src/apps/management/routes/orgs.test.ts +176 -0
- package/src/apps/management/routes/orgs.ts +101 -59
- package/src/apps/management/routes/projects.test.ts +183 -0
- package/src/apps/management/routes/projects.ts +124 -60
- package/src/apps/management/routes/scopes.test.ts +44 -0
- package/src/apps/management/routes/scopes.ts +37 -28
- package/src/apps/management/routes/usage.test.ts +92 -0
- package/src/apps/management/routes/usage.ts +186 -151
- package/src/apps/management/routes/verified-token-requests.test.ts +114 -0
- package/src/apps/management/routes/verified-token-requests.ts +166 -133
- package/src/apps/management/routes/webhooks.test.ts +313 -1
- package/src/apps/management/routes/webhooks.ts +220 -71
- package/src/apps/mpp/internal/Adapter.ts +13 -1
- package/src/db/Db.test.ts +42 -5
- package/src/db/Db.ts +85 -0
- package/src/db/Schema.ts +41 -3
- package/src/db/tables/earnVaults.test.ts +22 -0
- package/src/db/tables/earnVaults.ts +11 -1
- package/src/db/tables/organizations.test.ts +5 -2
- package/src/db/tables/webhookDeliveries.ts +13 -0
- package/src/db/tables/webhookQueueCompletions.ts +55 -0
- package/src/db/tables/webhookQueueEvents.ts +97 -57
- package/src/db/tables/webhookSubscriptions.ts +134 -144
- package/src/internal/Auth.ts +23 -5
- package/src/internal/Cache.ts +14 -7
- package/src/internal/EarnVaults.capabilities.test.ts +33 -0
- package/src/internal/EarnVaults.test.ts +79 -0
- package/src/internal/EarnVaults.ts +277 -0
- package/src/internal/MetricSink.test.ts +41 -373
- package/src/internal/MetricSink.ts +92 -273
- package/src/internal/OpenApi.ts +165 -49
- package/src/internal/Response.test.ts +95 -0
- package/src/internal/Response.ts +40 -2
- package/src/internal/Schema.test.ts +34 -0
- package/src/internal/Schema.ts +20 -9
- package/src/internal/Store.test.ts +186 -0
- package/src/internal/Store.ts +57 -17
- package/src/internal/Tidx.test.ts +19 -0
- package/src/internal/Tidx.ts +16 -4
- package/src/internal/WebhookTransfer.ts +1 -351
- package/src/internal/Webhooks.test.ts +222 -145
- package/src/internal/Webhooks.ts +234 -135
- package/src/internal/funding/Deposit.ts +71 -64
- package/src/internal/funding/DepositAddress.ts +50 -43
- package/src/internal/funding/DepositWebhook.test.ts +131 -0
- package/src/internal/funding/DepositWebhook.ts +101 -0
- package/src/internal/funding/Provider.ts +164 -142
- package/src/internal/funding/Reconciliation.test.ts +14 -0
- package/src/internal/funding/Reconciliation.ts +161 -86
- package/src/internal/funding/index.test.ts +1 -0
- package/src/internal/funding/index.ts +1 -0
- package/src/internal/funding/providers/index.test.ts +185 -0
- package/src/internal/funding/providers/stargate.ts +184 -0
- package/src/internal/webhookDestinations/slack.ts +15 -0
- package/src/providers/index.test.ts +1 -0
- package/src/providers/index.ts +9 -0
- package/src/Webhooks.bench.ts +0 -714
- package/src/Webhooks.memory.bench.ts +0 -250
- package/src/Webhooks.test.ts +0 -146
|
@@ -25,41 +25,44 @@ export namespace schema {
|
|
|
25
25
|
)
|
|
26
26
|
|
|
27
27
|
/** One project: an app or integration within an organization. */
|
|
28
|
-
export const Project =
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
z.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
id: z
|
|
41
|
-
.string()
|
|
42
|
-
.check(
|
|
43
|
-
z.describe('Opaque project id (`prj_…`).'),
|
|
44
|
-
z.meta({ examples: ['prj_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
|
|
45
|
-
),
|
|
46
|
-
name: z
|
|
47
|
-
.string()
|
|
48
|
-
.check(z.describe('Human-readable project name.'), z.meta({ examples: ['Checkout'] })),
|
|
49
|
-
orgId: z
|
|
50
|
-
.string()
|
|
51
|
-
.check(
|
|
52
|
-
z.describe('Owning organization id (`org_…`).'),
|
|
53
|
-
z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
|
|
54
|
-
),
|
|
55
|
-
updatedAt: z
|
|
56
|
-
.string()
|
|
57
|
-
.check(
|
|
58
|
-
z.describe('When the project was last updated (ISO 8601).'),
|
|
59
|
-
z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
|
|
28
|
+
export const Project = OpenApi.component(
|
|
29
|
+
Schema.describe(
|
|
30
|
+
z.object({
|
|
31
|
+
createdAt: z.iso
|
|
32
|
+
.datetime()
|
|
33
|
+
.check(
|
|
34
|
+
z.describe('When the project was created (ISO 8601).'),
|
|
35
|
+
z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
|
|
36
|
+
),
|
|
37
|
+
environments: z.array(z.enum(environments)).check(
|
|
38
|
+
z.describe('Environments available to this project: sandbox (testnet) and production (mainnet).'), // prettier-ignore
|
|
39
|
+
z.meta({ examples: [[...environments]] }),
|
|
60
40
|
),
|
|
61
|
-
|
|
62
|
-
|
|
41
|
+
id: z
|
|
42
|
+
.string()
|
|
43
|
+
.check(
|
|
44
|
+
z.describe('Opaque project id (`prj_…`).'),
|
|
45
|
+
z.meta({ examples: ['prj_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
|
|
46
|
+
),
|
|
47
|
+
name: z
|
|
48
|
+
.string()
|
|
49
|
+
.check(z.describe('Human-readable project name.'), z.meta({ examples: ['Checkout'] })),
|
|
50
|
+
orgId: z
|
|
51
|
+
.string()
|
|
52
|
+
.check(
|
|
53
|
+
z.describe('Owning organization id (`org_…`).'),
|
|
54
|
+
z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
|
|
55
|
+
),
|
|
56
|
+
updatedAt: z.iso
|
|
57
|
+
.datetime()
|
|
58
|
+
.check(
|
|
59
|
+
z.describe('When the project was last updated (ISO 8601).'),
|
|
60
|
+
z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }),
|
|
61
|
+
),
|
|
62
|
+
}),
|
|
63
|
+
'A project: an app or integration within an organization.',
|
|
64
|
+
),
|
|
65
|
+
'Project',
|
|
63
66
|
)
|
|
64
67
|
|
|
65
68
|
/** Path parameters addressing an organization's project collection. */
|
|
@@ -92,34 +95,47 @@ export namespace schema {
|
|
|
92
95
|
})
|
|
93
96
|
.check(z.describe('Path parameters for one project.'))
|
|
94
97
|
|
|
95
|
-
/** Request body creating
|
|
96
|
-
export const
|
|
97
|
-
.object({ name })
|
|
98
|
-
|
|
98
|
+
/** Request body creating a project. */
|
|
99
|
+
export const CreateProjectRequest = OpenApi.component(
|
|
100
|
+
z.object({ name }).check(z.describe('Fields for creating a project.')),
|
|
101
|
+
'CreateProjectRequest',
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
/** Request body updating a project. */
|
|
105
|
+
export const UpdateProjectRequest = OpenApi.component(
|
|
106
|
+
z.object({ name }).check(z.describe('Fields for updating a project.')),
|
|
107
|
+
'UpdateProjectRequest',
|
|
108
|
+
)
|
|
99
109
|
|
|
100
110
|
/** Schemas for the deleteProject operation. */
|
|
101
111
|
export namespace deleteProject {
|
|
102
112
|
/** Confirmation that the project was deleted. */
|
|
103
|
-
export const Response =
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
+
export const Response = OpenApi.component(
|
|
114
|
+
z
|
|
115
|
+
.object({
|
|
116
|
+
id: z
|
|
117
|
+
.string()
|
|
118
|
+
.check(
|
|
119
|
+
z.describe('ID of the project that was deleted.'),
|
|
120
|
+
z.meta({ examples: ['prj_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
|
|
121
|
+
),
|
|
122
|
+
})
|
|
123
|
+
.check(z.describe('Confirmation that the project was deleted.')),
|
|
124
|
+
'DeleteProjectResponse',
|
|
125
|
+
)
|
|
113
126
|
}
|
|
114
127
|
|
|
115
128
|
/** Schemas for the listProjects operation. */
|
|
116
129
|
export namespace listProjects {
|
|
117
130
|
/** Non-paginated list of an organization's projects. */
|
|
118
|
-
export const Response =
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
131
|
+
export const Response = OpenApi.component(
|
|
132
|
+
Schema.describe(
|
|
133
|
+
z.object({
|
|
134
|
+
data: z.array(Project).check(z.describe('The projects, newest first.')),
|
|
135
|
+
}),
|
|
136
|
+
"A non-paginated list of an organization's projects.",
|
|
137
|
+
),
|
|
138
|
+
'ProjectList',
|
|
123
139
|
)
|
|
124
140
|
}
|
|
125
141
|
}
|
|
@@ -140,7 +156,16 @@ export function projects() {
|
|
|
140
156
|
OpenApi.describeRoute({
|
|
141
157
|
operationId: 'listProjects',
|
|
142
158
|
responses: OpenApi.responses({
|
|
143
|
-
errors: {
|
|
159
|
+
errors: {
|
|
160
|
+
400: {
|
|
161
|
+
codes: ['param_invalid'],
|
|
162
|
+
description: 'Malformed API key or invalid path parameters.',
|
|
163
|
+
},
|
|
164
|
+
404: {
|
|
165
|
+
codes: ['organization_not_found'],
|
|
166
|
+
description: 'No accessible organization was found for this id.',
|
|
167
|
+
},
|
|
168
|
+
},
|
|
144
169
|
success: {
|
|
145
170
|
description: "The organization's projects, newest first.",
|
|
146
171
|
schema: schema.listProjects.Response,
|
|
@@ -180,14 +205,23 @@ export function projects() {
|
|
|
180
205
|
code: 'param_invalid',
|
|
181
206
|
message: 'Check the path parameters and try again.',
|
|
182
207
|
}),
|
|
183
|
-
OpenApi.validate('json', schema.
|
|
208
|
+
OpenApi.validate('json', schema.CreateProjectRequest, {
|
|
184
209
|
code: 'body_invalid',
|
|
185
210
|
message: 'Check the request body and try again.',
|
|
186
211
|
}),
|
|
187
212
|
OpenApi.describeRoute({
|
|
188
213
|
operationId: 'createProject',
|
|
189
214
|
responses: OpenApi.responses({
|
|
190
|
-
errors: {
|
|
215
|
+
errors: {
|
|
216
|
+
400: {
|
|
217
|
+
codes: ['body_invalid', 'param_invalid'],
|
|
218
|
+
description: 'Malformed API key, invalid path parameters, or invalid request body.',
|
|
219
|
+
},
|
|
220
|
+
404: {
|
|
221
|
+
codes: ['organization_not_found'],
|
|
222
|
+
description: 'No accessible organization was found for this id.',
|
|
223
|
+
},
|
|
224
|
+
},
|
|
191
225
|
success: { description: 'The created project.', schema: schema.Project },
|
|
192
226
|
}),
|
|
193
227
|
summary: 'Create project',
|
|
@@ -196,6 +230,7 @@ export function projects() {
|
|
|
196
230
|
async (c) => {
|
|
197
231
|
if (Auth.narrowAccess) return Auth.accessError(c)
|
|
198
232
|
if (Auth.narrowScope) return Auth.ensureOrgError(c)
|
|
233
|
+
if (Auth.narrowOrgRole) return Auth.ensureOrgRoleError(c)
|
|
199
234
|
if (OpenApi.narrowValidation)
|
|
200
235
|
return OpenApi.validationError(c, {
|
|
201
236
|
code: 'param_invalid',
|
|
@@ -229,7 +264,16 @@ export function projects() {
|
|
|
229
264
|
OpenApi.describeRoute({
|
|
230
265
|
operationId: 'getProject',
|
|
231
266
|
responses: OpenApi.responses({
|
|
232
|
-
errors: {
|
|
267
|
+
errors: {
|
|
268
|
+
400: {
|
|
269
|
+
codes: ['param_invalid'],
|
|
270
|
+
description: 'Malformed API key or invalid path parameters.',
|
|
271
|
+
},
|
|
272
|
+
404: {
|
|
273
|
+
codes: ['organization_not_found', 'project_not_found'],
|
|
274
|
+
description: 'No accessible project was found for this id.',
|
|
275
|
+
},
|
|
276
|
+
},
|
|
233
277
|
success: { description: 'One project.', schema: schema.Project },
|
|
234
278
|
}),
|
|
235
279
|
summary: 'Get project',
|
|
@@ -256,14 +300,23 @@ export function projects() {
|
|
|
256
300
|
code: 'param_invalid',
|
|
257
301
|
message: 'Check the path parameters and try again.',
|
|
258
302
|
}),
|
|
259
|
-
OpenApi.validate('json', schema.
|
|
303
|
+
OpenApi.validate('json', schema.UpdateProjectRequest, {
|
|
260
304
|
code: 'body_invalid',
|
|
261
305
|
message: 'Check the request body and try again.',
|
|
262
306
|
}),
|
|
263
307
|
OpenApi.describeRoute({
|
|
264
308
|
operationId: 'updateProject',
|
|
265
309
|
responses: OpenApi.responses({
|
|
266
|
-
errors: {
|
|
310
|
+
errors: {
|
|
311
|
+
400: {
|
|
312
|
+
codes: ['body_invalid', 'param_invalid'],
|
|
313
|
+
description: 'Malformed API key, invalid path parameters, or invalid request body.',
|
|
314
|
+
},
|
|
315
|
+
404: {
|
|
316
|
+
codes: ['organization_not_found', 'project_not_found'],
|
|
317
|
+
description: 'No accessible project was found for this id.',
|
|
318
|
+
},
|
|
319
|
+
},
|
|
267
320
|
success: { description: 'The updated project.', schema: schema.Project },
|
|
268
321
|
}),
|
|
269
322
|
summary: 'Update project',
|
|
@@ -282,6 +335,7 @@ export function projects() {
|
|
|
282
335
|
message: 'Check the request body and try again.',
|
|
283
336
|
})
|
|
284
337
|
if (Auth.narrowScope) return Auth.ensureProjectError(c)
|
|
338
|
+
if (Auth.narrowOrgRole) return Auth.ensureOrgRoleError(c)
|
|
285
339
|
|
|
286
340
|
const body = c.req.valid('json')
|
|
287
341
|
const db = Db.get(c.get('db'))
|
|
@@ -306,7 +360,16 @@ export function projects() {
|
|
|
306
360
|
OpenApi.describeRoute({
|
|
307
361
|
operationId: 'deleteProject',
|
|
308
362
|
responses: OpenApi.responses({
|
|
309
|
-
errors: {
|
|
363
|
+
errors: {
|
|
364
|
+
400: {
|
|
365
|
+
codes: ['param_invalid'],
|
|
366
|
+
description: 'Malformed API key or invalid path parameters.',
|
|
367
|
+
},
|
|
368
|
+
404: {
|
|
369
|
+
codes: ['organization_not_found', 'project_not_found'],
|
|
370
|
+
description: 'No accessible project was found for this id.',
|
|
371
|
+
},
|
|
372
|
+
},
|
|
310
373
|
success: {
|
|
311
374
|
description: 'Confirmation that the project was deleted.',
|
|
312
375
|
schema: schema.deleteProject.Response,
|
|
@@ -318,6 +381,7 @@ export function projects() {
|
|
|
318
381
|
async (c) => {
|
|
319
382
|
if (Auth.narrowAccess) return Auth.accessError(c)
|
|
320
383
|
if (Auth.narrowScope) return Auth.ensureProjectError(c)
|
|
384
|
+
if (Auth.narrowOrgRole) return Auth.ensureOrgRoleError(c)
|
|
321
385
|
if (OpenApi.narrowValidation)
|
|
322
386
|
return OpenApi.validationError(c, {
|
|
323
387
|
code: 'param_invalid',
|
|
@@ -2,7 +2,51 @@ import * as Scope from '../../../Scope.js'
|
|
|
2
2
|
import * as TestApp from '../../../../test/App.js'
|
|
3
3
|
import * as Scopes from './scopes.js'
|
|
4
4
|
|
|
5
|
+
test('publishes a generator-ready OpenAPI contract', async () => {
|
|
6
|
+
const spec = await (await TestApp.create().request('/openapi.json')).json()
|
|
7
|
+
const operation = spec.paths['/v1/scopes'].get
|
|
8
|
+
|
|
9
|
+
expect(spec.components.schemas.ScopeList.properties.data.examples).toEqual([[]])
|
|
10
|
+
|
|
11
|
+
expect({
|
|
12
|
+
components: ['Scope', 'ScopeList'].filter((name) => spec.components.schemas[name]),
|
|
13
|
+
errors: {
|
|
14
|
+
400: operation.responses[400].content['application/json'].schema,
|
|
15
|
+
403: operation.responses[403].content['application/json'].schema,
|
|
16
|
+
},
|
|
17
|
+
operationId: operation.operationId,
|
|
18
|
+
response: operation.responses[200].content['application/json'].schema,
|
|
19
|
+
}).toMatchInlineSnapshot(`
|
|
20
|
+
{
|
|
21
|
+
"components": [
|
|
22
|
+
"Scope",
|
|
23
|
+
"ScopeList",
|
|
24
|
+
],
|
|
25
|
+
"errors": {
|
|
26
|
+
"400": {
|
|
27
|
+
"$ref": "#/components/schemas/ApiKeyMalformedError",
|
|
28
|
+
},
|
|
29
|
+
"403": {
|
|
30
|
+
"$ref": "#/components/schemas/ForbiddenError",
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
"operationId": "getScopes",
|
|
34
|
+
"response": {
|
|
35
|
+
"$ref": "#/components/schemas/ScopeList",
|
|
36
|
+
},
|
|
37
|
+
}
|
|
38
|
+
`)
|
|
39
|
+
})
|
|
40
|
+
|
|
5
41
|
describe('scopes', () => {
|
|
42
|
+
test('rejects malformed API key credentials', async () => {
|
|
43
|
+
const response = await TestApp.create().request('/v1/scopes', {
|
|
44
|
+
headers: { authorization: 'Basic wrong' },
|
|
45
|
+
})
|
|
46
|
+
expect(response.status).toBe(400)
|
|
47
|
+
expect(await response.json()).toMatchObject({ error: { code: 'api_key_malformed' } })
|
|
48
|
+
})
|
|
49
|
+
|
|
6
50
|
test('lists the scope catalog without authentication (public catalog)', async () => {
|
|
7
51
|
const app = TestApp.create()
|
|
8
52
|
const response = await app.request('/v1/scopes')
|
|
@@ -12,37 +12,45 @@ export namespace schema {
|
|
|
12
12
|
/** Schemas for the getScopes operation. */
|
|
13
13
|
export namespace getScopes {
|
|
14
14
|
/** A single issuable API-key scope. */
|
|
15
|
-
export const Entry =
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
scope: z
|
|
24
|
-
.string()
|
|
25
|
-
.check(
|
|
26
|
-
z.describe(
|
|
27
|
-
'Scope identifier used in API-key grants and route policies. Zone templates carry a concrete chain id and access level in grants.',
|
|
15
|
+
export const Entry = OpenApi.component(
|
|
16
|
+
z
|
|
17
|
+
.object({
|
|
18
|
+
description: z
|
|
19
|
+
.string()
|
|
20
|
+
.check(
|
|
21
|
+
z.describe('Human-readable explanation of what the scope grants.'),
|
|
22
|
+
z.meta({ examples: ['Read webhook subscriptions.'] }),
|
|
28
23
|
),
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
24
|
+
scope: z
|
|
25
|
+
.string()
|
|
26
|
+
.check(
|
|
27
|
+
z.describe(
|
|
28
|
+
'Scope identifier used in API-key grants and route policies. Zone templates carry a concrete chain id and access level in grants.',
|
|
29
|
+
),
|
|
30
|
+
z.meta({ examples: ['data:read'] }),
|
|
31
|
+
),
|
|
32
|
+
selfServe: z
|
|
33
|
+
.boolean()
|
|
34
|
+
.check(
|
|
35
|
+
z.describe('Whether an eligible session may self-mint this scope.'),
|
|
36
|
+
z.meta({ examples: [true] }),
|
|
37
|
+
),
|
|
38
|
+
})
|
|
39
|
+
.check(z.describe('A single issuable API-key scope.')),
|
|
40
|
+
'Scope',
|
|
41
|
+
)
|
|
39
42
|
|
|
40
43
|
/** Response body for the scope catalog. */
|
|
41
|
-
export const Response =
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
export const Response = OpenApi.component(
|
|
45
|
+
z
|
|
46
|
+
.object({
|
|
47
|
+
data: z
|
|
48
|
+
.array(Entry)
|
|
49
|
+
.check(z.describe('Issuable API-key scopes.'), z.meta({ examples: [[]] })),
|
|
50
|
+
})
|
|
51
|
+
.check(z.describe('Response body for the scope catalog.')),
|
|
52
|
+
'ScopeList',
|
|
53
|
+
)
|
|
46
54
|
}
|
|
47
55
|
}
|
|
48
56
|
|
|
@@ -59,6 +67,7 @@ export function scopes() {
|
|
|
59
67
|
description: 'See which scopes can be granted to API keys.',
|
|
60
68
|
operationId: 'getScopes',
|
|
61
69
|
responses: OpenApi.responses({
|
|
70
|
+
errors: { 400: { codes: [], description: 'Malformed API key.' } },
|
|
62
71
|
success: { description: 'Issuable scope catalog.', schema: schema.getScopes.Response },
|
|
63
72
|
}),
|
|
64
73
|
summary: 'List scopes',
|
|
@@ -124,6 +124,98 @@ const emptyUsage = {
|
|
|
124
124
|
|
|
125
125
|
afterEach(() => vi.useRealTimers())
|
|
126
126
|
|
|
127
|
+
test('publishes generator-ready OpenAPI contracts', async () => {
|
|
128
|
+
const spec = await (await createApp().request('/openapi.json')).json()
|
|
129
|
+
const requests = spec.paths['/v1/orgs/{orgId}/usage/requests'].get
|
|
130
|
+
const sponsorships = spec.paths['/v1/orgs/{orgId}/usage/sponsorships'].get
|
|
131
|
+
|
|
132
|
+
expect({
|
|
133
|
+
components: [
|
|
134
|
+
'RequestUsage',
|
|
135
|
+
'RequestUsageByKey',
|
|
136
|
+
'RequestUsageByRoute',
|
|
137
|
+
'RequestUsageByStatus',
|
|
138
|
+
'RequestUsageSeriesPoint',
|
|
139
|
+
'RequestUsageTotals',
|
|
140
|
+
'SponsorshipUsage',
|
|
141
|
+
'SponsorshipUsageBucket',
|
|
142
|
+
].filter((name) => spec.components.schemas[name]),
|
|
143
|
+
requests: {
|
|
144
|
+
errors: {
|
|
145
|
+
400: requests.responses[400].content['application/json'].schema,
|
|
146
|
+
404: requests.responses[404].content['application/json'].schema,
|
|
147
|
+
501: requests.responses[501].content['application/json'].schema,
|
|
148
|
+
},
|
|
149
|
+
operationId: requests.operationId,
|
|
150
|
+
response: requests.responses[200].content['application/json'].schema,
|
|
151
|
+
},
|
|
152
|
+
sponsorships: {
|
|
153
|
+
errors: {
|
|
154
|
+
400: sponsorships.responses[400].content['application/json'].schema,
|
|
155
|
+
404: sponsorships.responses[404].content['application/json'].schema,
|
|
156
|
+
},
|
|
157
|
+
operationId: sponsorships.operationId,
|
|
158
|
+
response: sponsorships.responses[200].content['application/json'].schema,
|
|
159
|
+
},
|
|
160
|
+
timestamps: {
|
|
161
|
+
requestFrom: spec.components.schemas.RequestUsage.properties.from.format,
|
|
162
|
+
requestPoint: spec.components.schemas.RequestUsageSeriesPoint.properties.time.format,
|
|
163
|
+
requestTo: spec.components.schemas.RequestUsage.properties.to.format,
|
|
164
|
+
sponsorship: spec.components.schemas.SponsorshipUsageBucket.properties.timestamp.format,
|
|
165
|
+
},
|
|
166
|
+
}).toMatchInlineSnapshot(`
|
|
167
|
+
{
|
|
168
|
+
"components": [
|
|
169
|
+
"RequestUsage",
|
|
170
|
+
"RequestUsageByKey",
|
|
171
|
+
"RequestUsageByRoute",
|
|
172
|
+
"RequestUsageByStatus",
|
|
173
|
+
"RequestUsageSeriesPoint",
|
|
174
|
+
"RequestUsageTotals",
|
|
175
|
+
"SponsorshipUsage",
|
|
176
|
+
"SponsorshipUsageBucket",
|
|
177
|
+
],
|
|
178
|
+
"requests": {
|
|
179
|
+
"errors": {
|
|
180
|
+
"400": {
|
|
181
|
+
"$ref": "#/components/schemas/ApiKeyMalformedOrParamInvalidOrQueryInvalidError",
|
|
182
|
+
},
|
|
183
|
+
"404": {
|
|
184
|
+
"$ref": "#/components/schemas/OrganizationNotFoundError",
|
|
185
|
+
},
|
|
186
|
+
"501": {
|
|
187
|
+
"$ref": "#/components/schemas/AnalyticsUnconfiguredError",
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
"operationId": "getRequestUsage",
|
|
191
|
+
"response": {
|
|
192
|
+
"$ref": "#/components/schemas/RequestUsage",
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
"sponsorships": {
|
|
196
|
+
"errors": {
|
|
197
|
+
"400": {
|
|
198
|
+
"$ref": "#/components/schemas/ApiKeyMalformedOrParamInvalidOrQueryInvalidError",
|
|
199
|
+
},
|
|
200
|
+
"404": {
|
|
201
|
+
"$ref": "#/components/schemas/OrganizationNotFoundError",
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
"operationId": "getSponsorshipUsage",
|
|
205
|
+
"response": {
|
|
206
|
+
"$ref": "#/components/schemas/SponsorshipUsage",
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
"timestamps": {
|
|
210
|
+
"requestFrom": "date-time",
|
|
211
|
+
"requestPoint": "date-time",
|
|
212
|
+
"requestTo": "date-time",
|
|
213
|
+
"sponsorship": "date-time",
|
|
214
|
+
},
|
|
215
|
+
}
|
|
216
|
+
`)
|
|
217
|
+
})
|
|
218
|
+
|
|
127
219
|
describe('GET /orgs/:orgId/usage/requests', () => {
|
|
128
220
|
test('scopes to one project with environment-filtered attribution and legacy key ids', async () => {
|
|
129
221
|
vi.useFakeTimers({ now: new Date('2026-02-01T00:00:00.000Z') })
|