@distilled.cloud/cloudflare 0.0.0-john
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 +59 -0
- package/lib/auth.d.ts +14 -0
- package/lib/auth.d.ts.map +1 -0
- package/lib/auth.js +13 -0
- package/lib/auth.js.map +1 -0
- package/lib/category.d.ts +2 -0
- package/lib/category.d.ts.map +1 -0
- package/lib/category.js +2 -0
- package/lib/category.js.map +1 -0
- package/lib/client/api.d.ts +12 -0
- package/lib/client/api.d.ts.map +1 -0
- package/lib/client/api.js +292 -0
- package/lib/client/api.js.map +1 -0
- package/lib/client/index.d.ts +8 -0
- package/lib/client/index.d.ts.map +1 -0
- package/lib/client/index.js +8 -0
- package/lib/client/index.js.map +1 -0
- package/lib/credentials.d.ts +68 -0
- package/lib/credentials.d.ts.map +1 -0
- package/lib/credentials.js +136 -0
- package/lib/credentials.js.map +1 -0
- package/lib/errors.d.ts +48 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +31 -0
- package/lib/errors.js.map +1 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +10 -0
- package/lib/index.js.map +1 -0
- package/lib/retry.d.ts +14 -0
- package/lib/retry.d.ts.map +1 -0
- package/lib/retry.js +14 -0
- package/lib/retry.js.map +1 -0
- package/lib/schemas.d.ts +29 -0
- package/lib/schemas.d.ts.map +1 -0
- package/lib/schemas.js +34 -0
- package/lib/schemas.js.map +1 -0
- package/lib/sensitive.d.ts +5 -0
- package/lib/sensitive.d.ts.map +1 -0
- package/lib/sensitive.js +5 -0
- package/lib/sensitive.js.map +1 -0
- package/lib/services/abuse-reports.d.ts +296 -0
- package/lib/services/abuse-reports.d.ts.map +1 -0
- package/lib/services/abuse-reports.js +414 -0
- package/lib/services/abuse-reports.js.map +1 -0
- package/lib/services/accounts.d.ts +766 -0
- package/lib/services/accounts.d.ts.map +1 -0
- package/lib/services/accounts.js +860 -0
- package/lib/services/accounts.js.map +1 -0
- package/lib/services/acm.d.ts +73 -0
- package/lib/services/acm.d.ts.map +1 -0
- package/lib/services/acm.js +80 -0
- package/lib/services/acm.js.map +1 -0
- package/lib/services/addressing.d.ts +1321 -0
- package/lib/services/addressing.d.ts.map +1 -0
- package/lib/services/addressing.js +1863 -0
- package/lib/services/addressing.js.map +1 -0
- package/lib/services/ai-gateway.d.ts +1137 -0
- package/lib/services/ai-gateway.d.ts.map +1 -0
- package/lib/services/ai-gateway.js +1830 -0
- package/lib/services/ai-gateway.js.map +1 -0
- package/lib/services/ai.d.ts +297 -0
- package/lib/services/ai.d.ts.map +1 -0
- package/lib/services/ai.js +352 -0
- package/lib/services/ai.js.map +1 -0
- package/lib/services/aisearch.d.ts +1069 -0
- package/lib/services/aisearch.d.ts.map +1 -0
- package/lib/services/aisearch.js +2542 -0
- package/lib/services/aisearch.js.map +1 -0
- package/lib/services/alerting.d.ts +855 -0
- package/lib/services/alerting.d.ts.map +1 -0
- package/lib/services/alerting.js +1445 -0
- package/lib/services/alerting.js.map +1 -0
- package/lib/services/api-gateway.d.ts +1088 -0
- package/lib/services/api-gateway.d.ts.map +1 -0
- package/lib/services/api-gateway.js +1655 -0
- package/lib/services/api-gateway.js.map +1 -0
- package/lib/services/argo.d.ts +101 -0
- package/lib/services/argo.d.ts.map +1 -0
- package/lib/services/argo.js +113 -0
- package/lib/services/argo.js.map +1 -0
- package/lib/services/audit-logs.d.ts +46 -0
- package/lib/services/audit-logs.d.ts.map +1 -0
- package/lib/services/audit-logs.js +37 -0
- package/lib/services/audit-logs.js.map +1 -0
- package/lib/services/billing.d.ts +62 -0
- package/lib/services/billing.d.ts.map +1 -0
- package/lib/services/billing.js +102 -0
- package/lib/services/billing.js.map +1 -0
- package/lib/services/bot-management.d.ts +124 -0
- package/lib/services/bot-management.d.ts.map +1 -0
- package/lib/services/bot-management.js +262 -0
- package/lib/services/bot-management.js.map +1 -0
- package/lib/services/botnet-feed.d.ts +65 -0
- package/lib/services/botnet-feed.d.ts.map +1 -0
- package/lib/services/botnet-feed.js +88 -0
- package/lib/services/botnet-feed.js.map +1 -0
- package/lib/services/brand-protection.d.ts +194 -0
- package/lib/services/brand-protection.d.ts.map +1 -0
- package/lib/services/brand-protection.js +221 -0
- package/lib/services/brand-protection.js.map +1 -0
- package/lib/services/browser-rendering.d.ts +857 -0
- package/lib/services/browser-rendering.d.ts.map +1 -0
- package/lib/services/browser-rendering.js +1142 -0
- package/lib/services/browser-rendering.js.map +1 -0
- package/lib/services/cache.d.ts +287 -0
- package/lib/services/cache.d.ts.map +1 -0
- package/lib/services/cache.js +354 -0
- package/lib/services/cache.js.map +1 -0
- package/lib/services/calls.d.ts +223 -0
- package/lib/services/calls.d.ts.map +1 -0
- package/lib/services/calls.js +188 -0
- package/lib/services/calls.js.map +1 -0
- package/lib/services/certificate-authorities.d.ts +40 -0
- package/lib/services/certificate-authorities.d.ts.map +1 -0
- package/lib/services/certificate-authorities.js +49 -0
- package/lib/services/certificate-authorities.js.map +1 -0
- package/lib/services/client-certificates.d.ts +288 -0
- package/lib/services/client-certificates.d.ts.map +1 -0
- package/lib/services/client-certificates.js +379 -0
- package/lib/services/client-certificates.js.map +1 -0
- package/lib/services/cloud-connector.d.ts +88 -0
- package/lib/services/cloud-connector.d.ts.map +1 -0
- package/lib/services/cloud-connector.js +97 -0
- package/lib/services/cloud-connector.js.map +1 -0
- package/lib/services/cloudforce-one.d.ts +1387 -0
- package/lib/services/cloudforce-one.d.ts.map +1 -0
- package/lib/services/cloudforce-one.js +1741 -0
- package/lib/services/cloudforce-one.js.map +1 -0
- package/lib/services/connectivity.d.ts +291 -0
- package/lib/services/connectivity.d.ts.map +1 -0
- package/lib/services/connectivity.js +404 -0
- package/lib/services/connectivity.js.map +1 -0
- package/lib/services/content-scanning.d.ts +156 -0
- package/lib/services/content-scanning.d.ts.map +1 -0
- package/lib/services/content-scanning.js +175 -0
- package/lib/services/content-scanning.js.map +1 -0
- package/lib/services/custom-certificates.d.ts +240 -0
- package/lib/services/custom-certificates.d.ts.map +1 -0
- package/lib/services/custom-certificates.js +336 -0
- package/lib/services/custom-certificates.js.map +1 -0
- package/lib/services/custom-hostnames.d.ts +590 -0
- package/lib/services/custom-hostnames.d.ts.map +1 -0
- package/lib/services/custom-hostnames.js +1204 -0
- package/lib/services/custom-hostnames.js.map +1 -0
- package/lib/services/custom-nameservers.d.ts +87 -0
- package/lib/services/custom-nameservers.d.ts.map +1 -0
- package/lib/services/custom-nameservers.js +95 -0
- package/lib/services/custom-nameservers.js.map +1 -0
- package/lib/services/custom-pages.d.ts +89 -0
- package/lib/services/custom-pages.d.ts.map +1 -0
- package/lib/services/custom-pages.js +140 -0
- package/lib/services/custom-pages.js.map +1 -0
- package/lib/services/d1.d.ts +392 -0
- package/lib/services/d1.d.ts.map +1 -0
- package/lib/services/d1.js +487 -0
- package/lib/services/d1.js.map +1 -0
- package/lib/services/dcv-delegation.d.ts +24 -0
- package/lib/services/dcv-delegation.d.ts.map +1 -0
- package/lib/services/dcv-delegation.js +24 -0
- package/lib/services/dcv-delegation.js.map +1 -0
- package/lib/services/diagnostics.d.ts +208 -0
- package/lib/services/diagnostics.d.ts.map +1 -0
- package/lib/services/diagnostics.js +288 -0
- package/lib/services/diagnostics.js.map +1 -0
- package/lib/services/dns-firewall.d.ts +317 -0
- package/lib/services/dns-firewall.d.ts.map +1 -0
- package/lib/services/dns-firewall.js +400 -0
- package/lib/services/dns-firewall.js.map +1 -0
- package/lib/services/dns.d.ts +3065 -0
- package/lib/services/dns.d.ts.map +1 -0
- package/lib/services/dns.js +4627 -0
- package/lib/services/dns.js.map +1 -0
- package/lib/services/durable-objects.d.ts +92 -0
- package/lib/services/durable-objects.d.ts.map +1 -0
- package/lib/services/durable-objects.js +103 -0
- package/lib/services/durable-objects.js.map +1 -0
- package/lib/services/email-routing.d.ts +598 -0
- package/lib/services/email-routing.d.ts.map +1 -0
- package/lib/services/email-routing.js +715 -0
- package/lib/services/email-routing.js.map +1 -0
- package/lib/services/email-security.d.ts +1389 -0
- package/lib/services/email-security.d.ts.map +1 -0
- package/lib/services/email-security.js +2261 -0
- package/lib/services/email-security.js.map +1 -0
- package/lib/services/filters.d.ts +197 -0
- package/lib/services/filters.d.ts.map +1 -0
- package/lib/services/filters.js +168 -0
- package/lib/services/filters.js.map +1 -0
- package/lib/services/firewall.d.ts +1352 -0
- package/lib/services/firewall.d.ts.map +1 -0
- package/lib/services/firewall.js +2084 -0
- package/lib/services/firewall.js.map +1 -0
- package/lib/services/healthchecks.d.ts +507 -0
- package/lib/services/healthchecks.d.ts.map +1 -0
- package/lib/services/healthchecks.js +867 -0
- package/lib/services/healthchecks.js.map +1 -0
- package/lib/services/hostnames.d.ts +86 -0
- package/lib/services/hostnames.d.ts.map +1 -0
- package/lib/services/hostnames.js +111 -0
- package/lib/services/hostnames.js.map +1 -0
- package/lib/services/hyperdrive.d.ts +203 -0
- package/lib/services/hyperdrive.d.ts.map +1 -0
- package/lib/services/hyperdrive.js +300 -0
- package/lib/services/hyperdrive.js.map +1 -0
- package/lib/services/iam.d.ts +657 -0
- package/lib/services/iam.d.ts.map +1 -0
- package/lib/services/iam.js +843 -0
- package/lib/services/iam.js.map +1 -0
- package/lib/services/images.d.ts +427 -0
- package/lib/services/images.d.ts.map +1 -0
- package/lib/services/images.js +444 -0
- package/lib/services/images.js.map +1 -0
- package/lib/services/intel.d.ts +865 -0
- package/lib/services/intel.d.ts.map +1 -0
- package/lib/services/intel.js +1266 -0
- package/lib/services/intel.js.map +1 -0
- package/lib/services/ips.d.ts +28 -0
- package/lib/services/ips.d.ts.map +1 -0
- package/lib/services/ips.js +39 -0
- package/lib/services/ips.js.map +1 -0
- package/lib/services/keyless-certificates.d.ts +197 -0
- package/lib/services/keyless-certificates.d.ts.map +1 -0
- package/lib/services/keyless-certificates.js +229 -0
- package/lib/services/keyless-certificates.js.map +1 -0
- package/lib/services/kv.d.ts +369 -0
- package/lib/services/kv.d.ts.map +1 -0
- package/lib/services/kv.js +453 -0
- package/lib/services/kv.js.map +1 -0
- package/lib/services/leaked-credential-checks.d.ts +129 -0
- package/lib/services/leaked-credential-checks.d.ts.map +1 -0
- package/lib/services/leaked-credential-checks.js +138 -0
- package/lib/services/leaked-credential-checks.js.map +1 -0
- package/lib/services/load-balancers.d.ts +1973 -0
- package/lib/services/load-balancers.d.ts.map +1 -0
- package/lib/services/load-balancers.js +3181 -0
- package/lib/services/load-balancers.js.map +1 -0
- package/lib/services/logpush.d.ts +401 -0
- package/lib/services/logpush.d.ts.map +1 -0
- package/lib/services/logpush.js +732 -0
- package/lib/services/logpush.js.map +1 -0
- package/lib/services/logs.d.ts +125 -0
- package/lib/services/logs.d.ts.map +1 -0
- package/lib/services/logs.js +149 -0
- package/lib/services/logs.js.map +1 -0
- package/lib/services/magic-cloud-networking.d.ts +1892 -0
- package/lib/services/magic-cloud-networking.d.ts.map +1 -0
- package/lib/services/magic-cloud-networking.js +5291 -0
- package/lib/services/magic-cloud-networking.js.map +1 -0
- package/lib/services/magic-network-monitoring.d.ts +379 -0
- package/lib/services/magic-network-monitoring.d.ts.map +1 -0
- package/lib/services/magic-network-monitoring.js +557 -0
- package/lib/services/magic-network-monitoring.js.map +1 -0
- package/lib/services/magic-transit.d.ts +3886 -0
- package/lib/services/magic-transit.d.ts.map +1 -0
- package/lib/services/magic-transit.js +6284 -0
- package/lib/services/magic-transit.js.map +1 -0
- package/lib/services/managed-transforms.d.ts +79 -0
- package/lib/services/managed-transforms.d.ts.map +1 -0
- package/lib/services/managed-transforms.js +111 -0
- package/lib/services/managed-transforms.js.map +1 -0
- package/lib/services/memberships.d.ts +204 -0
- package/lib/services/memberships.d.ts.map +1 -0
- package/lib/services/memberships.js +308 -0
- package/lib/services/memberships.js.map +1 -0
- package/lib/services/mtls-certificates.d.ts +164 -0
- package/lib/services/mtls-certificates.d.ts.map +1 -0
- package/lib/services/mtls-certificates.js +192 -0
- package/lib/services/mtls-certificates.js.map +1 -0
- package/lib/services/network-interconnects.d.ts +410 -0
- package/lib/services/network-interconnects.d.ts.map +1 -0
- package/lib/services/network-interconnects.js +583 -0
- package/lib/services/network-interconnects.js.map +1 -0
- package/lib/services/organizations.d.ts +232 -0
- package/lib/services/organizations.d.ts.map +1 -0
- package/lib/services/organizations.js +370 -0
- package/lib/services/organizations.js.map +1 -0
- package/lib/services/origin-ca-certificates.d.ts +119 -0
- package/lib/services/origin-ca-certificates.d.ts.map +1 -0
- package/lib/services/origin-ca-certificates.js +183 -0
- package/lib/services/origin-ca-certificates.js.map +1 -0
- package/lib/services/origin-post-quantum-encryption.d.ts +50 -0
- package/lib/services/origin-post-quantum-encryption.d.ts.map +1 -0
- package/lib/services/origin-post-quantum-encryption.js +64 -0
- package/lib/services/origin-post-quantum-encryption.js.map +1 -0
- package/lib/services/origin-tls-client-auth.d.ts +308 -0
- package/lib/services/origin-tls-client-auth.d.ts.map +1 -0
- package/lib/services/origin-tls-client-auth.js +435 -0
- package/lib/services/origin-tls-client-auth.js.map +1 -0
- package/lib/services/page-rules.d.ts +773 -0
- package/lib/services/page-rules.d.ts.map +1 -0
- package/lib/services/page-rules.js +1373 -0
- package/lib/services/page-rules.js.map +1 -0
- package/lib/services/page-shield.d.ts +505 -0
- package/lib/services/page-shield.d.ts.map +1 -0
- package/lib/services/page-shield.js +520 -0
- package/lib/services/page-shield.js.map +1 -0
- package/lib/services/pages.d.ts +1949 -0
- package/lib/services/pages.d.ts.map +1 -0
- package/lib/services/pages.js +3030 -0
- package/lib/services/pages.js.map +1 -0
- package/lib/services/pipelines.d.ts +1716 -0
- package/lib/services/pipelines.d.ts.map +1 -0
- package/lib/services/pipelines.js +2991 -0
- package/lib/services/pipelines.js.map +1 -0
- package/lib/services/queues.d.ts +904 -0
- package/lib/services/queues.d.ts.map +1 -0
- package/lib/services/queues.js +1250 -0
- package/lib/services/queues.js.map +1 -0
- package/lib/services/r2-data-catalog.d.ts +341 -0
- package/lib/services/r2-data-catalog.d.ts.map +1 -0
- package/lib/services/r2-data-catalog.js +513 -0
- package/lib/services/r2-data-catalog.js.map +1 -0
- package/lib/services/r2.d.ts +1087 -0
- package/lib/services/r2.d.ts.map +1 -0
- package/lib/services/r2.js +1404 -0
- package/lib/services/r2.js.map +1 -0
- package/lib/services/radar.d.ts +9365 -0
- package/lib/services/radar.d.ts.map +1 -0
- package/lib/services/radar.js +20552 -0
- package/lib/services/radar.js.map +1 -0
- package/lib/services/rate-limits.d.ts +360 -0
- package/lib/services/rate-limits.d.ts.map +1 -0
- package/lib/services/rate-limits.js +545 -0
- package/lib/services/rate-limits.js.map +1 -0
- package/lib/services/realtime-kit.d.ts +2728 -0
- package/lib/services/realtime-kit.d.ts.map +1 -0
- package/lib/services/realtime-kit.js +5402 -0
- package/lib/services/realtime-kit.js.map +1 -0
- package/lib/services/registrar.d.ts +121 -0
- package/lib/services/registrar.d.ts.map +1 -0
- package/lib/services/registrar.js +167 -0
- package/lib/services/registrar.js.map +1 -0
- package/lib/services/request-tracers.d.ts +61 -0
- package/lib/services/request-tracers.d.ts.map +1 -0
- package/lib/services/request-tracers.js +85 -0
- package/lib/services/request-tracers.js.map +1 -0
- package/lib/services/resource-sharing.d.ts +622 -0
- package/lib/services/resource-sharing.d.ts.map +1 -0
- package/lib/services/resource-sharing.js +929 -0
- package/lib/services/resource-sharing.js.map +1 -0
- package/lib/services/rules.d.ts +346 -0
- package/lib/services/rules.d.ts.map +1 -0
- package/lib/services/rules.js +431 -0
- package/lib/services/rules.js.map +1 -0
- package/lib/services/rulesets.d.ts +3345 -0
- package/lib/services/rulesets.d.ts.map +1 -0
- package/lib/services/rulesets.js +7904 -0
- package/lib/services/rulesets.js.map +1 -0
- package/lib/services/rum.d.ts +314 -0
- package/lib/services/rum.d.ts.map +1 -0
- package/lib/services/rum.js +442 -0
- package/lib/services/rum.js.map +1 -0
- package/lib/services/schema-validation.d.ts +273 -0
- package/lib/services/schema-validation.d.ts.map +1 -0
- package/lib/services/schema-validation.js +365 -0
- package/lib/services/schema-validation.js.map +1 -0
- package/lib/services/secrets-store.d.ts +393 -0
- package/lib/services/secrets-store.d.ts.map +1 -0
- package/lib/services/secrets-store.js +452 -0
- package/lib/services/secrets-store.js.map +1 -0
- package/lib/services/security-center.d.ts +136 -0
- package/lib/services/security-center.d.ts.map +1 -0
- package/lib/services/security-center.js +196 -0
- package/lib/services/security-center.js.map +1 -0
- package/lib/services/security-txt.d.ts +105 -0
- package/lib/services/security-txt.d.ts.map +1 -0
- package/lib/services/security-txt.js +136 -0
- package/lib/services/security-txt.js.map +1 -0
- package/lib/services/snippets.d.ts +190 -0
- package/lib/services/snippets.d.ts.map +1 -0
- package/lib/services/snippets.js +221 -0
- package/lib/services/snippets.js.map +1 -0
- package/lib/services/spectrum.d.ts +350 -0
- package/lib/services/spectrum.d.ts.map +1 -0
- package/lib/services/spectrum.js +535 -0
- package/lib/services/spectrum.js.map +1 -0
- package/lib/services/speed.d.ts +257 -0
- package/lib/services/speed.d.ts.map +1 -0
- package/lib/services/speed.js +471 -0
- package/lib/services/speed.js.map +1 -0
- package/lib/services/ssl.d.ts +412 -0
- package/lib/services/ssl.d.ts.map +1 -0
- package/lib/services/ssl.js +755 -0
- package/lib/services/ssl.js.map +1 -0
- package/lib/services/stream.d.ts +1110 -0
- package/lib/services/stream.d.ts.map +1 -0
- package/lib/services/stream.js +1085 -0
- package/lib/services/stream.js.map +1 -0
- package/lib/services/token-validation.d.ts +662 -0
- package/lib/services/token-validation.d.ts.map +1 -0
- package/lib/services/token-validation.js +834 -0
- package/lib/services/token-validation.js.map +1 -0
- package/lib/services/turnstile.d.ts +272 -0
- package/lib/services/turnstile.d.ts.map +1 -0
- package/lib/services/turnstile.js +339 -0
- package/lib/services/turnstile.js.map +1 -0
- package/lib/services/url-normalization.d.ts +53 -0
- package/lib/services/url-normalization.d.ts.map +1 -0
- package/lib/services/url-normalization.js +52 -0
- package/lib/services/url-normalization.js.map +1 -0
- package/lib/services/url-scanner.d.ts +612 -0
- package/lib/services/url-scanner.d.ts.map +1 -0
- package/lib/services/url-scanner.js +915 -0
- package/lib/services/url-scanner.js.map +1 -0
- package/lib/services/user.d.ts +507 -0
- package/lib/services/user.d.ts.map +1 -0
- package/lib/services/user.js +634 -0
- package/lib/services/user.js.map +1 -0
- package/lib/services/vectorize.d.ts +297 -0
- package/lib/services/vectorize.d.ts.map +1 -0
- package/lib/services/vectorize.js +351 -0
- package/lib/services/vectorize.js.map +1 -0
- package/lib/services/waiting-rooms.d.ts +1149 -0
- package/lib/services/waiting-rooms.d.ts.map +1 -0
- package/lib/services/waiting-rooms.js +1859 -0
- package/lib/services/waiting-rooms.js.map +1 -0
- package/lib/services/web3.d.ts +289 -0
- package/lib/services/web3.d.ts.map +1 -0
- package/lib/services/web3.js +381 -0
- package/lib/services/web3.js.map +1 -0
- package/lib/services/workers-for-platforms.d.ts +1394 -0
- package/lib/services/workers-for-platforms.d.ts.map +1 -0
- package/lib/services/workers-for-platforms.js +2121 -0
- package/lib/services/workers-for-platforms.js.map +1 -0
- package/lib/services/workers.d.ts +3827 -0
- package/lib/services/workers.d.ts.map +1 -0
- package/lib/services/workers.js +6105 -0
- package/lib/services/workers.js.map +1 -0
- package/lib/services/workflows.d.ts +442 -0
- package/lib/services/workflows.d.ts.map +1 -0
- package/lib/services/workflows.js +599 -0
- package/lib/services/workflows.js.map +1 -0
- package/lib/services/zaraz.d.ts +312 -0
- package/lib/services/zaraz.d.ts.map +1 -0
- package/lib/services/zaraz.js +305 -0
- package/lib/services/zaraz.js.map +1 -0
- package/lib/services/zero-trust.d.ts +18235 -0
- package/lib/services/zero-trust.d.ts.map +1 -0
- package/lib/services/zero-trust.js +30268 -0
- package/lib/services/zero-trust.js.map +1 -0
- package/lib/services/zones.d.ts +1382 -0
- package/lib/services/zones.d.ts.map +1 -0
- package/lib/services/zones.js +2477 -0
- package/lib/services/zones.js.map +1 -0
- package/lib/traits.d.ts +28 -0
- package/lib/traits.d.ts.map +1 -0
- package/lib/traits.js +26 -0
- package/lib/traits.js.map +1 -0
- package/package.json +82 -0
- package/src/auth.ts +15 -0
- package/src/category.ts +1 -0
- package/src/client/api.ts +421 -0
- package/src/client/index.ts +7 -0
- package/src/credentials.ts +271 -0
- package/src/errors.ts +73 -0
- package/src/index.ts +9 -0
- package/src/retry.ts +35 -0
- package/src/schemas.ts +51 -0
- package/src/sensitive.ts +4 -0
- package/src/services/abuse-reports.ts +955 -0
- package/src/services/accounts.ts +2152 -0
- package/src/services/acm.ts +178 -0
- package/src/services/addressing.ts +4262 -0
- package/src/services/ai-gateway.ts +3773 -0
- package/src/services/ai.ts +901 -0
- package/src/services/aisearch.ts +5215 -0
- package/src/services/alerting.ts +3303 -0
- package/src/services/api-gateway.ts +3890 -0
- package/src/services/argo.ts +270 -0
- package/src/services/audit-logs.ts +90 -0
- package/src/services/billing.ts +176 -0
- package/src/services/bot-management.ts +545 -0
- package/src/services/botnet-feed.ts +205 -0
- package/src/services/brand-protection.ts +575 -0
- package/src/services/browser-rendering.ts +2720 -0
- package/src/services/cache.ts +877 -0
- package/src/services/calls.ts +548 -0
- package/src/services/certificate-authorities.ts +114 -0
- package/src/services/client-certificates.ts +815 -0
- package/src/services/cloud-connector.ts +248 -0
- package/src/services/cloudforce-one.ts +4104 -0
- package/src/services/connectivity.ts +706 -0
- package/src/services/content-scanning.ts +458 -0
- package/src/services/custom-certificates.ts +690 -0
- package/src/services/custom-hostnames.ts +2641 -0
- package/src/services/custom-nameservers.ts +235 -0
- package/src/services/custom-pages.ts +311 -0
- package/src/services/d1.ts +1208 -0
- package/src/services/dcv-delegation.ts +54 -0
- package/src/services/diagnostics.ts +677 -0
- package/src/services/dns-firewall.ts +904 -0
- package/src/services/dns.ts +9277 -0
- package/src/services/durable-objects.ts +237 -0
- package/src/services/email-routing.ts +1796 -0
- package/src/services/email-security.ts +5052 -0
- package/src/services/filters.ts +488 -0
- package/src/services/firewall.ts +4728 -0
- package/src/services/healthchecks.ts +1866 -0
- package/src/services/hostnames.ts +254 -0
- package/src/services/hyperdrive.ts +595 -0
- package/src/services/iam.ts +1969 -0
- package/src/services/images.ts +1180 -0
- package/src/services/intel.ts +3072 -0
- package/src/services/ips.ts +88 -0
- package/src/services/keyless-certificates.ts +509 -0
- package/src/services/kv.ts +1129 -0
- package/src/services/leaked-credential-checks.ts +364 -0
- package/src/services/load-balancers.ts +6993 -0
- package/src/services/logpush.ts +1695 -0
- package/src/services/logs.ts +389 -0
- package/src/services/magic-cloud-networking.ts +10747 -0
- package/src/services/magic-network-monitoring.ts +1200 -0
- package/src/services/magic-transit.ts +13673 -0
- package/src/services/managed-transforms.ts +245 -0
- package/src/services/memberships.ts +698 -0
- package/src/services/mtls-certificates.ts +444 -0
- package/src/services/network-interconnects.ts +1253 -0
- package/src/services/organizations.ts +738 -0
- package/src/services/origin-ca-certificates.ts +369 -0
- package/src/services/origin-post-quantum-encryption.ts +136 -0
- package/src/services/origin-tls-client-auth.ts +1002 -0
- package/src/services/page-rules.ts +2632 -0
- package/src/services/page-shield.ts +1371 -0
- package/src/services/pages.ts +6167 -0
- package/src/services/pipelines.ts +6455 -0
- package/src/services/queues.ts +2827 -0
- package/src/services/r2-data-catalog.ts +1151 -0
- package/src/services/r2.ts +3529 -0
- package/src/services/radar.ts +42836 -0
- package/src/services/rate-limits.ts +1252 -0
- package/src/services/realtime-kit.ts +11080 -0
- package/src/services/registrar.ts +390 -0
- package/src/services/request-tracers.ts +161 -0
- package/src/services/resource-sharing.ts +2082 -0
- package/src/services/rules.ts +953 -0
- package/src/services/rulesets.ts +15361 -0
- package/src/services/rum.ts +994 -0
- package/src/services/schema-validation.ts +869 -0
- package/src/services/secrets-store.ts +1050 -0
- package/src/services/security-center.ts +495 -0
- package/src/services/security-txt.ts +317 -0
- package/src/services/snippets.ts +562 -0
- package/src/services/spectrum.ts +1190 -0
- package/src/services/speed.ts +1154 -0
- package/src/services/ssl.ts +1714 -0
- package/src/services/stream.ts +3008 -0
- package/src/services/token-validation.ts +1825 -0
- package/src/services/turnstile.ts +725 -0
- package/src/services/url-normalization.ts +133 -0
- package/src/services/url-scanner.ts +1851 -0
- package/src/services/user.ts +1587 -0
- package/src/services/vectorize.ts +875 -0
- package/src/services/waiting-rooms.ts +4216 -0
- package/src/services/web3.ts +899 -0
- package/src/services/workers-for-platforms.ts +4134 -0
- package/src/services/workers.ts +12298 -0
- package/src/services/workflows.ts +1372 -0
- package/src/services/zaraz.ts +833 -0
- package/src/services/zero-trust.ts +64685 -0
- package/src/services/zones.ts +5106 -0
- package/src/traits.ts +47 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare API operations factory.
|
|
3
|
+
*
|
|
4
|
+
* This module is imported as `import * as API from "../client/api.ts"` by
|
|
5
|
+
* generated service files so that `API.make()`, `API.OperationMethod`, etc.
|
|
6
|
+
* are all accessible as namespace members.
|
|
7
|
+
*/
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import * as Schema from "effect/Schema";
|
|
10
|
+
import type * as AST from "effect/SchemaAST";
|
|
11
|
+
import * as Stream from "effect/Stream";
|
|
12
|
+
import {
|
|
13
|
+
makeAPI,
|
|
14
|
+
type ApiErrorClass,
|
|
15
|
+
type OperationMethod,
|
|
16
|
+
type PaginatedOperationMethod,
|
|
17
|
+
} from "@distilled.cloud/core/client";
|
|
18
|
+
import {
|
|
19
|
+
paginateCursor,
|
|
20
|
+
paginateSingle,
|
|
21
|
+
paginateWithDefaults,
|
|
22
|
+
type PaginationStrategy,
|
|
23
|
+
} from "@distilled.cloud/core/pagination";
|
|
24
|
+
import { getPath, type RequestParts } from "@distilled.cloud/core/traits";
|
|
25
|
+
import {
|
|
26
|
+
CloudflareHttpError,
|
|
27
|
+
HTTP_STATUS_MAP,
|
|
28
|
+
InternalServerError,
|
|
29
|
+
TooManyRequests,
|
|
30
|
+
UnknownCloudflareError,
|
|
31
|
+
} from "../errors.ts";
|
|
32
|
+
import { Credentials, formatHeaders } from "../credentials.ts";
|
|
33
|
+
import { type ErrorMatcher, getErrorMatchers } from "../traits.ts";
|
|
34
|
+
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// Global Cloudflare error codes
|
|
37
|
+
// ============================================================================
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Cloudflare error codes that map to global/default errors regardless of operation.
|
|
41
|
+
* These are infrastructure-level errors that can occur on any endpoint.
|
|
42
|
+
*/
|
|
43
|
+
const GLOBAL_ERROR_CODE_MAP: Record<number, (message: string) => unknown> = {
|
|
44
|
+
// "Please wait and consider throttling your request speed"
|
|
45
|
+
971: (message) => new TooManyRequests({ message }),
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Create an appropriate error for an HTTP status code.
|
|
50
|
+
*
|
|
51
|
+
* For status codes in HTTP_STATUS_MAP (400, 401, 500, 502, 503, 504, etc.),
|
|
52
|
+
* returns the properly categorized error (with retry categories for 5xx).
|
|
53
|
+
* For unmapped 5xx codes (e.g., Cloudflare-specific 520-530), returns a
|
|
54
|
+
* CloudflareHttpError so the status is preserved.
|
|
55
|
+
*/
|
|
56
|
+
function httpStatusError(status: number, body?: string): unknown {
|
|
57
|
+
const ErrorClass = HTTP_STATUS_MAP[status as keyof typeof HTTP_STATUS_MAP];
|
|
58
|
+
if (ErrorClass) {
|
|
59
|
+
return new ErrorClass({ message: body ?? String(status) });
|
|
60
|
+
}
|
|
61
|
+
// For unmapped 5xx codes (e.g., Cloudflare-specific 520-530), use
|
|
62
|
+
// InternalServerError so they get ServerError + Retryable categories
|
|
63
|
+
if (status >= 500) {
|
|
64
|
+
return new InternalServerError({ message: body ?? String(status) });
|
|
65
|
+
}
|
|
66
|
+
return new CloudflareHttpError({
|
|
67
|
+
status,
|
|
68
|
+
statusText: String(status),
|
|
69
|
+
body,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export type { OperationMethod, PaginatedOperationMethod };
|
|
74
|
+
|
|
75
|
+
// ============================================================================
|
|
76
|
+
// Error matching
|
|
77
|
+
// ============================================================================
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Extract the _tag literal value from a TaggedError schema AST.
|
|
81
|
+
*/
|
|
82
|
+
function extractTagFromAst(ast: AST.AST): string | undefined {
|
|
83
|
+
if (ast.encoding && ast.encoding.length > 0) {
|
|
84
|
+
return extractTagFromAst(ast.encoding[0].to);
|
|
85
|
+
}
|
|
86
|
+
if (ast._tag === "Objects") {
|
|
87
|
+
const tagProp = ast.propertySignatures.find(
|
|
88
|
+
(p: { name: PropertyKey }) => p.name === "_tag",
|
|
89
|
+
);
|
|
90
|
+
if (
|
|
91
|
+
tagProp &&
|
|
92
|
+
tagProp.type._tag === "Literal" &&
|
|
93
|
+
typeof tagProp.type.literal === "string"
|
|
94
|
+
) {
|
|
95
|
+
return tagProp.type.literal;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Check if an error matches an expression-based matcher.
|
|
103
|
+
*/
|
|
104
|
+
function matchesExpression(
|
|
105
|
+
matcher: ErrorMatcher,
|
|
106
|
+
code: number | undefined,
|
|
107
|
+
status: number,
|
|
108
|
+
message: string,
|
|
109
|
+
): boolean {
|
|
110
|
+
if (matcher.code === undefined && matcher.status === undefined) return false;
|
|
111
|
+
if (matcher.code !== undefined && matcher.code !== code) return false;
|
|
112
|
+
if (matcher.status !== undefined && matcher.status !== status) return false;
|
|
113
|
+
if (matcher.message !== undefined) {
|
|
114
|
+
if (typeof matcher.message === "string") {
|
|
115
|
+
if (matcher.message !== message) return false;
|
|
116
|
+
} else if (matcher.message.includes !== undefined) {
|
|
117
|
+
if (!message.includes(matcher.message.includes)) return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Calculate specificity score for a matcher.
|
|
125
|
+
*/
|
|
126
|
+
function matcherSpecificity(matcher: ErrorMatcher): number {
|
|
127
|
+
let score = 0;
|
|
128
|
+
if (matcher.code !== undefined) score += 1;
|
|
129
|
+
if (matcher.status !== undefined) score += 1;
|
|
130
|
+
if (matcher.message !== undefined) score += 1;
|
|
131
|
+
return score;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
interface MatchedError {
|
|
135
|
+
schema: Schema.Top;
|
|
136
|
+
tag: string;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Find matching error schema using annotations from the schema AST.
|
|
141
|
+
*/
|
|
142
|
+
function findMatchingError(
|
|
143
|
+
errorSchemas: Map<string, Schema.Top>,
|
|
144
|
+
code: number | undefined,
|
|
145
|
+
status: number,
|
|
146
|
+
message: string,
|
|
147
|
+
): MatchedError | undefined {
|
|
148
|
+
let bestMatch: MatchedError | undefined;
|
|
149
|
+
let bestScore = 0;
|
|
150
|
+
|
|
151
|
+
for (const [name, schema] of errorSchemas) {
|
|
152
|
+
const ast = schema.ast;
|
|
153
|
+
const matchers = getErrorMatchers(ast);
|
|
154
|
+
if (!matchers || matchers.length === 0) continue;
|
|
155
|
+
|
|
156
|
+
for (const matcher of matchers) {
|
|
157
|
+
if (matchesExpression(matcher, code, status, message)) {
|
|
158
|
+
const score = matcherSpecificity(matcher);
|
|
159
|
+
if (score > bestScore) {
|
|
160
|
+
bestScore = score;
|
|
161
|
+
bestMatch = { schema, tag: name };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return bestMatch;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Match a Cloudflare API error response using per-operation error schemas.
|
|
172
|
+
*/
|
|
173
|
+
const matchError = (
|
|
174
|
+
status: number,
|
|
175
|
+
errorBody: unknown,
|
|
176
|
+
errors?: readonly ApiErrorClass[],
|
|
177
|
+
): Effect.Effect<never, unknown> => {
|
|
178
|
+
// Handle non-JSON error responses (e.g., HTML from malformed URLs, 520 pages)
|
|
179
|
+
const isNonJsonError =
|
|
180
|
+
typeof errorBody === "object" &&
|
|
181
|
+
errorBody !== null &&
|
|
182
|
+
"_nonJsonError" in errorBody;
|
|
183
|
+
if (isNonJsonError) {
|
|
184
|
+
// For 5xx errors, return a properly categorized error so retries work
|
|
185
|
+
if (status >= 500) {
|
|
186
|
+
return Effect.fail(
|
|
187
|
+
httpStatusError(status, String((errorBody as any).body)),
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
return Effect.fail(
|
|
191
|
+
new CloudflareHttpError({
|
|
192
|
+
status,
|
|
193
|
+
statusText: String(status),
|
|
194
|
+
body: String((errorBody as any).body),
|
|
195
|
+
}),
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Parse the Cloudflare error envelope
|
|
200
|
+
const envelope =
|
|
201
|
+
typeof errorBody === "object" && errorBody !== null ? errorBody : undefined;
|
|
202
|
+
const cfErrors =
|
|
203
|
+
envelope && "errors" in envelope && Array.isArray((envelope as any).errors)
|
|
204
|
+
? ((envelope as any).errors as Array<{
|
|
205
|
+
code?: number;
|
|
206
|
+
message?: string;
|
|
207
|
+
}>)
|
|
208
|
+
: undefined;
|
|
209
|
+
const firstError = cfErrors?.[0];
|
|
210
|
+
// Cloudflare sometimes omits the code field entirely (e.g., webhook errors).
|
|
211
|
+
// Treat missing code as 0 (the default) so matchers with { code: 0 } can match.
|
|
212
|
+
const errorCode =
|
|
213
|
+
firstError && typeof firstError.code === "number"
|
|
214
|
+
? firstError.code
|
|
215
|
+
: firstError
|
|
216
|
+
? 0
|
|
217
|
+
: undefined;
|
|
218
|
+
const errorMessage = firstError?.message ?? String(status);
|
|
219
|
+
|
|
220
|
+
// Check if this is a valid Cloudflare envelope (has success field)
|
|
221
|
+
const isEnvelope =
|
|
222
|
+
envelope && "success" in envelope && (envelope as any).success === false;
|
|
223
|
+
|
|
224
|
+
if (!isEnvelope) {
|
|
225
|
+
// Not a Cloudflare envelope — HTTP-level error
|
|
226
|
+
// For 5xx errors, return a properly categorized error so retries work
|
|
227
|
+
const bodyStr =
|
|
228
|
+
typeof errorBody === "string" ? errorBody : JSON.stringify(errorBody);
|
|
229
|
+
if (status >= 500) {
|
|
230
|
+
return Effect.fail(httpStatusError(status, bodyStr));
|
|
231
|
+
}
|
|
232
|
+
return Effect.fail(
|
|
233
|
+
new CloudflareHttpError({
|
|
234
|
+
status,
|
|
235
|
+
statusText: String(status),
|
|
236
|
+
body: bodyStr,
|
|
237
|
+
}),
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Build error schema map from the per-operation errors
|
|
242
|
+
if (errors && errors.length > 0) {
|
|
243
|
+
const errorSchemas = new Map<string, Schema.Top>();
|
|
244
|
+
for (const errorSchema of errors) {
|
|
245
|
+
const identifier = extractTagFromAst(
|
|
246
|
+
(errorSchema as unknown as Schema.Top).ast,
|
|
247
|
+
);
|
|
248
|
+
if (identifier) {
|
|
249
|
+
errorSchemas.set(identifier, errorSchema as unknown as Schema.Top);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const matched = findMatchingError(
|
|
254
|
+
errorSchemas,
|
|
255
|
+
errorCode,
|
|
256
|
+
status,
|
|
257
|
+
errorMessage,
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
if (matched) {
|
|
261
|
+
// Decode using the schema - properly instantiates TaggedError classes
|
|
262
|
+
const errorData = {
|
|
263
|
+
_tag: matched.tag,
|
|
264
|
+
code: errorCode ?? 0,
|
|
265
|
+
message: errorMessage,
|
|
266
|
+
};
|
|
267
|
+
return Schema.decodeUnknownEffect(matched.schema)(errorData).pipe(
|
|
268
|
+
Effect.flatMap((decoded: unknown) => Effect.fail(decoded)),
|
|
269
|
+
Effect.catchIf(
|
|
270
|
+
(e: unknown) =>
|
|
271
|
+
typeof e === "object" &&
|
|
272
|
+
e !== null &&
|
|
273
|
+
"_tag" in e &&
|
|
274
|
+
(e as any)._tag === "SchemaError",
|
|
275
|
+
() =>
|
|
276
|
+
Effect.fail(
|
|
277
|
+
new UnknownCloudflareError({
|
|
278
|
+
code: errorCode,
|
|
279
|
+
message: errorMessage,
|
|
280
|
+
}),
|
|
281
|
+
),
|
|
282
|
+
),
|
|
283
|
+
) as Effect.Effect<never, unknown>;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Check global error codes before falling through to unknown
|
|
288
|
+
if (errorCode !== undefined && errorCode in GLOBAL_ERROR_CODE_MAP) {
|
|
289
|
+
return Effect.fail(GLOBAL_ERROR_CODE_MAP[errorCode](errorMessage));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// No match — return unknown Cloudflare error
|
|
293
|
+
return Effect.fail(
|
|
294
|
+
new UnknownCloudflareError({
|
|
295
|
+
code: errorCode,
|
|
296
|
+
message: errorMessage,
|
|
297
|
+
}),
|
|
298
|
+
);
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Wrap schema decode failures as CloudflareHttpError to match the original's behavior.
|
|
303
|
+
* The original project maps all decode errors to CloudflareHttpError (not a separate parse error type).
|
|
304
|
+
*/
|
|
305
|
+
class CloudflareDecodeError extends CloudflareHttpError {
|
|
306
|
+
constructor(props: { body: unknown; cause: unknown }) {
|
|
307
|
+
super({
|
|
308
|
+
status: 200,
|
|
309
|
+
statusText: "Schema decode failed",
|
|
310
|
+
body:
|
|
311
|
+
typeof props.body === "string"
|
|
312
|
+
? props.body
|
|
313
|
+
: JSON.stringify(props.body),
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const ASSET_UPLOAD_PATH = "/accounts/{account_id}/workers/assets/upload";
|
|
319
|
+
|
|
320
|
+
export const transformCloudflareRequestParts = ({
|
|
321
|
+
pathTemplate,
|
|
322
|
+
parts,
|
|
323
|
+
}: {
|
|
324
|
+
pathTemplate: string;
|
|
325
|
+
parts: RequestParts;
|
|
326
|
+
}): RequestParts => {
|
|
327
|
+
if (pathTemplate !== ASSET_UPLOAD_PATH) {
|
|
328
|
+
return parts;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const authorization = parts.headers.Authorization;
|
|
332
|
+
if (!authorization || authorization.startsWith("Bearer ")) {
|
|
333
|
+
return parts;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
return {
|
|
337
|
+
...parts,
|
|
338
|
+
headers: {
|
|
339
|
+
...parts.headers,
|
|
340
|
+
Authorization: `Bearer ${authorization}`,
|
|
341
|
+
},
|
|
342
|
+
};
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
const _API = makeAPI({
|
|
346
|
+
credentials: Credentials as any,
|
|
347
|
+
getBaseUrl: (creds: any) => creds.apiBaseUrl,
|
|
348
|
+
getAuthHeaders: formatHeaders,
|
|
349
|
+
matchError,
|
|
350
|
+
ParseError: CloudflareDecodeError as any,
|
|
351
|
+
transformRequestParts: ({ pathTemplate, parts }) =>
|
|
352
|
+
transformCloudflareRequestParts({ pathTemplate, parts }),
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
const paginatePageByItems: PaginationStrategy = (
|
|
356
|
+
operation,
|
|
357
|
+
input,
|
|
358
|
+
pagination,
|
|
359
|
+
) => {
|
|
360
|
+
const inputToken = pagination.inputToken;
|
|
361
|
+
if (!inputToken) {
|
|
362
|
+
return Stream.die(
|
|
363
|
+
new Error("Cloudflare page pagination requires an inputToken"),
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
type State = { page: number; done: boolean };
|
|
368
|
+
const startPage =
|
|
369
|
+
typeof input[inputToken] === "number" ? (input[inputToken] as number) : 1;
|
|
370
|
+
|
|
371
|
+
return Stream.unfold({ page: startPage, done: false } as State, (state) =>
|
|
372
|
+
Effect.gen(function* () {
|
|
373
|
+
if (state.done) return undefined;
|
|
374
|
+
|
|
375
|
+
const requestPayload = { ...input, [inputToken]: state.page };
|
|
376
|
+
const response = yield* operation(requestPayload);
|
|
377
|
+
const items =
|
|
378
|
+
pagination.items !== undefined
|
|
379
|
+
? (getPath(response, pagination.items) as
|
|
380
|
+
| readonly unknown[]
|
|
381
|
+
| undefined)
|
|
382
|
+
: undefined;
|
|
383
|
+
|
|
384
|
+
return [
|
|
385
|
+
response,
|
|
386
|
+
{
|
|
387
|
+
page: state.page + 1,
|
|
388
|
+
done: (items ?? []).length === 0,
|
|
389
|
+
},
|
|
390
|
+
] as const;
|
|
391
|
+
}),
|
|
392
|
+
);
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
const cloudflarePaginate: PaginationStrategy = (
|
|
396
|
+
operation,
|
|
397
|
+
input,
|
|
398
|
+
pagination,
|
|
399
|
+
) => {
|
|
400
|
+
switch (pagination.mode) {
|
|
401
|
+
case "single":
|
|
402
|
+
return paginateSingle(operation, input, pagination);
|
|
403
|
+
case "page":
|
|
404
|
+
return paginatePageByItems(operation, input, pagination);
|
|
405
|
+
case "cursor":
|
|
406
|
+
return paginateCursor(operation, input, pagination);
|
|
407
|
+
case "token":
|
|
408
|
+
default:
|
|
409
|
+
return paginateWithDefaults(operation, input, pagination);
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
export const make = _API.make;
|
|
414
|
+
export const makePaginated = ((
|
|
415
|
+
configFn: any,
|
|
416
|
+
paginateFn?: PaginationStrategy,
|
|
417
|
+
) =>
|
|
418
|
+
_API.makePaginated(
|
|
419
|
+
configFn,
|
|
420
|
+
paginateFn ?? cloudflarePaginate,
|
|
421
|
+
)) as typeof _API.makePaginated;
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { ConfigError } from "@distilled.cloud/core/errors";
|
|
2
|
+
import * as Config from "effect/Config";
|
|
3
|
+
import * as Data from "effect/Data";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Layer from "effect/Layer";
|
|
6
|
+
import * as Option from "effect/Option";
|
|
7
|
+
import * as Redacted from "effect/Redacted";
|
|
8
|
+
import * as ServiceMap from "effect/ServiceMap";
|
|
9
|
+
|
|
10
|
+
export const DEFAULT_API_BASE_URL = "https://api.cloudflare.com/client/v4";
|
|
11
|
+
|
|
12
|
+
const CREDENTIAL_REFRESH_WINDOW_MS = 5 * 60 * 1000;
|
|
13
|
+
|
|
14
|
+
export interface ApiTokenConfig {
|
|
15
|
+
readonly apiToken: string;
|
|
16
|
+
readonly apiBaseUrl?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ApiKeyConfig {
|
|
20
|
+
readonly apiKey: string;
|
|
21
|
+
readonly email: string;
|
|
22
|
+
readonly apiBaseUrl?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface OAuthConfig {
|
|
26
|
+
readonly accessToken: string;
|
|
27
|
+
readonly refreshToken?: string;
|
|
28
|
+
readonly expiresAt?: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface OAuthProvider<R = never> {
|
|
32
|
+
readonly load: Effect.Effect<OAuthConfig, unknown, R>;
|
|
33
|
+
readonly refresh: (
|
|
34
|
+
credentials: OAuthConfig,
|
|
35
|
+
) => Effect.Effect<OAuthConfig, unknown, R>;
|
|
36
|
+
readonly apiBaseUrl?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ApiTokenCredentials {
|
|
40
|
+
readonly type: "apiToken";
|
|
41
|
+
readonly apiToken: Redacted.Redacted<string>;
|
|
42
|
+
readonly apiBaseUrl: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface ApiKeyCredentials {
|
|
46
|
+
readonly type: "apiKey";
|
|
47
|
+
readonly apiKey: Redacted.Redacted<string>;
|
|
48
|
+
readonly email: string;
|
|
49
|
+
readonly apiBaseUrl: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface OAuthCredentials {
|
|
53
|
+
readonly type: "oauth";
|
|
54
|
+
readonly accessToken: Redacted.Redacted<string>;
|
|
55
|
+
readonly refreshToken: Redacted.Redacted<string> | undefined;
|
|
56
|
+
readonly expiresAt?: number;
|
|
57
|
+
readonly apiBaseUrl: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type ResolvedCredentials =
|
|
61
|
+
| ApiTokenCredentials
|
|
62
|
+
| ApiKeyCredentials
|
|
63
|
+
| OAuthCredentials;
|
|
64
|
+
|
|
65
|
+
export class OAuthRefreshError extends Data.TaggedError(
|
|
66
|
+
"CloudflareOAuthRefreshError",
|
|
67
|
+
)<{
|
|
68
|
+
message: string;
|
|
69
|
+
cause?: unknown;
|
|
70
|
+
}> {}
|
|
71
|
+
|
|
72
|
+
export type CredentialsError = ConfigError | OAuthRefreshError;
|
|
73
|
+
|
|
74
|
+
export class Credentials extends ServiceMap.Service<
|
|
75
|
+
Credentials,
|
|
76
|
+
Effect.Effect<ResolvedCredentials, CredentialsError, any>
|
|
77
|
+
>()("CloudflareCredentials") {}
|
|
78
|
+
|
|
79
|
+
const resolveApiBaseUrl = (apiBaseUrl?: string): string =>
|
|
80
|
+
apiBaseUrl ?? DEFAULT_API_BASE_URL;
|
|
81
|
+
|
|
82
|
+
export const apiTokenCredentials = (
|
|
83
|
+
config: ApiTokenConfig,
|
|
84
|
+
): ApiTokenCredentials => ({
|
|
85
|
+
type: "apiToken",
|
|
86
|
+
apiToken: Redacted.make(config.apiToken),
|
|
87
|
+
apiBaseUrl: resolveApiBaseUrl(config.apiBaseUrl),
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
export const apiKeyCredentials = (config: ApiKeyConfig): ApiKeyCredentials => ({
|
|
91
|
+
type: "apiKey",
|
|
92
|
+
apiKey: Redacted.make(config.apiKey),
|
|
93
|
+
email: config.email,
|
|
94
|
+
apiBaseUrl: resolveApiBaseUrl(config.apiBaseUrl),
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
export const oauthCredentials = (
|
|
98
|
+
config: OAuthConfig,
|
|
99
|
+
apiBaseUrl?: string,
|
|
100
|
+
): OAuthCredentials => ({
|
|
101
|
+
type: "oauth",
|
|
102
|
+
accessToken: Redacted.make(config.accessToken),
|
|
103
|
+
refreshToken: config.refreshToken
|
|
104
|
+
? Redacted.make(config.refreshToken)
|
|
105
|
+
: undefined,
|
|
106
|
+
expiresAt: config.expiresAt,
|
|
107
|
+
apiBaseUrl: resolveApiBaseUrl(apiBaseUrl),
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
const getRefreshAt = (credentials: ResolvedCredentials): number => {
|
|
111
|
+
if (credentials.type !== "oauth" || credentials.expiresAt === undefined) {
|
|
112
|
+
return Number.POSITIVE_INFINITY;
|
|
113
|
+
}
|
|
114
|
+
return credentials.expiresAt <= Date.now() + CREDENTIAL_REFRESH_WINDOW_MS
|
|
115
|
+
? credentials.expiresAt
|
|
116
|
+
: credentials.expiresAt - CREDENTIAL_REFRESH_WINDOW_MS;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const isExpired = (expiresAt?: number): boolean =>
|
|
120
|
+
expiresAt !== undefined &&
|
|
121
|
+
Date.now() >= expiresAt - CREDENTIAL_REFRESH_WINDOW_MS;
|
|
122
|
+
|
|
123
|
+
const createCachedCredentialsEffect = <E, R>(
|
|
124
|
+
resolve: Effect.Effect<ResolvedCredentials, E, R>,
|
|
125
|
+
): Effect.Effect<ResolvedCredentials, E, R> => {
|
|
126
|
+
let cachedCreds: ResolvedCredentials | undefined;
|
|
127
|
+
let refreshAt = 0;
|
|
128
|
+
|
|
129
|
+
return Effect.suspend(() => {
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
if (cachedCreds && now < refreshAt) {
|
|
132
|
+
return Effect.succeed(cachedCreds);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return Effect.map(resolve, (credentials) => {
|
|
136
|
+
cachedCreds = credentials;
|
|
137
|
+
refreshAt = getRefreshAt(credentials);
|
|
138
|
+
return credentials;
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const wrapOAuthError = <A, R>(
|
|
144
|
+
message: string,
|
|
145
|
+
effect: Effect.Effect<A, unknown, R>,
|
|
146
|
+
): Effect.Effect<A, OAuthRefreshError, R> =>
|
|
147
|
+
effect.pipe(
|
|
148
|
+
Effect.mapError(
|
|
149
|
+
(cause) =>
|
|
150
|
+
new OAuthRefreshError({
|
|
151
|
+
message,
|
|
152
|
+
cause,
|
|
153
|
+
}),
|
|
154
|
+
),
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
export const fromApiToken = (
|
|
158
|
+
config: ApiTokenConfig,
|
|
159
|
+
): Layer.Layer<Credentials> =>
|
|
160
|
+
Layer.succeed(Credentials, Effect.succeed(apiTokenCredentials(config)));
|
|
161
|
+
|
|
162
|
+
export const fromApiKey = (config: ApiKeyConfig): Layer.Layer<Credentials> =>
|
|
163
|
+
Layer.succeed(Credentials, Effect.succeed(apiKeyCredentials(config)));
|
|
164
|
+
|
|
165
|
+
export const fromOAuth = <R>(
|
|
166
|
+
provider: OAuthProvider<R>,
|
|
167
|
+
): Layer.Layer<Credentials, never, R> => {
|
|
168
|
+
let currentCredentials: OAuthConfig | undefined;
|
|
169
|
+
|
|
170
|
+
const resolve = Effect.gen(function* () {
|
|
171
|
+
const loadedCredentials =
|
|
172
|
+
currentCredentials ??
|
|
173
|
+
(yield* wrapOAuthError(
|
|
174
|
+
"Failed to load Cloudflare OAuth credentials.",
|
|
175
|
+
provider.load,
|
|
176
|
+
));
|
|
177
|
+
|
|
178
|
+
const credentials = isExpired(loadedCredentials.expiresAt)
|
|
179
|
+
? yield* wrapOAuthError(
|
|
180
|
+
"Failed to refresh Cloudflare OAuth credentials.",
|
|
181
|
+
provider.refresh(loadedCredentials),
|
|
182
|
+
)
|
|
183
|
+
: loadedCredentials;
|
|
184
|
+
|
|
185
|
+
currentCredentials = credentials;
|
|
186
|
+
return oauthCredentials(credentials, provider.apiBaseUrl);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
return Layer.succeed(Credentials, createCachedCredentialsEffect(resolve));
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
const fromConfigError = (message: string) => () =>
|
|
193
|
+
new ConfigError({
|
|
194
|
+
message,
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
const envConfig = Config.all({
|
|
198
|
+
apiToken: Config.option(Config.string("CLOUDFLARE_API_TOKEN")),
|
|
199
|
+
apiKey: Config.option(Config.string("CLOUDFLARE_API_KEY")),
|
|
200
|
+
email: Config.option(Config.string("CLOUDFLARE_EMAIL")),
|
|
201
|
+
apiBaseUrl: Config.string("CLOUDFLARE_API_BASE_URL").pipe(
|
|
202
|
+
Config.withDefault(DEFAULT_API_BASE_URL),
|
|
203
|
+
),
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
export const resolveFromEnv: Effect.Effect<ResolvedCredentials, ConfigError> =
|
|
207
|
+
Effect.gen(function* () {
|
|
208
|
+
const config = yield* envConfig
|
|
209
|
+
.asEffect()
|
|
210
|
+
.pipe(
|
|
211
|
+
Effect.mapError(
|
|
212
|
+
fromConfigError("Failed to load Cloudflare credentials from config"),
|
|
213
|
+
),
|
|
214
|
+
);
|
|
215
|
+
const apiToken = Option.getOrUndefined(config.apiToken);
|
|
216
|
+
const apiKey = Option.getOrUndefined(config.apiKey);
|
|
217
|
+
const email = Option.getOrUndefined(config.email);
|
|
218
|
+
const apiBaseUrl = config.apiBaseUrl;
|
|
219
|
+
|
|
220
|
+
if (apiToken) {
|
|
221
|
+
return apiTokenCredentials({ apiToken, apiBaseUrl });
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (apiKey && email) {
|
|
225
|
+
return apiKeyCredentials({ apiKey, email, apiBaseUrl });
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (apiKey && !email) {
|
|
229
|
+
return yield* new ConfigError({
|
|
230
|
+
message:
|
|
231
|
+
"CLOUDFLARE_EMAIL environment variable is required when using CLOUDFLARE_API_KEY",
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (!apiKey && email) {
|
|
236
|
+
return yield* new ConfigError({
|
|
237
|
+
message:
|
|
238
|
+
"CLOUDFLARE_API_KEY environment variable is required when using CLOUDFLARE_EMAIL",
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return yield* new ConfigError({
|
|
243
|
+
message:
|
|
244
|
+
"Either CLOUDFLARE_API_TOKEN or CLOUDFLARE_API_KEY+CLOUDFLARE_EMAIL environment variables are required",
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
export const fromEnv = (): Layer.Layer<Credentials> =>
|
|
249
|
+
Layer.succeed(Credentials, resolveFromEnv);
|
|
250
|
+
|
|
251
|
+
export const CredentialsFromEnv = fromEnv();
|
|
252
|
+
|
|
253
|
+
export const formatHeaders = (
|
|
254
|
+
credentials: ResolvedCredentials,
|
|
255
|
+
): Record<string, string> => {
|
|
256
|
+
switch (credentials.type) {
|
|
257
|
+
case "apiKey":
|
|
258
|
+
return {
|
|
259
|
+
"X-Auth-Key": Redacted.value(credentials.apiKey),
|
|
260
|
+
"X-Auth-Email": credentials.email,
|
|
261
|
+
};
|
|
262
|
+
case "apiToken":
|
|
263
|
+
return {
|
|
264
|
+
Authorization: `Bearer ${Redacted.value(credentials.apiToken)}`,
|
|
265
|
+
};
|
|
266
|
+
case "oauth":
|
|
267
|
+
return {
|
|
268
|
+
Authorization: `Bearer ${Redacted.value(credentials.accessToken)}`,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
};
|