{"documents":[{"href":"/docs/getting-started/what-these-are","title":"What these are","page":"What these are","section":"Getting started","summary":"A collection of small TypeScript packages that agree with each other, built on what the web platform already provides."},{"href":"/docs/getting-started/what-these-are#what-they-have-in-common","title":"What they have in common","page":"What these are","section":"Getting started"},{"href":"/docs/getting-started/what-these-are#what-they-are-not","title":"What they are not","page":"What these are","section":"Getting started"},{"href":"/docs/getting-started/what-these-are#where-to-go-next","title":"Where to go next","page":"What these are","section":"Getting started"},{"href":"/docs/getting-started/install-and-pin","title":"Install and pin","page":"Install and pin","section":"Getting started","summary":"How a package arrives, what it installs alongside itself, and where the record of a release is kept."},{"href":"/docs/getting-started/install-and-pin#what-a-package-brings-with-it","title":"What a package brings with it","page":"Install and pin","section":"Getting started"},{"href":"/docs/getting-started/install-and-pin#finding-out-what-changed","title":"Finding out what changed","page":"Install and pin","section":"Getting started"},{"href":"/docs/getting-started/your-first-handler","title":"Your first handler","page":"Your first handler","section":"Getting started","summary":"Three packages composed into a request handler that never throws, and what each line of it demonstrates."},{"href":"/docs/getting-started/your-first-handler#what-each-part-is-doing","title":"What each part is doing","page":"Your first handler","section":"Getting started"},{"href":"/docs/getting-started/your-first-handler#running-it","title":"Running it","page":"Your first handler","section":"Getting started"},{"href":"/docs/getting-started/your-first-handler#where-to-go-next","title":"Where to go next","page":"Your first handler","section":"Getting started"},{"href":"/docs/conventions/result-everywhere","title":"Result everywhere","page":"Result everywhere","section":"Conventions","summary":"Every fallible entry point answers with a value instead of throwing, and what that buys you at the call site."},{"href":"/docs/conventions/result-everywhere#working-with-one","title":"Working with one","page":"Result everywhere","section":"Conventions"},{"href":"/docs/conventions/result-everywhere#crossing-the-boundary","title":"Crossing the boundary","page":"Result everywhere","section":"Conventions"},{"href":"/docs/conventions/result-everywhere#errors-carry-position","title":"Errors carry position","page":"Result everywhere","section":"Conventions"},{"href":"/docs/conventions/result-everywhere#what-still-throws","title":"What still throws","page":"Result everywhere","section":"Conventions"},{"href":"/docs/conventions/standard-schema-validation","title":"Standard Schema validation","page":"Standard Schema validation","section":"Conventions","summary":"Where a package needs a schema it accepts any Standard Schema, so the validation library is yours to choose."},{"href":"/docs/conventions/standard-schema-validation#what-that-looks-like","title":"What that looks like","page":"Standard Schema validation","section":"Conventions"},{"href":"/docs/conventions/standard-schema-validation#validating-on-your-own","title":"Validating on your own","page":"Standard Schema validation","section":"Conventions"},{"href":"/docs/conventions/standard-schema-validation#why-it-is-an-interface-rather-than-a-dependency","title":"Why it is an interface rather than a dependency","page":"Standard Schema validation","section":"Conventions"},{"href":"/docs/conventions/subpath-exports","title":"Subpath exports","page":"Subpath exports","section":"Conventions","summary":"A package is split into entry points so importing one concern leaves the others out of your bundle."},{"href":"/docs/conventions/subpath-exports#the-recurring-shapes","title":"The recurring shapes","page":"Subpath exports","section":"Conventions"},{"href":"/docs/conventions/subpath-exports#a-package-with-no-root","title":"A package with no root","page":"Subpath exports","section":"Conventions"},{"href":"/docs/conventions/subpath-exports#why-this-rather-than-more-packages","title":"Why this rather than more packages","page":"Subpath exports","section":"Conventions"},{"href":"/docs/conventions/naming","title":"Naming","page":"Naming","section":"Conventions","summary":"What a package name tells you, and the conventions its exports follow, so the next package reads like the last one."},{"href":"/docs/conventions/naming#package-names","title":"Package names","page":"Naming","section":"Conventions"},{"href":"/docs/conventions/naming#symmetric-pairs","title":"Symmetric pairs","page":"Naming","section":"Conventions"},{"href":"/docs/conventions/naming#prefixes-that-mean-something","title":"Prefixes that mean something","page":"Naming","section":"Conventions"},{"href":"/docs/conventions/naming#types-live-in-a-namespace-beside-the-value","title":"Types live in a namespace beside the value","page":"Naming","section":"Conventions"},{"href":"/docs/conventions/naming#options-are-named-at-the-call-site","title":"Options are named at the call site","page":"Naming","section":"Conventions"},{"href":"/docs/releases/versioning","title":"Versioning","page":"Versioning","section":"Releases","summary":"Releases are dated rather than semantic, the number records when a release went out, and that is why a dependency is written as one exact date."},{"href":"/docs/releases/versioning#the-number-says-when","title":"The number says when","page":"Versioning","section":"Releases"},{"href":"/docs/releases/versioning#depend-on-one-exact-date","title":"Depend on one exact date","page":"Versioning","section":"Releases"},{"href":"/docs/releases/versioning#why-a-range-is-the-wrong-tool","title":"Why a range is the wrong tool","page":"Versioning","section":"Releases"},{"href":"/docs/license","title":"License","page":"License","section":"License","summary":"Every package in the collection is published under the MIT license, on the same terms, and each one carries its own copy of it."},{"href":"/docs/license#what-the-license-grants","title":"What the license grants","page":"License","section":"License"},{"href":"/api/http","title":"@sdxc/http","page":"@sdxc/http","section":"Packages · HTTP & responses","summary":"Response builders, content negotiation, and HTTP caching for the Fetch API"},{"href":"/api/http#installation","title":"Installation","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#usage","title":"Usage","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#answer-with-json","title":"Answer With JSON","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#serve-the-format-a-client-asked-for","title":"Serve The Format A Client Asked For","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#cache-a-page-and-answer-its-revalidations","title":"Cache A Page And Answer Its Revalidations","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#answer-head-like-get","title":"Answer HEAD Like GET","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#api","title":"API","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-content-type","title":"@sdxc/http/content-type","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-status-code","title":"@sdxc/http/status-code","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-response","title":"@sdxc/http/response","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-response-json","title":"@sdxc/http/response/json","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-response-html","title":"@sdxc/http/response/html","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-negotiate","title":"@sdxc/http/negotiate","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-cache","title":"@sdxc/http/cache","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#sdxc-http-middleware-head-requests","title":"@sdxc/http/middleware/head-requests","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#pattern-a-validated-api-endpoint","title":"Pattern: A Validated API Endpoint","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#pattern-a-conditional-write","title":"Pattern: A Conditional Write","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/http#pattern-a-cached-asset-route","title":"Pattern: A Cached Asset Route","page":"@sdxc/http","section":"Packages · HTTP & responses"},{"href":"/api/response","title":"@sdxc/response","page":"@sdxc/response","section":"Packages · HTTP & responses","summary":"Semantic helpers that build Response objects for JSON APIs and redirects"},{"href":"/api/response#installation","title":"Installation","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#usage","title":"Usage","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#answer-with-json","title":"Answer With JSON","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#read-one-back","title":"Read One Back","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#redirect","title":"Redirect","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#discriminate-success-from-failure","title":"Discriminate Success From Failure","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#api","title":"API","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#the-shared-shape","title":"The Shared Shape","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#success-responses","title":"Success Responses","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#redirects","title":"Redirects","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#client-error-responses","title":"Client Error Responses","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#server-error-responses","title":"Server Error Responses","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#pattern-narrowing-the-parsed-body","title":"Pattern: Narrowing The Parsed Body","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#pattern-asserting-on-responses-in-tests","title":"Pattern: Asserting On Responses In Tests","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/response#pattern-post-redirect-get-after-a-form-submission","title":"Pattern: Post-Redirect-Get After A Form Submission","page":"@sdxc/response","section":"Packages · HTTP & responses"},{"href":"/api/api-client","title":"@sdxc/api-client","page":"@sdxc/api-client","section":"Packages · HTTP & responses","summary":"Base class for HTTP API clients: one origin, verb methods, shared hooks"},{"href":"/api/api-client#installation","title":"Installation","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#usage","title":"Usage","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#a-client-for-one-service","title":"A Client For One Service","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#attach-what-every-request-needs","title":"Attach What Every Request Needs","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#inspect-or-replace-a-response","title":"Inspect Or Replace A Response","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#paths-resolve-against-the-base-url","title":"Paths Resolve Against The Base URL","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#api","title":"API","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#new-apiclient-baseurl-url","title":"new APIClient(baseURL: URL)","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#client-fetch-path-string-init-requestinit-promise-response","title":"client.fetch(path: string, init?: RequestInit): Promise<Response>","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#client-get-path-init-client-post-path-init-client-put-path-init-client-patch-path-init-client-delete-path-init","title":"client.get(path, init?), client.post(path, init?), client.put(path, init?), client.patch(path, init?), client.delete(path, init?)","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#protected-before-request-request-promise-request","title":"protected before(request: Request): Promise<Request>","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#protected-after-request-request-response-response-promise-response","title":"protected after(request: Request, response: Response): Promise<Response>","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#protected-propagatetrace-all-traceparent-none","title":"protected propagateTrace: \"all\" | \"traceparent\" | \"none\"","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#protected-baseurl-url","title":"protected baseURL: URL","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#types","title":"Types","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#pattern-methods-that-return-data","title":"Pattern: Methods That Return Data","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#pattern-one-error-policy-for-every-call","title":"Pattern: One Error Policy For Every Call","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/api-client#pattern-stubbing-the-origin-in-tests","title":"Pattern: Stubbing The Origin In Tests","page":"@sdxc/api-client","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip","title":"@sdxc/get-client-ip","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses","summary":"Read the client IP from a Cloudflare Workers request"},{"href":"/api/get-client-ip#installation","title":"Installation","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#usage","title":"Usage","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#read-the-caller-s-address","title":"Read The Caller's Address","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#handle-a-request-without-the-header","title":"Handle A Request Without The Header","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#pair-it-with-cloudflare-s-geolocation","title":"Pair It With Cloudflare's Geolocation","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#api","title":"API","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#getclientip-request-request-string-null","title":"getClientIP(request: Request): string | null","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#pattern-rate-limiting-per-client","title":"Pattern: Rate Limiting Per Client","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/get-client-ip#pattern-attaching-the-address-to-a-log-line","title":"Pattern: Attaching The Address To A Log Line","page":"@sdxc/get-client-ip","section":"Packages · HTTP & responses"},{"href":"/api/user-agent","title":"@sdxc/user-agent","page":"@sdxc/user-agent","section":"Packages · HTTP & responses","summary":"Read a User-Agent string into its browser, engine, operating system and device"},{"href":"/api/user-agent#installation","title":"Installation","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#usage","title":"Usage","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#read-a-request-s-user-agent","title":"Read A Request's User Agent","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#read-it-once-per-request","title":"Read It Once Per Request","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#ask-a-question-of-it","title":"Ask A Question Of It","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#branch-on-the-form-factor","title":"Branch On The Form Factor","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#compare-a-browser-version","title":"Compare A Browser Version","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#switch-over-a-name","title":"Switch Over A Name","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#api","title":"API","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#parse-useragent-string-useragent","title":"parse(userAgent: string): UserAgent","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#useragent-middleware","title":"userAgent(): Middleware","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#currentuseragent","title":"CurrentUserAgent","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#predicates","title":"Predicates","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#types","title":"Types","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#pattern-naming-a-device-a-person-will-recognize","title":"Pattern: Naming A Device A Person Will Recognize","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/user-agent#pattern-serving-a-platform-s-own-download","title":"Pattern: Serving A Platform's Own Download","page":"@sdxc/user-agent","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields","title":"@sdxc/structured-fields","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses","summary":"Parse and serialize RFC 9651 structured HTTP field values"},{"href":"/api/structured-fields#installation","title":"Installation","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#usage","title":"Usage","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#write-a-field","title":"Write A Field","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#read-the-untyped-model","title":"Read The Untyped Model","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#read-a-field-through-a-schema","title":"Read A Field Through A Schema","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#api","title":"API","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#sdxc-structured-fields","title":"@sdxc/structured-fields","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#sdxc-structured-fields-schema","title":"@sdxc/structured-fields/schema","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#pattern-read-rfc-9211-cache-status","title":"Pattern: Read RFC 9211 Cache-Status","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#pattern-an-idempotency-key-item","title":"Pattern: An Idempotency-Key Item","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/structured-fields#pattern-write-only-the-members-you-have","title":"Pattern: Write Only The Members You Have","page":"@sdxc/structured-fields","section":"Packages · HTTP & responses"},{"href":"/api/server-timing","title":"@sdxc/server-timing","page":"@sdxc/server-timing","section":"Packages · HTTP & responses","summary":"Server-Timing measurements collected per request and written to a response header"},{"href":"/api/server-timing#installation","title":"Installation","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#usage","title":"Usage","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#measure-and-report","title":"Measure And Report","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#time-several-operations","title":"Time Several Operations","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#annotate-a-response-on-the-way-out","title":"Annotate A Response On The Way Out","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#api","title":"API","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#new-timingcollector","title":"new TimingCollector()","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#collector-measure-t-name-string-description-string-fn-promise-t-promise-t","title":"collector.measure<T>(name: string, description: string, fn: () => Promise<T>): Promise<T>","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#collector-tostring-string","title":"collector.toString(): string","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#collector-toheaders-headers-headers-headers","title":"collector.toHeaders(headers?: Headers): Headers","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#pattern-timing-a-whole-request","title":"Pattern: Timing A Whole Request","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/server-timing#pattern-measuring-inside-the-code-that-does-the-work","title":"Pattern: Measuring Inside The Code That Does The Work","page":"@sdxc/server-timing","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware","title":"@sdxc/catch-response-middleware","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses","summary":"Router middleware that turns a thrown Response into the request's response"},{"href":"/api/catch-response-middleware#installation","title":"Installation","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#usage","title":"Usage","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#basic-example","title":"Basic Example","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#throwing-from-a-helper","title":"Throwing From A Helper","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#api","title":"API","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#catchresponse-middleware","title":"catchResponse(): Middleware","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/catch-response-middleware#pattern-ordering-against-response-observing-middleware","title":"Pattern: Ordering Against Response-Observing Middleware","page":"@sdxc/catch-response-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware","title":"@sdxc/trailing-slash-middleware","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses","summary":"Router middleware that redirects every path to one canonical trailing-slash form"},{"href":"/api/trailing-slash-middleware#installation","title":"Installation","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#usage","title":"Usage","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#strip-trailing-slashes","title":"Strip Trailing Slashes","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#enforce-a-trailing-slash","title":"Enforce A Trailing Slash","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#the-longhand","title":"The Longhand","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#api","title":"API","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#trailingslash-options-trailingslashoptions-middleware","title":"trailingSlash(options?: TrailingSlashOptions): Middleware","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#trailingslashoptions","title":"TrailingSlashOptions","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/trailing-slash-middleware#pattern-placing-it-first","title":"Pattern: Placing It First","page":"@sdxc/trailing-slash-middleware","section":"Packages · HTTP & responses"},{"href":"/api/well-known","title":"@sdxc/well-known","page":"@sdxc/well-known","section":"Packages · HTTP & responses","summary":"Typed well-known URI documents: security.txt, WebFinger, OIDC metadata, JWKS"},{"href":"/api/well-known#installation","title":"Installation","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#usage","title":"Usage","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#serve-security-txt-and-webfinger-from-a-router","title":"Serve security.txt And WebFinger From A Router","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#publish-openid-connect-discovery-from-an-action","title":"Publish OpenID Connect Discovery From An Action","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#read-a-provider-s-metadata","title":"Read A Provider's Metadata","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#api","title":"API","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known","title":"@sdxc/well-known","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#every-document-subpath","title":"Every Document Subpath","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-security-txt-rfc-9116","title":"@sdxc/well-known/security-txt (RFC 9116)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-webfinger-rfc-7033","title":"@sdxc/well-known/webfinger (RFC 7033)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-oauth-authorization-server-rfc-8414","title":"@sdxc/well-known/oauth-authorization-server (RFC 8414)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-openid-configuration-openid-connect-discovery-1-0","title":"@sdxc/well-known/openid-configuration (OpenID Connect Discovery 1.0)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-oauth-protected-resource-rfc-9728","title":"@sdxc/well-known/oauth-protected-resource (RFC 9728)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-jwks-rfc-7517-5","title":"@sdxc/well-known/jwks (RFC 7517 §5)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-change-password-w3c","title":"@sdxc/well-known/change-password (W3C)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-passkey-endpoints-w3c","title":"@sdxc/well-known/passkey-endpoints (W3C)","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-response","title":"@sdxc/well-known/response","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#sdxc-well-known-middleware","title":"@sdxc/well-known/middleware","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#pattern-metadata-for-an-api-accepting-bearer-tokens","title":"Pattern: Metadata For An API Accepting Bearer Tokens","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#pattern-a-change-password-redirect-beside-documents","title":"Pattern: A Change-Password Redirect Beside Documents","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/well-known#pattern-importing-a-fetched-key-set","title":"Pattern: Importing A Fetched Key Set","page":"@sdxc/well-known","section":"Packages · HTTP & responses"},{"href":"/api/openapi","title":"@sdxc/openapi","page":"@sdxc/openapi","section":"Packages · API design","summary":"Build, serve and check OpenAPI 3.1 documents from typed operations"},{"href":"/api/openapi#installation","title":"Installation","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#usage","title":"Usage","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#declare-an-operation","title":"Declare An Operation","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#parse-a-request-through-it","title":"Parse A Request Through It","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#build-and-serve-the-document","title":"Build And Serve The Document","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#api","title":"API","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#sdxc-openapi","title":"@sdxc/openapi","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#sdxc-openapi-security","title":"@sdxc/openapi/security","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#sdxc-openapi-router","title":"@sdxc/openapi/router","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#sdxc-openapi-testing","title":"@sdxc/openapi/testing","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#pattern-a-drift-test","title":"Pattern: A Drift Test","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#pattern-conformance-across-a-test-suite","title":"Pattern: Conformance Across A Test Suite","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/openapi#pattern-protected-resource-scopes","title":"Pattern: Protected Resource Scopes","page":"@sdxc/openapi","section":"Packages · API design"},{"href":"/api/problem","title":"@sdxc/problem","page":"@sdxc/problem","section":"Packages · API design","summary":"Build, detect and parse RFC 9457 problem details, cataloged per API"},{"href":"/api/problem#installation","title":"Installation","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#usage","title":"Usage","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#answer-with-a-problem","title":"Answer With A Problem","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#declare-a-catalog","title":"Declare A Catalog","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#read-a-problem","title":"Read A Problem","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#report-validation-failures","title":"Report Validation Failures","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#api","title":"API","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#problem-options-init","title":"problem(options, init?)","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#stringify-options","title":"stringify(options)","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#defineproblems-base-entries","title":"defineProblems(base, entries)","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#isproblem-message","title":"isProblem(message)","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#parseproblem-response-options","title":"parseProblem(response, options?)","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#parse-text-options","title":"parse(text, options?)","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#validationproblem-issues-options","title":"validationProblem(issues, options?)","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#issuesfrom-source-code","title":"issuesFrom(source, code?)","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#topointer-path","title":"toPointer(path)","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#issues-schema","title":"ISSUES_SCHEMA","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#problemparseerror","title":"ProblemParseError","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#problem-media-type-about-blank","title":"PROBLEM_MEDIA_TYPE, ABOUT_BLANK","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#types","title":"Types","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/problem#pattern-share-a-catalog-between-a-server-and-its-client","title":"Pattern: Share A Catalog Between A Server And Its Client","page":"@sdxc/problem","section":"Packages · API design"},{"href":"/api/json-schema","title":"@sdxc/json-schema","page":"@sdxc/json-schema","section":"Packages · API design","summary":"Schema builders that validate like remix/data-schema and emit JSON Schema"},{"href":"/api/json-schema#installation","title":"Installation","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#usage","title":"Usage","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#describe-a-request-body","title":"Describe A Request Body","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#name-a-schema","title":"Name A Schema","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#recursive-schemas","title":"Recursive Schemas","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#api","title":"API","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#sdxc-json-schema","title":"@sdxc/json-schema","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#sdxc-json-schema-checks","title":"@sdxc/json-schema/checks","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#sdxc-json-schema-coerce","title":"@sdxc/json-schema/coerce","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#pattern-a-path-parameter-that-documents-its-format","title":"Pattern: A Path Parameter That Documents Its Format","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#pattern-a-query-string-with-coercion","title":"Pattern: A Query String With Coercion","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/json-schema#pattern-hand-a-schema-to-a-standard-json-schema-tool","title":"Pattern: Hand A Schema To A Standard JSON Schema Tool","page":"@sdxc/json-schema","section":"Packages · API design"},{"href":"/api/pagination","title":"@sdxc/pagination","page":"@sdxc/pagination","section":"Packages · API design","summary":"Offset and keyset pagination with parameter parsing and Link headers"},{"href":"/api/pagination#installation","title":"Installation","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#usage","title":"Usage","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#page-arithmetic-on-its-own","title":"Page Arithmetic On Its Own","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#offset-paging-with-a-numbered-pager","title":"Offset Paging, With A Numbered Pager","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#keyset-paging-for-a-long-feed","title":"Keyset Paging, For A Long Feed","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#advertising-a-page-in-the-response","title":"Advertising A Page In The Response","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#api","title":"API","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#new-pagination-init-paginationinit","title":"new Pagination(init: PaginationInit)","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pagination-series-options-pageseriesoptions-pageseries","title":"pagination.series(options?: PageSeriesOptions): PageSeries","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pagination-tojson-paginationjson","title":"pagination.toJSON(): PaginationJSON","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pagination-byoffset-query-options-promise-result-page-t-paginationerror","title":"Pagination.byOffset(query, options): Promise<Result<Page<T>, PaginationError>>","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pagination-bykeyset-query-options-promise-result-keysetpage-t-paginationerror","title":"Pagination.byKeyset(query, options): Promise<Result<KeysetPage<T>, PaginationError>>","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#parsepageparams-searchparams-options-result-pageparams-validationerror","title":"parsePageParams(searchParams, options?): Result<PageParams, ValidationError>","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#createpaging-options-paging","title":"createPaging(options?): Paging","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#paginate-headers-page-options-headers","title":"paginate(headers, page, options): Headers","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#parselinkheader-header-linkvalue","title":"parseLinkHeader(header): LinkValue[]","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#serializelinkheader-links-string-null","title":"serializeLinkHeader(links): string | null","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#encodecursor-direction-columns-values-result-string-unencodablecursorvalueerror","title":"encodeCursor(direction, columns, values): Result<string, UnencodableCursorValueError>","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#decodecursor-cursor-result-decodedcursor-invalidcursorerror","title":"decodeCursor(cursor): Result<DecodedCursor, InvalidCursorError>","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#defaults","title":"Defaults","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#errors","title":"Errors","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#types","title":"Types","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pattern-one-route-both-strategies","title":"Pattern: One Route, Both Strategies","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pattern-rendering-a-pager-from-series","title":"Pattern: Rendering A Pager From series()","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/pagination#pattern-serializing-into-an-envelope","title":"Pattern: Serializing Into An Envelope","page":"@sdxc/pagination","section":"Packages · API design"},{"href":"/api/idempotency","title":"@sdxc/idempotency","page":"@sdxc/idempotency","section":"Packages · API design","summary":"Idempotency-Key requests: replay the first response, refuse conflicting reuse"},{"href":"/api/idempotency#installation","title":"Installation","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#usage","title":"Usage","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#send-a-key","title":"Send A Key","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#protect-a-route","title":"Protect A Route","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#store-records-in-sql","title":"Store Records In SQL","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#api","title":"API","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#sdxc-idempotency","title":"@sdxc/idempotency","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#sdxc-idempotency-middleware","title":"@sdxc/idempotency/middleware","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#sdxc-idempotency-data-table","title":"@sdxc/idempotency/data-table","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#sdxc-idempotency-memory","title":"@sdxc/idempotency/memory","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#sdxc-idempotency-client","title":"@sdxc/idempotency/client","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#pattern-refusals-from-your-problem-catalog","title":"Pattern: Refusals From Your Problem Catalog","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#pattern-a-durable-object-as-the-store","title":"Pattern: A Durable Object As The Store","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/idempotency#pattern-keys-for-retried-jobs","title":"Pattern: Keys For Retried Jobs","page":"@sdxc/idempotency","section":"Packages · API design"},{"href":"/api/merge-patch","title":"@sdxc/merge-patch","page":"@sdxc/merge-patch","section":"Packages · API design","summary":"Apply, diff and read RFC 7396 JSON Merge Patch documents"},{"href":"/api/merge-patch#installation","title":"Installation","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#usage","title":"Usage","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#apply-and-diff","title":"Apply And Diff","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#read-a-patch-request","title":"Read A PATCH Request","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#api","title":"API","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#sdxc-merge-patch","title":"@sdxc/merge-patch","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#sdxc-merge-patch-request","title":"@sdxc/merge-patch/request","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#pattern-compute-a-patch-from-two-snapshots","title":"Pattern: Compute A Patch From Two Snapshots","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#pattern-advertise-the-format-on-options","title":"Pattern: Advertise The Format On OPTIONS","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/merge-patch#pattern-type-the-patches-a-client-sends","title":"Pattern: Type The Patches A Client Sends","page":"@sdxc/merge-patch","section":"Packages · API design"},{"href":"/api/auth","title":"@sdxc/auth","page":"@sdxc/auth","section":"Packages · Identity & security","summary":"OAuth 2.0 and OpenID Connect client for any runtime that speaks Request and Response"},{"href":"/api/auth#installation","title":"Installation","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#usage","title":"Usage","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#reading-the-session","title":"Reading The Session","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#the-four-roles","title":"The Four Roles","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#the-browser-flow-is-three-methods","title":"The Browser Flow Is Three Methods","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#tokens-with-no-person-present","title":"Tokens With No Person Present","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#an-api-that-describes-itself","title":"An API That Describes Itself","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#api","title":"API","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-issuer","title":"@sdxc/auth/issuer","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-relying-party","title":"@sdxc/auth/relying-party","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-service-client","title":"@sdxc/auth/service-client","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-resource-server","title":"@sdxc/auth/resource-server","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-protected-resource","title":"@sdxc/auth/protected-resource","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-bearer-challenge","title":"@sdxc/auth/bearer-challenge","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-management-client","title":"@sdxc/auth/management-client","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-auth-session","title":"@sdxc/auth/auth-session","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-id-token","title":"@sdxc/auth/id-token","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-access-token","title":"@sdxc/auth/access-token","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-auth-error","title":"@sdxc/auth/auth-error","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-remix-context","title":"@sdxc/auth/remix/context","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-remix-schemes","title":"@sdxc/auth/remix/schemes","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#sdxc-auth-remix-authorization","title":"@sdxc/auth/remix/authorization","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#pattern-wiring-a-remix-router","title":"Pattern: Wiring A Remix Router","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#pattern-step-up-authentication","title":"Pattern: Step-Up Authentication","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/auth#pattern-sharing-documents-across-isolates","title":"Pattern: Sharing Documents Across Isolates","page":"@sdxc/auth","section":"Packages · Identity & security"},{"href":"/api/jwt","title":"@sdxc/jwt","page":"@sdxc/jwt","section":"Packages · Identity & security","summary":"JWT payload classes and the keys that sign them"},{"href":"/api/jwt#installation","title":"Installation","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#usage","title":"Usage","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#describing-a-kind-of-token","title":"Describing A Kind Of Token","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#issuing-a-token","title":"Issuing A Token","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#verifying-one","title":"Verifying One","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#api","title":"API","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#jwt","title":"JWT","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#jwk","title":"JWK","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#keystorage","title":"KeyStorage","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#rotation-and-the-order-to-roll-it-out-in","title":"Rotation, And The Order To Roll It Out In","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#pattern-verifying-an-upstream-id-token","title":"Pattern: Verifying An Upstream ID Token","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/jwt#pattern-keys-in-a-database-instead-of-a-bucket","title":"Pattern: Keys In A Database Instead Of A Bucket","page":"@sdxc/jwt","section":"Packages · Identity & security"},{"href":"/api/passkey","title":"@sdxc/passkey","page":"@sdxc/passkey","section":"Packages · Identity & security","summary":"Passkeys end to end: a WebAuthn browser API and a verifying relying party"},{"href":"/api/passkey#installation","title":"Installation","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#usage","title":"Usage","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#register-a-passkey","title":"Register a passkey","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#sign-in-with-a-passkey","title":"Sign in with a passkey","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#offer-passkeys-in-the-sign-in-field","title":"Offer passkeys in the sign-in field","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#api","title":"API","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#sdxc-passkey-client","title":"@sdxc/passkey/client","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#sdxc-passkey-server","title":"@sdxc/passkey/server","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#errors","title":"Errors","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#pattern-a-remix-sign-in-flow","title":"Pattern: a Remix sign-in flow","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#the-routes","title":"The routes","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#the-relying-party","title":"The relying party","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#the-endpoints","title":"The endpoints","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#the-island","title":"The island","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#registering-in-the-same-shape","title":"Registering, in the same shape","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#pattern-keeping-the-challenge-between-the-two-calls","title":"Pattern: keeping the challenge between the two calls","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#pattern-passkeys-as-a-second-factor","title":"Pattern: passkeys as a second factor","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#pattern-telling-the-person-what-happened","title":"Pattern: telling the person what happened","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/passkey#attestation","title":"Attestation","page":"@sdxc/passkey","section":"Packages · Identity & security"},{"href":"/api/saml","title":"@sdxc/saml","page":"@sdxc/saml","section":"Packages · Identity & security","summary":"SAML 2.0 service provider: verify signed assertions, build requests and metadata"},{"href":"/api/saml#installation","title":"Installation","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#the-shape-of-the-api-is-the-security-property","title":"The shape of the API is the security property","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#usage","title":"Usage","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#verify-a-response","title":"Verify A Response","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#start-a-sign-in","title":"Start A Sign-In","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#read-and-write-metadata","title":"Read And Write Metadata","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#track-certificates","title":"Track Certificates","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#api","title":"API","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#verifyresponse-source-options-promise-result-assertion-samlerror","title":"verifyResponse(source, options): Promise<Result<Assertion, SAMLError>>","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#createauthnrequest-options-promise-result-authnrequestresult-samlerror","title":"createAuthnRequest(options): Promise<Result<AuthnRequestResult, SAMLError>>","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#parseidpmetadata-source-promise-result-idpmetadata-samlerror","title":"parseIdPMetadata(source): Promise<Result<IdPMetadata, SAMLError>>","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#buildserviceprovidermetadata-options-result-string-samlerror","title":"buildServiceProviderMetadata(options): Result<string, SAMLError>","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#certificate","title":"Certificate","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#assertion","title":"Assertion","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#replaystore","title":"ReplayStore","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#failures","title":"Failures","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#what-this-refuses-and-why","title":"What this refuses, and why","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#pattern-a-connection-that-rotates-its-certificates","title":"Pattern: A Connection That Rotates Its Certificates","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/saml#pattern-a-replay-store-on-a-table","title":"Pattern: A Replay Store On A Table","page":"@sdxc/saml","section":"Packages · Identity & security"},{"href":"/api/scim","title":"@sdxc/scim","page":"@sdxc/scim","section":"Packages · Identity & security","summary":"SCIM 2.0 resources, filters, PATCH operations and discovery documents"},{"href":"/api/scim#installation","title":"Installation","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#usage","title":"Usage","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#create-a-user","title":"Create A User","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#list-users-with-a-filter","title":"List Users With A Filter","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#patch-a-user","title":"Patch A User","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#serve-discovery","title":"Serve Discovery","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#api","title":"API","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#sdxc-scim","title":"@sdxc/scim","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#sdxc-scim-filter","title":"@sdxc/scim/filter","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#sdxc-scim-data-table","title":"@sdxc/scim/data-table","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#sdxc-scim-patch","title":"@sdxc/scim/patch","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#sdxc-scim-discovery","title":"@sdxc/scim/discovery","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#pattern-push-a-filter-into-sql-fall-back-in-memory","title":"Pattern: Push A Filter Into SQL, Fall Back In Memory","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#pattern-conditional-replace-with-versions","title":"Pattern: Conditional Replace With Versions","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/scim#pattern-one-definition-for-everything","title":"Pattern: One Definition For Everything","page":"@sdxc/scim","section":"Packages · Identity & security"},{"href":"/api/crypto","title":"@sdxc/crypto","page":"@sdxc/crypto","section":"Packages · Identity & security","summary":"Web Crypto primitives — hashing, HMAC, tokens, TOTP, AES-GCM — plus scrypt passwords"},{"href":"/api/crypto#installation","title":"Installation","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#usage","title":"Usage","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#encoding-and-digests","title":"Encoding and digests","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#signing-and-verifying-a-payload","title":"Signing and verifying a payload","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#passwords","title":"Passwords","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#second-factor","title":"Second factor","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#encryption-at-rest","title":"Encryption at rest","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#api","title":"API","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#encoding","title":"Encoding","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#bytes","title":"Bytes","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#hashing-and-hmac","title":"Hashing and HMAC","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#random-values-and-tokens","title":"Random values and tokens","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#password-hashing","title":"Password hashing","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#totp","title":"TOTP","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#symmetric-encryption","title":"Symmetric encryption","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#errors","title":"Errors","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#types","title":"Types","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#pattern-upgrade-on-login","title":"Pattern: upgrade on login","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#pattern-hashed-lookup-sealed-storage","title":"Pattern: hashed lookup, sealed storage","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#pattern-verifying-an-inbound-signature","title":"Pattern: verifying an inbound signature","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/crypto#pattern-enrolling-a-second-factor","title":"Pattern: enrolling a second factor","page":"@sdxc/crypto","section":"Packages · Identity & security"},{"href":"/api/security-headers","title":"@sdxc/security-headers","page":"@sdxc/security-headers","section":"Packages · Identity & security","summary":"Typed CSP, Permissions-Policy and security response headers, with middleware"},{"href":"/api/security-headers#installation","title":"Installation","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#usage","title":"Usage","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#install-the-policy","title":"Install The Policy","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#write-headers-without-the-middleware","title":"Write Headers Without The Middleware","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#read-a-policy-back","title":"Read A Policy Back","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#api","title":"API","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#sdxc-security-headers","title":"@sdxc/security-headers","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#sdxc-security-headers-csp","title":"@sdxc/security-headers/csp","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#sdxc-security-headers-permissions-policy","title":"@sdxc/security-headers/permissions-policy","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#sdxc-security-headers-reports","title":"@sdxc/security-headers/reports","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#sdxc-security-headers-middleware","title":"@sdxc/security-headers/middleware","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-an-inline-script-with-a-nonce","title":"Pattern: An Inline Script With A Nonce","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-the-managed-import-map","title":"Pattern: The Managed Import Map","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-a-route-that-must-be-framed","title":"Pattern: A Route That Must Be Framed","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-report-only-rollout-and-a-report-route","title":"Pattern: Report-Only Rollout And A Report Route","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-asserting-a-policy-in-a-test","title":"Pattern: Asserting A Policy In A Test","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/security-headers#pattern-choosing-sources-that-hold-up","title":"Pattern: Choosing Sources That Hold Up","page":"@sdxc/security-headers","section":"Packages · Identity & security"},{"href":"/api/webhooks","title":"@sdxc/webhooks","page":"@sdxc/webhooks","section":"Packages · Identity & security","summary":"Sign and verify Standard Webhooks deliveries, reporting every failure as a typed value"},{"href":"/api/webhooks#installation","title":"Installation","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#usage","title":"Usage","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#verify-an-inbound-request","title":"Verify An Inbound Request","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#type-the-payload","title":"Type The Payload","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#accept-more-than-one-secret","title":"Accept More Than One Secret","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#sign-an-outbound-delivery","title":"Sign An Outbound Delivery","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#reject-replays","title":"Reject Replays","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#api","title":"API","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#verify-request-options","title":"verify(request, options)","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#sign-payload-options","title":"sign(payload, options)","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#kvreplaystore","title":"KVReplayStore","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#errors","title":"Errors","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#types","title":"Types","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#pattern-a-fail-closed-endpoint","title":"Pattern: A Fail-Closed Endpoint","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#pattern-delivering-and-retrying","title":"Pattern: Delivering And Retrying","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#pattern-reproducible-signatures-in-tests","title":"Pattern: Reproducible Signatures In Tests","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/webhooks#pattern-rotating-a-receiver-s-secret","title":"Pattern: Rotating A Receiver's Secret","page":"@sdxc/webhooks","section":"Packages · Identity & security"},{"href":"/api/captcha","title":"@sdxc/captcha","page":"@sdxc/captcha","section":"Packages · Forms & abuse","summary":"Turnstile, hCaptcha and reCAPTCHA verification, with middleware and widgets"},{"href":"/api/captcha#installation","title":"Installation","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#usage","title":"Usage","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#guard-a-form-route","title":"Guard a form route","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#render-the-widget","title":"Render the widget","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#verify-without-the-middleware","title":"Verify without the middleware","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#switch-providers","title":"Switch providers","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#api","title":"API","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#sdxc-captcha","title":"@sdxc/captcha","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#sdxc-captcha-middleware","title":"@sdxc/captcha/middleware","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#sdxc-captcha-turnstile","title":"@sdxc/captcha/turnstile","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#sdxc-captcha-turnstile-ui","title":"@sdxc/captcha/turnstile/ui","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#sdxc-captcha-hcaptcha","title":"@sdxc/captcha/hcaptcha","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#sdxc-captcha-hcaptcha-ui","title":"@sdxc/captcha/hcaptcha/ui","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#sdxc-captcha-recaptcha","title":"@sdxc/captcha/recaptcha","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#sdxc-captcha-recaptcha-ui","title":"@sdxc/captcha/recaptcha/ui","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#sdxc-captcha-memory","title":"@sdxc/captcha/memory","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#pattern-fail-open-when-the-provider-is-down","title":"Pattern: Fail open when the provider is down","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#pattern-escalate-a-low-recaptcha-v3-score","title":"Pattern: Escalate a low reCAPTCHA v3 score","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#pattern-testing-a-guarded-route","title":"Pattern: Testing a guarded route","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/captcha#pattern-implementing-captcha-for-another-provider","title":"Pattern: Implementing Captcha for another provider","page":"@sdxc/captcha","section":"Packages · Forms & abuse"},{"href":"/api/honeypot","title":"@sdxc/honeypot","page":"@sdxc/honeypot","section":"Packages · Forms & abuse","summary":"Honeypot form fields with a signed timestamp, middleware and a UI component"},{"href":"/api/honeypot#installation","title":"Installation","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#usage","title":"Usage","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#guard-a-form-route","title":"Guard a form route","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#verify-without-the-middleware","title":"Verify without the middleware","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#api","title":"API","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#sdxc-honeypot","title":"@sdxc/honeypot","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#sdxc-honeypot-middleware","title":"@sdxc/honeypot/middleware","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#sdxc-honeypot-ui","title":"@sdxc/honeypot/ui","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#pattern-answer-a-bot-like-a-success","title":"Pattern: Answer a bot like a success","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#pattern-score-what-passes-with-a-spam-filter","title":"Pattern: Score what passes with a spam filter","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/honeypot#pattern-testing-a-guarded-route","title":"Pattern: Testing a guarded route","page":"@sdxc/honeypot","section":"Packages · Forms & abuse"},{"href":"/api/spam","title":"@sdxc/spam","page":"@sdxc/spam","section":"Packages · Forms & abuse","summary":"Spam scoring for user content: local rules, reputation checks and a classifier"},{"href":"/api/spam#installation","title":"Installation","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#usage","title":"Usage","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#score-a-submission","title":"Score a submission","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#give-the-rules-more-to-work-with","title":"Give the rules more to work with","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#add-reputation-and-a-second-opinion","title":"Add reputation and a second opinion","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#learn-from-moderators","title":"Learn from moderators","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#api","title":"API","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam","title":"@sdxc/spam","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-author-email","title":"@sdxc/spam/author-email","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-stop-forum-spam","title":"@sdxc/spam/stop-forum-spam","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-link-blocklist","title":"@sdxc/spam/link-blocklist","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-akismet","title":"@sdxc/spam/akismet","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-bayes","title":"@sdxc/spam/bayes","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-workers-ai","title":"@sdxc/spam/workers-ai","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#sdxc-spam-memory","title":"@sdxc/spam/memory","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-refuse-bots-before-scoring","title":"Pattern: Refuse bots before scoring","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-hold-discard-or-publish","title":"Pattern: Hold, discard or publish","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-writing-a-rule-for-your-site","title":"Pattern: Writing a rule for your site","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-reweighting-a-rule","title":"Pattern: Reweighting a rule","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/spam#pattern-testing-an-action-that-filters","title":"Pattern: Testing an action that filters","page":"@sdxc/spam","section":"Packages · Forms & abuse"},{"href":"/api/password-policy","title":"@sdxc/password-policy","page":"@sdxc/password-policy","section":"Packages · Forms & abuse","summary":"Password checks: length, common and breached passwords, similarity and reuse"},{"href":"/api/password-policy#installation","title":"Installation","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#usage","title":"Usage","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#check-a-new-password","title":"Check a new password","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#add-the-breached-password-lookup","title":"Add the breached-password lookup","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#a-password-only-ever-used-with-a-second-factor","title":"A password only ever used with a second factor","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#run-one-rule-on-its-own","title":"Run one rule on its own","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#api","title":"API","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#entry-points","title":"Entry points","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkpassword-candidate-options","title":"checkPassword(candidate, options?)","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checklength-candidate-options","title":"checkLength(candidate, options?)","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkcommonpassword-candidate-iscommonpassword-candidate","title":"checkCommonPassword(candidate) · isCommonPassword(candidate)","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkidentifiers-candidate-identifiers","title":"checkIdentifiers(candidate, identifiers)","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkdeniedterms-candidate-terms","title":"checkDeniedTerms(candidate, terms)","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkbreachedpassword-candidate-options","title":"checkBreachedPassword(candidate, options?)","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#checkpasswordhistory-candidate-previoushashes-options","title":"checkPasswordHistory(candidate, previousHashes, options?)","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#passwordpolicyerror","title":"PasswordPolicyError","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#defaults","title":"Defaults","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#pattern-mapping-a-refusal-to-a-message","title":"Pattern: Mapping a refusal to a message","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#pattern-failing-open-or-closed-when-the-lookup-is-unavailable","title":"Pattern: Failing open or closed when the lookup is unavailable","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#pattern-checking-then-hashing-what-was-submitted","title":"Pattern: Checking, then hashing what was submitted","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/password-policy#pattern-refusing-a-reused-password-on-change","title":"Pattern: Refusing a reused password on change","page":"@sdxc/password-policy","section":"Packages · Forms & abuse"},{"href":"/api/email-address","title":"@sdxc/email-address","page":"@sdxc/email-address","section":"Packages · Forms & abuse","summary":"Email address parsing, normalization, disposable-domain and mail-server checks"},{"href":"/api/email-address#installation","title":"Installation","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#usage","title":"Usage","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#parse-an-address","title":"Parse An Address","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#refuse-a-disposable-address","title":"Refuse A Disposable Address","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#check-the-domain-receives-mail","title":"Check The Domain Receives Mail","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#suggest-a-fix-for-a-mistyped-provider","title":"Suggest A Fix For A Mistyped Provider","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#api","title":"API","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#sdxc-email-address","title":"@sdxc/email-address","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#sdxc-email-address-disposable","title":"@sdxc/email-address/disposable","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#sdxc-email-address-mail-server","title":"@sdxc/email-address/mail-server","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#sdxc-email-address-role-account","title":"@sdxc/email-address/role-account","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#sdxc-email-address-typo","title":"@sdxc/email-address/typo","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#pattern-validate-a-sign-up-address","title":"Pattern: Validate A Sign-Up Address","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#pattern-store-one-form-index-the-other","title":"Pattern: Store One Form, Index The Other","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/email-address#pattern-cache-mail-server-answers","title":"Pattern: Cache Mail-Server Answers","page":"@sdxc/email-address","section":"Packages · Forms & abuse"},{"href":"/api/markdown","title":"@sdxc/markdown","page":"@sdxc/markdown","section":"Packages · Content & formats","summary":"GitHub Flavored Markdown: parse to a typed AST, transform it, write it back"},{"href":"/api/markdown#installation","title":"Installation","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#usage","title":"Usage","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#parse-a-document","title":"Parse A Document","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#validate-the-frontmatter","title":"Validate The Frontmatter","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#render-it","title":"Render It","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#extract-plain-text","title":"Extract Plain Text","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#write-a-document-back","title":"Write A Document Back","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#api","title":"API","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown","title":"@sdxc/markdown","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-plain","title":"@sdxc/markdown/plain","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-html","title":"@sdxc/markdown/html","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#sdxc-markdown-remix","title":"@sdxc/markdown/remix","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-transform-a-document","title":"Pattern: Transform A Document","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-read-the-tree-without-transforming-it","title":"Pattern: Read The Tree Without Transforming It","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-annotations-and-tags","title":"Pattern: Annotations And Tags","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-variables-resolved-per-render","title":"Pattern: Variables Resolved Per Render","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-github-alerts","title":"Pattern: GitHub Alerts","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/markdown#pattern-lint-content-in-ci","title":"Pattern: Lint Content In CI","page":"@sdxc/markdown","section":"Packages · Content & formats"},{"href":"/api/yaml","title":"@sdxc/yaml","page":"@sdxc/yaml","section":"Packages · Content & formats","summary":"YAML reading and writing over a documented subset, shaped after the built-in JSON object"},{"href":"/api/yaml#installation","title":"Installation","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#usage","title":"Usage","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#read-a-document","title":"Read A Document","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#read-nested-collections","title":"Read Nested Collections","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#write-a-value","title":"Write A Value","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#reach-for-both-under-one-name","title":"Reach For Both Under One Name","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#api","title":"API","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#parse-source-string-result-unknown-yamlparseerror","title":"parse(source: string): Result<unknown, YAMLParseError>","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#stringify-value-unknown-options-stringifyoptions-result-string-yamlstringifyerror","title":"stringify(value: unknown, options?: StringifyOptions): Result<string, YAMLStringifyError>","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#yamlparseerror","title":"YAMLParseError","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#yamlstringifyerror","title":"YAMLStringifyError","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#types","title":"Types","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#the-supported-subset","title":"The Supported Subset","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#pattern-validating-parsed-yaml-with-a-schema","title":"Pattern: Validating Parsed YAML With A Schema","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#pattern-round-tripping-a-document","title":"Pattern: Round-Tripping A Document","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/yaml#pattern-diagnosing-a-bad-file","title":"Pattern: Diagnosing A Bad File","page":"@sdxc/yaml","section":"Packages · Content & formats"},{"href":"/api/xml","title":"@sdxc/xml","page":"@sdxc/xml","section":"Packages · Content & formats","summary":"XML parser and serializer for RSS-style feeds"},{"href":"/api/xml#installation","title":"Installation","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#usage","title":"Usage","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#parse-a-document","title":"Parse A Document","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#traverse-a-document","title":"Traverse A Document","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#write-a-document","title":"Write A Document","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#round-trip-a-document","title":"Round-Trip A Document","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#keep-the-source-s-whitespace","title":"Keep The Source's Whitespace","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#api","title":"API","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-parse-source-string-options-xml-parseoptions-result-xml-xmlparseerror","title":"XML.parse(source: string, options?: XML.ParseOptions): Result<XML, XMLParseError>","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-stringify-input-xml-xml-input-result-string-xmlstringifyerror","title":"XML.stringify(input: XML | XML.Input): Result<string, XMLStringifyError>","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#new-xml-document-xml-document","title":"new XML(document: XML.Document)","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-declaration-xml-declaration-undefined","title":"xml.declaration: XML.Declaration | undefined","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-root-xml-element","title":"xml.root: XML.Element","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-find-predicate-xml-predicate-xml-element-undefined","title":"xml.find(predicate: XML.Predicate): XML.Element | undefined","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-findall-predicate-xml-predicate-xml-element","title":"xml.findAll(predicate: XML.Predicate): XML.Element[]","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-query-path-string-xml-element-undefined","title":"xml.query(path: string): XML.Element | undefined","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-queryall-path-string-xml-element","title":"xml.queryAll(path: string): XML.Element[]","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-tojson-xml-document","title":"xml.toJSON(): XML.Document","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xml-tostring-string","title":"xml.toString(): string","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xmlparseerror","title":"XMLParseError","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#xmlstringifyerror","title":"XMLStringifyError","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#types","title":"Types","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#pattern-reading-a-feed-s-channel","title":"Pattern: Reading A Feed's Channel","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/xml#pattern-preserving-namespaces","title":"Pattern: Preserving Namespaces","page":"@sdxc/xml","section":"Packages · Content & formats"},{"href":"/api/html","title":"@sdxc/html","page":"@sdxc/html","section":"Packages · Content & formats","summary":"Read a served page: fetch or parse HTML, then query it by role and accessible name"},{"href":"/api/html#installation","title":"Installation","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#usage","title":"Usage","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#get-a-page","title":"Get A Page","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#read-the-head","title":"Read The Head","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#address-an-element","title":"Address An Element","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#read-a-form-a-table-and-a-definition-list","title":"Read A Form, A Table And A Definition List","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#narrow-to-a-section","title":"Narrow To A Section","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#choose-among-several-matches","title":"Choose Among Several Matches","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#matching-rules","title":"Matching Rules","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#api","title":"API","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#html-parse-source-string-result-html-htmlparseerror","title":"HTML.parse(source: string): Result<HTML, HTMLParseError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#html-fetch-input-init-promise-result-html-htmlfetcherror-htmlparseerror","title":"HTML.fetch(input, init?): Promise<Result<HTML, HTMLFetchError | HTMLParseError>>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-title","title":"doc.title","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-text","title":"doc.text","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-meta-name-string-result-string-htmlnotfounderror","title":"doc.meta(name: string): Result<string, HTMLNotFoundError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-link-rel-string-result-string-htmlnotfounderror","title":"doc.link(rel: string): Result<string, HTMLNotFoundError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-query-selector-html-selector-result-html-element-htmlqueryerror","title":"doc.query(selector?: HTML.Selector): Result<HTML.Element, HTMLQueryError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-queryall-selector-html-selector-html-element","title":"doc.queryAll(selector?: HTML.Selector): HTML.Element[]","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-field-name-options-result-html-element-htmlqueryerror","title":"doc.field(name, options?): Result<HTML.Element, HTMLQueryError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-cell-selector-html-cellselector-result-html-element-htmlqueryerror","title":"doc.cell(selector: HTML.CellSelector): Result<HTML.Element, HTMLQueryError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#doc-definition-term-options-result-html-element-htmlqueryerror","title":"doc.definition(term, options?): Result<HTML.Element, HTMLQueryError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#html-element","title":"HTML.Element","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#html-sanitize-source-policy-result-string-htmlparseerror","title":"HTML.sanitize(source, policy?): Result<string, HTMLParseError>","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#sdxc-html-document","title":"@sdxc/html/document","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#errors","title":"Errors","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#pattern-naming-the-ambiguity-in-a-failure-report","title":"Pattern: Naming The Ambiguity In A Failure Report","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#pattern-asserting-on-the-page-as-served","title":"Pattern: Asserting On The Page As Served","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#pattern-reading-a-table-from-the-response-body","title":"Pattern: Reading A Table From The Response Body","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/html#pattern-pulling-data-out-of-a-section","title":"Pattern: Pulling Data Out Of A Section","page":"@sdxc/html","section":"Packages · Content & formats"},{"href":"/api/csv","title":"@sdxc/csv","page":"@sdxc/csv","section":"Packages · Content & formats","summary":"Read and write RFC 4180 CSV, with a streaming writer and formula neutralization"},{"href":"/api/csv#installation","title":"Installation","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#usage","title":"Usage","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#write-and-read-back","title":"Write And Read Back","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#read-an-upload","title":"Read An Upload","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#write-for-excel","title":"Write For Excel","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#stream-a-download","title":"Stream A Download","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#api","title":"API","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#parse-source-options","title":"parse(source, options?)","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#stringify-rows-options","title":"stringify(rows, options?)","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#streamify-rows-options","title":"streamify(rows, options)","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#types","title":"Types","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#pattern-type-uploaded-rows","title":"Pattern: Type Uploaded Rows","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#pattern-export-rows-from-a-database-cursor","title":"Pattern: Export Rows From A Database Cursor","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/csv#pattern-read-back-what-was-written","title":"Pattern: Read Back What Was Written","page":"@sdxc/csv","section":"Packages · Content & formats"},{"href":"/api/icalendar","title":"@sdxc/icalendar","page":"@sdxc/icalendar","section":"Packages · Content & formats","summary":"Read and write iCalendar documents, with recurrence rules and time zones"},{"href":"/api/icalendar#installation","title":"Installation","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#usage","title":"Usage","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#write-a-feed","title":"Write A Feed","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#read-a-calendar","title":"Read A Calendar","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#expand-a-recurrence","title":"Expand A Recurrence","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#write-a-zoned-recurring-event","title":"Write A Zoned Recurring Event","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#api","title":"API","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#sdxc-icalendar","title":"@sdxc/icalendar","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#sdxc-icalendar-rrule","title":"@sdxc/icalendar/rrule","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#sdxc-icalendar-timezone","title":"@sdxc/icalendar/timezone","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#sdxc-icalendar-itip","title":"@sdxc/icalendar/itip","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#pattern-invite-update-and-cancel-by-mail","title":"Pattern: Invite, Update And Cancel By Mail","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#pattern-record-an-attendee-s-answer","title":"Pattern: Record An Attendee's Answer","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#pattern-a-maintenance-feed-with-stable-revisions","title":"Pattern: A Maintenance Feed With Stable Revisions","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#pattern-last-day-of-the-month-recurrences","title":"Pattern: \"Last Day Of The Month\" Recurrences","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/icalendar#pattern-is-anything-active-now","title":"Pattern: Is Anything Active Now","page":"@sdxc/icalendar","section":"Packages · Content & formats"},{"href":"/api/distill","title":"@sdxc/distill","page":"@sdxc/distill","section":"Packages · Content & formats","summary":"Extract the article from a web page: bounded fetch, scoring and sanitizing"},{"href":"/api/distill#installation","title":"Installation","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#usage","title":"Usage","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#api","title":"API","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#distill-url-options","title":"distill(url, options)","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#distillfrom-source-url","title":"distillFrom(source, url)","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#addressable-url","title":"addressable(url)","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#sdxc-distill-retrieve","title":"@sdxc/distill/retrieve","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#outcomes","title":"Outcomes","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#the-four-bounds","title":"The four bounds","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#sanitization","title":"Sanitization","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#pattern-caching-what-comes-back","title":"Pattern: Caching What Comes Back","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/distill#pattern-deciding-the-article-was-worth-it","title":"Pattern: Deciding The Article Was Worth It","page":"@sdxc/distill","section":"Packages · Content & formats"},{"href":"/api/jsdoc","title":"@sdxc/jsdoc","page":"@sdxc/jsdoc","section":"Packages · Content & formats","summary":"Read JSDoc out of JavaScript and TypeScript source text into a JSON documentation model"},{"href":"/api/jsdoc#installation","title":"Installation","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#usage","title":"Usage","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#extract-one-module","title":"Extract One Module","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#build-the-document-a-site-reads","title":"Build The Document A Site Reads","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#parse-a-comment-on-its-own","title":"Parse A Comment On Its Own","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#api","title":"API","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#extract-source-string-options-extractoptions-result-docmodule-extracterror","title":"extract(source: string, options?: ExtractOptions): Result<DocModule, ExtractError>","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#parsecomment-raw-string-doccomment","title":"parseComment(raw: string): DocComment","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#findtag-comment-doccomment-null-tag-string-doctag-null","title":"findTag(comment: DocComment | null, tag: string): DocTag | null","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#findtags-comment-doccomment-null-tag-string-doctag","title":"findTags(comment: DocComment | null, tag: string): DocTag[]","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#inlinelinks-text-string-doclink","title":"inlineLinks(text: string): DocLink[]","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#schema-version-number","title":"SCHEMA_VERSION: number","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#extracterror","title":"ExtractError","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#types","title":"Types","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#pattern-resolving-a-barrel","title":"Pattern: Resolving A Barrel","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#pattern-linking-symbols-to-each-other","title":"Pattern: Linking Symbols To Each Other","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/jsdoc#pattern-grouping-a-page-by-kind","title":"Pattern: Grouping A Page By Kind","page":"@sdxc/jsdoc","section":"Packages · Content & formats"},{"href":"/api/rss","title":"@sdxc/rss","page":"@sdxc/rss","section":"Packages · Feeds & publishing","summary":"RSS 2.0 feed builder and parser"},{"href":"/api/rss#installation","title":"Installation","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#usage","title":"Usage","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#build-a-feed","title":"Build A Feed","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#read-a-feed","title":"Read A Feed","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#fetch-a-feed","title":"Fetch A Feed","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#api","title":"API","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#new-rss-channel-rss-channel","title":"new RSS(channel: RSS.Channel)","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-channel","title":"rss.channel","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-items","title":"rss.items","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-additem-item-rss-item","title":"rss.addItem(item: RSS.Item)","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-removeitem-guid-string","title":"rss.removeItem(guid: string)","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-tojson","title":"rss.toJSON()","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-tostring","title":"rss.toString()","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-parse-source-string-rss","title":"RSS.parse(source: string): RSS","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-fromxml-xml-xml-rss","title":"RSS.fromXML(xml: XML): RSS","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#rss-fetch-input-url-requestinfo-init-requestinit-promise-rss","title":"RSS.fetch(input: URL | RequestInfo, init?: RequestInit): Promise<RSS>","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#supported-fields","title":"Supported Fields","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#channel","title":"Channel","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#item","title":"Item","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#namespaced-extensions","title":"Namespaced Extensions","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/rss#notes","title":"Notes","page":"@sdxc/rss","section":"Packages · Feeds & publishing"},{"href":"/api/atom","title":"@sdxc/atom","page":"@sdxc/atom","section":"Packages · Feeds & publishing","summary":"Atom 1.0 feed parser and builder"},{"href":"/api/atom#installation","title":"Installation","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#usage","title":"Usage","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#parse-a-feed","title":"Parse A Feed","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#fetch-a-feed","title":"Fetch A Feed","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#build-a-feed","title":"Build A Feed","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#api","title":"API","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#new-atom-feed-atom-feed","title":"new Atom(feed: Atom.Feed)","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-feed","title":"atom.feed","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-entries","title":"atom.entries","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-addentry-entry-atom-entry","title":"atom.addEntry(entry: Atom.Entry)","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-removeentry-id-string","title":"atom.removeEntry(id: string)","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-tojson","title":"atom.toJSON()","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-tostring","title":"atom.toString()","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-parse-source-string-base-string-result-atom-atomparseerror","title":"Atom.parse(source: string, base?: string): Result<Atom, AtomParseError>","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-fromxml-xml-xml-base-string-result-atom-atomparseerror","title":"Atom.fromXML(xml: XML, base?: string): Result<Atom, AtomParseError>","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#atom-fetch-input-init-promise-result-atom-atomfetcherror-atomparseerror","title":"Atom.fetch(input, init?): Promise<Result<Atom, AtomFetchError | AtomParseError>>","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#errors","title":"Errors","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#reading-the-data","title":"Reading The Data","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#text-constructs","title":"Text Constructs","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#links","title":"Links","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#dates","title":"Dates","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#authors","title":"Authors","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#relative-references","title":"Relative References","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#namespaces","title":"Namespaces","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/atom#notes","title":"Notes","page":"@sdxc/atom","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed","title":"@sdxc/json-feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing","summary":"JSON Feed 1.1 builder and parser"},{"href":"/api/json-feed#installation","title":"Installation","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#usage","title":"Usage","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#build-a-feed","title":"Build A Feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#serve-a-feed","title":"Serve A Feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#read-a-feed","title":"Read A Feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#fetch-a-feed","title":"Fetch A Feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#api","title":"API","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#new-jsonfeed-feed-jsonfeed-feed","title":"new JSONFeed(feed: JSONFeed.Feed)","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-feed","title":"feed.feed","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-items","title":"feed.items","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-version","title":"feed.version","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-additem-item-jsonfeed-item","title":"feed.addItem(item: JSONFeed.Item)","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-removeitem-id-string","title":"feed.removeItem(id: string)","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-tojson","title":"feed.toJSON()","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#feed-tostring","title":"feed.toString()","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#jsonfeed-parse-source-string","title":"JSONFeed.parse(source: string)","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#jsonfeed-fromjson-value-unknown","title":"JSONFeed.fromJSON(value: unknown)","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#jsonfeed-fetch-input-url-requestinfo-init-requestinit","title":"JSONFeed.fetch(input: URL | RequestInfo, init?: RequestInit)","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#jsonfeed-version-value-unknown","title":"JSONFeed.version(value: unknown)","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#jsonfeed-mediatype","title":"JSONFeed.mediaType","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#errors","title":"Errors","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#types","title":"Types","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#pattern-publish-an-extension","title":"Pattern: Publish An Extension","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#pattern-read-a-feed-someone-else-publishes","title":"Pattern: Read A Feed Someone Else Publishes","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/json-feed#notes","title":"Notes","page":"@sdxc/json-feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed","title":"@sdxc/feed","page":"@sdxc/feed","section":"Packages · Feeds & publishing","summary":"One feed API over RSS, Atom and JSON Feed, with conditional fetching and autodiscovery"},{"href":"/api/feed#installation","title":"Installation","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#usage","title":"Usage","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#read-a-feed","title":"Read A Feed","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#poll-a-feed-without-re-downloading-it","title":"Poll A Feed Without Re-downloading It","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#discover-a-feed-from-a-site","title":"Discover A Feed From A Site","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#api","title":"API","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-parse-source-string-options-feed-parseoptions","title":"Feed.parse(source: string, options?: Feed.ParseOptions)","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-fromxml-xml-xml-options-feed-parseoptions","title":"Feed.fromXML(xml: XML, options?: Feed.ParseOptions)","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-fromjson-value-unknown-options-feed-parseoptions","title":"Feed.fromJSON(value: unknown, options?: Feed.ParseOptions)","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-fetch-input-string-url-options-feed-fetchoptions","title":"Feed.fetch(input: string | URL, options?: Feed.FetchOptions)","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-selecthub-header-feed-link-document-feed-link","title":"Feed.selectHub(header?: Feed.Link[], document?: Feed.Link[])","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-selectsubscription-header-feed-link-document-feed-link","title":"Feed.selectSubscription(header?: Feed.Link[], document?: Feed.Link[])","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#feed-discover-input-string-url-options-feed-fetchoptions","title":"Feed.discover(input: string | URL, options?: Feed.FetchOptions)","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#instance-accessors","title":"Instance Accessors","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#errors","title":"Errors","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#types","title":"Types","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#the-normalized-shape","title":"The Normalized Shape","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/feed#notes","title":"Notes","page":"@sdxc/feed","section":"Packages · Feeds & publishing"},{"href":"/api/opml","title":"@sdxc/opml","page":"@sdxc/opml","section":"Packages · Feeds & publishing","summary":"Read and write OPML subscription lists"},{"href":"/api/opml#installation","title":"Installation","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#usage","title":"Usage","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#import-a-subscription-list","title":"Import A Subscription List","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#export-one","title":"Export One","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#api","title":"API","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#parse-source-string-result-opml-outline-opmlparseerror","title":"parse(source: string): Result<OPML.Outline[], OPMLParseError>","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#stringify-outlines-opml-outline-options-opml-stringifyoptions-string","title":"stringify(outlines: OPML.Outline[], options?: OPML.StringifyOptions): string","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#errors","title":"Errors","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#types","title":"Types","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#pattern-round-tripping-a-list","title":"Pattern: Round-Tripping A List","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/opml#notes","title":"Notes","page":"@sdxc/opml","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap","title":"@sdxc/sitemap","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing","summary":"Read and write the sitemap protocol: collect URLs, or fetch a published sitemap"},{"href":"/api/sitemap#installation","title":"Installation","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#usage","title":"Usage","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#build-a-sitemap","title":"Build A Sitemap","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#read-a-published-sitemap","title":"Read A Published Sitemap","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#parse-a-document-you-already-hold","title":"Parse A Document You Already Hold","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#walk-an-index","title":"Walk An Index","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#parsing-rules","title":"Parsing Rules","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#api","title":"API","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#new-sitemap","title":"new Sitemap()","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-append-loc-url-options-sitemap-appendoptions-void","title":"sitemap.append(loc: URL, options?: Sitemap.AppendOptions): void","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-tostring-string","title":"sitemap.toString(): string","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-parse-xml-xml-result-sitemap-sitemapparseerror","title":"Sitemap.parse(xml: XML): Result<Sitemap, SitemapParseError>","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-fetch-input-init-promise-result-sitemap-sitemapfetcherror-sitemapparseerror-xmlparseerror","title":"Sitemap.fetch(input, init?): Promise<Result<Sitemap, SitemapFetchError | SitemapParseError | XMLParseError>>","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-kind-sitemap-kind","title":"sitemap.kind: Sitemap.Kind","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-entries-set-sitemap-entry","title":"sitemap.entries: Set<Sitemap.Entry>","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#sitemap-size-number","title":"sitemap.size: number","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#errors","title":"Errors","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#types","title":"Types","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#pattern-serving-a-sitemap","title":"Pattern: Serving A Sitemap","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#pattern-auditing-a-site-against-its-own-sitemap","title":"Pattern: Auditing A Site Against Its Own Sitemap","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/sitemap#pattern-writing-a-sitemap-index","title":"Pattern: Writing A Sitemap Index","page":"@sdxc/sitemap","section":"Packages · Feeds & publishing"},{"href":"/api/robots","title":"@sdxc/robots","page":"@sdxc/robots","section":"Packages · Feeds & publishing","summary":"Read, write and evaluate robots.txt and robots directives"},{"href":"/api/robots#installation","title":"Installation","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#usage","title":"Usage","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#check-a-url-before-crawling-it","title":"Check a URL before crawling it","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#evaluate-a-file-you-already-hold","title":"Evaluate a file you already hold","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#serve-a-robots-txt","title":"Serve a robots.txt","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#read-a-page-s-own-directives","title":"Read a page's own directives","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#api","title":"API","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#sdxc-robots","title":"@sdxc/robots","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#sdxc-robots-fetch","title":"@sdxc/robots/fetch","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#sdxc-robots-directives","title":"@sdxc/robots/directives","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#pattern-cache-the-outcome-not-the-text","title":"Pattern: Cache The Outcome, Not The Text","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#pattern-a-meta-tag-from-two-booleans","title":"Pattern: A Meta Tag From Two Booleans","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/robots#conformance","title":"Conformance","page":"@sdxc/robots","section":"Packages · Feeds & publishing"},{"href":"/api/microformats","title":"@sdxc/microformats","page":"@sdxc/microformats","section":"Packages · Feeds & publishing","summary":"Parse, read and write microformats2"},{"href":"/api/microformats#installation","title":"Installation","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#usage","title":"Usage","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#parse-a-page","title":"Parse A Page","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#read-an-entry","title":"Read An Entry","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#mark-up-a-template","title":"Mark Up A Template","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#api","title":"API","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#sdxc-microformats","title":"@sdxc/microformats","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#sdxc-microformats-vocabulary","title":"@sdxc/microformats/vocabulary","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#sdxc-microformats-ui","title":"@sdxc/microformats/ui","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#pattern-label-a-webmention-from-one-fetch","title":"Pattern: Label A Webmention From One Fetch","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#pattern-answer-micropub-with-the-same-shape","title":"Pattern: Answer Micropub With The Same Shape","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/microformats#pattern-verify-a-template-with-the-parser","title":"Pattern: Verify A Template With The Parser","page":"@sdxc/microformats","section":"Packages · Feeds & publishing"},{"href":"/api/micropub","title":"@sdxc/micropub","page":"@sdxc/micropub","section":"Packages · Feeds & publishing","summary":"Read Micropub requests into typed operations and build the spec's responses"},{"href":"/api/micropub#installation","title":"Installation","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#usage","title":"Usage","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#handle-a-write","title":"Handle A Write","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#answer-a-query","title":"Answer A Query","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#accept-an-upload","title":"Accept An Upload","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#api","title":"API","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#sdxc-micropub","title":"@sdxc/micropub","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#sdxc-micropub-media","title":"@sdxc/micropub/media","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#pattern-keep-files-and-urls-together","title":"Pattern: Keep Files And URLs Together","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/micropub#pattern-read-a-post-back-in-the-shape-a-create-sends","title":"Pattern: Read A Post Back In The Shape A Create Sends","page":"@sdxc/micropub","section":"Packages · Feeds & publishing"},{"href":"/api/webmention","title":"@sdxc/webmention","page":"@sdxc/webmention","section":"Packages · Feeds & publishing","summary":"Receive, verify, discover and send Webmentions"},{"href":"/api/webmention#installation","title":"Installation","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#usage","title":"Usage","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#receive","title":"Receive","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#verify-in-the-background","title":"Verify In The Background","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#send","title":"Send","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#advertise","title":"Advertise","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#api","title":"API","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#sdxc-webmention","title":"@sdxc/webmention","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#sdxc-webmention-receiver","title":"@sdxc/webmention/receiver","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#sdxc-webmention-discover","title":"@sdxc/webmention/discover","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#sdxc-webmention-sender","title":"@sdxc/webmention/sender","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#pattern-delete-a-post","title":"Pattern: Delete A Post","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/webmention#pattern-retry-or-acknowledge","title":"Pattern: Retry Or Acknowledge","page":"@sdxc/webmention","section":"Packages · Feeds & publishing"},{"href":"/api/websub","title":"@sdxc/websub","page":"@sdxc/websub","section":"Packages · Feeds & publishing","summary":"WebSub subscriber and publisher: subscribe, verify intent and signatures, notify hubs"},{"href":"/api/websub#installation","title":"Installation","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#usage","title":"Usage","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#subscribe-to-a-topic","title":"Subscribe To A Topic","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#answer-the-hub-at-the-callback","title":"Answer The Hub At The Callback","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#advertise-a-hub-and-ping-it","title":"Advertise A Hub And Ping It","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#api","title":"API","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#sdxc-websub","title":"@sdxc/websub","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#sdxc-websub-subscriber","title":"@sdxc/websub/subscriber","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#sdxc-websub-publisher","title":"@sdxc/websub/publisher","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#pattern-a-callback-route","title":"Pattern: A Callback Route","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/websub#pattern-ping-after-purging","title":"Pattern: Ping After Purging","page":"@sdxc/websub","section":"Packages · Feeds & publishing"},{"href":"/api/cache","title":"@sdxc/cache","page":"@sdxc/cache","section":"Packages · Data & storage","summary":"Cache contract with adapters for memory and Cloudflare KV"},{"href":"/api/cache#installation","title":"Installation","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#usage","title":"Usage","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#nothing-throws","title":"Nothing throws","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#api","title":"API","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#cache","title":"Cache","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#cacheerror","title":"CacheError","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#memorycache","title":"MemoryCache","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#workerkvcache","title":"WorkerKVCache","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#conformance-options","title":"conformance(options)","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#pattern-keying-by-prefix","title":"Pattern: keying by prefix","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/cache#pattern-a-cache-in-a-test","title":"Pattern: a cache in a test","page":"@sdxc/cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache","title":"@sdxc/workers-cache","page":"@sdxc/workers-cache","section":"Packages · Data & storage","summary":"Cache tags, purging and cache-status reads for Cloudflare Workers Cache"},{"href":"/api/workers-cache#installation","title":"Installation","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#usage","title":"Usage","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#declare-a-tag-vocabulary","title":"Declare A Tag Vocabulary","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#tag-a-response","title":"Tag A Response","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#invalidate-by-tag","title":"Invalidate By Tag","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#declare-caching-from-a-request-handler","title":"Declare Caching From A Request Handler","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#api","title":"API","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#createtags-vocabulary","title":"createTags(vocabulary)","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#cachetag-tags-readonly-cachetag-string","title":"cacheTag(tags: readonly CacheTag[]): string","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#purge-cache-cacheinterface-options-purgeoptions-promise-result-void-purgeerror","title":"purge(cache: CacheInterface, options: PurgeOptions): Promise<Result<void, PurgeError>>","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#cachestatus-response-response-cachestatus","title":"cacheStatus(response: Response): CacheStatus","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#cachehops-response-response-cachehop","title":"cacheHops(response: Response): CacheHop[]","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#createrecordingcache-options-recordingcacheoptions-recordingcache","title":"createRecordingCache(options?: RecordingCacheOptions): RecordingCache","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#constants","title":"Constants","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#errors","title":"Errors","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#types","title":"Types","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#cache-options-workerscachemiddlewareoptions-middleware","title":"cache(options: WorkersCacheMiddlewareOptions): Middleware","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#pattern-named-policies-in-one-module","title":"Pattern: Named Policies In One Module","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#pattern-a-group-tag-from-a-middleware","title":"Pattern: A Group Tag From A Middleware","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/workers-cache#pattern-testing-a-cached-route","title":"Pattern: Testing A Cached Route","page":"@sdxc/workers-cache","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv","title":"@sdxc/session-storage-kv","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage","summary":"A remix/session SessionStorage backed by a Cloudflare Workers KV store"},{"href":"/api/session-storage-kv#installation","title":"Installation","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#usage","title":"Usage","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#create-the-storage","title":"Create The Storage","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#wire-it-into-a-router","title":"Wire It Into A Router","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#choose-a-key-prefix-and-a-lifetime","title":"Choose A Key Prefix And A Lifetime","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#type-the-session-data","title":"Type The Session Data","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#api","title":"API","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#new-kvsessionstorage-values-flash-kv-kvstore-options-kvsessionstorage-options","title":"new KVSessionStorage<Values, Flash>(kv: KVStore, options?: KVSessionStorage.Options)","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#storage-read-cookie-string-null-promise-session","title":"storage.read(cookie: string | null): Promise<Session>","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#storage-save-session-session-promise-string-null","title":"storage.save(session: Session): Promise<string | null>","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#kvsessionstorage-options","title":"KVSessionStorage.Options","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#kvsessionstorage-data","title":"KVSessionStorage.Data","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#kvstore","title":"KVStore","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#pattern-sign-in-and-sign-out","title":"Pattern: Sign In And Sign Out","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/session-storage-kv#pattern-testing-without-a-kv-binding","title":"Pattern: Testing Without A KV Binding","page":"@sdxc/session-storage-kv","section":"Packages · Data & storage"},{"href":"/api/data-table-d1","title":"@sdxc/data-table-d1","page":"@sdxc/data-table-d1","section":"Packages · Data & storage","summary":"A remix/data-table DatabaseDriver backed by Cloudflare D1"},{"href":"/api/data-table-d1#installation","title":"Installation","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#usage","title":"Usage","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#query-a-table","title":"Query A Table","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#run-a-raw-statement","title":"Run A Raw Statement","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#observe-what-each-statement-costs","title":"Observe What Each Statement Costs","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#api","title":"API","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#created1databaseadapter-db-d1database-options-databasedriver","title":"createD1DatabaseAdapter(db: D1Database, options?): DatabaseDriver","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#d1statementobserver","title":"D1StatementObserver","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#d1statementobservation","title":"D1StatementObservation","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#transactions","title":"Transactions","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#schema-and-unsupported-operations","title":"Schema And Unsupported Operations","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#pattern-making-a-multi-row-write-atomic","title":"Pattern: Making A Multi-Row Write Atomic","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#pattern-attributing-rows-read-and-written-per-query","title":"Pattern: Attributing Rows Read And Written Per Query","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#pattern-reusing-the-driver-across-requests","title":"Pattern: Reusing The Driver Across Requests","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-d1#pattern-handing-the-driver-to-a-host-agnostic-library","title":"Pattern: Handing The Driver To A Host-Agnostic Library","page":"@sdxc/data-table-d1","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage","title":"@sdxc/data-table-sqlstorage","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage","summary":"A remix/data-table database driver backed by a Cloudflare Durable Object's SQL storage"},{"href":"/api/data-table-sqlstorage#installation","title":"Installation","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#usage","title":"Usage","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#build-a-driver-from-a-durable-object-s-sql-handle","title":"Build A Driver From A Durable Object's SQL Handle","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#read-and-write-through-models","title":"Read And Write Through Models","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#atomicity-without-a-transaction-scope","title":"Atomicity Without A Transaction Scope","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#run-raw-sql","title":"Run Raw SQL","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#api","title":"API","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#createsqlstoragedatabaseadapter-db-sqlstorage-options-databasedriver","title":"createSQLStorageDatabaseAdapter(db: SqlStorage, options?): DatabaseDriver","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#pattern-running-migrations-when-a-durable-object-boots","title":"Pattern: Running Migrations When A Durable Object Boots","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#where-a-script-is-cut","title":"Where A Script Is Cut","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/data-table-sqlstorage#pattern-hosting-a-storage-agnostic-library-inside-a-durable-object","title":"Pattern: Hosting A Storage-Agnostic Library Inside A Durable Object","page":"@sdxc/data-table-sqlstorage","section":"Packages · Data & storage"},{"href":"/api/icons","title":"@sdxc/icons","page":"@sdxc/icons","section":"Packages · Interface","summary":"Lucide icons as remix/ui components, one tree-shakeable export per icon"},{"href":"/api/icons#installation","title":"Installation","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#usage","title":"Usage","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#render-an-icon","title":"Render An Icon","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#size-color-and-stroke","title":"Size, Color And Stroke","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#name-an-icon-for-assistive-technology","title":"Name An Icon For Assistive Technology","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#render-an-icon-chosen-at-runtime","title":"Render An Icon Chosen At Runtime","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#api","title":"API","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#pascalcasename-icon","title":"<PascalCaseName>Icon","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#icon","title":"Icon","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#iconexportnames","title":"iconExportNames","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#createlucideicon-iconname-string-iconnode-iconnode-component","title":"createLucideIcon(iconName: string, iconNode: IconNode): Component","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#types","title":"Types","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#pattern-building-an-icon-picker","title":"Pattern: Building An Icon Picker","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#pattern-keeping-icons-out-of-the-client-bundle","title":"Pattern: Keeping Icons Out Of The Client Bundle","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/icons#pattern-adding-an-icon-lucide-doesn-t-ship","title":"Pattern: Adding An Icon Lucide Doesn't Ship","page":"@sdxc/icons","section":"Packages · Interface"},{"href":"/api/i18n","title":"@sdxc/i18n","page":"@sdxc/i18n","section":"Packages · Interface","summary":"Language detection and MessageFormat 2 translators for Remix routers and remix/ui"},{"href":"/api/i18n#installation","title":"Installation","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#messages","title":"Messages","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#usage","title":"Usage","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#translating","title":"Translating","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#per-request-translation-in-a-router","title":"Per-request translation in a router","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#standalone-detection","title":"Standalone detection","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#translating-without-a-request","title":"Translating without a request","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#rendering-with-remix-ui","title":"Rendering with remix/ui","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#messages-with-markup","title":"Messages with markup","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#hydrated-islands","title":"Hydrated islands","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#api","title":"API","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#createi18n-options-i18noptions-resources-fallback-i18n-resources-fallback","title":"createI18n(options: I18nOptions<Resources, Fallback>): I18n<Resources[Fallback]>","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#i18n-r","title":"I18n<R>","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#i18n-options-i18nmiddlewareoptions-middleware","title":"i18n(options: I18nMiddlewareOptions): Middleware","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#languagedetector","title":"LanguageDetector","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#getclientlocales-requestorheaders-request-headers-string-undefined","title":"getClientLocales(requestOrHeaders: Request | Headers): string | undefined","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#createtranslator-options-translatoroptions-translator","title":"createTranslator(options: TranslatorOptions): Translator","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#intlprovider","title":"IntlProvider","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#setintl-intl-i18n-void","title":"setIntl(intl: I18n): void","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#intl-handle-handle-unknown-any-i18n","title":"intl(handle: Handle<unknown, any>): I18n","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#trans","title":"Trans","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#types","title":"Types","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#pattern-reusing-the-session-from-the-session-middleware","title":"Pattern: Reusing the session from the session middleware","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#pattern-letting-the-user-pick-a-language","title":"Pattern: Letting the user pick a language","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/i18n#pattern-locale-from-the-url-pathname","title":"Pattern: Locale from the URL pathname","page":"@sdxc/i18n","section":"Packages · Interface"},{"href":"/api/messageformat","title":"@sdxc/messageformat","page":"@sdxc/messageformat","section":"Packages · Interface","summary":"Unicode MessageFormat 2 parser and formatter shaped like Intl.MessageFormat"},{"href":"/api/messageformat#installation","title":"Installation","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#usage","title":"Usage","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#format-a-message","title":"Format A Message","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#choose-a-variant","title":"Choose A Variant","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#render-markup","title":"Render Markup","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#handle-errors","title":"Handle Errors","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#check-a-message-without-throwing","title":"Check A Message Without Throwing","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#api","title":"API","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#new-messageformat-locales-source-options","title":"new MessageFormat(locales, source, options?)","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#format-values-onerror","title":"format(values?, onError?)","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#formattoparts-values-onerror","title":"formatToParts(values?, onError?)","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#resolvedoptions","title":"resolvedOptions()","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#parse-source","title":"parse(source)","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#messageerror","title":"MessageError","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#default-functions","title":"Default Functions","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#types","title":"Types","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#pattern-a-custom-function","title":"Pattern: A Custom Function","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/messageformat#pattern-folding-markup-into-elements","title":"Pattern: Folding Markup Into Elements","page":"@sdxc/messageformat","section":"Packages · Interface"},{"href":"/api/seo","title":"@sdxc/seo","page":"@sdxc/seo","section":"Packages · Interface","summary":"Canonical URLs, typed schema.org structured data and head metadata"},{"href":"/api/seo#installation","title":"Installation","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#usage","title":"Usage","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#configure-once","title":"Configure Once","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#canonical-and-absolute-urls","title":"Canonical And Absolute URLs","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#structured-data","title":"Structured Data","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#head-elements","title":"Head Elements","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#api","title":"API","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#createseo-config-seoconfig-seoservice","title":"createSeo(config: SeoConfig): SeoService","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-canonical-url-string-url-string","title":"seo.canonical(url: string | URL): string","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-absolute-path-string-url-string","title":"seo.absolute(path: string | URL): string","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-robotstag-options-robotsoptions-string","title":"seo.robotsTag(options?: RobotsOptions): string","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-jsonldstring-schema-schemaorg-node-schemaorg-node-string","title":"seo.jsonLdString(schema: SchemaOrg.Node | SchemaOrg.Node[]): string","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-baseurl-string","title":"seo.baseUrl: string","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-site-seosite","title":"seo.site: SeoSite","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-schema-seoschema","title":"seo.schema: SeoSchema","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo","title":"Seo","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-meta","title":"Seo.Meta","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#seo-jsonld","title":"Seo.JsonLd","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#types","title":"Types","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#pattern-one-instance-per-site","title":"Pattern: One Instance Per Site","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#pattern-a-document-layout-that-takes-metadata-as-input","title":"Pattern: A Document Layout That Takes Metadata As Input","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#pattern-serializing-outside-remix-ui","title":"Pattern: Serializing Outside remix/ui","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/seo#pattern-keeping-a-page-out-of-the-index","title":"Pattern: Keeping A Page Out Of The Index","page":"@sdxc/seo","section":"Packages · Interface"},{"href":"/api/highlight","title":"@sdxc/highlight","page":"@sdxc/highlight","section":"Packages · Interface","summary":"Syntax highlighting as tokens, with a markdown walk visitor and a stylesheet"},{"href":"/api/highlight#installation","title":"Installation","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#usage","title":"Usage","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#tokenize-source","title":"Tokenize Source","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#render-tokens","title":"Render Tokens","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#render-markup","title":"Render Markup","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#paint-a-parsed-document","title":"Paint A Parsed Document","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#api","title":"API","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#tokenize-code-string-language-string-token","title":"tokenize(code: string, language: string): Token[]","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#highlight-code-string-language-string-string","title":"highlight(code: string, language: string): string","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#normalizelanguage-language-string-string","title":"normalizeLanguage(language: string): string","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#languages-record-string-grammar","title":"languages: Record<string, Grammar>","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#scan-code-string-grammar-grammar-token","title":"scan(code: string, grammar: Grammar): Token[]","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#compose-parts-array-record-string-rule-grammar","title":"compose(...parts: Array<Record<string, Rule[]>>): Grammar","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#highlight-from-sdxc-highlight-markdown","title":"highlight (from @sdxc/highlight/markdown)","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#sdxc-highlight-styles-css","title":"@sdxc/highlight/styles.css","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#types","title":"Types","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#pattern-painting-tokens-without-a-stylesheet","title":"Pattern: Painting Tokens Without A Stylesheet","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#pattern-theming-the-stylesheet","title":"Pattern: Theming The Stylesheet","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/highlight#pattern-writing-a-grammar","title":"Pattern: Writing A Grammar","page":"@sdxc/highlight","section":"Packages · Interface"},{"href":"/api/lazy-route","title":"@sdxc/lazy-route","page":"@sdxc/lazy-route","section":"Packages · Interface","summary":"Maps a route to a module imported on the first request that reaches it"},{"href":"/api/lazy-route#installation","title":"Installation","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#usage","title":"Usage","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#basic-example","title":"Basic Example","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#actions-and-controllers","title":"Actions And Controllers","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#middleware-the-module-declares","title":"Middleware The Module Declares","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#guards-the-router-owns","title":"Guards The Router Owns","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#loading-a-named-export","title":"Loading A Named Export","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#api","title":"API","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#lazy-load-middleware","title":"lazy(load, middleware?)","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#what-moves-to-the-first-request","title":"What Moves To The First Request","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#pattern-deciding-what-to-defer","title":"Pattern: Deciding What To Defer","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#pattern-keeping-a-group-s-guard-in-one-place","title":"Pattern: Keeping A Group's Guard In One Place","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/lazy-route#pattern-a-route-map-assembled-from-several-modules","title":"Pattern: A Route Map Assembled From Several Modules","page":"@sdxc/lazy-route","section":"Packages · Interface"},{"href":"/api/jobs","title":"@sdxc/jobs","page":"@sdxc/jobs","section":"Packages · Operations","summary":"Declared background jobs dispatched over a pluggable queue backend"},{"href":"/api/jobs#installation","title":"Installation","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#overview","title":"Overview","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#usage","title":"Usage","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#declaring-the-map","title":"Declaring the map","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#writing-a-handler","title":"Writing a handler","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#wiring-the-worker","title":"Wiring the worker","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#enqueuing-a-job","title":"Enqueuing a job","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#what-gets-logged","title":"What gets logged","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#traces","title":"Traces","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#api","title":"API","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#jobs-tree-jobtree-jobmap","title":"jobs(tree: JobTree): JobMap","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#job-options-joboptions-jobleaf","title":"job(options?: JobOptions): JobLeaf","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#messagebody-job-jobdefinition-input-jsonvalue","title":"messageBody(job: JobDefinition, input?): JSONValue","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#createjobhandler-job-jobdefinition-handler-jobhandlerfunction-jobhandler","title":"createJobHandler(job: JobDefinition, handler: JobHandlerFunction): JobHandler","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#createjobdispatcher-options-jobdispatcheroptions-jobdispatcher","title":"createJobDispatcher(options?: JobDispatcherOptions): JobDispatcher","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#jobcontext","title":"JobContext","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#endings","title":"Endings","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#types","title":"Types","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#createuptimereporter-options","title":"createUptimeReporter(options)","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-middleware-that-provides-a-database","title":"Pattern: Middleware That Provides A Database","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-one-body-of-work-several-schedules","title":"Pattern: One Body Of Work, Several Schedules","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-cooperative-cancellation","title":"Pattern: Cooperative Cancellation","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-a-job-that-enqueues-other-jobs","title":"Pattern: A Job That Enqueues Other Jobs","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#pattern-testing-a-handler","title":"Pattern: Testing A Handler","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#related-packages","title":"Related Packages","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/jobs#tips","title":"Tips","page":"@sdxc/jobs","section":"Packages · Operations"},{"href":"/api/cron","title":"@sdxc/cron","page":"@sdxc/cron","section":"Packages · Operations","summary":"Cron schedules with zone-aware occurrences and descriptors"},{"href":"/api/cron#installation","title":"Installation","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#overview","title":"Overview","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#usage","title":"Usage","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#validating-input","title":"Validating input","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#computing-occurrences","title":"Computing occurrences","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#describing-a-schedule","title":"Describing a schedule","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#asking-whether-a-run-is-late","title":"Asking whether a run is late","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#api","title":"API","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-parse-expression-string-result-schedule-invalidcronexpression","title":"Schedule.parse(expression: string): Result<Schedule, InvalidCronExpression>","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-next-options-date-date","title":"schedule.next(options): Date | Date[]","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-prev-options-date","title":"schedule.prev(options): Date","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-matches-date-date-options-boolean","title":"schedule.matches(date: Date, options): boolean","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-describe-scheduledescriptor","title":"schedule.describe(): ScheduleDescriptor","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-tostring-string","title":"schedule.toString(): string","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-expectedby-lastrun-date-options-date","title":"schedule.expectedBy(lastRun: Date, options): Date","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#schedule-isdue-lastrun-date-options-boolean","title":"schedule.isDue(lastRun: Date, options): boolean","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#invalidcronexpression","title":"InvalidCronExpression","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#types","title":"Types","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#supported-syntax","title":"Supported syntax","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#the-day-of-month-and-day-of-week-rule","title":"The day-of-month and day-of-week rule","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#daylight-saving-time","title":"Daylight saving time","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#differences-from-cron-parser","title":"Differences from cron-parser","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#how-the-suite-is-built","title":"How the suite is built","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#pattern-validating-a-submitted-expression","title":"Pattern: Validating a submitted expression","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#pattern-translating-a-descriptor","title":"Pattern: Translating a descriptor","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#pattern-a-dead-man-s-switch","title":"Pattern: A dead man's switch","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#pattern-counting-runs-in-a-window","title":"Pattern: Counting runs in a window","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#related-packages","title":"Related Packages","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/cron#tips","title":"Tips","page":"@sdxc/cron","section":"Packages · Operations"},{"href":"/api/logger","title":"@sdxc/logger","page":"@sdxc/logger","section":"Packages · Operations","summary":"One wide event per Worker invocation, attached at the router and the job dispatcher"},{"href":"/api/logger#installation","title":"Installation","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#usage","title":"Usage","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#configure-once-attach-at-the-router","title":"Configure once, attach at the router","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#any-other-entry-point","title":"Any other entry point","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#from-anywhere-inside-the-invocation","title":"From anywhere inside the invocation","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#api","title":"API","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#createlogger-options-logger-options-logger","title":"createLogger(options: Logger.Options): Logger","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#logger","title":"Logger","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#log","title":"Log","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#currentlog-log-undefined","title":"currentLog(): Log | undefined","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#log-logger-logger-from-sdxc-logger-middleware","title":"log(logger?: Logger) — from @sdxc/logger/middleware","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#currentlog-from-sdxc-logger-middleware","title":"CurrentLog — from @sdxc/logger/middleware","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#types","title":"Types","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#pattern-shared-namespaces-from-middleware","title":"Pattern: Shared Namespaces From Middleware","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/logger#pattern-turning-sampling-on-for-one-kind","title":"Pattern: Turning Sampling On For One Kind","page":"@sdxc/logger","section":"Packages · Operations"},{"href":"/api/trace-context","title":"@sdxc/trace-context","page":"@sdxc/trace-context","section":"Packages · Operations","summary":"W3C Trace Context, carried from each invocation to its jobs and requests"},{"href":"/api/trace-context#installation","title":"Installation","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#usage","title":"Usage","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#give-every-request-a-trace","title":"Give Every Request A Trace","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#propagate-by-hand","title":"Propagate By Hand","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#read-and-write-the-headers","title":"Read And Write The Headers","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#api","title":"API","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#sdxc-trace-context","title":"@sdxc/trace-context","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#sdxc-trace-context-traceparent","title":"@sdxc/trace-context/traceparent","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#sdxc-trace-context-tracestate","title":"@sdxc/trace-context/tracestate","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#sdxc-trace-context-middleware","title":"@sdxc/trace-context/middleware","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#pattern-join-a-callee-reached-over-rpc","title":"Pattern: Join A Callee Reached Over RPC","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/trace-context#pattern-refuse-caller-chosen-traces-on-a-public-endpoint","title":"Pattern: Refuse Caller-Chosen Traces On A Public Endpoint","page":"@sdxc/trace-context","section":"Packages · Operations"},{"href":"/api/rate-limit","title":"@sdxc/rate-limit","page":"@sdxc/rate-limit","section":"Packages · Operations","summary":"Adapter-based rate limiting with standard response headers"},{"href":"/api/rate-limit#installation","title":"Installation","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#usage","title":"Usage","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#counting-an-attempt","title":"Counting An Attempt","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#limiting-routes","title":"Limiting Routes","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#api","title":"API","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#adapter","title":"Adapter","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#ratelimitdecision","title":"RateLimitDecision","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#adapters","title":"Adapters","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#ratelimitheaders-decision-window-string-string","title":"rateLimitHeaders(decision, window): [string, string][]","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#applyratelimitheaders-response-decision-window-response","title":"applyRateLimitHeaders(response, decision, window): Response","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#toomanyrequests-decision-window-body-init-response","title":"tooManyRequests(decision, window, body?, init?): Response","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#ratelimiterror","title":"RateLimitError","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#ratelimiterbinding-and-ratelimitkvnamespace","title":"RateLimiterBinding and RateLimitKVNamespace","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#ratelimit-options-middleware","title":"rateLimit(options): Middleware","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#failurepolicy","title":"FailurePolicy","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#option-types","title":"Option Types","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#pattern-one-registration-per-protected-surface","title":"Pattern: One Registration Per Protected Surface","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/rate-limit#pattern-failing-closed-on-a-surface-that-must-not-leak","title":"Pattern: Failing Closed On A Surface That Must Not Leak","page":"@sdxc/rate-limit","section":"Packages · Operations"},{"href":"/api/flags","title":"@sdxc/flags","page":"@sdxc/flags","section":"Packages · Operations","summary":"Feature flag evaluation implementing the OpenFeature specification"},{"href":"/api/flags#installation","title":"Installation","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#usage","title":"Usage","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#evaluating-a-flag","title":"Evaluating a flag","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#declaring-a-catalog","title":"Declaring a catalog","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#installing-into-a-fetch-router","title":"Installing into a fetch router","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#installing-into-a-job-dispatcher","title":"Installing into a job dispatcher","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#api","title":"API","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#sdxc-flags","title":"@sdxc/flags","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#sdxc-flags-client","title":"@sdxc/flags/client","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#sdxc-flags-catalog","title":"@sdxc/flags/catalog","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#sdxc-flags-provider","title":"@sdxc/flags/provider","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#sdxc-flags-provider-noop","title":"@sdxc/flags/provider/noop","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#sdxc-flags-provider-memory","title":"@sdxc/flags/provider/memory","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#sdxc-flags-conformance","title":"@sdxc/flags/conformance","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#sdxc-flags-middleware","title":"@sdxc/flags/middleware","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#sdxc-flags-middleware-router","title":"@sdxc/flags/middleware/router","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#sdxc-flags-middleware-dispatcher","title":"@sdxc/flags/middleware/dispatcher","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#pattern-a-provider-against-a-real-service","title":"Pattern: A provider against a real service","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#pattern-pinning-a-flag-in-a-test","title":"Pattern: Pinning a flag in a test","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#pattern-per-call-context-for-a-job-s-subject","title":"Pattern: Per-call context for a job's subject","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#pattern-redacting-context-before-a-third-party-provider","title":"Pattern: Redacting context before a third-party provider","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags#pattern-reading-evaluations-off-the-wide-event","title":"Pattern: Reading evaluations off the wide event","page":"@sdxc/flags","section":"Packages · Operations"},{"href":"/api/flags-engine","title":"@sdxc/flags-engine","page":"@sdxc/flags-engine","section":"Packages · Operations","summary":"Flag evaluation engine: typed targeting rules, percentage splits and pluggable stores"},{"href":"/api/flags-engine#installation","title":"Installation","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#usage","title":"Usage","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#resolving-against-a-set-in-memory","title":"Resolving against a set in memory","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#targeting-a-rule","title":"Targeting a rule","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#rolling-out-to-a-percentage","title":"Rolling out to a percentage","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#serving-flags-through-sdxc-flags","title":"Serving flags through @sdxc/flags","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#api","title":"API","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#flagset-and-flagdefinition","title":"FlagSet and FlagDefinition","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#segmentset","title":"SegmentSet","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#targetingrule-and-condition","title":"TargetingRule and Condition","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#semvercomparison","title":"SemVerComparison","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#split","title":"Split","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#reasons","title":"Reasons","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#evaluate-snapshot-key-defaultvalue-context","title":"evaluate(snapshot, key, defaultValue, context?)","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#evaluateall-snapshot-context","title":"evaluateAll(snapshot, context?)","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#parseflagset-stored","title":"parseFlagSet(stored)","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#createengine-options","title":"createEngine(options)","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#engine","title":"Engine","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#snapshot-types","title":"Snapshot types","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#schemas","title":"Schemas","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#flagstore-and-storedflagset","title":"FlagStore and StoredFlagSet","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#flagstoreerror","title":"FlagStoreError","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#inmemoryflagstore","title":"InMemoryFlagStore","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#workerkvflagstore","title":"WorkerKVFlagStore","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#conformance-options","title":"conformance(options)","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#engineprovider","title":"EngineProvider","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#pattern-reloading-on-a-schedule-you-own","title":"Pattern: Reloading on a schedule you own","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#pattern-logging-the-definitions-that-were-refused","title":"Pattern: Logging the definitions that were refused","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#pattern-a-store-of-your-own","title":"Pattern: A store of your own","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/flags-engine#pattern-previewing-a-rule-before-it-ships","title":"Pattern: Previewing a rule before it ships","page":"@sdxc/flags-engine","section":"Packages · Operations"},{"href":"/api/billing","title":"@sdxc/billing","page":"@sdxc/billing","section":"Packages · Operations","summary":"Vendor-neutral billing providers and a webhook endpoint that verifies deliveries"},{"href":"/api/billing#installation","title":"Installation","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#usage","title":"Usage","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#construct-a-provider","title":"Construct A Provider","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#open-a-hosted-checkout","title":"Open A Hosted Checkout","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#bill-through-the-router-middleware","title":"Bill Through The Router Middleware","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#test-without-a-platform","title":"Test Without A Platform","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#api","title":"API","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#billing","title":"Billing","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#the-resource-groups","title":"The resource groups","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#billingerror","title":"BillingError","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#supports-billing-billing-capability-optionalcapability-boolean","title":"supports(billing: Billing, capability: OptionalCapability): boolean","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#minorunitdigits-currency-currency-number","title":"minorUnitDigits(currency: Currency): number","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#default-page-size","title":"DEFAULT_PAGE_SIZE","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#billingwebhook","title":"BillingWebhook","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#webhookstore-and-memorywebhookstore","title":"WebhookStore and MemoryWebhookStore","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#sdxc-billing-middleware","title":"@sdxc/billing/middleware","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#sdxc-billing-providers-polar","title":"@sdxc/billing/providers/polar","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#sdxc-billing-providers-stripe","title":"@sdxc/billing/providers/stripe","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#sdxc-billing-providers-mercado-pago","title":"@sdxc/billing/providers/mercado-pago","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#sdxc-billing-providers-memory","title":"@sdxc/billing/providers/memory","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#sdxc-billing-conformance","title":"@sdxc/billing/conformance","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#types","title":"Types","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-syncing-entitlements-from-webhooks","title":"Pattern: Syncing Entitlements From Webhooks","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-gating-a-route-on-an-entitlement","title":"Pattern: Gating A Route On An Entitlement","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-reporting-usage-from-a-scheduled-job","title":"Pattern: Reporting Usage From A Scheduled Job","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-walking-a-list-to-the-end","title":"Pattern: Walking A List To The End","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-testing-a-billing-flow","title":"Pattern: Testing A Billing Flow","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/billing#pattern-writing-a-provider","title":"Pattern: Writing A Provider","page":"@sdxc/billing","section":"Packages · Operations"},{"href":"/api/mail","title":"@sdxc/mail","page":"@sdxc/mail","section":"Packages · Operations","summary":"Transport-agnostic transactional email with pluggable transports and remix/ui rendering"},{"href":"/api/mail#installation","title":"Installation","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#usage","title":"Usage","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#send-a-message","title":"Send A Message","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#author-an-email-as-a-class","title":"Author An Email As A Class","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#publish-a-mailer-on-the-request-context","title":"Publish A Mailer On The Request Context","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#test-without-mocking-a-provider","title":"Test Without Mocking A Provider","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#api","title":"API","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#new-mailer-options-maileroptions","title":"new Mailer(options: MailerOptions)","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#mailer-send-input-overrides-promise-result-sentmessage-mailerror","title":"mailer.send(input, overrides?): Promise<Result<SentMessage, MailError>>","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#mailer-later-input-overrides-void","title":"mailer.later(input, overrides?): void","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#mailer-flush-promise-result-sentmessage-mailerror","title":"mailer.flush(): Promise<Result<SentMessage, MailError>[]>","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#mailer-pending-number","title":"mailer.pending: number","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#render-element-remixelement-promise-renderedemail","title":"render(element: RemixElement): Promise<RenderedEmail>","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#buildmimemessage-message-normalizedmessage-string","title":"buildMimeMessage(message: NormalizedMessage): string","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#isemail-value-message-email-value-is-email","title":"isEmail(value: Message | Email): value is Email","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#formataddress-address-address-string","title":"formatAddress(address: Address): string","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#toaddresslist-value-address-address-undefined-address","title":"toAddressList(value: Address | Address[] | undefined): Address[]","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#htmltotext-html-string-string","title":"htmlToText(html: string): string","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#mailerror","title":"MailError","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#email-layout-kit","title":"Email (layout kit)","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#types","title":"Types","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-markdown","title":"@sdxc/mail/markdown","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-memory","title":"@sdxc/mail/memory","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-cloudflare","title":"@sdxc/mail/cloudflare","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-middleware","title":"@sdxc/mail/middleware","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#sdxc-mail-unsubscribe","title":"@sdxc/mail/unsubscribe","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#bulk-mail","title":"Bulk Mail","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#calendar-invitations","title":"Calendar Invitations","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#mime-guarantees","title":"MIME Guarantees","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#dark-mode","title":"Dark Mode","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#pattern-deciding-between-send-and-later","title":"Pattern: Deciding Between send() And later()","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#pattern-translating-a-subject-for-the-recipient","title":"Pattern: Translating A Subject For The Recipient","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#pattern-rendering-markdown-as-a-body","title":"Pattern: Rendering Markdown As A Body","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/mail#pattern-switching-providers","title":"Pattern: Switching Providers","page":"@sdxc/mail","section":"Packages · Operations"},{"href":"/api/hostname","title":"@sdxc/hostname","page":"@sdxc/hostname","section":"Packages · Operations","summary":"Cloudflare for SaaS custom-hostname client: register, poll and delete customer domains"},{"href":"/api/hostname#installation","title":"Installation","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#usage","title":"Usage","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#register-a-customer-domain","title":"Register A Customer Domain","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#poll-until-it-goes-live","title":"Poll Until It Goes Live","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#find-and-remove-a-domain","title":"Find And Remove A Domain","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#handle-a-failed-call","title":"Handle A Failed Call","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#api","title":"API","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#new-hostnameclient-options-hostnameclientoptions","title":"new HostnameClient(options: HostnameClientOptions)","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-create-hostname-string-entityid-string-region-string-promise-hostnameresult","title":"client.create(hostname: string, entityId: string, region?: string): Promise<HostnameResult>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-status-id-string-promise-hostnameresult","title":"client.status(id: string): Promise<HostnameResult>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-getbyname-hostname-string-promise-hostnameresult-null","title":"client.getByName(hostname: string): Promise<HostnameResult | null>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-listbyentity-entityid-string-promise-hostnameresult","title":"client.listByEntity(entityId: string): Promise<HostnameResult[]>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-delete-id-string-promise-void","title":"client.delete(id: string): Promise<void>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-refresh-id-string-promise-hostnameresult","title":"client.refresh(id: string): Promise<HostnameResult>","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#client-createdefaultsubdomain-slug-string-string","title":"client.createDefaultSubdomain(slug: string): string","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#hostnameclient-isactive-result-hostnameresult-boolean","title":"HostnameClient.isActive(result: HostnameResult): boolean","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#hostnameclient-ispendingvalidation-result-hostnameresult-boolean","title":"HostnameClient.isPendingValidation(result: HostnameResult): boolean","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#hostnameclient-getvalidationtxtrecord-result-hostnameresult-name-string-value-string-null","title":"HostnameClient.getValidationTxtRecord(result: HostnameResult): { name: string; value: string } | null","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#hostnameclient-getstatusmessage-result-hostnameresult-string","title":"HostnameClient.getStatusMessage(result: HostnameResult): string","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#hostnameapierror","title":"HostnameApiError","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#types","title":"Types","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#pattern-walking-a-customer-through-setup","title":"Pattern: Walking A Customer Through Setup","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#pattern-mirroring-hostnames-in-your-own-database","title":"Pattern: Mirroring Hostnames In Your Own Database","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/hostname#pattern-one-client-per-zone","title":"Pattern: One Client Per Zone","page":"@sdxc/hostname","section":"Packages · Operations"},{"href":"/api/doh","title":"@sdxc/doh","page":"@sdxc/doh","section":"Packages · Operations","summary":"Typed DNS over HTTPS lookups"},{"href":"/api/doh#installation","title":"Installation","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#usage","title":"Usage","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#look-up-records","title":"Look Up Records","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#check-domain-ownership","title":"Check Domain Ownership","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#read-record-data-from-anywhere","title":"Read Record Data From Anywhere","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#api","title":"API","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#sdxc-doh","title":"@sdxc/doh","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#pattern-tell-a-vanished-name-from-a-failing-resolver","title":"Pattern: Tell A Vanished Name From A Failing Resolver","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#pattern-cache-through-the-answer-s-ttl","title":"Pattern: Cache Through The Answer's TTL","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/doh#pattern-confirm-a-servfail-with-a-second-resolver","title":"Pattern: Confirm A SERVFAIL With A Second Resolver","page":"@sdxc/doh","section":"Packages · Operations"},{"href":"/api/mcp","title":"@sdxc/mcp","page":"@sdxc/mcp","section":"Packages · Operations","summary":"Model Context Protocol servers as remix/router actions over Streamable HTTP"},{"href":"/api/mcp#installation","title":"Installation","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#usage","title":"Usage","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#declare-a-tool","title":"Declare A Tool","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#handle-it","title":"Handle It","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#group-tools-under-one-controller","title":"Group Tools Under One Controller","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#declare-a-resource","title":"Declare A Resource","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#resource-uris","title":"Resource URIs","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#argument-handling","title":"Argument Handling","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#where-each-kind-of-failure-is-reported","title":"Where Each Kind Of Failure Is Reported","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#api","title":"API","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#createhandler-options-handleroptions-mcphandler","title":"createHandler(options: HandlerOptions): McpHandler","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#mcp-tools-map-tool-tool-action-actionorhandler-void","title":"mcp.tools.map(tool: Tool, action: ActionOrHandler): void","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#mcp-tools-map-group-toolgroup-controller-controller-void","title":"mcp.tools.map(group: ToolGroup, controller: Controller): void","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#mcp-resources-map-resource-resource-action-resourceaction-void","title":"mcp.resources.map(resource: Resource, action: ResourceAction): void","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#mcp-fetch-input-request-requestcontext-promise-response","title":"mcp.fetch(input: Request | RequestContext): Promise<Response>","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#tool-name-string-definition-tooldefinition-tool","title":"tool(name: string, definition: ToolDefinition): Tool","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#tools-group-toolgroup-toolgroup","title":"tools(group: ToolGroup): ToolGroup","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#walk-group-toolgroup-generator-tool","title":"walk(group: ToolGroup): Generator<Tool>","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#createtool-tool-tool-action-actionorhandler-actionorhandler","title":"createTool(tool: Tool, action: ActionOrHandler): ActionOrHandler","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#createtoolcontroller-group-toolgroup-controller-controller-controller","title":"createToolController(group: ToolGroup, controller: Controller): Controller","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#resource-pattern-string-declaration-resourcedeclaration-resource","title":"resource(pattern: string, declaration: ResourceDeclaration): Resource","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#resource-href-args-string","title":"resource.href(...args): string","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#resources-group-resourcegroup-resourcegroup","title":"resources(group: ResourceGroup): ResourceGroup","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#walkresources-group-resourcegroup-generator-resource","title":"walkResources(group: ResourceGroup): Generator<Resource>","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#createresource-resource-resource-action-resourceaction-resourceaction","title":"createResource(resource: Resource, action: ResourceAction): ResourceAction","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#validatearguments-schema-objectschema-value-unknown-result-record-string-unknown-invalidargumentserror","title":"validateArguments(schema: ObjectSchema, value: unknown): Result<Record<string, unknown>, InvalidArgumentsError>","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#contextfor-input-request-requestcontext-requestcontext","title":"contextFor(input: Request | RequestContext): RequestContext","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#errors","title":"Errors","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#protocol-constants","title":"Protocol Constants","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#context-keys","title":"Context Keys","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#types","title":"Types","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#pattern-mounting-on-any-host","title":"Pattern: Mounting On Any Host","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#pattern-hiding-a-tool-from-a-caller","title":"Pattern: Hiding A Tool From A Caller","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#pattern-metering-a-tool-call","title":"Pattern: Metering A Tool Call","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/mcp#pattern-enriching-the-request-log","title":"Pattern: Enriching The Request Log","page":"@sdxc/mcp","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing","title":"@sdxc/cloudflare-pricing","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations","summary":"Cloudflare Developer Platform list prices, one module per service"},{"href":"/api/cloudflare-pricing#installation","title":"Installation","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#usage","title":"Usage","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#price-a-measured-quantity","title":"Price A Measured Quantity","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#price-a-day-of-storage","title":"Price A Day Of Storage","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#read-what-a-plan-includes","title":"Read What A Plan Includes","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#api","title":"API","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#sdxc-cloudflare-pricing","title":"@sdxc/cloudflare-pricing","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#service-modules","title":"Service Modules","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#pattern-a-rate-card-for-a-cost-ledger","title":"Pattern: A Rate Card For A Cost Ledger","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/cloudflare-pricing#pattern-estimating-a-monthly-bill","title":"Pattern: Estimating A Monthly Bill","page":"@sdxc/cloudflare-pricing","section":"Packages · Operations"},{"href":"/api/result","title":"@sdxc/result","page":"@sdxc/result","section":"Packages · Language & values","summary":"Result type for error handling"},{"href":"/api/result#installation","title":"Installation","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#usage","title":"Usage","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#return-a-result","title":"Return a Result","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#handle-both-cases-at-once","title":"Handle both cases at once","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#wrap-code-that-throws","title":"Wrap code that throws","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#retry-a-failing-operation","title":"Retry a failing operation","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#split-a-batch-of-results","title":"Split a batch of Results","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#api","title":"API","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#types","title":"Types","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#functions","title":"Functions","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#classes","title":"Classes","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#pattern-railway-oriented-programming","title":"Pattern: Railway-oriented programming","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#pattern-custom-error-types","title":"Pattern: Custom error types","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/result#pattern-early-returns","title":"Pattern: Early returns","page":"@sdxc/result","section":"Packages · Language & values"},{"href":"/api/types","title":"@sdxc/types","page":"@sdxc/types","section":"Packages · Language & values","summary":"Shared TypeScript types"},{"href":"/api/types#installation","title":"Installation","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#usage","title":"Usage","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#extract-the-resolved-type-of-an-async-function","title":"Extract the resolved type of an async function","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#type-component-props-from-a-data-function","title":"Type component props from a data function","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#constrain-an-argument-to-valid-json","title":"Constrain an argument to valid JSON","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#constrain-an-argument-to-what-json-can-write","title":"Constrain an argument to what JSON can write","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#api","title":"API","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#resolvedtype-t","title":"ResolvedType<T>","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#jsonprimitive","title":"JSONPrimitive","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#jsonvalue","title":"JSONValue","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#jsonserializable","title":"JSONSerializable","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#jsonserialized-t","title":"JSONSerialized<T>","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#isany-t","title":"IsAny<T>","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#pattern-typing-deferred-data","title":"Pattern: Typing deferred data","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#pattern-a-json-safe-boundary","title":"Pattern: A JSON-safe boundary","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/types#pattern-typing-array-items-from-query-results","title":"Pattern: Typing array items from query results","page":"@sdxc/types","section":"Packages · Language & values"},{"href":"/api/dates","title":"@sdxc/dates","page":"@sdxc/dates","section":"Packages · Language & values","summary":"Zone-aware date operations with Intl-only formatting"},{"href":"/api/dates#installation","title":"Installation","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#usage","title":"Usage","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#formatting-for-a-reader","title":"Formatting For A Reader","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#calendar-operations","title":"Calendar Operations","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#instant-arithmetic","title":"Instant Arithmetic","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#a-day-grid","title":"A Day Grid","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#api","title":"API","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#formatting","title":"Formatting","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#zoned-operations","title":"Zoned Operations","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#instant-arithmetic-1","title":"Instant Arithmetic","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#day-grids","title":"Day Grids","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#day-keys","title":"Day Keys","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#zone-math","title":"Zone Math","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#types","title":"Types","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-one-zone-per-request","title":"Pattern: One Zone Per Request","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-aggregating-by-day","title":"Pattern: Aggregating By Day","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-querying-one-day-s-rows","title":"Pattern: Querying One Day's Rows","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/dates#pattern-a-layout-intl-will-not-produce","title":"Pattern: A Layout Intl Will Not Produce","page":"@sdxc/dates","section":"Packages · Language & values"},{"href":"/api/duration","title":"@sdxc/duration","page":"@sdxc/duration","section":"Packages · Language & values","summary":"Typed duration strings converted to milliseconds or seconds"},{"href":"/api/duration#installation","title":"Installation","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#usage","title":"Usage","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#basic-example","title":"Basic Example","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#accepting-a-duration-in-your-own-api","title":"Accepting A Duration In Your Own API","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#parsing-text-that-arrives-at-runtime","title":"Parsing Text That Arrives At Runtime","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#api","title":"API","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#toms-input-durationinput-number","title":"toMs(input: DurationInput): number","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#toseconds-input-durationinput-number","title":"toSeconds(input: DurationInput): number","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#parse-text-string-result-number-invaliddurationerror","title":"parse(text: string): Result<number, InvalidDurationError>","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#invaliddurationerror","title":"InvalidDurationError","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#types","title":"Types","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#accepted-forms","title":"Accepted Forms","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#pattern-one-unit-per-boundary","title":"Pattern: One Unit Per Boundary","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#pattern-validating-configuration-once-at-startup","title":"Pattern: Validating Configuration Once At Startup","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/duration#pattern-strings-in-code-numbers-in-storage","title":"Pattern: Strings In Code, Numbers In Storage","page":"@sdxc/duration","section":"Packages · Language & values"},{"href":"/api/strings","title":"@sdxc/strings","page":"@sdxc/strings","section":"Packages · Language & values","summary":"English inflection, Chicago title case, slugs and grapheme-safe text"},{"href":"/api/strings#installation","title":"Installation","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#usage","title":"Usage","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#inflection","title":"Inflection","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#titles-slugs-and-excerpts","title":"Titles, Slugs And Excerpts","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#grapheme-safe-measurement","title":"Grapheme-Safe Measurement","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#a-product-s-own-vocabulary","title":"A Product's Own Vocabulary","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#api","title":"API","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pluralize-word-string-count-number-string","title":"pluralize(word: string, count?: number): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#singularize-word-string-string","title":"singularize(word: string): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#camelize-value-string-options-camelizeoptions-string","title":"camelize(value: string, options?: CamelizeOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#underscore-value-string-string","title":"underscore(value: string): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#dasherize-value-string-string","title":"dasherize(value: string): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#humanize-value-string-options-humanizeoptions-string","title":"humanize(value: string, options?: HumanizeOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#ordinalize-value-number-string","title":"ordinalize(value: number): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#createinflector-options-inflectoroptions-inflector","title":"createInflector(options?: InflectorOptions): Inflector","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#titleize-value-string-options-titleizeoptions-string","title":"titleize(value: string, options?: TitleizeOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#createtitleizer-options-titleizeoptions-titleizer","title":"createTitleizer(options?: TitleizeOptions): Titleizer","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#slugify-value-string-options-slugifyoptions-string","title":"slugify(value: string, options?: SlugifyOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#truncate-text-string-options-truncateoptions-string","title":"truncate(text: string, options: TruncateOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#excerpt-text-string-options-excerptoptions-string","title":"excerpt(text: string, options: ExcerptOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#wordcount-text-string-options-localeoptions-number","title":"wordCount(text: string, options?: LocaleOptions): number","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#initials-name-string-options-initialsoptions-string","title":"initials(name: string, options?: InitialsOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#capitalize-value-string-options-localeoptions-string","title":"capitalize(value: string, options?: LocaleOptions): string","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#types","title":"Types","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pattern-deriving-a-stable-identifier","title":"Pattern: Deriving A Stable Identifier","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pattern-one-slug-implementation-two-call-sites","title":"Pattern: One Slug Implementation, Two Call Sites","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pattern-an-excerpt-from-a-markdown-body","title":"Pattern: An Excerpt From A Markdown Body","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/strings#pattern-a-product-s-published-vocabulary","title":"Pattern: A Product's Published Vocabulary","page":"@sdxc/strings","section":"Packages · Language & values"},{"href":"/api/semver","title":"@sdxc/semver","page":"@sdxc/semver","section":"Packages · Language & values","summary":"SemVer 2.0.0 parsing, precedence ordering and range-free version comparisons"},{"href":"/api/semver#installation","title":"Installation","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#usage","title":"Usage","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#comparing-two-versions","title":"Comparing Two Versions","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#sorting-a-list-of-versions","title":"Sorting A List Of Versions","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#reading-a-version-s-elements","title":"Reading A Version's Elements","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#api","title":"API","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#parse-text-string-result-semver-invalidsemvererror","title":"parse(text: string): Result<SemVer, InvalidSemVerError>","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#compare-a-string-b-string-number","title":"compare(a: string, b: string): number","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#satisfies-value-string-comparison-semvercomparison-against-string-boolean","title":"satisfies(value: string, comparison: SemVerComparison, against: string): boolean","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#invalidsemvererror","title":"InvalidSemVerError","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#types","title":"Types","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#precedence-rules","title":"Precedence Rules","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#pattern-gating-a-feature-on-a-client-version","title":"Pattern: Gating A Feature On A Client Version","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#pattern-picking-the-newest-published-version","title":"Pattern: Picking The Newest Published Version","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/semver#pattern-deciding-whether-an-upgrade-is-breaking","title":"Pattern: Deciding Whether An Upgrade Is Breaking","page":"@sdxc/semver","section":"Packages · Language & values"},{"href":"/api/location","title":"@sdxc/location","page":"@sdxc/location","section":"Packages · Language & values","summary":"URL-like Location class for URL paths without an origin"},{"href":"/api/location#installation","title":"Installation","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#usage","title":"Usage","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#building-a-path","title":"Building A Path","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#validating-an-untrusted-redirect-target","title":"Validating An Untrusted Redirect Target","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#api","title":"API","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#new-location-input","title":"new Location(input)","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#properties","title":"Properties","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#location-tostring-location-tojson","title":"location.toString() / location.toJSON()","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#location-from-input","title":"Location.from(input)","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#location-safe-input-options","title":"Location.safe(input, options)","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#location-issafe-input-options","title":"Location.isSafe(input, options?)","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#location-canparse-input","title":"Location.canParse(input)","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#pattern-round-tripping-a-sign-in-return-target","title":"Pattern: Round-Tripping A Sign-In Return Target","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/location#pattern-editing-the-current-request-s-query-string","title":"Pattern: Editing The Current Request's Query String","page":"@sdxc/location","section":"Packages · Language & values"},{"href":"/api/validate","title":"@sdxc/validate","page":"@sdxc/validate","section":"Packages · Language & values","summary":"Standard Schema validation utilities"},{"href":"/api/validate#installation","title":"Installation","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#usage","title":"Usage","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#validate-a-plain-object","title":"Validate a plain object","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#validate-a-form-submission","title":"Validate a form submission","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#validate-a-request","title":"Validate a request","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#read-the-failure","title":"Read the failure","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#api","title":"API","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#validate-schema-input-schema-promise-result-inferoutput-schema-validationerror","title":"validate<Schema>(input, schema): Promise<Result<InferOutput<Schema>, ValidationError>>","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#validationerror","title":"ValidationError","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#pattern-one-schema-behind-several-entry-points","title":"Pattern: One Schema Behind Several Entry Points","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#pattern-rendering-a-refused-submission","title":"Pattern: Rendering A Refused Submission","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#pattern-normalizing-while-validating","title":"Pattern: Normalizing While Validating","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/validate#pattern-custom-messages","title":"Pattern: Custom Messages","page":"@sdxc/validate","section":"Packages · Language & values"},{"href":"/api/uuid","title":"@sdxc/uuid","page":"@sdxc/uuid","section":"Packages · Language & values","summary":"Validate, assert and generate UUIDs behind a branded UUID type"},{"href":"/api/uuid#installation","title":"Installation","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#usage","title":"Usage","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#generate-an-identifier","title":"Generate An Identifier","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#narrow-a-string-you-received","title":"Narrow A String You Received","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#assert-at-a-boundary","title":"Assert At A Boundary","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#tell-the-failures-apart","title":"Tell The Failures Apart","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#api","title":"API","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#uuid","title":"UUID","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#isuuid-value-string-value-is-uuid","title":"isUUID(value: string): value is UUID","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#assertuuid-value-string-asserts-value-is-uuid","title":"assertUUID(value: string): asserts value is UUID","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#generateuuid-uuid","title":"generateUUID(): UUID","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#generateuuidv7-uuid","title":"generateUUIDv7(): UUID","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#errors","title":"Errors","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#pattern-narrowing-once-at-the-edge","title":"Pattern: Narrowing Once At The Edge","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#pattern-branching-instead-of-throwing","title":"Pattern: Branching Instead Of Throwing","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/uuid#pattern-prefixed-identifiers","title":"Pattern: Prefixed Identifiers","page":"@sdxc/uuid","section":"Packages · Language & values"},{"href":"/api/typeid","title":"@sdxc/typeid","page":"@sdxc/typeid","section":"Packages · Language & values","summary":"Type-safe TypeID values: a UUID and the prefix that names what it identifies"},{"href":"/api/typeid#installation","title":"Installation","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#usage","title":"Usage","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#create-one-from-a-uuid","title":"Create One From A UUID","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#parse-one-back","title":"Parse One Back","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#check-a-string-without-catching","title":"Check A String Without Catching","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#format-rules","title":"Format Rules","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#api","title":"API","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-fromuuid-prefix-prefix-uuid-uuid-typeid-prefix","title":"TypeID.fromUUID(prefix: prefix, uuid: UUID): TypeID<prefix>","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-fromstring-value-string-prefix-prefix-typeid-prefix","title":"TypeID.fromString(value: string, prefix?: prefix): TypeID<prefix>","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-isvalid-value-string-prefix-prefix-boolean","title":"TypeID.isValid(value: string, prefix?: prefix): boolean","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#new-typeid-prefix-prefix-suffix-base32","title":"new TypeID(prefix: prefix, suffix: Base32)","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-prefix-prefix","title":"typeId.prefix: prefix","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-suffix-base32","title":"typeId.suffix: Base32","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-touuid-uuid","title":"typeId.toUUID(): UUID","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-tostring-string","title":"typeId.toString(): string","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#typeid-prefix-prefix-uuid-uuid-typeid-prefix","title":"typeid(prefix: prefix): (uuid: UUID) => TypeID<prefix>","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#errors","title":"Errors","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#pattern-parse-at-the-boundary","title":"Pattern: Parse At The Boundary","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#pattern-one-factory-per-resource","title":"Pattern: One Factory Per Resource","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/typeid#pattern-store-uuids-serve-typeids","title":"Pattern: Store UUIDs, Serve TypeIDs","page":"@sdxc/typeid","section":"Packages · Language & values"},{"href":"/api/spec","title":"@sdxc/spec","page":"@sdxc/spec","section":"Packages · Testing","summary":"Executable specification runner for .spec files"},{"href":"/api/spec#installation","title":"Installation","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#usage","title":"Usage","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#write-a-suite","title":"Write a suite","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#run-it","title":"Run it","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#read-a-denial","title":"Read a denial","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#the-language","title":"The language","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#tests-and-phases","title":"Tests and phases","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#expect","title":"expect","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#let-and-references","title":"let and references","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#eventually","title":"eventually","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#command","title":"command","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#setup-and-teardown","title":"setup and teardown","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#use-and-namespaces","title":"use and namespaces","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#capabilities","title":"Capabilities","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#fs-the-workspace-filesystem","title":"fs — the workspace filesystem","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#cli-run-processes-allow-run","title":"cli — run processes · --allow-run","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#http-call-an-http-api-allow-net","title":"http — call an HTTP API · --allow-net","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#named-bases-where-a-relative-target-points","title":"Named bases — where a relative target points","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#html-read-a-served-page-s-markup-no-grant","title":"html — read a served page's markup · no grant","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#browser-drive-a-real-browser-allow-net","title":"browser — drive a real browser · --allow-net","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#db-query-a-database-allow-db","title":"db — query a database · --allow-db","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#env-read-a-granted-variable-allow-env","title":"env — read a granted variable · --allow-env","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#url-parse-a-url-no-grant","title":"url — parse a URL · no grant","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#sample-generate-a-suite-s-input-no-grant","title":"sample — generate a suite's input · no grant","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#str-compose-a-string-no-grant","title":"str — compose a string · no grant","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#spec-what-this-run-is-called-no-grant","title":"spec — what this run is called · no grant","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#jwt-read-and-verify-tokens-allow-net-verify-only","title":"jwt — read and verify tokens · --allow-net (verify only)","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#permissions","title":"Permissions","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#spec-config-jsonc","title":"spec/config.jsonc","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#pattern-declare-then-opt-in","title":"Pattern: declare, then opt in","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#loading-project-plugins","title":"Loading project plugins","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#custom-and-third-party-plugins","title":"Custom and third-party plugins","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#cli","title":"CLI","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#programmatic-api","title":"Programmatic API","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#runsuite-options","title":"runSuite(options)","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#runtests-options","title":"runTests(options)","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#createhttpplugin-options","title":"createHttpPlugin(options?)","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/spec#entry-points","title":"Entry points","page":"@sdxc/spec","section":"Packages · Testing"},{"href":"/api/sample","title":"@sdxc/sample","page":"@sdxc/sample","section":"Packages · Testing","summary":"Seeded generation of believable people, places, prose, numbers and identifiers"},{"href":"/api/sample#installation","title":"Installation","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#usage","title":"Usage","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#basic-example","title":"Basic Example","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#fresh-values-each-run","title":"Fresh Values Each Run","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#a-fixed-reference-instant","title":"A Fixed Reference Instant","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#your-own-vocabulary","title":"Your Own Vocabulary","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#api","title":"API","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#createsample-options-sampleoptions-sample","title":"createSample(options: SampleOptions): Sample","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#createrandom-seed-seed-random","title":"createRandom(seed: Seed): Random","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#systemseed-number","title":"systemSeed(): number","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#sample","title":"Sample","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#random","title":"Random","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#types","title":"Types","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#pattern-reproducing-a-failed-run","title":"Pattern: Reproducing A Failed Run","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#pattern-a-fixture-that-keeps-growing","title":"Pattern: A Fixture That Keeps Growing","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#pattern-seeding-a-development-database","title":"Pattern: Seeding A Development Database","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/sample#pattern-a-weighted-field","title":"Pattern: A Weighted Field","page":"@sdxc/sample","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks","title":"@sdxc/cloudflare-mocks","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing","summary":"In-memory, behavior-accurate Cloudflare binding mocks for tests"},{"href":"/api/cloudflare-mocks#installation","title":"Installation","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#usage","title":"Usage","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#storage-that-really-stores","title":"Storage That Really Stores","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#recording-what-a-worker-sent","title":"Recording What A Worker Sent","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#assembling-an-env","title":"Assembling An Env","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#deferred-work","title":"Deferred Work","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#api","title":"API","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createkvnamespace-options-kvnamespacemockoptions-kvnamespace","title":"createKVNamespace(options?: KVNamespaceMockOptions): KVNamespace","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#created1database-options-d1databasemockoptions-d1database","title":"createD1Database(options?: D1DatabaseMockOptions): D1Database","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createsqlstorage-options-sqlstoragemockoptions-sqlstorage","title":"createSqlStorage(options?: SqlStorageMockOptions): SqlStorage","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#creater2bucket-r2bucketmock","title":"createR2Bucket(): R2BucketMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createqueue-body-options-queuemockoptions-queuemock-body","title":"createQueue<Body>(options?: QueueMockOptions): QueueMock<Body>","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createsendemail-options-sendemailmockoptions-sendemailmock","title":"createSendEmail(options?: SendEmailMockOptions): SendEmailMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createanalyticsengine-analyticsenginemock","title":"createAnalyticsEngine(): AnalyticsEngineMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createratelimit-options-ratelimitmockoptions-ratelimitmock","title":"createRateLimit(options?: RateLimitMockOptions): RateLimitMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createsecretsstoresecret-options-secretsstoresecretmockoptions-secretsstoresecretmock","title":"createSecretsStoreSecret(options?: SecretsStoreSecretMockOptions): SecretsStoreSecretMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createdurableobjectstate-props-options-durableobjectstatemockoptions-props-durableobjectstatemock-props","title":"createDurableObjectState<Props>(options?: DurableObjectStateMockOptions<Props>): DurableObjectStateMock<Props>","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createdurableobjectnamespace-t-createstub-durableobjectstubfactory-durableobjectnamespacemock-t","title":"createDurableObjectNamespace<T>(createStub: DurableObjectStubFactory): DurableObjectNamespaceMock<T>","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createfetcher-handler-fetcherhandler-fetchermock","title":"createFetcher(handler: FetcherHandler): FetcherMock","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createexecutioncontext-props-options-executioncontextmockoptions-props-executioncontextmock-props","title":"createExecutionContext<Props>(options?: ExecutionContextMockOptions<Props>): ExecutionContextMock<Props>","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#createenv-env-bindings-options-envmockoptions-env","title":"createEnv<Env>(bindings, options?: EnvMockOptions): Env","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#types","title":"Types","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#sqlite-engine","title":"SQLite Engine","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#where-a-mock-is-more-permissive-than-the-platform","title":"Where A Mock Is More Permissive Than The Platform","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#pattern-testing-a-repository-against-real-sql","title":"Pattern: Testing A Repository Against Real SQL","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#pattern-testing-a-producer-and-its-consumer-together","title":"Pattern: Testing A Producer And Its Consumer Together","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#pattern-testing-a-durable-object-by-construction","title":"Pattern: Testing A Durable Object By Construction","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"},{"href":"/api/cloudflare-mocks#pattern-asserting-on-background-work","title":"Pattern: Asserting On Background Work","page":"@sdxc/cloudflare-mocks","section":"Packages · Testing"}]}