diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..569b63e --- /dev/null +++ b/.env.example @@ -0,0 +1,13 @@ +# Live smoke-test credentials (copy to .env - gitignored - and fill in). +# `make smoke` sources .env when present. Never point this at a production +# organization or project. + +# Personal access token (Supabase dashboard -> Account -> Access Tokens). +# The same variable the Supabase CLI and the Terraform provider read. +SUPABASE_ACCESS_TOKEN=sbp_... + +# The standing free-tier dev project's reference (dashboard -> Settings -> +# General -> Project ID; 20 lowercase letters). Resolves the `ref` server +# variable so project-scoped queries need no WHERE ref clause; the smoke +# suite runs against this project. +SUPABASE_PROJECT_ID=abcdefghijklmnopqrst diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml new file mode 100644 index 0000000..d75f086 --- /dev/null +++ b/.github/workflows/build-and-test.yml @@ -0,0 +1,166 @@ +name: build-and-test + +# Build the supabase provider from the pinned spec and run every +# credential-free test layer on each push / PR; the live smoke suite runs +# only where the Supabase secrets are configured (never the project +# lifecycle - that is `make smoke-project-lifecycle`, run deliberately); a +# scheduled spec-drift job diffs the served spec against the pin (Supabase +# ships fast - drift is expected and must be reviewed, never silent). + +on: + push: + branches: [main, 'feature/**'] + paths-ignore: ['website/**'] + pull_request: + branches: [main] + paths-ignore: ['website/**'] + schedule: + - cron: '23 3 * * 1' # weekly spec-drift check (Monday 03:23 UTC) + workflow_dispatch: + +jobs: + build-and-test: + if: github.event_name != 'schedule' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-node@v7 + with: + node-version: 20 + cache: npm + + - name: Install dependencies + run: npm ci + + # puts the latest stackql on PATH; bin/start-server.sh and the test + # runners resolve it from there + - name: Install stackql + uses: stackql/setup-stackql@v2 + + - name: stackql version + run: stackql --version + + # Drift is reported, not fatal, here: the committed pin is what gets + # built and tested. The spec-drift job below opens the review issue. + - name: Verify the pinned spec against upstream (warns on drift) + run: | + if ! make fetch-spec; then + echo "::warning title=Supabase Management API spec drift::The served spec no longer matches provider-dev/config/spec_pin.json - run 'make refresh-spec && make build && make test' and review the diff. Building from the committed pin." + fi + + - name: Build provider from the pinned spec + run: make inventory split mappings pre-normalize normalize generate + + - name: Fail on uncommitted generation drift + run: | + git add -N . + if ! git diff --quiet -- provider-dev/openapi provider-dev/config provider-dev/source; then + echo "Generated output differs from the committed artifacts - run 'make build' and commit." + git diff --stat -- provider-dev/openapi provider-dev/config provider-dev/source + exit 1 + fi + + - name: Offline validation + run: make test-offline + + - name: Integration tests (mock Management API) + run: make test-integration + + - name: Meta-route tests + run: make test-meta + + - name: Generate docs (sanity - the site build runs on the web workflows) + run: make docs + + smoke: + # secret-gated live smoke suite against the standing dev project; + # skipped with a notice when the secrets are not configured (forks, PRs + # from outside). Serial pacing under the rate limit is built into the + # harness. The project create/pause/delete lifecycle is NOT run here - + # trigger it deliberately with `make smoke-project-lifecycle`. + runs-on: ubuntu-latest + needs: build-and-test + if: github.event_name != 'pull_request' && github.event_name != 'schedule' + env: + SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }} + SUPABASE_PROJECT_ID: ${{ secrets.SUPABASE_PROJECT_ID }} + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-node@v7 + with: + node-version: 20 + cache: npm + + - uses: actions/setup-python@v7 + with: + python-version: '3.12' + + - name: Install dependencies + run: npm ci + + - name: Live smoke suite (reads + cheap write lifecycles + query round trip) + if: env.SUPABASE_ACCESS_TOKEN != '' + run: make smoke + + - name: Live smoke skipped (no credentials) + if: env.SUPABASE_ACCESS_TOKEN == '' + run: | + echo "::notice title=Live smoke suite skipped::SUPABASE_ACCESS_TOKEN / SUPABASE_PROJECT_ID secrets are not configured - the live smoke suite did not run. Credential-free coverage still ran via the mock-server integration suite." + + spec-drift: + # Diff the served spec against the pin on a schedule and on demand, and + # open an issue when it moves. Supabase serves a single unversioned spec + # and ships fast - this job is the review trigger. + runs-on: ubuntu-latest + if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' + permissions: + contents: read + issues: write + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-node@v7 + with: + node-version: 20 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Fetch and compare against the pin + id: drift + run: | + set +e + make fetch-spec > fetch.log 2>&1 + rc=$? + set -e + cat fetch.log + if [ "$rc" -eq 0 ]; then + echo "drift=false" >> "$GITHUB_OUTPUT" + else + echo "drift=true" >> "$GITHUB_OUTPUT" + # materialise the diff for the issue body (refresh into the working tree only) + npm run fetch-spec -- --update > /dev/null 2>&1 || true + git diff --stat -- provider-dev/downloaded provider-dev/config/spec_pin.json > drift.txt || true + cat drift.txt + fi + + - name: Report drift + if: steps.drift.outputs.drift == 'true' + uses: actions/github-script@v9 + with: + script: | + const fs = require('fs'); + const stat = fs.existsSync('drift.txt') ? fs.readFileSync('drift.txt', 'utf8') : '(diff unavailable)'; + const title = 'Supabase Management API spec drift detected'; + const body = 'The spec served at https://api.supabase.com/api/v1-json no longer matches the pin in provider-dev/config/spec_pin.json.\n\n```\n' + stat + '\n```\nRun `make refresh-spec && make build && make test`, review the generated diff (new operations, changed schemas, beta labelling, new fix classes in record_spec_pin.mjs), update NOTES.md, and commit.'; + await core.summary.addHeading(title).addCodeBlock(stat).write(); + const { data: issues } = await github.rest.issues.listForRepo({ + owner: context.repo.owner, repo: context.repo.repo, state: 'open', labels: 'spec-drift' + }); + if (issues.some(i => i.title === title)) return; + await github.rest.issues.create({ + owner: context.repo.owner, repo: context.repo.repo, title, body, labels: ['spec-drift'] + }); diff --git a/.github/workflows/prod-web-deploy.yml b/.github/workflows/prod-web-deploy.yml new file mode 100644 index 0000000..7b950ed --- /dev/null +++ b/.github/workflows/prod-web-deploy.yml @@ -0,0 +1,58 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: + - main + paths: + - 'website/**' + +jobs: + build: + name: Build Docusaurus + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v7 + with: + node-version: 20 + cache: yarn + cache-dependency-path: website/yarn.lock + + - name: Install dependencies + run: yarn install --frozen-lockfile + working-directory: website + + - name: Build website + run: yarn build + working-directory: website + + - name: Upload Build Artifact + uses: actions/upload-pages-artifact@v5 + with: + path: website/build # Ensure the path is correctly set to the Docusaurus build output + + deploy: + name: Deploy to GitHub Pages + needs: build + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 + with: + working-directory: website/build # Ensures the correct directory is used for deployment diff --git a/.github/workflows/test-web-deploy.yml b/.github/workflows/test-web-deploy.yml new file mode 100644 index 0000000..64df0d3 --- /dev/null +++ b/.github/workflows/test-web-deploy.yml @@ -0,0 +1,31 @@ +name: Test deployment + +on: + pull_request: + branches: + - main + paths: + - 'website/**' + +jobs: + test-deploy: + name: Test deployment + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v7 + with: + node-version: 20 + cache: yarn + cache-dependency-path: website/yarn.lock + + - name: Install dependencies + run: yarn install --frozen-lockfile + working-directory: website + + - name: Test build website + run: yarn build + working-directory: website \ No newline at end of file diff --git a/.gitignore b/.gitignore index 872d5f6..ba4c9cd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,143 +1,47 @@ -# Logs -logs +# stackql binary and server artifacts +stackql +stackql.exe +stackql-zip +stackql-server.log +nohup.out *.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* +/.stackql -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories +# node node_modules/ -jspm_packages/ -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ +# python +__pycache__/ +*.py[cod] +.venv/ +venv/ -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files +# env / secrets .env .env.* !.env.example -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist -.output - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp directory -.temp - -# Sveltekit cache directory -.svelte-kit/ - -# vitepress build output -**/.vitepress/dist - -# vitepress cache directory -**/.vitepress/cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# Firebase cache directory -.firebase/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# pnpm -.pnpm-store - -# yarn v3 -.pnp.* -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/sdks -!.yarn/versions - -# Vite files -vite.config.js.timestamp-* -vite.config.ts.timestamp-* -.vite/ +# IDE / editor +.vscode/ +.idea/ +*.swp + +# docs site build output +website/build/ +website/.docusaurus/ +website/.shared-config/ + +# misc +.DS_Store +*.tmp +*.bak + +# The downloaded spec snapshot in provider-dev/downloaded/ IS committed: +# the Supabase Management API serves a single unversioned spec +# (https://api.supabase.com/api/v1-json) and the vendor ships fast, so +# committing the snapshot makes every refresh a reviewable diff against the +# hash pin in provider-dev/config/spec_pin.json. + +# integration test registry copy (rebuilt every run) +tests/integration/.registry-tmp/ +/.stackql diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..41583e3 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@jsr:registry=https://npm.jsr.io diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..e926072 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,89 @@ +# CLAUDE.md + +## Project + +This repository builds and documents the `supabase` provider for [StackQL](https://github.com/stackql/stackql), enabling SQL-based query and provisioning operations against the Supabase Management API - organizations and members, projects, preview branches, edge functions, secrets and API keys, project configuration (auth/GoTrue settings, Postgres settings, pooler, API/PostgREST settings, storage, realtime, SSL enforcement), custom domains and vanity subdomains, network restrictions and bans, backups and restore points, read replicas, add-ons, advisors, analytics, and the project SQL query endpoint. + +**Scope notes, recorded so they are never relitigated**: the per-project data APIs (PostgREST at `.supabase.co/rest/v1`, Realtime, Storage object I/O, GoTrue user-facing auth) are per-project hosts with per-project keys - a different surface, reserved as a possible future `supabase_project` sibling, out of scope here. The Management API is the provider. + +The provider is a type 1 (DIRECT) build from the vendor's published OpenAPI document using `@stackql/provider-utils`, in the lean fixed-host mould of the clickhouse/hetzner sibling repos (the reference implementation for structure, scripts, tests and docs is [`stackql-provider-clickhouse`](../../C/stackql-provider-clickhouse)). Sibling-build NOTES.md findings are reused, not re-derived - snowflake (the statement-endpoint mapping framework), clickhouse (rate limit as a design input, the org-scoped server template, gated smoke lifecycles), keycloak (PUT is not REPLACE without evidence), newrelic (the JSON-blob posture for query-dependent shapes), hetzner (deterministic spec fixes counted in the pin). Supabase-specific findings live in [NOTES.md](NOTES.md) - read it before changing a mapping. + +## Positioning context + +Supabase's official Terraform provider is labelled Public Alpha by the vendor (the "experimental" wording in earlier drafts was wrong - NOTES.md finding 17) and covers seven resources. State the label once, factually. This provider's counter is mechanical completeness from the vendor's published spec (158 operations, 14 services, 65 resources) and one capability the resource model does not attempt: the project SQL query endpoint surfaced in-session, so the control plane and the project database are queryable in one place. Comparisons are expressed through capability statements and runnable examples, never editorializing. + +## Spec source + +The Management API serves its own OpenAPI document (NestJS-generated) at `https://api.supabase.com/api/v1-json`. `bin/fetch-spec.sh` downloads, applies the deterministic fixes in `provider-dev/scripts/record_spec_pin.mjs` (six defect classes so far, counted in the pin), validates with `@apidevtools/swagger-parser`, and pins (URL, date, hash) in `provider-dev/config/spec_pin.json`. The snapshot in `provider-dev/downloaded/` is committed. Supabase ships fast - the weekly drift job opens an issue, and refreshes are reviewed diffs (`make refresh-spec`), never silent regenerations. A refresh that introduces a new 2019-09/2020-12 JSON Schema construct needs a new fix class in `record_spec_pin.mjs`, not a hand edit. + +## Design decisions (settled - see NOTES.md for the evidence) + +- **Bearer auth from `SUPABASE_ACCESS_TOKEN`** - the CLI's and the Terraform provider's variable. Fixed API base `https://api.supabase.com`. +- **Project scope is a server variable** - the split rebases the 141 operations under `/v1/projects/{ref}/` onto `https://api.supabase.com/v1/projects/{ref}` with `x-stackQL-envVar: SUPABASE_PROJECT_ID` (`provider-dev/config/servers.json`); the non-project paths keep their full path and are pinned to the API base by `post_process.mjs`. A `WHERE ref` value beats the environment. A JOIN cannot fan out over projects on `ref` - the docs teach the two-statement pattern (finding 13). +- **The query endpoint is `database.queries.run`, INSERT ... RETURNING rows** - one row whose `rows` column carries the result set (finding 1). The read-only sibling is EXEC-only. +- **snake_case surface** - `snake_case_aliases: true` on the provider config plus `request.nativeCasing: camel` on the three camelCase-body methods (finding 16). Everything else on the wire is already snake_case. +- **UPDATE values are strings** in the stackql engine (finding 14); INSERT and EXEC are typed. Document it; do not work around it in the provider. +- **Bare-array bodies** - secrets create/delete are single-item bodies wrapped by request transforms; the function bulk update is skip-coded (finding 8). DELETE bodies get naive translation in `post_process.mjs`. +- **Rate limit as a design input** - harness pacing is 1.2 s per statement; a 429 in CI is a harness bug (finding 6). +- **Labels** - `[Beta]`/`[Alpha]` and deprecations flow through from the vendor summaries. +- **Skip codes** (12 operations): `oauth_user_agent_flow` (the service is excluded from the provider entirely), `non_json_text_response`, `multipart_eszip_deploy`, `untyped_function_body`, `untyped_json_response`, `bare_array_bulk_body`, `head_count_endpoint`. + +## Toolchain rules + +- Use the **latest** `@stackql/provider-utils` and `@stackql/pgwire-lite` (check npm before starting work; do not pin to an old minor). Node.js >= 20, `type: module`. +- Docusaurus 3.10.x for the microsite; `showLastUpdateTime` is flipped on in `website/docusaurus.config.js`. +- WSL is the execution environment on this machine (GNU make, bash, a `stackql` binary on PATH, Python 3, yarn). Node steps also run from Windows. +- The two CLI entry points (`provider-dev-utils.mjs`, `docgen-utils.mjs`) are npm scripts invoked through `node`; the Makefile is the operator surface (`make help`). + +## Repository layout + +``` +Makefile # the pipeline: make all / make test / make smoke ... +bin/ # fetch-spec.sh, split.mjs, server lifecycle, test-meta-routes.cjs +provider-dev/ + downloaded/ # pinned spec snapshot (committed) + config/ # spec_pin.json, service_names.json, servers.json, endpoint_inventory.csv, all_services.csv + scripts/ # record_spec_pin, build_inventory, map_operations, pre_normalize, post_process, lib/spec_helpers + source/ # split + normalized per-service specs (build artifacts, committed) + openapi/src/supabase # generated provider output (committed) + docgen/provider-data # headerContent1.txt / headerContent2.txt (landing page) +tests/ + offline_validation.mjs + integration/ # mock_supabase_server.mjs, run_integration_tests.mjs, probe.mjs + smoke_test.py # pystackql live suite (--live, --read-only, --with-project-lifecycle, --cleanup-only) +website/ # Docusaurus microsite (shared stackql/docusaurus-config vendored at build) +.github/workflows/ # build-and-test.yml (pin check, build, drift check, 3 test layers, gated smoke, weekly spec-drift), web deploys +``` + +## Build pipeline + +`make all` runs deps -> fetch-spec (pin verify) -> inventory -> split -> mappings -> pre-normalize -> normalize -> generate (+ post-process) -> test-offline -> test-integration -> test-meta -> docs -> website. Every step is deterministic and re-runnable; manual mapping decisions are rules in `map_operations.mjs` (`RESOURCE_RULES`, `METHOD_RULES`) and skip codes in `lib/spec_helpers.mjs`, never hand-edits to CSVs or specs. `all_services.csv` is committed as the durable record of every operation -> resource.method mapping; a diff there on a regeneration is a breaking-change review (a method moving resource, a resource renamed), not noise. Validate-and-fail-without-writing is the standard for every script. + +## Tests + +1. `make test-offline` - `SHOW`/`DESCRIBE` against the local file registry (services, resources, verbs, env-var behaviour, snake aliases). +2. `make test-integration` - the mock Management API (`tests/integration/mock_supabase_server.mjs`, real wire shapes, bearer enforced) with row-level assertions per archetype. `tests/integration/probe.mjs ""` prints stackql output and the wire call for ad-hoc binding checks. +3. `make test-meta` - the meta-route walk over a local server. +4. `make smoke` / `make smoke-live` / `make smoke-read-only` / `make smoke-project-lifecycle` / `make smoke-cleanup` - live, against the standing free-tier dev project from `.env` (`SUPABASE_ACCESS_TOKEN`, `SUPABASE_PROJECT_ID`). Free-tier cost: nothing. The project lifecycle only runs in its gated target. + +Never run tests against a production organization or project. + +## Publish and docs + +Push the `supabase` dir to `providers/src` in a feature branch of [`stackql-provider-registry`](https://github.com/stackql/stackql-provider-registry) and follow the registry release flow; verify with `registry pull supabase` from the dev registry and `make smoke-live`. Docs: `make docs` (generate + sanitize, including the "required unless SUPABASE_PROJECT_ID is set" annotation) then `make website`; GitHub Pages with `supabase-provider.stackql.io` CNAME -> `stackql.github.io.`. + +## Writing conventions + +- README and docs copy: measured, precise, no hyperbole. Third-person or passive framing for descriptive copy. +- No em dashes; use `-`. No characters not on a QWERTY keyboard; use `->` for arrows. +- Sample queries follow the k8s README style: realistic, runnable, `json_extract` for nested fields; `"database"` double-quoted when selecting that column. + +## Non-negotiables + +1. Latest `@stackql/provider-utils`, always +2. The clickhouse repo is the reference pattern; sibling-build NOTES.md findings are reused, not re-derived - deviate only with a documented reason in NOTES.md +3. Test harnesses pace under the rate limit - a 429 in CI is a harness bug +4. The project create/delete lifecycle never runs outside the gated target - free-tier quota is a shared resource +5. Deterministic scripts, never hand-edits to derived artifacts +6. Every regeneration is followed by `make test` before commit +7. Smoke tests restore any config they toggle and clean up everything they create diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7929037 --- /dev/null +++ b/Makefile @@ -0,0 +1,156 @@ +# StackQL supabase (Supabase Management API) provider build pipeline. +# +# Every step is deterministic and re-runnable; manual mapping decisions live +# in provider-dev/scripts, never in hand-edited artifacts. `make all` runs +# the full chain: fetch/verify the spec pin -> inventory -> split service +# specs -> mappings -> pre-normalize -> normalize -> generate -> post-process +# -> offline + integration + meta-route tests -> docs -> website build. +# `make smoke` (live, needs credentials) is separate so `all` never touches +# a real account. +# +# Requirements: Node >= 20, GNU make, a stackql binary ($STACKQL, ./stackql +# or on PATH), Python 3 (a venv with pystackql is created on demand for the +# smoke suite), yarn for the website. Runs under Linux / WSL / macOS. +# +# Live credentials for the smoke suite (never committed - .env is +# gitignored; `make smoke` sources it if present): +# SUPABASE_ACCESS_TOKEN personal access token (the CLI / Terraform variable) +# SUPABASE_PROJECT_ID the standing dev project's ref (x-stackQL-envVar +# target; the smoke suite runs against this project) + +SHELL := bash +.DEFAULT_GOAL := help + +PROVIDER := supabase +SERVICES_DIR := provider-dev/openapi/src/$(PROVIDER) +# The project-scoped server template ({ref} resolved from SUPABASE_PROJECT_ID +# via x-stackQL-envVar) is the single source of truth in +# provider-dev/config/servers.json - shared by bin/split.mjs and this file. +SERVERS := provider-dev/config/servers.json +# Bearer auth from SUPABASE_ACCESS_TOKEN; snake_case_aliases presents the +# handful of camelCase wire properties as snake_case columns (paired with +# request.nativeCasing: camel on the three camelCase-body methods, set in +# post_process) - the oci/clickhouse precedent. +PROVIDER_CONFIG := {"auth": {"type": "bearer", "credentialsenvvar": "SUPABASE_ACCESS_TOKEN"}, "snake_case_aliases": true} +# NOTE: no pagination config is shipped on the command line - the single +# cursor-paginated collection (snippets) is configured per method in +# post_process; every other collection returns the complete bounded result +# (verified in the endpoint inventory, NOTES.md finding 3). +VENV := .venv +PY := $(VENV)/bin/python +ENV_FILE := .env + +.PHONY: help deps fetch-spec refresh-spec inventory split mappings pre-normalize normalize generate post-process build \ + test-offline test-integration test-meta test smoke smoke-live smoke-read-only smoke-project-lifecycle smoke-cleanup venv \ + docs website website-start clean all + +help: ## show this help + @grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " %-24s %s\n", $$1, $$2}' + +deps: ## install node dependencies (latest @stackql/provider-utils per package.json range) + npm install + +# ---------------------------------------------------------------- pipeline + +fetch-spec: ## download the Management API spec and verify it against the pin (fails on drift) + npm run fetch-spec + +refresh-spec: ## download the spec and ACCEPT the upstream change (rewrites the pin - review the diff) + npm run fetch-spec -- --update + +inventory: ## build provider-dev/config/endpoint_inventory.csv from the pinned spec + npm run build-inventory + +split: ## split the pinned spec into per-service specs on the project-scoped server template + npm run split -- --provider-name $(PROVIDER) --overwrite + +mappings: ## regenerate all_services.csv from scratch and apply the deterministic verb mappings (fails on unmapped ops) + rm -f provider-dev/config/all_services.csv + npm run generate-mappings -- --provider-name $(PROVIDER) --input-dir provider-dev/source --output-dir provider-dev/config + npm run map-operations + +pre-normalize: ## supabase-specific spec adjustments (eszip variant, query result schema, legacy query params, secrets bodies, pooler duplicate) + node provider-dev/scripts/pre_normalize.mjs + +normalize: ## generic provider-utils normalize pass (allOf flatten, bare-array wrap, ...) + npm run normalize -- --api-dir provider-dev/source + +generate: ## generate the provider (bearer auth, project-scoped servers, naive request body translate) + rm -rf provider-dev/openapi/* + npm run generate-provider -- \ + --provider-name $(PROVIDER) \ + --input-dir provider-dev/source \ + --output-dir $(SERVICES_DIR) \ + --config-path provider-dev/config/all_services.csv \ + --servers $(SERVERS) \ + --provider-config '$(PROVIDER_CONFIG)' \ + --naive-req-body-translate \ + --overwrite + $(MAKE) post-process + +post-process: ## re-apply generated-provider fixes (root-path servers, pagination, casing, query binding, body transforms) + node provider-dev/scripts/post_process.mjs + +build: fetch-spec inventory split mappings pre-normalize normalize generate ## full spec -> provider pipeline + +# ------------------------------------------------------------------- tests + +test-offline: ## quick offline validation against the local file registry (SHOW / DESCRIBE) + node tests/offline_validation.mjs + +test-integration: ## row-level integration tests against the mock Management API + node tests/integration/run_integration_tests.mjs + +test-meta: ## meta-route suite against a local stackql server + npm run start-server + npm run test-meta-routes -- $(PROVIDER) || (npm run stop-server; exit 1) + npm run stop-server + +test: test-offline test-integration test-meta ## all non-live test layers + +$(VENV)/bin/activate: + python3 -m venv $(VENV) + $(VENV)/bin/pip install --quiet --upgrade pip pystackql + +venv: $(VENV)/bin/activate ## create the python venv with pystackql for the smoke suite + +# `make smoke` sources .env when present so a developer checkout works +# without exporting anything; CI sets the variables from secrets. +with_env = set -a; [ -f $(ENV_FILE) ] && source <(tr -d '\r' < $(ENV_FILE)); set +a; + +smoke: venv ## live smoke suite with the locally generated provider - reads + cheap write lifecycles (needs credentials) + @$(with_env) $(PY) tests/smoke_test.py + +smoke-live: venv ## live smoke suite against the PUBLISHED provider in the stackql registry (post-publish verification) + @$(with_env) $(PY) tests/smoke_test.py --live + +smoke-read-only: venv ## live read smokes only, no writes + @$(with_env) $(PY) tests/smoke_test.py --read-only + +smoke-project-lifecycle: venv ## live suite INCLUDING the gated project create / pause / delete lifecycle (minutes, free-tier quota) + @$(with_env) $(PY) tests/smoke_test.py --with-project-lifecycle + +smoke-cleanup: venv ## sweep stackql-smoke-* secrets, functions, API keys (and projects) and exit + @$(with_env) $(PY) tests/smoke_test.py --cleanup-only + +# -------------------------------------------------------------------- docs + +docs: ## generate the website docs (snake_case surface), then sanitize + npm run generate-docs -- \ + --provider-name $(PROVIDER) \ + --provider-dir ./$(SERVICES_DIR)/v00.00.00000 \ + --output-dir ./website \ + --provider-data-dir ./provider-dev/docgen/provider-data \ + --snake-case-aliases + node website/scripts/sanitize-docs.mjs + +website: ## build the docusaurus microsite (vendors shared config first) + cd website && yarn install && yarn build + +website-start: ## run the docusaurus dev server + cd website && yarn install && yarn start + +clean: ## remove generated artifacts (provider output, docs, website build, test registry copy) + rm -rf provider-dev/openapi/* website/build website/.docusaurus website/docs/services tests/integration/.registry-tmp + +all: deps build test docs website ## everything non-live: deps, pipeline, tests, docs, site build diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 0000000..aacdcec --- /dev/null +++ b/NOTES.md @@ -0,0 +1,121 @@ +# NOTES + +Findings from the build, answered with evidence where possible. Sources: the pinned spec snapshot `provider-dev/downloaded/supabase-v1.json` (refreshed 2026-08-27, upstream sha256 `660e5634fab8...`, see `provider-dev/config/spec_pin.json`), the endpoint inventory (`provider-dev/config/endpoint_inventory.csv`), the mock-server integration suite (`tests/integration/`), probes of the stackql engine (v0.10.605) against the mock, the vendor's API reference and Terraform provider source, and the sibling NOTES.md findings (snowflake, clickhouse, keycloak, newrelic, hetzner) - reused, not re-derived. Findings that require a live token are marked for the smoke suite; see Blockers. + +## 1. The query endpoint mapping (flagship) - decided: INSERT ... RETURNING rows + +`POST /v1/projects/{ref}/database/query` (`v1-run-a-query`, `[Beta]`) executes SQL against the project's Postgres. Request body: `query` (string, required), `parameters` (array, optional), `read_only` (boolean, optional). A sibling `POST .../database/query/read-only` (`v1-read-only-query`, `[Beta]`) runs as `supabase_read_only_user` and takes `query` + `parameters` only. + +The snowflake SubmitStatement decision framework applied: + +- **SELECT is ruled out** on the any-sdk gap snowflake recorded: `query` is a required request-body property and select statements do not route WHERE parameters into request bodies. +- **INSERT ... RETURNING wins on projection quality**, proven against the mock. The 201 declares no content in the spec; `pre_normalize.mjs` types it as `V1RunQueryResultRows` (`{rows: [...]}`) and `post_process.mjs` attaches the wrap transform (the same overrideMediaType + schema_override + transform trio the generator emits for bare-array lists), so `INSERT INTO supabase.database.queries (ref, query) SELECT '', 'select ...' RETURNING rows` returns one row whose `rows` column carries the result set - the newrelic NRQL posture (`json_extract(rows, '$[0].count')`). The integration suite asserts the wire body (`{query}`, `{query, read_only: true}`), the 2-row fixture result flowing through the `rows` column, and the read-only sibling. +- The resource is `database.queries` with `run` (INSERT) and `run_read_only` (EXEC). Two INSERT methods with the same required-parameter signature (`ref`) would clash, and the main method already takes `read_only` in its body, so the sibling is EXEC-only. +- EXEC on `run` also works for fire-and-forget statements (prints the status line). + +**Doc framing:** examples are read-shaped; the endpoint runs arbitrary SQL as the service role and the docs say so; result rows are query-dependent and arrive as one JSON value; both endpoints carry the vendor's `[Beta]` label. + +**For the smoke suite:** the round trip creates `public.stackql_smoke_fixture`, inserts two rows, reads them back through `RETURNING rows`, runs `run_read_only`, and drops the table. Whether `parameters` binds `$1`-style placeholders is still unconfirmed live. + +## 2. Spec quality and deterministic fixes - six defect classes over two refreshes + +The NestJS-generated document leaks JSON Schema 2019-09/2020-12 syntax into an OpenAPI 3.0 document. Fixed deterministically in `record_spec_pin.mjs` before validation and counted in the pin (hetzner precedent); a class absent from a snapshot counts 0: + +- `type_null_to_nullable` (5): `"type": "null"` -> `nullable: true` (the JIT list anyOf discriminants, the deprecated always-null create-project fields). +- `hide_definitions_removed` (0, was 1): the `hideDefinitions` `@nestjs/swagger` artifact key - gone from the current spec. +- `property_names_removed` (3, new 2026-08): `propertyNames` on the api-keys `secret_jwt_template` free-form object. +- `exclusive_bound_lowered` (3, new 2026-08): numeric `exclusiveMinimum` on `DiskAutoscaleConfig` -> `minimum` + boolean flag (the clickhouse pre_normalize precedent). +- `schema_dialect_key_removed` (2, new 2026-08): a literal `$schema` key inside the reworked jit-access oneOf. +- `const_to_enum` (2, new 2026-08): `const: unavailable` -> `enum: [unavailable]`. + +swagger-parser 12 validates clean after fixes. The canonical spec path `https://api.supabase.com/api/v1-json` is confirmed from the vendor's API reference introduction; `/api/v1` serves the Swagger UI. + +**2026-08-27 refresh vs the 2026-07-14 pin:** 169 -> 170 operations (one added: `GET /v1/projects/{ref}/analytics/endpoints/metrics`, a Prometheus/OpenMetrics text scrape - skip-coded `non_json_text_response` per the clickhouse prometheus precedent), 146 -> 148 schemas, 86 schemas changed (mostly description and validation tightening; the jit-access read went from untyped JSON to a typed oneOf), `JitStateResponse` removed. + +## 3. Pagination - confirmed: one cursor collection configured, two offset windows parameter-driven + +- `GET /v1/snippets` (`cursor`, `limit`; response `{data, cursor}`) - configured as method-level pagination on `snippets.list` in `post_process.mjs` (`requestToken cursor/query`, `responseToken $.cursor/body`) and proven against a two-page mock fixture (3 rows, second call carries `cursor=page-two`). +- `GET /v1/projects/{ref}/actions` (`offset`, `limit`) and `GET /v1/organizations/{slug}/projects` (`offset`, `limit`, response `{projects, pagination}`) - offset arithmetic is not expressible in any-sdk's token pagination (keycloak finding); exposed as optional WHERE parameters (parameter-driven windowing). + +Every other collection returns the complete bounded result. Any leftover WHERE key with no matching parameter is appended as a query parameter by any-sdk, so `reveal`, `services`, `sql`, `iso_timestamp_start` and the like are predicate pushdowns without configuration (proven: `WHERE reveal = 'true'` on `api_keys`, `WHERE services = 'auth'` on `service_health`, which requires it). + +## 4. Update semantics - 16 PATCH, 9 PUT; all UPDATE, and every UPDATE value is a string + +The keycloak finding stands: PUT does not imply replace semantics and none has been proven live, so PUT and PATCH both map as `UPDATE`. The PUT list: `api-keys/legacy`, `jit-access`, `pgsodium`, `ssl-enforcement`, `sso/providers/{id}`, `config/database/postgres`, `database/jit`, `database/migrations` (mapped as the EXEC `upsert`), `functions` (bulk, skip-coded - finding 8). + +The larger finding is engine-side (finding 14): stackql marshals every `UPDATE ... SET` value as a JSON string. The auth-config toggle-and-restore in the smoke suite is therefore also the coercion probe: `UPDATE supabase.config.auth_configs SET disable_signup = 'true'` sends `{"disable_signup": "true"}`; whether the Management API's validation coerces it is the first thing the live run establishes. Nothing moves to `REPLACE` without live evidence. + +## 5. GoTrue and Postgres config shapes - both wide and flat: columns + +Measured from the pinned spec and asserted offline: the auth config response declares 237 flat properties (`DESCRIBE` shows > 200 columns - `disable_signup`, `mfa_totp_enroll_enabled`, `password_min_length`, `site_url`, `external_github_enabled`, ...); the Postgres config response 38 flat properties. Both lower to columns with no `json_extract`. Deep shapes that take the JSON-blob posture: the backups envelope (mapped as `backups.list` on `$.backups`, the envelope fields dropped), service health `info`, add-on `variant`, upgrade eligibility arrays, `available_regions` recommendations, the analytics `result` arrays (query-dependent - blob posture like the query endpoint), `network_restrictions.config` (`json_extract(config, '$.dbAllowedCidrs')`). + +## 6. Rate limit - the reference now says 120/min; pacing stays at 1.2 s + +The API reference (2026-08) states 120 requests per minute per user, scoped per project/organization, with stricter exceptions (analytics 30/min; database context 10/min and 1/s), `429` for the remainder of the minute, and `X-RateLimit-Limit/Remaining/Reset` headers. Older material said 60. The harness constant `INTER_REQUEST_DELAY_MS = 1200` (~50/min) transfers from clickhouse and stays: it is under either figure with margin. A 429 in CI is a harness bug and fails the run. The mock echoes the header shape. The unauthenticated 401 path returns no rate-limit headers; the authenticated shape is recorded on the first live run. + +## 7. Beta and deprecated labelling + +35 operations carry `[Beta]` and 1 `[Alpha]` (`PATCH network-restrictions`); the prefix is the first token of the generated method description, so per-method labelling flows through verbatim (clickhouse convention) and the landing page summarizes the beta surface. 5 operations are deprecated: the advisors pair, `logs.all`, `database/context` and `POST /v1/projects/{ref}/functions` - all stay mapped with the deprecation carried into docs. The vendor deprecating the JSON function create in favour of the excluded multipart deploy means API-side function creation may eventually disappear; the CLI is the deploy path, noted in docs. + +## 8. Bare-array request bodies - secrets wrapped per statement, function bulk update skipped + +`POST /v1/projects/{ref}/secrets` takes a bare array of `{name, value}` and `DELETE /v1/projects/{ref}/secrets` a bare array of names (a DELETE with a required body). Naive body translation cannot address a bare array (the first generation sent no body at all). Settled with any-sdk's request transform: `pre_normalize.mjs` rewrites each body schema to its single-item object form (`{name, value}` / `{name}`) and `post_process.mjs` attaches a `request.transform` that wraps the marshalled object back into the array (`[{{ . }}]` on the text template; `[{{ toJson .name }}]` on the JSON template). One secret per statement - the Terraform resource's granularity too. Proven on the wire in the integration suite (`[{"name":"STACKQL_SMOKE_IT","value":"v1"}]` and `["STACKQL_SMOKE_IT"]`). + +`PUT /v1/projects/{ref}/functions` (bulk update, bare array of function objects) has no per-statement surface - the single-function PATCH is the update path - and is skip-coded `bare_array_bulk_body`. + +DELETE bodies in general: the generator emits `requestBodyTranslate: naive` for POST/PUT/PATCH only, so a DELETE body attribute surfaces as `data__`; `post_process.mjs` adds the naive translation to the two DELETEs with bodies (`secrets.delete`, `network_bans.delete`) so `WHERE name = ...` / `WHERE ipv4_addresses = '[...]'` are the surface. + +## 9. Bare-array list wrap keys - provider-utils sets them + +13 list reads return top-level bare arrays. provider-utils normalize marks them (`x-stackql-bare-array-wrap`, wrapper key derived from the operationId: `v1_list_all_projects`, `v1_get_services_health`, ...) and generate emits the objectKey + wrap transform + schema override; `stackql_object_key` stays blank in the CSV for them and no `METHOD_RULES` are needed. Envelope reads carry their keys in the CSV (`$.keys`, `$.items`, `$.available_versions`, `$.projects`, `$.data`, `$.backups`, `$.lints`, `$.selected_addons`, `$.databases`). One exception: the generator applies the CSV objectKey to GET operations only, so the POST-backed `network_bans.list` (`$.banned_ipv4_addresses`) gets its objectKey in `post_process.mjs`. + +## 10. Untyped JSON responses - one typed by the refresh, one skipped + +`jit-access` (GET/PUT) is now a typed oneOf (`{state, appliedSuccessfully}` | `{state: unavailable, unavailableReason}`) after the 2026-08 refresh and maps as `jit_access_configs`. `GET /v1/projects/{ref}/database/openapi` still declares an empty schema; normalize converts it to a string and it projects no columns (the meta-route walk flags it), so it is skip-coded `untyped_json_response` - the project's PostgREST OpenAPI document has marginal value in SQL. The function body read stays skip-coded. + +## 11. Network bans read via POST + +`POST /v1/projects/{ref}/network-bans/retrieve/enriched` (no body, 201 `{banned_ipv4_addresses: [{banned_address, identifier, requester_ip}]}`) is `network_bans.list` (select); the plain `/retrieve` (string rows) is the EXEC `retrieve`. A POST-backed SELECT with no body routes fine (proven). `DELETE /network-bans` carries `{ipv4_addresses}` (finding 8). + +## 12. Service split - 14 services emitted, oauth classified but excluded + +The final split (`provider-dev/config/service_names.json`) keeps the candidate list's core and adds what the inventory surfaced: `analytics`, `advisors`, `profile`. `oauth` (the OAuth-app user-agent flow) is classified so the inventory records its 4 operations reason-coded, but the rule carries `"excluded": true` and `bin/split.mjs` does not emit it - every operation in it is skip-coded and an empty service fails the meta-route walk. Function secrets do not exist as a distinct surface; `api-keys` sit in `secrets`; storage admin at management level is the bucket list plus the storage config (in `config`); billing is add-ons only; JIT access config sits in `database`. 14 services, 65 resources, 158 methods (71 selectable). + +Resource naming decisions beyond the mechanical derivation (all rules in `map_operations.mjs`): `branch_configs` (the branch-by-id detail read, a different shape from the project-scoped `branches` list/get), `action_runs`, `edge_functions` (the CLAUDE.md name), `queries`, `databases` (the deprecated metadata list plus `update_password`), `jit_access` / `jit_role_mappings` / `jit_invites` / `jit_access_configs` (the two plain reads on `/database/jit` and `/database/jit/list` would clash on signature in one resource), `restore_points`, `backup_schedules`, `readonly_mode`, `typescript_types`, `network_bans`, `logs` / `all_logs` / `api_counts` / `api_request_counts` / `function_stats`, `performance_lints` / `security_lints`, `disable_branching` (the DELETE that disables preview branching is an action, not a row delete), `upsert` (the migrations PUT), `claim` (the organization project claim POST). + +## 13. Project scope as a server variable - ref from SUPABASE_PROJECT_ID; joins do not fan out + +141 of 170 operations live under `/v1/projects/{ref}/...`. The split rebases them onto the server template `https://api.supabase.com/v1/projects/{ref}` (`provider-dev/config/servers.json`) with `x-stackQL-envVar: SUPABASE_PROJECT_ID` on the `ref` variable - the clickhouse organization precedent (any-sdk v0.5.4-alpha01 / stackql v0.10.601+). Every other path (the projects root and create, available regions, the organization surface, branch-by-id, snippets, profile, and `/v1/projects/{ref}` itself) keeps its full path and `post_process.mjs` pins it to the bare API base with a path-level `servers` override (any-sdk resolves servers operation -> path item -> document). Proven: with the variable set `ref` disappears from `SHOW METHODS` required params; `WHERE ref = ...` beats the environment; unset with no WHERE fails with "cannot find any viable servers"; `projects.get` keeps `ref` as a path parameter. The env var name follows the dashboard's "Project ID" label (Terraform reads only `SUPABASE_ACCESS_TOKEN`; the CLI CI examples use `SUPABASE_PROJECT_ID`). + +Consequence: **a JOIN cannot fan out over projects on `ref`**. The config singletons do not echo `ref` in their rows, so `projects p JOIN auth_configs a ON a.ref = p.ref` returns nothing (the inner read runs once, for the environment's project). The estate posture pattern is two statements - list projects, then per-`ref` reads composed with `UNION ALL` - and the docs teach it that way. Recorded so it is not rediscovered. + +## 14. Engine typing of statement values - INSERT and EXEC are typed, UPDATE is strings + +Probed against the mock (stackql v0.10.605): + +- `INSERT ... SELECT ..., true, 'micro'` marshals typed JSON (`"kps_enabled": true`). +- `EXEC ... @db_allowed_cidrs = '["203.0.113.0/24"]'` parses JSON-shaped strings into arrays; but EXEC cannot carry a boolean at all (`true`/`false` is a parser error, `'true'` and `1` fail the schema type check). +- `UPDATE ... SET x = ` accepts string and number literals only (`true` is "RHS of type BoolVal not yet supported"; `json('true')` serialises the parser AST into the body) and marshals both as strings: `SET disable_signup = 'true', jwt_exp = 7200` sends `{"disable_signup": "true", "jwt_exp": "7200"}`. + +So UPDATE of boolean/numeric config fields depends on the API coercing strings. The docs state that UPDATE values are sent as strings; the smoke suite's auth-config toggle is the live probe (finding 4). Two parser keywords also affect the surface: the `database` column on `projects` must be double-quoted (`json_extract("database", '$.version')`), and `body` (the edge function source) works as a column name. + +## 15. Edge function create/update - legacy query parameters shadowed the body + +`POST /functions` and `PATCH /functions/{function_slug}` declare their attributes twice: as deprecated query parameters (`slug`, `name`, `verify_jwt`, `import_map`, `entrypoint_path`, `import_map_path`, `ezbr_sha256`) and as the JSON body. any-sdk bound the INSERT columns to the query parameters first and the API rejected the body (`slug, name and body are required`). `pre_normalize.mjs` removes the 14 query duplicates; the body is canonical. The same script drops the `application/vnd.denoland.eszip` request variant (declared first, so any-sdk would have sent that content type) - the JSON create is the mapped path, the CLI the deploy path. + +## 16. snake_case surface - three camelCase corners + +The wire is snake_case almost everywhere. camelCase appears on: `ssl-enforcement` (`currentConfig`, `appliedSuccessfully`, body `requestedConfig`), `config/storage` (`fileSizeLimit`, `migrationVersion`, `databasePoolMode`, body `fileSizeLimit`), `network-restrictions/apply` (body `dbAllowedCidrs`, `dbAllowedCidrsV6`), `upgrade/status` (`databaseUpgradeStatus`), `jit-access` (`appliedSuccessfully`, `unavailableReason`) and the pooler config (`connectionString`, a duplicate of `connection_string`). `snake_case_aliases: true` on the provider config presents the response properties as snake columns; `request.nativeCasing: camel` on the three methods with camelCase bodies (`network_restrictions.apply`, `ssl_enforcement_configs.update`, `storage_configs.update`) lets snake SQL keys resolve (proven on the wire: `requested_config` -> `requestedConfig`, `file_size_limit` -> `fileSizeLimit`, `db_allowed_cidrs` -> `dbAllowedCidrs`). The pooler duplicate collided under aliasing (two `connection_string` columns, a DDL error at query time) and `pre_normalize.mjs` drops the camelCase copy. Nested JSON keeps wire casing (`json_extract(config, '$.dbAllowedCidrs')`). + +## 17. Vendor labelling of the Terraform provider - "Public Alpha", not "experimental" + +The word "experimental" does not appear in the Terraform provider's README or docs. The vendor's own label is Public Alpha (the Supabase features page lists "Terraform provider" at stage "Public Alpha"); the registry tier is "community". The provider covers 7 resources and 4 data sources (project, settings with api/auth/database/network/storage/ssl_enforcement blocks, branch, edge_function via the multipart deploy, edge_function_secrets, apikey, third_party_auth); the `pooler` settings block is declared but never read or written. It reads `SUPABASE_ACCESS_TOKEN` (and `SUPABASE_API_ENDPOINT` for the endpoint). CLAUDE.md and the README copy use the Public Alpha label. + +## Blockers / for the live smoke run + +- **No `SUPABASE_ACCESS_TOKEN` or standing dev project in this environment.** The repository is prepared for a colleague with a Supabase account to run `make smoke` (see `.env.example`). The first live run establishes: the string-typed UPDATE coercion (findings 4 and 14 - the auth-config toggle), whether the JSON edge function create still works (deprecated), the authenticated rate-limit headers (finding 6), `parameters` binding on the query endpoint (finding 1), and project-creation timing for the gated lifecycle (`make smoke-project-lifecycle`; free tier: two active projects, paused projects do not count). +- **Gated project lifecycle**: create (free plan, the standing project's org and region) -> wait `ACTIVE_HEALTHY` (the Terraform provider waits up to 5 minutes) -> `pause` -> wait `INACTIVE` -> delete. Never outside the gated target. + +## Testing requirements (carried from CLAUDE.md) + +Four layers, in order: offline validation (`make test-offline`: 38 checks over `SHOW`/`DESCRIBE`), integration tests against `tests/integration/mock_supabase_server.mjs` (`make test-integration`: 66 row-level checks, bearer token asserted throughout), meta-route tests (`make test-meta`: 14 services, 65 resources, 158 methods), and the pystackql smoke suite (`make smoke`, `make smoke-live` against the published provider) against the standing dev project - serial pacing at 1.2 s, `stackql-smoke-` / `STACKQL_SMOKE_` naming, breadcrumbs swept first, everything created cleaned up, config toggles restored. Never against a production organization or project. diff --git a/README.md b/README.md index 3fd6546..fe2f621 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,267 @@ -# stackql-provider-supabase -StackQL provider for Supabase +# `supabase` provider for [`stackql`](https://github.com/stackql/stackql) + +This repository builds and documents the `supabase` provider for StackQL, enabling SQL-based query and provisioning operations against the [Supabase Management API](https://supabase.com/docs/reference/api/introduction) - organizations and members, projects, preview branches, edge functions, secrets and API keys, project configuration (auth, Postgres, pooler, API, storage, realtime, SSL enforcement), custom domains, network restrictions and bans, backups and restore points, read replicas, add-ons, advisors, analytics, and the project SQL query endpoint. + +## Scope + +The provider maps the Management API at `https://api.supabase.com` (the control plane). The per-project data APIs (PostgREST at `.supabase.co/rest/v1`, Realtime, Storage object I/O, GoTrue user-facing auth) are per-project hosts with per-project keys - a different surface, reserved as a possible future `supabase_project` sibling provider and out of scope here. + +Supabase's official Terraform provider is labelled Public Alpha by the vendor and covers seven resources. This provider's coverage is generated mechanically from the vendor's published OpenAPI document - 158 operations across 14 services and 65 resources - and includes one capability outside the resource model: the project SQL query endpoint surfaced in-session, so the control plane (projects, config, secrets) and the project database itself are queryable in one place. + +## Design Principles + +1. **Fixed server, PAT bearer auth** - the API base is the literal `https://api.supabase.com`. Authentication is `Authorization: Bearer` with a personal access token in the `SUPABASE_ACCESS_TOKEN` environment variable (the Supabase CLI's and the Terraform provider's convention). +2. **Project scope is a server variable** - 144 of the 170 operations address a project by `ref`; all but the project get/update/delete (which keep their root path) are generated on the server template `https://api.supabase.com/v1/projects/{ref}` with `ref` resolved from `SUPABASE_PROJECT_ID` (`x-stackQL-envVar`) when it is set, so single-project queries need no `WHERE ref` clause. A `WHERE ref = '...'` value always takes precedence. +3. **Spec fetch is pinned** - the Management API serves its own unversioned OpenAPI document at `https://api.supabase.com/api/v1-json`. `bin/fetch-spec.sh` downloads, fixes deterministically, validates and pins it (URL, date, sha256) in `provider-dev/config/spec_pin.json`; the snapshot is committed so every refresh is a reviewed diff. +4. **Rate limit as a design input** - the Management API allows a fixed number of requests per minute per user (documented as 120; lower on analytics and database context endpoints). Test harnesses run serially and pace at 1.2 s; a 429 in CI is a harness bug, not a retry case. +5. **Config-as-rows is the audit surface** - auth settings (237 flat columns), Postgres settings, SSL enforcement and network restrictions per project are the posture queries the docs lead with. +6. **The query endpoint is the flagship** - `INSERT INTO supabase.database.queries (ref, query) SELECT ... RETURNING rows` runs SQL against the project database and returns the result set as one row's `rows` column. +7. **Deterministic pipeline** - every step is scripted and re-runnable; mapping decisions are rules in scripts, never hand-edits to derived artifacts. `provider-dev/config/all_services.csv` is committed as the durable record of every operation -> resource.method mapping, so a regeneration that moves or renames a method is a reviewable diff. +8. **Update semantics labelled honestly** - the API mixes PATCH and PUT; both map as `UPDATE` until full-replacement semantics are proven per resource. + +Cross-build findings from the sibling providers (clickhouse, hetzner, snowflake, keycloak, newrelic NOTES.md) are reused, not re-derived. Supabase-specific findings - the query endpoint decision, the spec fix classes, the project-scope server variable, the engine's string-typed `UPDATE` values, the bare-array secrets bodies - are recorded in [NOTES.md](NOTES.md). + +## Prerequisites + +- Node.js >= 20 +- A local `stackql` binary for testing (`$STACKQL`, `./stackql`, or on `PATH`; `bin/start-server.sh` downloads one only if none is found) +- GNU make and bash (Linux, WSL or macOS); Python 3 and yarn for the smoke suite and the website +- For live smoke tests: a Supabase account, a personal access token, and a standing free-tier dev project (never a production organization or project) + +Install dependencies: + +```bash +npm install +``` + +### Makefile + +Every step below is wrapped as a `make` target (`make help` lists them). The composite targets: + +```bash +make all # deps, full pipeline (fetch/pin verify, inventory, split, mappings, pre-normalize, + # normalize, generate, post-process), offline + integration + meta-route tests, + # docs generation, website build - no credentials needed +make test # the three credential-free test layers +make smoke # live smoke suite against the standing dev project (sources .env if present) +``` + +`make all` never touches a real account - the live suites are separate targets (`smoke`, `smoke-live` against the published provider, `smoke-read-only`, `smoke-project-lifecycle` for the gated project create/pause/delete, `smoke-cleanup` to sweep breadcrumbs). Live credentials are read from the environment or a gitignored `.env` file (see `.env.example`): + +```bash +SUPABASE_ACCESS_TOKEN=sbp_... # personal access token +SUPABASE_PROJECT_ID=abcdefghijklmnopqrst # the standing dev project's ref +``` + +## 0. Download and Pin the Spec + +```bash +make fetch-spec # verify against the recorded pin (fails on drift) +make refresh-spec # accept an upstream change (rewrites the pin - review the diff) +``` + +Pinned snapshot (2026-08-27): `Supabase API (v1)`, OpenAPI 3.0.0, 115 paths, 170 operations, upstream sha256 `660e5634fab8...`. Six deterministic fix classes are applied before validation and counted in the pin: `"type": "null"` -> `nullable: true` (5), `propertyNames` removed (3), numeric `exclusiveMinimum` lowered to the 3.0 form (3), `$schema` dialect keys removed (2), `const` -> `enum` (2), and `hideDefinitions` (0 in this snapshot). The 2026-08 refresh added one operation (a Prometheus metrics scrape, skipped as text) and changed 86 schemas. + +## 1. Endpoint Inventory and Service Split + +```bash +make inventory +``` + +Writes `provider-dev/config/endpoint_inventory.csv`: one row per operation with `ref`/`slug` scoping, pagination parameters, request body kind (multipart/eszip/bare-array flagged), update-verb semantics presumption, the vendor's `[Beta]`/`[Alpha]` label, the deprecated flag, response shape, proposed service/resource/verb, and a skip reason where an operation is not mapped. + +Inventory of the pinned snapshot: 170 operations, 158 mapped and 12 skipped with reason codes (4 `oauth_user_agent_flow`, 3 `non_json_text_response`, 1 `multipart_eszip_deploy`, 1 `untyped_function_body`, 1 `untyped_json_response`, 1 `bare_array_bulk_body`, 1 `head_count_endpoint`). 35 operations carry `[Beta]`, 1 `[Alpha]`, 5 are deprecated. 144 operations scope by project `ref`, 6 by organization `slug`, 8 by branch id, 12 by the token itself. + +The service split is recorded as ordered path rules in `provider-dev/config/service_names.json` (first match wins, unmatched paths fail the build; `oauth` is classified but excluded from the provider since every operation in it is skip-coded): + +| Service | Resources | +|---|---| +| `projects` | projects, organization_projects, available_regions, service_health, restore_versions, upgrade_eligibility, upgrade_status, read_replicas, claim_tokens, disk_configs, disk_autoscale_configs, disk_utilization | +| `organizations` | organizations, members, entitlements, project_claims | +| `branches` | branches, branch_configs, action_runs | +| `config` | auth_configs, auth_signing_keys, legacy_signing_keys, sso_providers, third_party_auth_integrations, postgres_configs, pooler_configs, pgbouncer_configs, postgrest_configs, storage_configs, realtime_configs, ssl_enforcement_configs, pgsodium_configs | +| `network` | network_restrictions, network_bans | +| `domains` | custom_hostnames, vanity_subdomains | +| `functions` | edge_functions | +| `secrets` | secrets, api_keys, legacy_api_keys | +| `database` | queries, migrations, backups, backup_schedules, restore_points, snippets, databases, jit_access, jit_role_mappings, jit_invites, jit_access_configs, readonly_mode, typescript_types, webhooks, cli_login_roles | +| `storage` | buckets | +| `billing` | addons | +| `analytics` | logs, all_logs, api_counts, api_request_counts, function_stats | +| `advisors` | security_lints, performance_lints | +| `profile` | profiles | + +## 2. Split into Service Specs + +```bash +make split +``` + +`bin/split.mjs` splits by the path rules, then rebases every project-scoped path onto the server template in `provider-dev/config/servers.json` (dropping the `/v1/projects/{ref}` prefix and the `ref` path parameter, which becomes the server variable). The 18 non-project paths keep their full path and are pinned back to the API base by the post-process step. + +## 3. Generate Mappings + +```bash +make mappings +``` + +Regenerates `provider-dev/config/all_services.csv` from scratch and populates the `stackql_*` columns deterministically (`map_operations.mjs`: resource derivation from the path, `RESOURCE_RULES` and `METHOD_RULES` for the named exceptions). Validates before writing: every operation mapped or skipped with a reason, every spec operation present in the CSV, `(resource, method)` unique per service, and unique required-parameter signatures per `(resource, sqlVerb)`. + +| Operation pattern | StackQL verb | Resource / method | +|---|---|---| +| GET collection | `SELECT` | `.list` (bare arrays wrapped by normalize; envelopes carry their key) | +| GET single / config singleton | `SELECT` | `.get` | +| POST create | `INSERT` | `.create` | +| PATCH / PUT edit | `UPDATE` | `.update` | +| DELETE | `DELETE` | `.delete` | +| `POST .../database/query` | `INSERT` (`RETURNING rows`) | `database.queries.run`; the read-only sibling is `EXEC queries.run_read_only` | +| lifecycle actions (pause, restart, restore, upgrade, branch push/merge/reset, hostname activate, ...) | `EXEC` | `.` | +| POST-backed reads (network bans) | `SELECT` | `network_bans.list` | + +Mapped: 71 `SELECT`, 17 `INSERT`, 21 `UPDATE`, 17 `DELETE`, 32 `EXEC`. + +## 4. Normalize the Service Specs + +```bash +make pre-normalize normalize +``` + +`pre_normalize.mjs` applies the Supabase-specific adjustments (the eszip request variant and the deprecated query-parameter duplicates on the edge function create/update, the query endpoint's result schema, the secrets bulk bodies rewritten to single-item objects, the pooler config's camelCase duplicate column); the provider-utils normalize pass then flattens `allOf`, lowers `oneOf`/`anyOf`, and wraps the 13 bare-array list responses. + +## 5. Generate the Provider + +```bash +make generate +``` + +which runs: + +```bash +rm -rf provider-dev/openapi/* +npm run generate-provider -- \ + --provider-name supabase \ + --input-dir provider-dev/source \ + --output-dir provider-dev/openapi/src/supabase \ + --config-path provider-dev/config/all_services.csv \ + --servers provider-dev/config/servers.json \ + --provider-config '{"auth": {"type": "bearer", "credentialsenvvar": "SUPABASE_ACCESS_TOKEN"}, "snake_case_aliases": true}' \ + --naive-req-body-translate \ + --overwrite +node provider-dev/scripts/post_process.mjs +``` + +`--naive-req-body-translate` exposes top-level request body properties as columns, so `INSERT INTO supabase.secrets.secrets (name, value) ...` and `UPDATE supabase.config.auth_configs SET disable_signup = 'true'` render the wire bodies as written. `post_process.mjs` pins the non-project paths to the API base (path-level `servers`), configures cursor pagination on `snippets.list`, sets `request.nativeCasing: camel` on the three camelCase-body methods, attaches the query endpoint's result binding, the POST-backed `network_bans.list` objectKey, the secrets request transforms (single-item object -> the bare array the wire expects) and naive body translation on the two DELETEs with bodies, and validates that every other path is project-relative. + +### Server parameters + +The only server variable is `ref`. With `SUPABASE_PROJECT_ID` exported it is resolved automatically: + +```sql +SELECT disable_signup, mfa_totp_enroll_enabled FROM supabase.config.auth_configs; +``` + +A `WHERE ref = '...'` value takes precedence (one session, several projects); with the variable unset the parameter is required and listed by `SHOW METHODS`. `projects.list`, the organization surface, `profile` and `snippets` need neither. A JOIN cannot fan out over projects on `ref` (the config rows do not echo it); the estate posture pattern is a projects list followed by per-`ref` reads composed with `UNION ALL`. + +### Authentication + +Provider config: `{"auth": {"type": "bearer", "credentialsenvvar": "SUPABASE_ACCESS_TOKEN"}}`. A different variable can be passed at runtime with `--auth='{"supabase": {"type": "bearer", "credentialsenvvar": "..."}}'`. + +### Value typing + +`INSERT` and `EXEC` send typed JSON (booleans, numbers, JSON-shaped strings parsed into arrays). The stackql engine marshals every `UPDATE ... SET` value as a string (`SET disable_signup = 'true', password_min_length = '12'`); whether the Management API coerces string-typed booleans and numbers is established by the live smoke suite's auth-config toggle (NOTES.md finding 14). + +## 6. Test the Provider + +Four layers, in order. Every regeneration is followed by the first three before commit (`make test`); the fourth is live. + +### Validate offline + +```bash +make test-offline # node tests/offline_validation.mjs +``` + +`SHOW SERVICES` / `SHOW RESOURCES` / `SHOW METHODS` and `DESCRIBE EXTENDED` against the local file registry - 38 checks: the 14 services and 65 resources, the verb mapping on `projects.projects`, that `ref` is required only when `SUPABASE_PROJECT_ID` is unset, the `queries.run` INSERT binding, the wide flat auth config (> 200 columns), the snake_case aliases on SSL enforcement, the pooler duplicate dropped, the single-item secrets bodies, the naive DELETE body on `network_bans`, the branch method split. + +### Integration tests (mock Management API - no account required) + +```bash +make test-integration # add -- --verbose for per-query output +``` + +Runs the provider against an in-process mock of the Management API ([tests/integration/mock_supabase_server.mjs](tests/integration/mock_supabase_server.mjs)) serving the wire shapes the spec declares and enforcing the bearer token. The runner materialises a test copy of the registry with the server URLs pointed at the mock (server variables and the `x-stackQL-envVar` extension preserved) and asserts 66 row-level checks: bare-array wraps and single reads, the bearer header, `SUPABASE_PROJECT_ID` resolution vs a `WHERE ref` override vs the unset failure mode, the root paths on their overrides, the secrets bulk `INSERT`/`DELETE` wire bodies, an auth-config `UPDATE` toggle and restore, the snake_case corners (`requested_config` -> `requestedConfig`, `file_size_limit` -> `fileSizeLimit`, `db_allowed_cidrs` -> `dbAllowedCidrs`), the POST-backed bans read and the DELETE with a body, the query endpoint (`INSERT ... RETURNING rows` flowing a 2-row fixture, the `read_only` flag, the read-only sibling), an `EXEC` lifecycle action, an edge function lifecycle, API key pushdown and lifecycle, snippets cursor pagination across two pages, the envelope object keys, and the 404. [tests/integration/probe.mjs](tests/integration/probe.mjs) runs ad-hoc statements against the mock and prints the wire calls. + +### Meta-route test suite + +```bash +make test-meta # npm run start-server / test-meta-routes -- supabase / stop-server +``` + +Walks every service, resource and method over a local wire server: 14 services, 65 resources, 158 methods, 71 selectable, no failures. + +### Smoke tests (live) + +```bash +make smoke # reads + cheap write lifecycles + the query round trip (local registry) +make smoke-live # the same against the published provider (post-publish verification) +make smoke-read-only # read smokes only +make smoke-project-lifecycle # additionally the gated project create / pause / delete (minutes, free-tier quota) +make smoke-cleanup # sweep stackql-smoke-* breadcrumbs +``` + +[tests/smoke_test.py](tests/smoke_test.py) (pystackql) runs against the standing free-tier dev project named by `SUPABASE_PROJECT_ID`: read smokes (profile, organizations, the project estate, the posture set, secrets, API keys, edge functions, branches, health, add-ons, security lints, backups, storage, migrations, snippets) and self-cleaning write lifecycles - a secret `INSERT`/`SELECT`/`DELETE`, an API key `INSERT`/`SELECT`/`UPDATE`/`DELETE`, an edge function `INSERT`/`UPDATE`/`DELETE` (the vendor-deprecated JSON create), an auth-config toggle-and-restore (the string-typed `UPDATE` probe), an idempotent network-restrictions re-apply, and the query round trip (fixture table created, populated, read through `RETURNING rows`, dropped). Everything is named `stackql-smoke-` / `STACKQL_SMOKE_` and swept first. Free-tier cost: nothing. Statements are paced at 1.2 s; a 429 fails the run. The harness upgrades pystackql's managed stackql binary to >= v0.10.601 when older. Never run this against a production organization or project. + +The live suite has not yet been run from this repository (no token in the build environment); NOTES.md lists what the first run establishes. + +### UAT + +```bash +set -a; source .env; set +a +REG_ROOT="$(pwd)/provider-dev/openapi" +REG="{\"url\":\"file://${REG_ROOT}\",\"localDocRoot\":\"${REG_ROOT}\",\"verifyConfig\":{\"nopVerify\":true}}" +stackql --registry="${REG}" shell +``` + +### CI + +[.github/workflows/build-and-test.yml](.github/workflows/build-and-test.yml): pin check + build + generation-drift check, offline validation, integration tests, meta-route tests and docs generation on every push and PR; the secret-gated live smoke suite (never the project lifecycle) on pushes; and a weekly `spec-drift` job that fetches the served spec, compares it with the pin, and opens a `spec-drift` issue when it moves. The web workflows build and deploy the microsite from `main`. + +## 7. Publish the Provider + +To publish, push the `supabase` dir to `providers/src` in a feature branch of the [`stackql-provider-registry`](https://github.com/stackql/stackql-provider-registry) and follow the [registry release flow](https://github.com/stackql/stackql-provider-registry/blob/dev/docs/build-and-deployment.md). Pull and verify from the dev registry: + +```bash +export DEV_REG="{ \"url\": \"https://registry-dev.stackql.app/providers\" }" +stackql --registry="${DEV_REG}" shell +``` + +```sql +registry pull supabase; +``` + +then `make smoke-live`. + +## 8. Generate Web Docs + +The doc microsite (`website/`) is Docusaurus 3.10 and follows the shared architecture used by the other provider microsites: navbar/footer/theme/plugin configuration lives in [`stackql/docusaurus-config`](https://github.com/stackql/docusaurus-config), vendored into `.shared-config/` at build time. Site-local files are limited to the provider identity (`website/provider.js`), thin wrappers (`docusaurus.config.js` flips `showLastUpdateTime` on so every page carries a "Last updated on" stamp), the shared components/theme under `src/`, and static assets including `static/CNAME` (`supabase-provider.stackql.io`). + +```bash +make docs # generate-docs --snake-case-aliases + website/scripts/sanitize-docs.mjs +make website # yarn install && yarn build (vendors the shared config; needs GitHub access) +make website-start +``` + +`headerContent1.txt` / `headerContent2.txt` in `provider-dev/docgen/provider-data/` supply the landing page: installation, scope, token creation and the env var convention, project scope, the rate limit, beta labelling, and the example queries (estate inventory, the project security posture in four statements, control plane to Postgres rows in two statements, secrets and function inventory, branch hygiene, provisioning, and the serverless Postgres estate query alongside neon). `sanitize-docs.mjs` escapes MDX-hostile description text and annotates every generated `ref` example "required unless SUPABASE_PROJECT_ID is set". + +To publish, select GitHub Actions as the Pages source and create the DNS record (the served hostname is pinned by `website/static/CNAME`): + +| Source Domain | Record Type | Target | +|---|---|---| +| supabase-provider.stackql.io | CNAME | stackql.github.io. | + +## License + +MIT - see [LICENSE](LICENSE). + +## Contributing + +Issues and pull requests welcome. Regenerations must be followed by `make test` before commit; test harnesses must pace under the Management API rate limit and clean up everything they create. diff --git a/bin/fetch-spec.sh b/bin/fetch-spec.sh new file mode 100644 index 0000000..f02235c --- /dev/null +++ b/bin/fetch-spec.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +# Downloads the Supabase Management API OpenAPI spec (served unauthenticated +# as JSON at https://api.supabase.com/api/v1-json - the canonical path, from +# which the vendor's API reference is generated) into provider-dev/downloaded/, +# validates it with @apidevtools/swagger-parser, and records the fetch date +# and content hash in provider-dev/config/spec_pin.json. +# +# The spec URL is not versioned and Supabase ships fast, so the pin is the +# record of what was built. If a download does not match the recorded pin the +# script fails without writing anything; pass --update to accept the upstream +# change and rewrite the pin (treat the resulting spec diff as a reviewed +# refresh). +# +# Usage: bin/fetch-spec.sh [--update] + +set -euo pipefail + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +REPO_ROOT="$( cd "$SCRIPT_DIR/.." && pwd )" +DOWNLOAD_DIR="$REPO_ROOT/provider-dev/downloaded" +PIN_FILE="$REPO_ROOT/provider-dev/config/spec_pin.json" + +SPEC_URL="https://api.supabase.com/api/v1-json" +SPEC_FILE="supabase-v1.json" + +UPDATE=false +if [ "${1:-}" = "--update" ]; then + UPDATE=true +fi + +mkdir -p "$DOWNLOAD_DIR" +TMP_DIR="$(mktemp -d)" +trap 'rm -rf "$TMP_DIR"' EXIT + +echo "Fetching Supabase Management API spec from $SPEC_URL" +curl -fsSL "$SPEC_URL" -o "$TMP_DIR/$SPEC_FILE" + +# Validate, verify against the pin (or write it), then move into place. +UPDATE="$UPDATE" TMP_DIR="$TMP_DIR" DOWNLOAD_DIR="$DOWNLOAD_DIR" PIN_FILE="$PIN_FILE" \ +SPEC_URL="$SPEC_URL" SPEC_FILE="$SPEC_FILE" \ +node "$REPO_ROOT/provider-dev/scripts/record_spec_pin.mjs" + +echo "Spec downloaded to $DOWNLOAD_DIR/$SPEC_FILE, pin recorded in $PIN_FILE" diff --git a/bin/server-status.sh b/bin/server-status.sh new file mode 100644 index 0000000..a522337 --- /dev/null +++ b/bin/server-status.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +# Default port +PORT="5444" + +# Parse command line arguments +while [[ $# -gt 0 ]]; do + case $1 in + --port) + PORT="$2" + shift 2 + ;; + --help) + echo "Usage: server-status.sh [--port PORT]" + echo "Check status of StackQL server" + exit 0 + ;; + *) + echo "Unknown option: $1" + echo "Usage: server-status.sh [--port PORT]" + exit 1 + ;; + esac +done + +# Search for stackql process running on specified port +stackql_process=$(ps -ef | grep -E "[s]tackql.*--pgsrv.port=${PORT}") + +# Check if the process is running +if [ -z "$stackql_process" ]; then + echo "StackQL server is not running on port ${PORT}." + exit 1 +else + # Extract PID using awk + pid=$(echo "$stackql_process" | awk '{print $2}') + + # Get process start time + if [ "$(uname)" == "Darwin" ]; then + # macOS + start_time=$(ps -p $pid -o lstart= 2>/dev/null) + else + # Linux + start_time=$(ps -p $pid -o lstart= 2>/dev/null) + fi + + # Get registry path if possible + registry_info=$(echo "$stackql_process" | grep -o -E "registry=\{[^}]+\}") + + echo "StackQL server is running on port ${PORT} (PID: ${pid})" + echo "Started: ${start_time}" + + if [ ! -z "$registry_info" ]; then + echo "Registry: ${registry_info#*=}" + fi + + # Check if we can connect to the server + echo "Testing connection..." + if command -v psql &> /dev/null; then + if PGPASSWORD=stackql psql -h localhost -p ${PORT} -U stackql -d stackql -c "SELECT 1 as test" &> /dev/null; then + echo "✅ Server is accepting connections" + else + echo "❌ Could not connect to server" + fi + else + echo "Note: Install psql client to test connection" + fi + + # Check server log + BASE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )" + LOG_FILE="${BASE_DIR}/stackql-server.log" + + if [ -f "$LOG_FILE" ]; then + echo "Recent log entries:" + tail -n 5 "$LOG_FILE" + fi + + exit 0 +fi \ No newline at end of file diff --git a/bin/split.mjs b/bin/split.mjs new file mode 100644 index 0000000..9cd07a7 --- /dev/null +++ b/bin/split.mjs @@ -0,0 +1,127 @@ +#!/usr/bin/env node + +// Splits the pinned Supabase Management API spec into per-service StackQL +// service specs. The spec is split by the ordered path rules in +// provider-dev/config/service_names.json (shared with build_inventory.mjs via +// lib/spec_helpers.mjs); the vendor's tags are too coarse for the split +// (Database spans the query endpoint, migrations, backups, JIT and pooler +// config; Projects spans lifecycle, network and disk). Unmatched paths fail +// the run without writing. +// +// provider-utils split() cleans its output dir on every call, so the spec is +// split into a temp dir and the requested service specs are copied into +// --output-dir (all services by default, or a --services subset). +// +// After the split every service spec is rebased onto the project-scoped +// server template in provider-dev/config/servers.json +// (https://api.supabase.com/v1/projects/{ref}, the {ref} server variable +// carrying x-stackQL-envVar: SUPABASE_PROJECT_ID so stackql resolves it from +// the environment - the clickhouse organization precedent). Project-scoped +// paths lose the /v1/projects/{ref} prefix and the ref path parameter; every +// other path keeps its full path and is pinned back to the bare API base by a +// path-level servers override, injected by provider-dev/scripts/post_process.mjs +// after generation (the normalize step strips path-level servers). +// +// Usage: +// node bin/split.mjs --provider-name supabase \ +// [--api-doc provider-dev/downloaded/supabase-v1.json] \ +// [--output-dir provider-dev/source] \ +// [--services projects,config,secrets] [--overwrite] [--verbose] + +import fs from 'fs'; +import os from 'os'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import yaml from 'js-yaml'; +import { providerdev } from '@stackql/provider-utils'; +import { makeServiceResolver, excludedServices, REF_PREFIX, rebaseRefScopedPaths } from '../provider-dev/scripts/lib/spec_helpers.mjs'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); + +const args = process.argv.slice(2); +const getArg = (flag) => { + const index = args.indexOf(flag); + return index !== -1 ? args[index + 1] : null; +}; + +const providerName = getArg('--provider-name') || 'supabase'; +const apiDoc = getArg('--api-doc') || path.join(repoRoot, 'provider-dev', 'downloaded', 'supabase-v1.json'); +const outputDir = getArg('--output-dir') || path.join(repoRoot, 'provider-dev', 'source'); +const servicesFilter = getArg('--services') ? getArg('--services').split(',').map((s) => s.trim()) : null; +const overwrite = args.includes('--overwrite'); +const verbose = args.includes('--verbose'); + +if (!fs.existsSync(apiDoc)) { + console.error(`Error: spec not found at ${apiDoc} (run npm run fetch-spec first)`); + process.exit(1); +} +const resolveService = makeServiceResolver(); +const excluded = excludedServices(); +const serversPath = path.join(repoRoot, 'provider-dev', 'config', 'servers.json'); +const servers = JSON.parse(fs.readFileSync(serversPath, 'utf8')); + +// Prepare the output directory, preserving non-spec files (e.g. .gitkeep) +fs.mkdirSync(outputDir, { recursive: true }); +const existing = fs.readdirSync(outputDir).filter((f) => /\.(yaml|yml|json)$/.test(f)); +if (existing.length > 0 && !overwrite) { + console.error(`Error: output directory ${outputDir} is not empty. Use --overwrite to replace existing service specs.`); + process.exit(1); +} + +const unmapped = new Set(); +const svcDiscriminatorFn = (pathKey) => { + const service = resolveService(pathKey); + if (!service) { + unmapped.add(pathKey); + return 'unmapped_service'; + } + return service; +}; + +const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'stackql-split-')); +const written = []; +const skipped = []; +try { + const result = await providerdev.split({ + apiDoc, + providerName, + outputDir: tmpDir, + svcDiscriminator: 'function', + svcDiscriminatorFn, + overwrite: true, + verbose, + svcNameOverrides: {} + }); + if (!result) { + console.error('Error: split failed'); + process.exit(1); + } + if (unmapped.size > 0) { + console.error('Error: paths with no service rule in provider-dev/config/service_names.json:'); + for (const t of [...unmapped].sort()) console.error(` ${t}`); + process.exit(1); + } + + // Clear previous service specs only after the split and config validated + for (const f of existing) { + fs.rmSync(path.join(outputDir, f)); + } + for (const outFile of fs.readdirSync(tmpDir)) { + const service = outFile.replace(/\.(yaml|yml|json)$/, ''); + if (servicesFilter && !servicesFilter.includes(service)) continue; + if (excluded.has(service)) { skipped.push(service); continue; } + const doc = yaml.load(fs.readFileSync(path.join(tmpDir, outFile), 'utf8')); + const { rebased, kept } = rebaseRefScopedPaths(doc, servers); + fs.writeFileSync(path.join(outputDir, outFile), yaml.dump(doc, { lineWidth: -1, noRefs: true })); + written.push(`${outFile} (${rebased} paths rebased under ${REF_PREFIX}${kept ? `, ${kept} root paths kept` : ''})`); + } +} finally { + fs.rmSync(tmpDir, { recursive: true, force: true }); +} + +console.log(`Split completed: ${written.length} service specs written to ${outputDir}`); +for (const f of written.sort()) { + console.log(` ${f}`); +} +if (skipped.length) console.log(`Excluded (every operation skip-coded, no service emitted): ${skipped.join(', ')}`); +console.log(`Server template: ${servers[0].url} (ref via x-stackQL-envVar ${servers[0].variables.ref['x-stackQL-envVar']}; non-project paths pinned to the API base in post_process)`); diff --git a/bin/start-server.sh b/bin/start-server.sh new file mode 100644 index 0000000..5983f75 --- /dev/null +++ b/bin/start-server.sh @@ -0,0 +1,143 @@ +#!/bin/bash + +# Get current directory +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +BASE_DIR="$( cd "$DIR/.." && pwd )" + +# Parse command line arguments +PROVIDER="" +REG_PATH="" +PORT="5444" +VERIFY="false" + +function display_help() { + echo "Usage: start-server.sh [OPTIONS]" + echo "Options:" + echo " --provider NAME Provider name (default: use provider from package.json)" + echo " --registry PATH Path to local registry (default: current directory)" + echo " --port PORT Port to run server on (default: 5444)" + echo " --verify Enable signature verification (default: false)" + echo " --help Display this help message" +} + +while [[ $# -gt 0 ]]; do + case $1 in + --provider) + PROVIDER="$2" + shift 2 + ;; + --registry) + REG_PATH="$2" + shift 2 + ;; + --port) + PORT="$2" + shift 2 + ;; + --verify) + VERIFY="true" + shift + ;; + --help) + display_help + exit 0 + ;; + *) + echo "Unknown option: $1" + display_help + exit 1 + ;; + esac +done + +# If provider not specified, try to get from package.json +if [ -z "$PROVIDER" ]; then + if [ -f "$BASE_DIR/package.json" ]; then + PROVIDER=$(grep -o '"name": "stackql-provider-[^"]*"' "$BASE_DIR/package.json" | sed 's/"name": "stackql-provider-//' | sed 's/"//') + fi +fi + +# If registry path not specified, use current directory +if [ -z "$REG_PATH" ]; then + REG_PATH="$BASE_DIR/provider-dev/openapi" +fi + +echo "Using provider: $PROVIDER" +echo "Registry path: $REG_PATH" +echo "Port: $PORT" +echo "Verify signatures: $VERIFY" + +# Binary resolution: $STACKQL, ./stackql, then `stackql` on PATH (the test +# runners resolve the same way); download into the repo only as a last resort. +STACKQL_BIN="" +if [ -n "${STACKQL:-}" ] && [ -x "$STACKQL" ]; then + STACKQL_BIN="$STACKQL" +elif [ -x "$BASE_DIR/stackql" ]; then + STACKQL_BIN="$BASE_DIR/stackql" +elif command -v stackql >/dev/null 2>&1; then + STACKQL_BIN="$(command -v stackql)" +fi +if [ -z "$STACKQL_BIN" ]; then + echo "StackQL binary not found. Downloading..." + + # Determine OS and architecture + OS=$(uname -s | tr '[:upper:]' '[:lower:]') + ARCH=$(uname -m) + + # Map architecture to stackql naming + if [ "$ARCH" = "x86_64" ]; then + ARCH="amd64" + elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then + ARCH="arm64" + fi + + # Set download URL based on OS + if [ "$OS" = "darwin" ]; then + DOWNLOAD_URL="https://releases.stackql.io/stackql/latest/stackql_darwin_${ARCH}.zip" + elif [ "$OS" = "linux" ]; then + DOWNLOAD_URL="https://releases.stackql.io/stackql/latest/stackql_linux_${ARCH}.zip" + else + echo "Unsupported OS: $OS" + echo "Please download stackql manually from https://github.com/stackql/stackql/releases" + exit 1 + fi + + # Download and extract + cd "$BASE_DIR" + curl -L -o stackql.zip "$DOWNLOAD_URL" + unzip -o stackql.zip + rm stackql.zip + chmod +x stackql + STACKQL_BIN="$BASE_DIR/stackql" + echo "StackQL binary downloaded successfully" +fi +echo "Using stackql: $STACKQL_BIN ($("$STACKQL_BIN" --version 2>/dev/null | head -1))" + +# Set registry configuration +if [ "$VERIFY" = "true" ]; then + REG='{"url": "file://'${REG_PATH}'", "localDocRoot": "'${REG_PATH}'", "verifyConfig": {"nopVerify": false}}' +else + REG='{"url": "file://'${REG_PATH}'", "localDocRoot": "'${REG_PATH}'", "verifyConfig": {"nopVerify": true}}' +fi + +# Check if server is already running +if pgrep -f "stackql.*--pgsrv.port=${PORT}" > /dev/null; then + echo "StackQL server is already running on port ${PORT}" + exit 0 +fi + +# Start the server +echo "Starting StackQL server with registry: $REG" +cd "$BASE_DIR" +nohup "$STACKQL_BIN" --registry="${REG}" --pgsrv.port="${PORT}" srv > stackql-server.log 2>&1 & +SERVER_PID=$! + +# Check if server started successfully +sleep 2 +if ps -p $SERVER_PID > /dev/null; then + echo "StackQL server started successfully with PID: $SERVER_PID" + echo "Server log: $BASE_DIR/stackql-server.log" +else + echo "Failed to start StackQL server. Check log file: $BASE_DIR/stackql-server.log" + exit 1 +fi \ No newline at end of file diff --git a/bin/stop-server.sh b/bin/stop-server.sh new file mode 100644 index 0000000..fc7f070 --- /dev/null +++ b/bin/stop-server.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# Get command line arguments +PORT="5444" + +while [[ $# -gt 0 ]]; do + case $1 in + --port) + PORT="$2" + shift 2 + ;; + *) + echo "Unknown option: $1" + echo "Usage: stop-server.sh [--port PORT]" + exit 1 + ;; + esac +done + +# Find the process ID of the StackQL server on the specified port +PID=$(pgrep -f "stackql.*--pgsrv.port=${PORT}") + +if [ -z "$PID" ]; then + echo "No stackql server found running on port ${PORT}." +else + echo "Stopping stackql server on port ${PORT} (PID: $PID)..." + kill $PID + + # Check if server stopped + sleep 2 + if ps -p $PID > /dev/null; then + echo "Server did not stop gracefully, attempting force kill..." + kill -9 $PID + + sleep 1 + if ps -p $PID > /dev/null; then + echo "Failed to stop server. Please check manually with 'ps -ef | grep stackql'" + exit 1 + fi + fi + + echo "StackQL server stopped successfully." +fi \ No newline at end of file diff --git a/bin/test-meta-routes.cjs b/bin/test-meta-routes.cjs new file mode 100644 index 0000000..99f7c5d --- /dev/null +++ b/bin/test-meta-routes.cjs @@ -0,0 +1,458 @@ +#!/usr/bin/env node + +const { runQuery } = require('@stackql/pgwire-lite'); +const fs = require('fs'); +const path = require('path'); + +// Get current directory +const baseDir = path.resolve(path.dirname(process.argv[1]), '..'); + +// Default connection settings +const defaultOptions = { + user: 'stackql', + database: 'stackql', + // IPv4 loopback, not 'localhost': stackql srv binds 0.0.0.0 and Node + // resolves 'localhost' to ::1 first, which refuses the connection + host: '127.0.0.1', + port: 5444, + debug: false, +}; + +// Parse command line arguments +const args = process.argv.slice(2); +let provider = null; +let port = 5444; +let host = '127.0.0.1'; +let verbose = false; +let outputFormat = 'json'; +let timeoutMs = 60000; // Default timeout: 60 seconds + +for (let i = 0; i < args.length; i++) { + if (args[i].startsWith('--')) { + switch (args[i]) { + case '--port': + port = parseInt(args[++i], 10); + break; + case '--host': + host = args[++i]; + break; + case '--verbose': + verbose = true; + break; + case '--format': + outputFormat = args[++i]; + if (!['json', 'csv', 'markdown'].includes(outputFormat)) { + console.error(`Error: Invalid output format "${outputFormat}". Must be json, csv, or markdown.`); + process.exit(1); + } + break; + case '--timeout': + timeoutMs = parseInt(args[++i], 10); + break; + case '--help': + console.log(` +Usage: test-meta-routes.js [OPTIONS] + +Test all metadata routes for a StackQL provider. + +Arguments: + provider Name of the provider to test + +Options: + --port PORT Server port (default: 5444) + --verbose Enable verbose output + --format FORMAT Output format: json, csv, markdown (default: json) + --timeout MILLISECONDS Query timeout in milliseconds (default: 60000) + --help Display this help message + `); + process.exit(0); + break; + default: + console.error(`Error: Unknown option "${args[i]}"`); + process.exit(1); + } + } else if (!provider) { + provider = args[i]; + } +} + +// Check that provider was specified +if (!provider) { + console.error('Error: Provider name must be specified'); + console.error('Usage: test-meta-routes.js [OPTIONS]'); + process.exit(1); +} + +// Set up connection options +const connectionOptions = { + ...defaultOptions, + host, + port, + // Set query timeout + statement_timeout: timeoutMs, +}; + +// Get start time +const startTime = new Date(); + +// resources whose select response is a scalar (text) body - a single +// anonymous column at query time, so DESCRIBE EXTENDED is legitimately +// empty. Currently empty: pods_log gets a response transform (one row per +// log line) in post_process.mjs, so it has real columns. +const SCALAR_RESPONSE_RESOURCES = new Set([]); + +const results = { + provider, + totalServices: 0, + totalResources: 0, + totalMethods: 0, + selectableMethods: 0, + nonSelectableResourceCount: 0, + nonSelectableResources: [], + scalarResponseResources: [], + failures: [], +}; + +/** + * Run a query and handle errors + * @param {string} query - SQL query to run + * @param {string} description - Description for logging + * @returns {Promise} - Query results + */ +async function executeQuery(query, description) { + if (verbose) { + console.log(`Running: ${query}`); + } else { + process.stdout.write(`${description}... `); + } + + try { + const result = await runQuery(connectionOptions, query); + + if (!verbose) { + if (result.data && result.data.length) { + console.log(`✅ (${result.data.length} rows)`); + } else { + console.log('✅'); + } + } else { + console.info(result.data); + } + + return result.data; + } catch (error) { + if (!verbose) { + console.log('❌'); + } + + results.errors.push({ + query, + description, + error: error.message, + timestamp: new Date().toISOString() + }); + + results.summary.errors++; + + if (error.message.includes('the last operation didn\'t produce a result')) { + return []; + } + + if (error.message.includes('SELECT not supported for this resource')) { + if (verbose) { + console.warn(` Warning: Resource is not selectable`); + } + return null; + } + + console.error(`Error executing ${description}: ${error.message}`); + return []; + } +} + +/** + * Test all provider meta routes + */ +async function testMetaRoutes() { + try { + console.log(`\n🔍 Testing meta routes for provider: ${provider}\n`); + + // SHOW PROVIDERS to verify provider exists + const registryQuery = "SHOW PROVIDERS"; + const providers = await executeQuery(registryQuery, "Checking registry providers"); + + const providerExists = providers && providers.some(p => p.name === provider); + if (!providerExists) { + console.error(`Error: Provider '${provider}' not found in registry`); + if (providers && providers.length > 0) { + console.log("Available providers:"); + providers.forEach(p => console.log(` - ${p.name}`)); + } + process.exit(1); + } + + // SHOW SERVICES IN + const servicesQuery = `SHOW SERVICES IN ${provider}`; + const services = await executeQuery(servicesQuery, "Getting services"); + + if (!services || services.length === 0) { + console.error(`Error: No services found for provider '${provider}'`); + process.exit(1); + } + + console.log(`\nFound ${services.length} services in ${provider}`); + results.totalServices += services.length; + + // for each service + for (const service of services) { + const serviceName = service.name; + console.log(`\n📊 Processing service: ${serviceName}`); + + // SHOW RESOURCES IN . + const resourcesQuery = `SHOW RESOURCES IN ${provider}.${serviceName}`; + const resources = await executeQuery(resourcesQuery, `Getting resources for ${serviceName}`); + + if (!resources || resources.length === 0) { + console.error(`Error: No resources found for ${provider}.${serviceName}`); + process.exit(1); + } + + console.log(`Found ${resources.length} resources in ${serviceName}`); + results.totalResources += resources.length; + + // for each resource + for (const resource of resources) { + const resourceName = resource.name; + console.log(`\n 🔹 Testing resource: ${resourceName}`); + + const resourceFQRN = `${provider}.${serviceName}.${resourceName}`; + const resourceData = { + name: resourceName, + service: serviceName, + selectable: false, + sqlVerbs: {} + }; + + // SHOW EXTENDED METHODS IN .. + const methodsQuery = `SHOW EXTENDED METHODS IN ${resourceFQRN}`; + const methods = await executeQuery(methodsQuery, ` Getting methods for ${resourceName}`); + if (!methods || methods.length === 0) { + console.error(`Error: Resource ${resourceName} has no methods`); + process.exit(1); + } else { + console.log(`Found ${methods.length} methods for ${resourceName}`); + } + + results.totalMethods += methods.length; + + for (const method of methods) { + const methodName = method.MethodName; + const sqlVerb = method.SQLVerb || 'exec'; + + if(sqlVerb.toLowerCase() === 'select') { + results.selectableMethods++; + resourceData.selectable = true; + } + + // Initialize the array if it doesn't exist yet + if(!resourceData.sqlVerbs[sqlVerb]) { + resourceData.sqlVerbs[sqlVerb] = []; + } + + // Convert comma-delimited list to an array of trimmed values + let requiredParamsArray = []; + if (method.RequiredParams) { + requiredParamsArray = method.RequiredParams + .split(',') + .map(param => param.trim()) + .filter(param => param.length > 0); + } + + // Push the method info to the array with the parsed required params + resourceData.sqlVerbs[sqlVerb].push({ + methodName, + requiredParams: requiredParamsArray + }); + } + + // non exec methods must have unique signatures within a resource + // in other words no two methods mapped to the same sqlVerb should have the exact same set of required params, order is not important + // if this condition is detected, log it and exit the program immediately + let hasSelect = false; + for (const [verb, methods] of Object.entries(resourceData.sqlVerbs)) { + if (verb.toLowerCase() === 'select') { + hasSelect = true; + } + if (verb.toLowerCase() === 'exec') { + continue; + } + const seenSignatures = new Set(); + for (const method of methods) { + const signature = JSON.stringify(method.requiredParams); + if (seenSignatures.has(signature)) { + console.error(`Error: Duplicate method signature found for ${verb} in ${resourceData.service}.${resourceName}:`, method); + process.exit(1); + } + seenSignatures.add(signature); + } + } + + if (!hasSelect) { + results.nonSelectableResourceCount++; + results.nonSelectableResources.push(`${resourceData.service}.${resourceName}`); + } + + // Try DESCRIBE EXTENDED if available + if(resourceData.selectable) { + try { + const describeExtendedQuery = `DESCRIBE EXTENDED ${resourceFQRN}`; + const extendedColumns = await executeQuery(describeExtendedQuery, ` Describing extended ${resourceName}`); + + if (extendedColumns !== null && extendedColumns.length > 0) { + console.log(`Found ${extendedColumns.length} extended columns for ${resourceName}`); + } else if (SCALAR_RESPONSE_RESOURCES.has(resourceName)) { + // scalar (text) response - a single anonymous column at query + // time, so DESCRIBE is legitimately empty + console.log(`WARN: no columns for ${resourceName} (known scalar response)`); + results.scalarResponseResources.push(`${resourceData.service}.${resourceName}`); + } else { + console.error(`ERROR: No columns found for ${resourceName}`); + results.failures.push(`${resourceData.service}.${resourceName}: DESCRIBE EXTENDED returned no columns`); + } + } catch (error) { + console.error(`Error describing extended ${resourceName}:`, error.message); + results.failures.push(`${resourceData.service}.${resourceName}: ${error.message}`); + } + } + + } + } + + // Calculate execution time + const endTime = new Date(); + const executionTime = (endTime - startTime) / 1000; // in seconds + results.executionTime = executionTime; + + // Output summary + console.log("\n📋 Test Summary:"); + console.info(results); + + if (results.failures.length > 0) { + console.error(`\n❌ ${results.failures.length} failure(s):`); + for (const f of results.failures) console.error(` - ${f}`); + process.exit(1); + } + console.log("\n✅ All meta route tests passed"); + + // Save results to file + // const resultsDir = path.join(baseDir, 'test-results'); + // if (!fs.existsSync(resultsDir)) { + // fs.mkdirSync(resultsDir, { recursive: true }); + // } + + // const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + + // if (outputFormat === 'json') { + // const resultsFile = path.join(resultsDir, `${provider}-meta-test-${timestamp}.json`); + // fs.writeFileSync(resultsFile, JSON.stringify(results, null, 2)); + // console.log(`\nDetailed results saved to: ${resultsFile}`); + // } + // else if (outputFormat === 'csv') { + // // Generate CSV files + + // // Main summary CSV + // const summaryFile = path.join(resultsDir, `${provider}-meta-test-summary-${timestamp}.csv`); + // const summaryCSV = [ + // 'Provider,Timestamp,Services,Resources,Methods,Selectable,Insertable,Updatable,Deletable,Executable,Errors,ExecutionTime', + // `${provider},${results.timestamp},${results.summary.totalServices},${results.summary.totalResources},${results.summary.totalMethods},${results.summary.selectableMethods},${results.summary.insertableMethods},${results.summary.updatableMethods},${results.summary.deletableMethods},${results.summary.executableMethods},${results.summary.errors},${results.executionTime}` + // ].join('\n'); + // fs.writeFileSync(summaryFile, summaryCSV); + + // // Services CSV + // const servicesFile = path.join(resultsDir, `${provider}-meta-test-services-${timestamp}.csv`); + // const servicesCSV = [ + // 'Service,Title,ResourceCount', + // ...results.services.map(s => `${s.name},${s.title || ''},${s.resourceCount || 0}`) + // ].join('\n'); + // fs.writeFileSync(servicesFile, servicesCSV); + + // // Resources CSV + // const resourcesFile = path.join(resultsDir, `${provider}-meta-test-resources-${timestamp}.csv`); + // const resourcesCSV = [ + // 'Service,Resource,FQRN,Selectable,ColumnCount,MethodCount', + // ...results.resources.map(r => `${r.service},${r.name},${r.fqrn},${r.selectable},${r.columnCount || 0},${r.methodCount || 0}`) + // ].join('\n'); + // fs.writeFileSync(resourcesFile, resourcesCSV); + + // // Methods CSV + // const methodsFile = path.join(resultsDir, `${provider}-meta-test-methods-${timestamp}.csv`); + // const methodsCSV = [ + // 'Service,Resource,Method,SQLVerb,FQRN', + // ...results.methods.map(m => `${m.service},${m.resource},${m.name},${m.sqlVerb},${m.fqrn}`) + // ].join('\n'); + // fs.writeFileSync(methodsFile, methodsCSV); + + // console.log(`\nDetailed results saved to CSV files in: ${resultsDir}`); + // } + // else if (outputFormat === 'markdown') { + // const mdFile = path.join(resultsDir, `${provider}-meta-test-${timestamp}.md`); + + // const markdownContent = [ + // `# StackQL Provider Test Results: ${provider}`, + // '', + // `Test run: ${results.timestamp}`, + // '', + // '## Summary', + // '', + // '| Metric | Count |', + // '|--------|-------|', + // `| Services | ${results.summary.totalServices} |`, + // `| Resources | ${results.summary.totalResources} |`, + // `| Methods | ${results.summary.totalMethods} |`, + // `| Errors | ${results.summary.errors} |`, + // `| Execution Time | ${results.executionTime.toFixed(2)} seconds |`, + // '', + // '### Methods by SQL Verb', + // '', + // '| Verb | Count |', + // '|------|-------|', + // ...Object.entries(results.verbs).map(([verb, count]) => `| ${verb.toUpperCase()} | ${count} |`), + // '', + // '## Services', + // '', + // '| Service | Resources |', + // '|---------|-----------|', + // ...results.services.map(s => `| ${s.name} | ${s.resourceCount || 0} |`), + // '', + // '## Resources with Most Methods', + // '', + // '| Resource | Service | Methods | Selectable |', + // '|----------|---------|---------|------------|', + // ...results.resources + // .sort((a, b) => (b.methodCount || 0) - (a.methodCount || 0)) + // .slice(0, 20) + // .map(r => `| ${r.name} | ${r.service} | ${r.methodCount || 0} | ${r.selectable ? '✓' : '✗'} |`), + // '', + // '## Errors', + // '', + // results.errors.length > 0 + // ? [ + // '| Query | Error |', + // '|-------|-------|', + // ...results.errors.map(e => `| \`${e.query}\` | ${e.error} |`) + // ].join('\n') + // : 'No errors encountered during testing.', + // ].join('\n'); + + // fs.writeFileSync(mdFile, markdownContent); + // console.log(`\nDetailed results saved to: ${mdFile}`); + // } + + } catch (error) { + console.error('Error in meta routes test:', error); + process.exit(1); + } +} + +// Run the tests +testMetaRoutes(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3dbc360 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,573 @@ +{ + "name": "stackql-provider-supabase", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "stackql-provider-supabase", + "version": "0.1.0", + "dependencies": { + "@apidevtools/swagger-parser": "^12.1.0", + "@stackql/pgwire-lite": "^1.0.2", + "@stackql/provider-utils": "^0.7.8", + "js-yaml": "^4.1.0", + "pluralize": "^8.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.0.1.tgz", + "integrity": "sha512-Oc96zvmxx1fqoSEdUmfmvvb59/KDOnUoJ7s2t7bISyAn0XEz57LCCw8k2Y4Pf3mwKaZLMciESALORLgfe2frCw==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "license": "MIT" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-12.1.0.tgz", + "integrity": "sha512-e5mJoswsnAX0jG+J09xHFYQXb/bUc5S3pLpMxUuRUA2H8T2kni3yEoyz2R3Dltw5f4A6j6rPNMpWTK+iVDFlng==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "14.0.1", + "@apidevtools/openapi-schemas": "^2.1.0", + "@apidevtools/swagger-methods": "^3.0.2", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "call-me-maybe": "^1.0.2" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "license": "MIT", + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/@stackql/deno-openapi-dereferencer": { + "name": "@jsr/stackql__deno-openapi-dereferencer", + "version": "0.3.1", + "resolved": "https://npm.jsr.io/~/11/@jsr/stackql__deno-openapi-dereferencer/0.3.1.tgz", + "integrity": "sha512-7Ucdom3SYxvzp7VwzulQMe66E+1LeCZIprFQ70PwRPIUfL90bYNQDrLfe5L1WaB+X7StWdHmoFSFxoa9RDlN7w==", + "dependencies": { + "jsonpath-plus": "7.0.0" + } + }, + "node_modules/@stackql/pgwire-lite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stackql/pgwire-lite/-/pgwire-lite-1.0.2.tgz", + "integrity": "sha512-uHZA0yzVyow8TtWYyGPFI7/If8Ci/5EjjKdoaZ4YEk1XcSoCKaGQmH9KCUlR/R1FvQk4Ic3DV9It8XhePsoTqQ==", + "license": "MIT", + "dependencies": { + "winston": "^3.14.2" + } + }, + "node_modules/@stackql/provider-utils": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@stackql/provider-utils/-/provider-utils-0.7.8.tgz", + "integrity": "sha512-eJJ27ceMo+eTT4OTuJ7e0Cvft21u+SSGh+2s3THeoDxImndiNlg4W0wd4Sv7k+5ZbhDDbcIKcka6RJFZybkVCw==", + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-parser": "^10.1.1", + "@stackql/deno-openapi-dereferencer": "npm:@jsr/stackql__deno-openapi-dereferencer@^0.3.1", + "csv-parser": "^3.2.0", + "js-yaml": "^4.1.0", + "pluralize": "^8.0.0" + }, + "bin": { + "docgen-utils": "bin/docgen-utils.mjs", + "provider-dev-utils": "bin/provider-dev-utils.mjs" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@stackql/provider-utils/node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.7.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", + "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@stackql/provider-utils/node_modules/@apidevtools/swagger-parser": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.1.tgz", + "integrity": "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "11.7.2", + "@apidevtools/openapi-schemas": "^2.1.0", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "call-me-maybe": "^1.0.2" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "license": "MIT", + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/csv-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.2.1.tgz", + "integrity": "sha512-v8RPMSglouR9od735SnwSxLBbCJqEPSbgm1R5qfr8yIiMUCEFjox56kRZid0SvgHJEkxeIEu3+a9QS3YRh7CuA==", + "license": "MIT", + "bin": { + "csv-parser": "bin/csv-parser" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", + "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/jsonpath-plus": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.0.0.tgz", + "integrity": "sha512-MH4UnrWrU1hJGVEyEyjvYgONkzNTO6Yol0nq18EMnUQ/ZC5cTuJheirXXIwu1b9mZ6t3XL0P79gPsu+zlTnDIQ==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT", + "peer": true + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/winston": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1b81db1 --- /dev/null +++ b/package.json @@ -0,0 +1,40 @@ +{ + "name": "stackql-provider-supabase", + "version": "0.1.0", + "description": "StackQL Provider for Supabase", + "type": "module", + "scripts": { + "fetch-spec": "bash ./bin/fetch-spec.sh", + "build-inventory": "node ./provider-dev/scripts/build_inventory.mjs", + "split": "node ./bin/split.mjs", + "generate-mappings": "node ./node_modules/@stackql/provider-utils/bin/provider-dev-utils.mjs analyze", + "map-operations": "node ./provider-dev/scripts/map_operations.mjs", + "pre-normalize": "node ./provider-dev/scripts/pre_normalize.mjs", + "normalize": "node ./node_modules/@stackql/provider-utils/bin/provider-dev-utils.mjs normalize", + "generate-provider": "node ./node_modules/@stackql/provider-utils/bin/provider-dev-utils.mjs generate", + "post-process": "node ./provider-dev/scripts/post_process.mjs", + "generate-docs": "node ./node_modules/@stackql/provider-utils/bin/docgen-utils.mjs generate-docs", + "sanitize-docs": "node ./website/scripts/sanitize-docs.mjs", + "start-server": "bash ./bin/start-server.sh", + "stop-server": "bash ./bin/stop-server.sh", + "server-status": "bash ./bin/server-status.sh", + "test-meta-routes": "node ./bin/test-meta-routes.cjs", + "test-offline": "node ./tests/offline_validation.mjs", + "test-integration": "node ./tests/integration/run_integration_tests.mjs" + }, + "dependencies": { + "@apidevtools/swagger-parser": "^12.1.0", + "@stackql/pgwire-lite": "^1.0.2", + "@stackql/provider-utils": "^0.7.8", + "js-yaml": "^4.1.0", + "pluralize": "^8.0.0" + }, + "keywords": [ + "stackql", + "supabase", + "provider" + ], + "engines": { + "node": ">=20.0.0" + } +} diff --git a/provider-dev/config/all_services.csv b/provider-dev/config/all_services.csv new file mode 100644 index 0000000..d0a9277 --- /dev/null +++ b/provider-dev/config/all_services.csv @@ -0,0 +1,166 @@ +filename,path,operationId,formatted_op_id,verb,response_object,tags,formatted_tags,stackql_resource_name,stackql_method_name,stackql_verb,stackql_object_key,op_description +advisors.yaml,/advisors/performance,v1-get-performance-advisors,v1_get_performance_advisors,get,V1ProjectAdvisorsResponse,Advisors,advisors,performance_lints,list,select,$.lints,Gets project performance advisors. +advisors.yaml,/advisors/security,v1-get-security-advisors,v1_get_security_advisors,get,V1ProjectAdvisorsResponse,Advisors,advisors,security_lints,list,select,$.lints,Gets project security advisors. +analytics.yaml,/analytics/endpoints/logs.all,v1-get-project-logs-all,v1_get_project_logs_all,get,AnalyticsResponse,Analytics,analytics,all_logs,get,select,,Gets project's logs +analytics.yaml,/analytics/endpoints/logs,v1-get-project-logs,v1_get_project_logs,get,AnalyticsResponse,Analytics,analytics,logs,get,select,,Gets all project's logs in a single log stream +analytics.yaml,/analytics/endpoints/usage.api-counts,v1-get-project-usage-api-count,v1_get_project_usage_api_count,get,V1GetUsageApiCountResponse,Analytics,analytics,api_counts,get,select,,Gets project's usage api counts +analytics.yaml,/analytics/endpoints/usage.api-requests-count,v1-get-project-usage-request-count,v1_get_project_usage_request_count,get,V1GetUsageApiRequestsCountResponse,Analytics,analytics,api_request_counts,get,select,,Gets project's usage api requests count +analytics.yaml,/analytics/endpoints/functions.combined-stats,v1-get-project-function-combined-stats,v1_get_project_function_combined_stats,get,AnalyticsResponse,Analytics,analytics,function_stats,get,select,,Gets a project's function combined statistics +analytics.yaml,/analytics/endpoints/metrics,v1-scrape-project-metrics,v1_scrape_project_metrics,get,,Analytics,analytics,skip_this_resource,,,,Scrape a project's metrics +billing.yaml,/billing/addons,v1-list-project-addons,v1_list_project_addons,get,ListProjectAddonsResponse,Billing,billing,addons,list,select,$.selected_addons,List billing addons and compute instance selections +billing.yaml,/billing/addons,v1-apply-project-addon,v1_apply_project_addon,patch,,Billing,billing,addons,update,update,,"Apply or update billing addons, including compute instance size" +billing.yaml,/billing/addons/{addon_variant},v1-remove-project-addon,v1_remove_project_addon,delete,,Billing,billing,addons,delete,delete,,Remove billing addons or revert compute instance sizing +branches.yaml,/v1/branches/{branch_id_or_ref},v1-get-a-branch-config,v1_get_a_branch_config,get,BranchDetailResponse,Environments,environments,branch_configs,get,select,,Get database branch config +branches.yaml,/v1/branches/{branch_id_or_ref},v1-update-a-branch-config,v1_update_a_branch_config,patch,BranchResponse,Environments,environments,branches,update,update,,Update database branch config +branches.yaml,/v1/branches/{branch_id_or_ref},v1-delete-a-branch,v1_delete_a_branch,delete,BranchDeleteResponse,Environments,environments,branches,delete,delete,,Delete a database branch +branches.yaml,/v1/branches/{branch_id_or_ref}/push,v1-push-a-branch,v1_push_a_branch,post,BranchUpdateResponse,Environments,environments,branches,push,exec,,Pushes a database branch +branches.yaml,/v1/branches/{branch_id_or_ref}/merge,v1-merge-a-branch,v1_merge_a_branch,post,BranchUpdateResponse,Environments,environments,branches,merge,exec,,Merges a database branch +branches.yaml,/v1/branches/{branch_id_or_ref}/reset,v1-reset-a-branch,v1_reset_a_branch,post,BranchUpdateResponse,Environments,environments,branches,reset,exec,,Resets a database branch +branches.yaml,/v1/branches/{branch_id_or_ref}/restore,v1-restore-a-branch,v1_restore_a_branch,post,BranchRestoreResponse,Environments,environments,branches,restore,exec,,Restore a scheduled branch deletion +branches.yaml,/v1/branches/{branch_id_or_ref}/diff,v1-diff-a-branch,v1_diff_a_branch,get,,Environments,environments,skip_this_resource,,,,[Beta] Diffs a database branch +branches.yaml,/actions,v1-list-action-runs,v1_list_action_runs,get,ListActionRunResponse,Environments,environments,action_runs,list,select,,List all action runs +branches.yaml,/actions/{run_id},v1-get-action-run,v1_get_action_run,get,ActionRunResponse,Environments,environments,action_runs,get,select,,Get the status of an action run +branches.yaml,/actions/{run_id}/status,v1-update-action-run-status,v1_update_action_run_status,patch,UpdateRunStatusResponse,Environments,environments,action_runs,update_status,exec,,Update the status of an action run +branches.yaml,/actions/{run_id}/logs,v1-get-action-run-logs,v1_get_action_run_logs,get,,Environments,environments,skip_this_resource,,,,Get the logs of an action run +branches.yaml,/branches,v1-list-all-branches,v1_list_all_branches,get,BranchResponse,Environments,environments,branches,list,select,,List all database branches +branches.yaml,/branches,v1-create-a-branch,v1_create_a_branch,post,BranchResponse,Environments,environments,branches,create,insert,,Create a database branch +branches.yaml,/branches,v1-disable-preview-branching,v1_disable_preview_branching,delete,,Environments,environments,branches,disable_branching,exec,,Disables preview branching +branches.yaml,/branches/{name},v1-get-a-branch,v1_get_a_branch,get,BranchResponse,Environments,environments,branches,get,select,,Get a database branch +config.yaml,/pgsodium,v1-get-pgsodium-config,v1_get_pgsodium_config,get,PgsodiumConfigResponse,Secrets,secrets,pgsodium_configs,get,select,,[Beta] Gets project's pgsodium config +config.yaml,/pgsodium,v1-update-pgsodium-config,v1_update_pgsodium_config,put,PgsodiumConfigResponse,Secrets,secrets,pgsodium_configs,update,update,,[Beta] Updates project's pgsodium config. Updating the root_key can cause all data encrypted with the older key to become inaccessible. +config.yaml,/postgrest,v1-get-postgrest-service-config,v1_get_postgrest_service_config,get,PostgrestConfigWithJWTSecretResponse,Rest,rest,postgrest_configs,get,select,,Gets project's postgrest config +config.yaml,/postgrest,v1-update-postgrest-service-config,v1_update_postgrest_service_config,patch,V1PostgrestConfigResponse,Rest,rest,postgrest_configs,update,update,,Updates project's postgrest config +config.yaml,/ssl-enforcement,v1-get-ssl-enforcement-config,v1_get_ssl_enforcement_config,get,SslEnforcementResponse,Database,database,ssl_enforcement_configs,get,select,,[Beta] Get project's SSL enforcement configuration. +config.yaml,/ssl-enforcement,v1-update-ssl-enforcement-config,v1_update_ssl_enforcement_config,put,SslEnforcementResponse,Database,database,ssl_enforcement_configs,update,update,,[Beta] Update project's SSL enforcement configuration. +config.yaml,/config/auth/signing-keys/legacy,v1-create-legacy-signing-key,v1_create_legacy_signing_key,post,SigningKeyResponse,Auth,auth,legacy_signing_keys,create,insert,,Set up the project's existing JWT secret as an in_use JWT signing key. This endpoint will be removed in the future always check for HTTP 404 Not Found. +config.yaml,/config/auth/signing-keys/legacy,v1-get-legacy-signing-key,v1_get_legacy_signing_key,get,SigningKeyResponse,Auth,auth,legacy_signing_keys,get,select,,"Get the signing key information for the JWT secret imported as signing key for this project. This endpoint will be removed in the future, check for HTTP 404 Not Found." +config.yaml,/config/auth/signing-keys,v1-create-project-signing-key,v1_create_project_signing_key,post,SigningKeyResponse,Auth,auth,auth_signing_keys,create,insert,,Create a new signing key for the project in standby status +config.yaml,/config/auth/signing-keys,v1-get-project-signing-keys,v1_get_project_signing_keys,get,SigningKeysResponse,Auth,auth,auth_signing_keys,list,select,$.keys,List all signing keys for the project +config.yaml,/config/auth/signing-keys/{id},v1-get-project-signing-key,v1_get_project_signing_key,get,SigningKeyResponse,Auth,auth,auth_signing_keys,get,select,,Get information about a signing key +config.yaml,/config/auth/signing-keys/{id},v1-remove-project-signing-key,v1_remove_project_signing_key,delete,SigningKeyResponse,Auth,auth,auth_signing_keys,delete,delete,,Remove a signing key from a project. Only possible if the key has been in revoked status for a while. +config.yaml,/config/auth/signing-keys/{id},v1-update-project-signing-key,v1_update_project_signing_key,patch,SigningKeyResponse,Auth,auth,auth_signing_keys,update,update,,"Update a signing key, mainly its status" +config.yaml,/config/auth,v1-get-auth-service-config,v1_get_auth_service_config,get,AuthConfigResponse,Auth,auth,auth_configs,get,select,,Gets project's auth config +config.yaml,/config/auth,v1-update-auth-service-config,v1_update_auth_service_config,patch,AuthConfigResponse,Auth,auth,auth_configs,update,update,,Updates a project's auth config +config.yaml,/config/auth/third-party-auth,v1-create-project-tpa-integration,v1_create_project_tpa_integration,post,ThirdPartyAuth,Auth,auth,third_party_auth_integrations,create,insert,,Creates a new third-party auth integration +config.yaml,/config/auth/third-party-auth,v1-list-project-tpa-integrations,v1_list_project_tpa_integrations,get,ThirdPartyAuth,Auth,auth,third_party_auth_integrations,list,select,,Lists all third-party auth integrations +config.yaml,/config/auth/third-party-auth/{tpa_id},v1-delete-project-tpa-integration,v1_delete_project_tpa_integration,delete,ThirdPartyAuth,Auth,auth,third_party_auth_integrations,delete,delete,,Removes a third-party auth integration +config.yaml,/config/auth/third-party-auth/{tpa_id},v1-get-project-tpa-integration,v1_get_project_tpa_integration,get,ThirdPartyAuth,Auth,auth,third_party_auth_integrations,get,select,,Get a third-party integration +config.yaml,/config/storage,v1-get-storage-config,v1_get_storage_config,get,StorageConfigResponse,Storage,storage,storage_configs,get,select,,Gets project's storage config +config.yaml,/config/storage,v1-update-storage-config,v1_update_storage_config,patch,,Storage,storage,storage_configs,update,update,,Updates project's storage config +config.yaml,/config/database/pgbouncer,v1-get-project-pgbouncer-config,v1_get_project_pgbouncer_config,get,V1PgbouncerConfigResponse,Database,database,pgbouncer_configs,get,select,,Get project's pgbouncer config +config.yaml,/config/database/pooler,v1-get-pooler-config,v1_get_pooler_config,get,SupavisorConfigResponse,Database,database,pooler_configs,list,select,,Gets project's supavisor config +config.yaml,/config/database/pooler,v1-update-pooler-config,v1_update_pooler_config,patch,UpdateSupavisorConfigResponse,Database,database,pooler_configs,update,update,,Updates project's supavisor config +config.yaml,/config/database/postgres,v1-get-postgres-config,v1_get_postgres_config,get,PostgresConfigResponse,Database,database,postgres_configs,get,select,,Gets project's Postgres config +config.yaml,/config/database/postgres,v1-update-postgres-config,v1_update_postgres_config,put,PostgresConfigResponse,Database,database,postgres_configs,update,update,,Updates project's Postgres config +config.yaml,/config/realtime,v1-get-realtime-config,v1_get_realtime_config,get,RealtimeConfigResponse,Realtime,realtime,realtime_configs,get,select,,Gets realtime configuration +config.yaml,/config/realtime,v1-update-realtime-config,v1_update_realtime_config,patch,,Realtime,realtime,realtime_configs,update,update,,Updates realtime configuration +config.yaml,/config/realtime/shutdown,v1-shutdown-realtime,v1_shutdown_realtime,post,,Realtime,realtime,realtime_configs,shutdown,exec,,Shutdowns realtime connections for a project +config.yaml,/config/auth/sso/providers,v1-create-a-sso-provider,v1_create_a_sso_provider,post,CreateProviderResponse,Auth,auth,sso_providers,create,insert,,Creates a new SSO provider +config.yaml,/config/auth/sso/providers,v1-list-all-sso-provider,v1_list_all_sso_provider,get,ListProvidersResponse,Auth,auth,sso_providers,list,select,$.items,Lists all SSO providers +config.yaml,/config/auth/sso/providers/{provider_id},v1-get-a-sso-provider,v1_get_a_sso_provider,get,GetProviderResponse,Auth,auth,sso_providers,get,select,,Gets a SSO provider by its UUID +config.yaml,/config/auth/sso/providers/{provider_id},v1-update-a-sso-provider,v1_update_a_sso_provider,put,UpdateProviderResponse,Auth,auth,sso_providers,update,update,,Updates a SSO provider by its UUID +config.yaml,/config/auth/sso/providers/{provider_id},v1-delete-a-sso-provider,v1_delete_a_sso_provider,delete,DeleteProviderResponse,Auth,auth,sso_providers,delete,delete,,Removes a SSO provider by its UUID +database.yaml,/v1/snippets,v1-list-all-snippets,v1_list_all_snippets,get,SnippetList,Database,database,snippets,list,select,$.data,Lists SQL snippets for the logged in user +database.yaml,/v1/snippets/{id},v1-get-a-snippet,v1_get_a_snippet,get,SnippetResponse,Database,database,snippets,get,select,,Gets a specific SQL snippet +database.yaml,/jit-access,v1-get-jit-access-config,v1_get_jit_access_config,get,,Database,database,jit_access_configs,get,select,,[Beta] Get project's temporary access configuration. +database.yaml,/jit-access,v1-update-jit-access-config,v1_update_jit_access_config,put,,Database,database,jit_access_configs,update,update,,[Beta] Update project's temporary access configuration. +database.yaml,/types/typescript,v1-generate-typescript-types,v1_generate_typescript_types,get,TypescriptResponse,Database,database,typescript_types,get,select,,Generate TypeScript types +database.yaml,/readonly,v1-get-readonly-mode-status,v1_get_readonly_mode_status,get,ReadOnlyStatusResponse,Database,database,readonly_mode,get,select,,Returns project's readonly mode status +database.yaml,/readonly/temporary-disable,v1-disable-readonly-mode-temporarily,v1_disable_readonly_mode_temporarily,post,,Database,database,readonly_mode,temporary_disable,exec,,Disables project's readonly mode for the next 15 minutes +database.yaml,/cli/login-role,v1-create-login-role,v1_create_login_role,post,CreateRoleResponse,Database,database,cli_login_roles,create,insert,,[Beta] Create a login role for CLI with temporary password +database.yaml,/cli/login-role,v1-delete-login-roles,v1_delete_login_roles,delete,DeleteRolesResponse,Database,database,cli_login_roles,delete,delete,,[Beta] Delete existing login roles used by CLI +database.yaml,/database/migrations,v1-list-migration-history,v1_list_migration_history,get,V1ListMigrationsResponse,Database,database,migrations,list,select,,List applied migration versions +database.yaml,/database/migrations,v1-apply-a-migration,v1_apply_a_migration,post,,Database,database,migrations,create,insert,,Apply a database migration +database.yaml,/database/migrations,v1-upsert-a-migration,v1_upsert_a_migration,put,,Database,database,migrations,upsert,exec,,Upsert a database migration without applying +database.yaml,/database/migrations,v1-rollback-migrations,v1_rollback_migrations,delete,,Database,database,migrations,delete,delete,,Rollback database migrations and remove them from history table +database.yaml,/database/migrations/{version},v1-get-a-migration,v1_get_a_migration,get,V1GetMigrationResponse,Database,database,migrations,get,select,,Fetch an existing entry from migration history +database.yaml,/database/migrations/{version},v1-patch-a-migration,v1_patch_a_migration,patch,,Database,database,migrations,update,update,,Patch an existing entry in migration history +database.yaml,/database/query,v1-run-a-query,v1_run_a_query,post,,Database,database,queries,run,insert,,[Beta] Run sql query +database.yaml,/database/query/read-only,v1-read-only-query,v1_read_only_query,post,,Database,database,queries,run_read_only,exec,,[Beta] Run a sql query as supabase_read_only_user +database.yaml,/database/webhooks/enable,v1-enable-database-webhook,v1_enable_database_webhook,post,,Database,database,webhooks,enable,exec,,[Beta] Enables Database Webhooks on the project +database.yaml,/database/context,v1-get-database-metadata,v1_get_database_metadata,get,GetProjectDbMetadataResponse,Database,database,databases,list,select,$.databases,Gets database metadata for the given project. +database.yaml,/database/password,v1-update-database-password,v1_update_database_password,patch,V1UpdatePasswordResponse,Database,database,databases,update_password,exec,,Updates the database password +database.yaml,/database/jit,v1-get-jit-access,v1_get_jit_access,get,JitAccessResponse,Database,database,jit_role_mappings,get,select,,Get user-id to role mappings for JIT access +database.yaml,/database/jit,v1-authorize-jit-access,v1_authorize_jit_access,post,JitAuthorizeAccessResponse,Database,database,jit_access,create,insert,,Authorize user-id to role mappings for JIT access +database.yaml,/database/jit,v1-update-jit-access,v1_update_jit_access,put,JitAccessResponse,Database,database,jit_access,update,update,,Updates a user mapping for JIT access +database.yaml,/database/jit/list,v1-list-jit-access,v1_list_jit_access,get,JitListAccessResponse,Database,database,jit_access,list,select,$.items,List all user-id to role mappings for JIT access +database.yaml,/database/jit/invite,v1-invite-external-jit-access,v1_invite_external_jit_access,post,InviteExternalUserJitResponse,Database,database,jit_invites,create,insert,,Invites an external user to a database for JIT access +database.yaml,/database/jit/invite/accept,v1-accept-invite-external-jit-access,v1_accept_invite_external_jit_access,post,JitAccessResponse,Database,database,jit_invites,accept,exec,,Accepts invitation for JIT database access +database.yaml,/database/jit/invite/{invite_id},v1-delete-invite-external-jit-access,v1_delete_invite_external_jit_access,delete,,Database,database,jit_invites,delete,delete,,Deletes the invite for an external user to a database for JIT access +database.yaml,/database/jit/{user_id},v1-delete-jit-access,v1_delete_jit_access,delete,,Database,database,jit_access,delete,delete,,Delete JIT access by user-id +database.yaml,/database/openapi,v1-get-database-openapi,v1_get_database_openapi,get,,Database,database,skip_this_resource,,,,Get PostgREST OpenAPI spec +database.yaml,/database/backups,v1-list-all-backups,v1_list_all_backups,get,V1BackupsResponse,Database,database,backups,list,select,$.backups,Lists all backups +database.yaml,/database/backups/restore-pitr,v1-restore-pitr-backup,v1_restore_pitr_backup,post,,Database,database,backups,restore_pitr,exec,,Restores a PITR backup for a database +database.yaml,/database/backups/restore-point,v1-create-restore-point,v1_create_restore_point,post,V1RestorePointResponse,Database,database,restore_points,create,insert,,Initiates a creation of a restore point for a database +database.yaml,/database/backups/restore-point,v1-get-restore-point,v1_get_restore_point,get,V1RestorePointResponse,Database,database,restore_points,get,select,,Get restore points for project +database.yaml,/database/backups/restore,v1-restore-physical-backup,v1_restore_physical_backup,post,,Database,database,backups,restore,exec,,Restores a physical backup for a database +database.yaml,/database/backups/schedule,v1-get-backup-schedule,v1_get_backup_schedule,get,V1BackupScheduleResponse,Database,database,backup_schedules,get,select,,Gets the backup schedule for a project +database.yaml,/database/backups/schedule,v1-update-backup-schedule,v1_update_backup_schedule,patch,V1BackupScheduleResponse,Database,database,backup_schedules,update,update,,Updates the backup schedule time for a project +database.yaml,/database/backups/undo,v1-undo,v1_undo,post,,Database,database,backups,undo,exec,,Initiates an undo to a given restore point +domains.yaml,/custom-hostname,v1-get-hostname-config,v1_get_hostname_config,get,UpdateCustomHostnameResponse,Domains,domains,custom_hostnames,get,select,,[Beta] Gets project's custom hostname config +domains.yaml,/custom-hostname,v1-Delete hostname config,v1_delete hostname config,delete,,Domains,domains,custom_hostnames,delete,delete,,[Beta] Deletes a project's custom hostname configuration +domains.yaml,/custom-hostname/initialize,v1-update-hostname-config,v1_update_hostname_config,post,UpdateCustomHostnameResponse,Domains,domains,custom_hostnames,initialize,exec,,[Beta] Updates project's custom hostname configuration +domains.yaml,/custom-hostname/reverify,v1-verify-dns-config,v1_verify_dns_config,post,UpdateCustomHostnameResponse,Domains,domains,custom_hostnames,reverify,exec,,[Beta] Attempts to verify the DNS configuration for project's custom hostname configuration +domains.yaml,/custom-hostname/activate,v1-activate-custom-hostname,v1_activate_custom_hostname,post,UpdateCustomHostnameResponse,Domains,domains,custom_hostnames,activate,exec,,[Beta] Activates a custom hostname for a project. +domains.yaml,/vanity-subdomain,v1-get-vanity-subdomain-config,v1_get_vanity_subdomain_config,get,VanitySubdomainConfigResponse,Domains,domains,vanity_subdomains,get,select,,[Beta] Gets current vanity subdomain config +domains.yaml,/vanity-subdomain,v1-deactivate-vanity-subdomain-config,v1_deactivate_vanity_subdomain_config,delete,,Domains,domains,vanity_subdomains,delete,delete,,[Beta] Deletes a project's vanity subdomain configuration +domains.yaml,/vanity-subdomain/check-availability,v1-check-vanity-subdomain-availability,v1_check_vanity_subdomain_availability,post,SubdomainAvailabilityResponse,Domains,domains,vanity_subdomains,check_availability,exec,,[Beta] Checks vanity subdomain availability +domains.yaml,/vanity-subdomain/activate,v1-activate-vanity-subdomain-config,v1_activate_vanity_subdomain_config,post,ActivateVanitySubdomainResponse,Domains,domains,vanity_subdomains,activate,exec,,[Beta] Activates a vanity subdomain for a project. +functions.yaml,/functions,v1-list-all-functions,v1_list_all_functions,get,FunctionResponse,Edge Functions,edge functions,edge_functions,list,select,,List all functions +functions.yaml,/functions,v1-create-a-function,v1_create_a_function,post,FunctionResponse,Edge Functions,edge functions,edge_functions,create,insert,,Create a function +functions.yaml,/functions,v1-bulk-update-functions,v1_bulk_update_functions,put,BulkUpdateFunctionResponse,Edge Functions,edge functions,skip_this_resource,,,,Bulk update functions +functions.yaml,/functions/deploy,v1-deploy-a-function,v1_deploy_a_function,post,DeployFunctionResponse,Edge Functions,edge functions,skip_this_resource,,,,Deploy a function +functions.yaml,/functions/{function_slug},v1-get-a-function,v1_get_a_function,get,FunctionSlugResponse,Edge Functions,edge functions,edge_functions,get,select,,Retrieve a function +functions.yaml,/functions/{function_slug},v1-update-a-function,v1_update_a_function,patch,FunctionResponse,Edge Functions,edge functions,edge_functions,update,update,,Update a function +functions.yaml,/functions/{function_slug},v1-delete-a-function,v1_delete_a_function,delete,,Edge Functions,edge functions,edge_functions,delete,delete,,Delete a function +functions.yaml,/functions/{function_slug}/body,v1-get-a-function-body,v1_get_a_function_body,get,StreamableFile,Edge Functions,edge functions,skip_this_resource,,,,Retrieve a function body +network.yaml,/network-bans/retrieve,v1-list-all-network-bans,v1_list_all_network_bans,post,NetworkBanResponse,Projects,projects,network_bans,retrieve,exec,,[Beta] Gets project's network bans +network.yaml,/network-bans/retrieve/enriched,v1-list-all-network-bans-enriched,v1_list_all_network_bans_enriched,post,NetworkBanResponseEnriched,Projects,projects,network_bans,list,select,$.banned_ipv4_addresses,[Beta] Gets project's network bans with additional information about which databases they affect +network.yaml,/network-bans,v1-delete-network-bans,v1_delete_network_bans,delete,,Projects,projects,network_bans,delete,delete,,[Beta] Remove network bans. +network.yaml,/network-restrictions,v1-get-network-restrictions,v1_get_network_restrictions,get,NetworkRestrictionsResponse,Projects,projects,network_restrictions,get,select,,[Beta] Gets project's network restrictions +network.yaml,/network-restrictions,v1-patch-network-restrictions,v1_patch_network_restrictions,patch,NetworkRestrictionsV2Response,Projects,projects,network_restrictions,update,update,,[Alpha] Updates project's network restrictions by adding or removing CIDRs +network.yaml,/network-restrictions/apply,v1-update-network-restrictions,v1_update_network_restrictions,post,NetworkRestrictionsResponse,Projects,projects,network_restrictions,apply,exec,,[Beta] Updates project's network restrictions +organizations.yaml,/v1/organizations,v1-list-all-organizations,v1_list_all_organizations,get,OrganizationResponseV1,Organizations,organizations,organizations,list,select,,List all organizations +organizations.yaml,/v1/organizations,v1-create-an-organization,v1_create_an_organization,post,OrganizationResponseV1,Organizations,organizations,organizations,create,insert,,Create an organization +organizations.yaml,/v1/organizations/{slug}/entitlements,v1-get-organization-entitlements,v1_get_organization_entitlements,get,V1ListEntitlementsResponse,Organizations,organizations,entitlements,get,select,,Get entitlements for an organization +organizations.yaml,/v1/organizations/{slug}/members,v1-list-organization-members,v1_list_organization_members,get,V1OrganizationMemberResponse,Organizations,organizations,members,list,select,,List members of an organization +organizations.yaml,/v1/organizations/{slug},v1-get-an-organization,v1_get_an_organization,get,V1OrganizationSlugResponse,Organizations,organizations,organizations,get,select,,Gets information about the organization +organizations.yaml,/v1/organizations/{slug}/project-claim/{token},v1-get-organization-project-claim,v1_get_organization_project_claim,get,OrganizationProjectClaimResponse,Organizations,organizations,project_claims,get,select,,Gets project details for the specified organization and claim token +organizations.yaml,/v1/organizations/{slug}/project-claim/{token},v1-claim-project-for-organization,v1_claim_project_for_organization,post,,Organizations,organizations,project_claims,claim,exec,,Claims project for the specified organization +profile.yaml,/v1/profile,v1-get-profile,v1_get_profile,get,V1ProfileResponse,Profile,profile,profiles,get,select,,Gets the user's profile +projects.yaml,/v1/projects,v1-list-all-projects,v1_list_all_projects,get,V1ProjectWithDatabaseResponse,Projects,projects,projects,list,select,,List all projects +projects.yaml,/v1/projects,v1-create-a-project,v1_create_a_project,post,V1ProjectResponse,Projects,projects,projects,create,insert,,Create a project +projects.yaml,/v1/projects/available-regions,v1-get-available-regions,v1_get_available_regions,get,RegionsInfo,Projects,projects,available_regions,get,select,,[Beta] Gets the list of available regions that can be used for a new project +projects.yaml,/v1/projects/{ref},v1-get-project,v1_get_project,get,V1ProjectWithDatabaseResponse,Projects,projects,projects,get,select,,Gets a specific project that belongs to the authenticated user +projects.yaml,/v1/projects/{ref},v1-delete-a-project,v1_delete_a_project,delete,V1ProjectRefResponse,Projects,projects,projects,delete,delete,,Deletes the given project +projects.yaml,/v1/projects/{ref},v1-update-a-project,v1_update_a_project,patch,V1ProjectRefResponse,Projects,projects,projects,update,update,,Updates the given project +projects.yaml,/upgrade,v1-upgrade-postgres-version,v1_upgrade_postgres_version,post,ProjectUpgradeInitiateResponse,Projects,projects,projects,upgrade,exec,,[Beta] Upgrades the project's Postgres version +projects.yaml,/upgrade/eligibility,v1-get-postgres-upgrade-eligibility,v1_get_postgres_upgrade_eligibility,get,ProjectUpgradeEligibilityResponse,Projects,projects,upgrade_eligibility,get,select,,[Beta] Returns the project's eligibility for upgrades +projects.yaml,/upgrade/status,v1-get-postgres-upgrade-status,v1_get_postgres_upgrade_status,get,DatabaseUpgradeStatusResponse,Projects,projects,upgrade_status,get,select,,[Beta] Gets the latest status of the project's upgrade +projects.yaml,/read-replicas/setup,v1-setup-a-read-replica,v1_setup_a_read_replica,post,,Database,database,read_replicas,setup,exec,,[Beta] Set up a read replica +projects.yaml,/read-replicas/remove,v1-remove-a-read-replica,v1_remove_a_read_replica,post,,Database,database,read_replicas,remove,exec,,[Beta] Remove a read replica +projects.yaml,/health,v1-get-services-health,v1_get_services_health,get,V1ServiceHealthResponse,Projects,projects,service_health,list,select,,Gets project's service health status +projects.yaml,/pause,v1-pause-a-project,v1_pause_a_project,post,,Projects,projects,projects,pause,exec,,Pauses the given project +projects.yaml,/restart,v1-restart-a-project,v1_restart_a_project,post,,Projects,projects,projects,restart,exec,,Restarts the given project +projects.yaml,/restore,v1-list-available-restore-versions,v1_list_available_restore_versions,get,GetProjectAvailableRestoreVersionsResponse,Projects,projects,restore_versions,list,select,$.available_versions,Lists available restore versions for the given project +projects.yaml,/restore,v1-restore-a-project,v1_restore_a_project,post,,Projects,projects,projects,restore,exec,,Restores the given project +projects.yaml,/restore/cancel,v1-cancel-a-project-restoration,v1_cancel_a_project_restoration,post,,Projects,projects,projects,cancel_restore,exec,,Cancels the given project restoration +projects.yaml,/claim-token,v1-get-project-claim-token,v1_get_project_claim_token,get,ProjectClaimTokenResponse,Projects,projects,claim_tokens,get,select,,Gets project claim token +projects.yaml,/claim-token,v1-create-project-claim-token,v1_create_project_claim_token,post,CreateProjectClaimTokenResponse,Projects,projects,claim_tokens,create,insert,,Creates project claim token +projects.yaml,/claim-token,v1-delete-project-claim-token,v1_delete_project_claim_token,delete,,Projects,projects,claim_tokens,delete,delete,,Revokes project claim token +projects.yaml,/config/disk,v1-get-database-disk,v1_get_database_disk,get,DiskResponse,Projects,projects,disk_configs,get,select,,Get database disk attributes +projects.yaml,/config/disk,v1-modify-database-disk,v1_modify_database_disk,post,,Projects,projects,disk_configs,modify,exec,,Modify database disk +projects.yaml,/config/disk/util,v1-get-disk-utilization,v1_get_disk_utilization,get,DiskUtilMetricsResponse,Projects,projects,disk_utilization,get,select,,Get disk utilization +projects.yaml,/config/disk/autoscale,v1-get-project-disk-autoscale-config,v1_get_project_disk_autoscale_config,get,DiskAutoscaleConfig,Projects,projects,disk_autoscale_configs,get,select,,Gets project disk autoscale config +projects.yaml,/v1/organizations/{slug}/projects,v1-get-all-projects-for-organization,v1_get_all_projects_for_organization,get,OrganizationProjectsResponse,Projects,projects,organization_projects,list,select,$.projects,Gets all projects for the given organization +secrets.yaml,/api-keys,v1-get-project-api-keys,v1_get_project_api_keys,get,ApiKeyResponse,Secrets,secrets,api_keys,list,select,,Get project api keys +secrets.yaml,/api-keys,v1-create-project-api-key,v1_create_project_api_key,post,ApiKeyResponse,Secrets,secrets,api_keys,create,insert,,Creates a new API key for the project +secrets.yaml,/api-keys/legacy,v1-get-project-legacy-api-keys,v1_get_project_legacy_api_keys,get,LegacyApiKeysResponse,Secrets,secrets,legacy_api_keys,get,select,,"Check whether JWT based legacy (anon, service_role) API keys are enabled. This API endpoint will be removed in the future, check for HTTP 404 Not Found." +secrets.yaml,/api-keys/legacy,v1-update-project-legacy-api-keys,v1_update_project_legacy_api_keys,put,LegacyApiKeysResponse,Secrets,secrets,legacy_api_keys,update,update,,"Disable or re-enable JWT based legacy (anon, service_role) API keys. This API endpoint will be removed in the future, check for HTTP 404 Not Found." +secrets.yaml,/api-keys/{id},v1-update-project-api-key,v1_update_project_api_key,patch,ApiKeyResponse,Secrets,secrets,api_keys,update,update,,Updates an API key for the project +secrets.yaml,/api-keys/{id},v1-get-project-api-key,v1_get_project_api_key,get,ApiKeyResponse,Secrets,secrets,api_keys,get,select,,Get API key +secrets.yaml,/api-keys/{id},v1-delete-project-api-key,v1_delete_project_api_key,delete,ApiKeyResponse,Secrets,secrets,api_keys,delete,delete,,Deletes an API key for the project +secrets.yaml,/secrets,v1-list-all-secrets,v1_list_all_secrets,get,SecretResponse,Secrets,secrets,secrets,list,select,,List all secrets +secrets.yaml,/secrets,v1-bulk-create-secrets,v1_bulk_create_secrets,post,,Secrets,secrets,secrets,create,insert,,Bulk create secrets +secrets.yaml,/secrets,v1-bulk-delete-secrets,v1_bulk_delete_secrets,delete,,Secrets,secrets,secrets,delete,delete,,Bulk delete secrets +storage.yaml,/storage/buckets,v1-list-all-buckets,v1_list_all_buckets,get,V1StorageBucketResponse,Storage,storage,buckets,list,select,,Lists all buckets diff --git a/provider-dev/config/endpoint_inventory.csv b/provider-dev/config/endpoint_inventory.csv new file mode 100644 index 0000000..fcd6634 --- /dev/null +++ b/provider-dev/config/endpoint_inventory.csv @@ -0,0 +1,171 @@ +method,path,operation_id,tag,scope,path_params,pagination_params,has_request_body,body_kinds,body_bare_array,update_semantics,beta,deprecated,response_shape,response_array_keys,response_media_types,proposed_service,proposed_resource,proposed_verb,skip_reason +get,/v1/branches/{branch_id_or_ref},v1-get-a-branch-config,Environments,branch,branch_id_or_ref,,n,,,,,,object,,,branches,branches,select, +patch,/v1/branches/{branch_id_or_ref},v1-update-a-branch-config,Environments,branch,branch_id_or_ref,,y,application/json,,patch-partial-presumed,,,object,,,branches,branches,update, +delete,/v1/branches/{branch_id_or_ref},v1-delete-a-branch,Environments,branch,branch_id_or_ref,,n,,,,,,object,,,branches,branches,delete, +post,/v1/branches/{branch_id_or_ref}/push,v1-push-a-branch,Environments,branch,branch_id_or_ref,,y,application/json,,,,,object,,,branches,branches,exec, +post,/v1/branches/{branch_id_or_ref}/merge,v1-merge-a-branch,Environments,branch,branch_id_or_ref,,y,application/json,,,,,object,,,branches,branches,exec, +post,/v1/branches/{branch_id_or_ref}/reset,v1-reset-a-branch,Environments,branch,branch_id_or_ref,,y,application/json,,,,,object,,,branches,branches,exec, +post,/v1/branches/{branch_id_or_ref}/restore,v1-restore-a-branch,Environments,branch,branch_id_or_ref,,n,,,,,,object,,,branches,branches,exec, +get,/v1/branches/{branch_id_or_ref}/diff,v1-diff-a-branch,Environments,branch,branch_id_or_ref,,n,,,,beta,,non-json,,text/plain,branches,,,non_json_text_response +get,/v1/projects,v1-list-all-projects,Projects,account,,,n,,,,,,bare-array,,,projects,projects,select, +post,/v1/projects,v1-create-a-project,Projects,account,,,y,application/json,,,,,object,,,projects,projects,insert, +get,/v1/projects/available-regions,v1-get-available-regions,Projects,account,,,n,,,,beta,,object,,,projects,available_regions,select, +get,/v1/organizations,v1-list-all-organizations,Organizations,account,,,n,,,,,,bare-array,,,organizations,organizations,select, +post,/v1/organizations,v1-create-an-organization,Organizations,account,,,y,application/json,,,,,object,,,organizations,organizations,insert, +get,/v1/oauth/authorize,v1-authorize-user,OAuth,account,,,n,,,,beta,,none,,,oauth,,,oauth_user_agent_flow +post,/v1/oauth/token,v1-exchange-oauth-token,OAuth,account,,,y,application/x-www-form-urlencoded,,,beta,,object,,,oauth,,,oauth_user_agent_flow +post,/v1/oauth/revoke,v1-revoke-token,OAuth,account,,,y,application/json,,,beta,,none,,,oauth,,,oauth_user_agent_flow +get,/v1/oauth/authorize/project-claim,v1-oauth-authorize-project-claim,OAuth,account,,,n,,,,,,none,,,oauth,,,oauth_user_agent_flow +get,/v1/snippets,v1-list-all-snippets,Database,account,,cursor;limit,n,,,,,,object,data,,database,snippets,select, +get,/v1/snippets/{id},v1-get-a-snippet,Database,account,id,,n,,,,,,object,,,database,snippets,select, +get,/v1/profile,v1-get-profile,Profile,account,,,n,,,,,,object,,,profile,profiles,select, +get,/v1/projects/{ref}/actions,v1-list-action-runs,Environments,ref,ref,offset;limit,n,,,,,,bare-array,,,branches,actions,select, +head,/v1/projects/{ref}/actions,v1-count-action-runs,Environments,ref,ref,,n,,,,,,none,,,branches,,,head_count_endpoint +get,/v1/projects/{ref}/actions/{run_id},v1-get-action-run,Environments,ref,ref;run_id,,n,,,,,,object,run_steps,,branches,actions,select, +patch,/v1/projects/{ref}/actions/{run_id}/status,v1-update-action-run-status,Environments,ref,ref;run_id,,y,application/json,,patch-partial-presumed,,,object,,,branches,actions,exec, +get,/v1/projects/{ref}/actions/{run_id}/logs,v1-get-action-run-logs,Environments,ref,ref;run_id,,n,,,,,,non-json,,text/plain,branches,,,non_json_text_response +get,/v1/projects/{ref}/api-keys,v1-get-project-api-keys,Secrets,ref,ref,,n,,,,,,bare-array,,,secrets,api_keys,select, +post,/v1/projects/{ref}/api-keys,v1-create-project-api-key,Secrets,ref,ref,,y,application/json,,,,,object,,,secrets,api_keys,insert, +get,/v1/projects/{ref}/api-keys/legacy,v1-get-project-legacy-api-keys,Secrets,ref,ref,,n,,,,,,object,,,secrets,api_keys_legacies,select, +put,/v1/projects/{ref}/api-keys/legacy,v1-update-project-legacy-api-keys,Secrets,ref,ref,,n,,,put-replace-unverified,,,object,,,secrets,api_keys_legacies,update, +get,/v1/projects/{ref}/api-keys/{id},v1-get-project-api-key,Secrets,ref,ref;id,,n,,,,,,object,,,secrets,api_keys,select, +patch,/v1/projects/{ref}/api-keys/{id},v1-update-project-api-key,Secrets,ref,ref;id,,y,application/json,,patch-partial-presumed,,,object,,,secrets,api_keys,update, +delete,/v1/projects/{ref}/api-keys/{id},v1-delete-project-api-key,Secrets,ref,ref;id,,n,,,,,,object,,,secrets,api_keys,delete, +get,/v1/projects/{ref}/branches,v1-list-all-branches,Environments,ref,ref,,n,,,,,,bare-array,,,branches,branches,select, +post,/v1/projects/{ref}/branches,v1-create-a-branch,Environments,ref,ref,,y,application/json,,,,,object,,,branches,branches,insert, +delete,/v1/projects/{ref}/branches,v1-disable-preview-branching,Environments,ref,ref,,n,,,,,,none,,,branches,branches,delete, +get,/v1/projects/{ref}/branches/{name},v1-get-a-branch,Environments,ref,ref;name,,n,,,,,,object,,,branches,branches,select, +get,/v1/projects/{ref}/custom-hostname,v1-get-hostname-config,Domains,ref,ref,,n,,,,beta,,object,,,domains,custom_hostnames,select, +delete,/v1/projects/{ref}/custom-hostname,v1-Delete hostname config,Domains,ref,ref,,n,,,,beta,,none,,,domains,custom_hostnames,delete, +post,/v1/projects/{ref}/custom-hostname/initialize,v1-update-hostname-config,Domains,ref,ref,,y,application/json,,,beta,,object,,,domains,custom_hostnames,exec, +post,/v1/projects/{ref}/custom-hostname/reverify,v1-verify-dns-config,Domains,ref,ref,,n,,,,beta,,object,,,domains,custom_hostnames,exec, +post,/v1/projects/{ref}/custom-hostname/activate,v1-activate-custom-hostname,Domains,ref,ref,,n,,,,beta,,object,,,domains,custom_hostnames,exec, +get,/v1/projects/{ref}/jit-access,v1-get-jit-access-config,Database,ref,ref,,n,,,,beta,,untyped-json,,,database,jit_accesses,select, +put,/v1/projects/{ref}/jit-access,v1-update-jit-access-config,Database,ref,ref,,y,application/json,,put-replace-unverified,beta,,untyped-json,,,database,jit_accesses,update, +post,/v1/projects/{ref}/network-bans/retrieve,v1-list-all-network-bans,Projects,ref,ref,,n,,,,beta,,object,banned_ipv4_addresses,,network,network_bans_retrieves,insert, +post,/v1/projects/{ref}/network-bans/retrieve/enriched,v1-list-all-network-bans-enriched,Projects,ref,ref,,n,,,,beta,,object,banned_ipv4_addresses,,network,network_bans_retrieve_enricheds,insert, +delete,/v1/projects/{ref}/network-bans,v1-delete-network-bans,Projects,ref,ref,,y,application/json,,,beta,,none,,,network,network_bans,delete, +get,/v1/projects/{ref}/network-restrictions,v1-get-network-restrictions,Projects,ref,ref,,n,,,,beta,,object,,,network,network_restrictions,select, +patch,/v1/projects/{ref}/network-restrictions,v1-patch-network-restrictions,Projects,ref,ref,,y,application/json,,patch-partial-presumed,alpha,,object,,,network,network_restrictions,update, +post,/v1/projects/{ref}/network-restrictions/apply,v1-update-network-restrictions,Projects,ref,ref,,y,application/json,,,beta,,object,,,network,network_restrictions,exec, +get,/v1/projects/{ref}/pgsodium,v1-get-pgsodium-config,Secrets,ref,ref,,n,,,,beta,,object,,,config,pgsodiums,select, +put,/v1/projects/{ref}/pgsodium,v1-update-pgsodium-config,Secrets,ref,ref,,y,application/json,,put-replace-unverified,beta,,object,,,config,pgsodiums,update, +get,/v1/projects/{ref}/postgrest,v1-get-postgrest-service-config,Rest,ref,ref,,n,,,,,,object,,,config,postgrests,select, +patch,/v1/projects/{ref}/postgrest,v1-update-postgrest-service-config,Rest,ref,ref,,y,application/json,,patch-partial-presumed,,,object,,,config,postgrests,update, +get,/v1/projects/{ref},v1-get-project,Projects,ref,ref,,n,,,,,,object,,,projects,projects,select, +patch,/v1/projects/{ref},v1-update-a-project,Projects,ref,ref,,y,application/json,,patch-partial-presumed,,,object,,,projects,projects,update, +delete,/v1/projects/{ref},v1-delete-a-project,Projects,ref,ref,,n,,,,,,object,,,projects,projects,delete, +get,/v1/projects/{ref}/secrets,v1-list-all-secrets,Secrets,ref,ref,,n,,,,,,bare-array,,,secrets,secrets,select, +post,/v1/projects/{ref}/secrets,v1-bulk-create-secrets,Secrets,ref,ref,,y,application/json,y,,,,none,,,secrets,secrets,insert, +delete,/v1/projects/{ref}/secrets,v1-bulk-delete-secrets,Secrets,ref,ref,,y,application/json,y,,,,none,,,secrets,secrets,delete, +get,/v1/projects/{ref}/ssl-enforcement,v1-get-ssl-enforcement-config,Database,ref,ref,,n,,,,beta,,object,,,config,ssl_enforcements,select, +put,/v1/projects/{ref}/ssl-enforcement,v1-update-ssl-enforcement-config,Database,ref,ref,,y,application/json,,put-replace-unverified,beta,,object,,,config,ssl_enforcements,update, +get,/v1/projects/{ref}/types/typescript,v1-generate-typescript-types,Database,ref,ref,,n,,,,,,object,,,database,types_typescripts,select, +get,/v1/projects/{ref}/vanity-subdomain,v1-get-vanity-subdomain-config,Domains,ref,ref,,n,,,,beta,,object,,,domains,vanity_subdomains,select, +delete,/v1/projects/{ref}/vanity-subdomain,v1-deactivate-vanity-subdomain-config,Domains,ref,ref,,n,,,,beta,,none,,,domains,vanity_subdomains,delete, +post,/v1/projects/{ref}/vanity-subdomain/check-availability,v1-check-vanity-subdomain-availability,Domains,ref,ref,,y,application/json,,,beta,,object,,,domains,vanity_subdomains,exec, +post,/v1/projects/{ref}/vanity-subdomain/activate,v1-activate-vanity-subdomain-config,Domains,ref,ref,,y,application/json,,,beta,,object,,,domains,vanity_subdomains,exec, +post,/v1/projects/{ref}/upgrade,v1-upgrade-postgres-version,Projects,ref,ref,,y,application/json,,,beta,,object,,,projects,projects,exec, +get,/v1/projects/{ref}/upgrade/eligibility,v1-get-postgres-upgrade-eligibility,Projects,ref,ref,,n,,,,beta,,object,target_upgrade_versions;legacy_auth_custom_roles;objects_to_be_dropped;unsupported_extensions;user_defined_objects_in_internal_schemas;validation_errors;warnings,,projects,upgrade_eligibilities,select, +get,/v1/projects/{ref}/upgrade/status,v1-get-postgres-upgrade-status,Projects,ref,ref,,n,,,,beta,,object,,,projects,upgrade_statuses,select, +get,/v1/projects/{ref}/readonly,v1-get-readonly-mode-status,Database,ref,ref,,n,,,,,,object,,,database,readonlies,select, +post,/v1/projects/{ref}/readonly/temporary-disable,v1-disable-readonly-mode-temporarily,Database,ref,ref,,n,,,,,,none,,,database,readonlies,exec, +post,/v1/projects/{ref}/read-replicas/setup,v1-setup-a-read-replica,Database,ref,ref,,y,application/json,,,beta,,none,,,projects,read_replicas,exec, +post,/v1/projects/{ref}/read-replicas/remove,v1-remove-a-read-replica,Database,ref,ref,,y,application/json,,,beta,,none,,,projects,read_replicas,exec, +get,/v1/projects/{ref}/health,v1-get-services-health,Projects,ref,ref,,n,,,,,,bare-array,,,projects,health,select, +get,/v1/projects/{ref}/config/auth/signing-keys/legacy,v1-get-legacy-signing-key,Auth,ref,ref,,n,,,,,,object,,,config,auth_signing_keys_legacies,select, +post,/v1/projects/{ref}/config/auth/signing-keys/legacy,v1-create-legacy-signing-key,Auth,ref,ref,,n,,,,,,object,,,config,auth_signing_keys_legacies,insert, +get,/v1/projects/{ref}/config/auth/signing-keys,v1-get-project-signing-keys,Auth,ref,ref,,n,,,,,,object,keys,,config,auth_signing_keys,select, +post,/v1/projects/{ref}/config/auth/signing-keys,v1-create-project-signing-key,Auth,ref,ref,,y,application/json,,,,,object,,,config,auth_signing_keys,insert, +get,/v1/projects/{ref}/config/auth/signing-keys/{id},v1-get-project-signing-key,Auth,ref,ref;id,,n,,,,,,object,,,config,auth_signing_keys,select, +patch,/v1/projects/{ref}/config/auth/signing-keys/{id},v1-update-project-signing-key,Auth,ref,ref;id,,y,application/json,,patch-partial-presumed,,,object,,,config,auth_signing_keys,update, +delete,/v1/projects/{ref}/config/auth/signing-keys/{id},v1-remove-project-signing-key,Auth,ref,ref;id,,n,,,,,,object,,,config,auth_signing_keys,delete, +get,/v1/projects/{ref}/config/auth,v1-get-auth-service-config,Auth,ref,ref,,n,,,,,,object,,,config,auths,select, +patch,/v1/projects/{ref}/config/auth,v1-update-auth-service-config,Auth,ref,ref,,y,application/json,,patch-partial-presumed,,,object,,,config,auths,update, +get,/v1/projects/{ref}/config/auth/third-party-auth,v1-list-project-tpa-integrations,Auth,ref,ref,,n,,,,,,bare-array,,,config,auth_third_party_auths,select, +post,/v1/projects/{ref}/config/auth/third-party-auth,v1-create-project-tpa-integration,Auth,ref,ref,,y,application/json,,,,,object,,,config,auth_third_party_auths,insert, +get,/v1/projects/{ref}/config/auth/third-party-auth/{tpa_id},v1-get-project-tpa-integration,Auth,ref,ref;tpa_id,,n,,,,,,object,,,config,auth_third_party_auths,select, +delete,/v1/projects/{ref}/config/auth/third-party-auth/{tpa_id},v1-delete-project-tpa-integration,Auth,ref,ref;tpa_id,,n,,,,,,object,,,config,auth_third_party_auths,delete, +post,/v1/projects/{ref}/pause,v1-pause-a-project,Projects,ref,ref,,n,,,,,,none,,,projects,projects,exec, +post,/v1/projects/{ref}/restart,v1-restart-a-project,Projects,ref,ref,,n,,,,,,none,,,projects,projects,exec, +get,/v1/projects/{ref}/restore,v1-list-available-restore-versions,Projects,ref,ref,,n,,,,,,object,available_versions,,projects,restores,select, +post,/v1/projects/{ref}/restore,v1-restore-a-project,Projects,ref,ref,,n,,,,,,none,,,projects,projects,exec, +post,/v1/projects/{ref}/restore/cancel,v1-cancel-a-project-restoration,Projects,ref,ref,,n,,,,,,none,,,projects,restores,exec, +get,/v1/projects/{ref}/billing/addons,v1-list-project-addons,Billing,ref,ref,,n,,,,,,object,selected_addons;available_addons,,billing,addons,select, +patch,/v1/projects/{ref}/billing/addons,v1-apply-project-addon,Billing,ref,ref,,y,application/json,,patch-partial-presumed,,,none,,,billing,addons,update, +delete,/v1/projects/{ref}/billing/addons/{addon_variant},v1-remove-project-addon,Billing,ref,ref;addon_variant,,n,,,,,,none,,,billing,addons,delete, +get,/v1/projects/{ref}/claim-token,v1-get-project-claim-token,Projects,ref,ref,,n,,,,,,object,,,projects,claim_tokens,select, +post,/v1/projects/{ref}/claim-token,v1-create-project-claim-token,Projects,ref,ref,,n,,,,,,object,,,projects,claim_tokens,insert, +delete,/v1/projects/{ref}/claim-token,v1-delete-project-claim-token,Projects,ref,ref,,n,,,,,,none,,,projects,claim_tokens,delete, +get,/v1/projects/{ref}/advisors/performance,v1-get-performance-advisors,Advisors,ref,ref,,n,,,,,y,object,lints,,advisors,performances,select, +get,/v1/projects/{ref}/advisors/security,v1-get-security-advisors,Advisors,ref,ref,,n,,,,,y,object,lints,,advisors,securities,select, +get,/v1/projects/{ref}/analytics/endpoints/logs.all,v1-get-project-logs-all,Analytics,ref,ref,,n,,,,,y,object,result,,analytics,endpoints_logs_alls,select, +get,/v1/projects/{ref}/analytics/endpoints/logs,v1-get-project-logs,Analytics,ref,ref,,n,,,,,,object,result,,analytics,endpoints_logs,select, +get,/v1/projects/{ref}/analytics/endpoints/usage.api-counts,v1-get-project-usage-api-count,Analytics,ref,ref,,n,,,,,,object,result,,analytics,endpoints_usage_api_counts,select, +get,/v1/projects/{ref}/analytics/endpoints/usage.api-requests-count,v1-get-project-usage-request-count,Analytics,ref,ref,,n,,,,,,object,result,,analytics,endpoints_usage_api_requests_counts,select, +get,/v1/projects/{ref}/analytics/endpoints/functions.combined-stats,v1-get-project-function-combined-stats,Analytics,ref,ref,,n,,,,,,object,result,,analytics,endpoints_functions_combined_stats,select, +get,/v1/projects/{ref}/analytics/endpoints/metrics,v1-scrape-project-metrics,Analytics,ref,ref,,n,,,,,,non-json,,text/plain;application/openmetrics-text,analytics,,,non_json_text_response +post,/v1/projects/{ref}/cli/login-role,v1-create-login-role,Database,ref,ref,,y,application/json,,,beta,,object,,,database,cli_login_roles,insert, +delete,/v1/projects/{ref}/cli/login-role,v1-delete-login-roles,Database,ref,ref,,n,,,,beta,,object,,,database,cli_login_roles,delete, +get,/v1/projects/{ref}/database/migrations,v1-list-migration-history,Database,ref,ref,,n,,,,,,bare-array,,,database,migrations,select, +post,/v1/projects/{ref}/database/migrations,v1-apply-a-migration,Database,ref,ref,,y,application/json,,,,,none,,,database,migrations,insert, +put,/v1/projects/{ref}/database/migrations,v1-upsert-a-migration,Database,ref,ref,,y,application/json,,put-replace-unverified,,,none,,,database,migrations,update, +delete,/v1/projects/{ref}/database/migrations,v1-rollback-migrations,Database,ref,ref,,n,,,,,,none,,,database,migrations,delete, +get,/v1/projects/{ref}/database/migrations/{version},v1-get-a-migration,Database,ref,ref;version,,n,,,,,,object,statements;rollback,,database,migrations,select, +patch,/v1/projects/{ref}/database/migrations/{version},v1-patch-a-migration,Database,ref,ref;version,,y,application/json,,patch-partial-presumed,,,none,,,database,migrations,update, +post,/v1/projects/{ref}/database/query,v1-run-a-query,Database,ref,ref,,y,application/json,,,beta,,none,,,database,databases,exec, +post,/v1/projects/{ref}/database/query/read-only,v1-read-only-query,Database,ref,ref,,y,application/json,,,beta,,none,,,database,queries,exec, +post,/v1/projects/{ref}/database/webhooks/enable,v1-enable-database-webhook,Database,ref,ref,,n,,,,beta,,none,,,database,webhooks,exec, +get,/v1/projects/{ref}/database/context,v1-get-database-metadata,Database,ref,ref,,n,,,,,y,object,databases,,database,contexts,select, +patch,/v1/projects/{ref}/database/password,v1-update-database-password,Database,ref,ref,,y,application/json,,patch-partial-presumed,,,object,,,database,databases,exec, +get,/v1/projects/{ref}/database/jit,v1-get-jit-access,Database,ref,ref,,n,,,,,,object,user_roles,,database,jits,select, +post,/v1/projects/{ref}/database/jit,v1-authorize-jit-access,Database,ref,ref,,y,application/json,,,,,object,,,database,jits,insert, +put,/v1/projects/{ref}/database/jit,v1-update-jit-access,Database,ref,ref,,y,application/json,,put-replace-unverified,,,object,user_roles,,database,jits,update, +get,/v1/projects/{ref}/database/jit/list,v1-list-jit-access,Database,ref,ref,,n,,,,,,object,items,,database,jit_lists,select, +post,/v1/projects/{ref}/database/jit/invite,v1-invite-external-jit-access,Database,ref,ref,,y,application/json,,,,,object,user_roles,,database,jit_invites,insert, +post,/v1/projects/{ref}/database/jit/invite/accept,v1-accept-invite-external-jit-access,Database,ref,ref,,y,application/json,,,,,object,user_roles,,database,jit_invites,exec, +delete,/v1/projects/{ref}/database/jit/invite/{invite_id},v1-delete-invite-external-jit-access,Database,ref,ref;invite_id,,n,,,,,,none,,,database,jit_invites,delete, +delete,/v1/projects/{ref}/database/jit/{user_id},v1-delete-jit-access,Database,ref,ref;user_id,,n,,,,,,none,,,database,jits,delete, +get,/v1/projects/{ref}/database/openapi,v1-get-database-openapi,Database,ref,ref,,n,,,,,,untyped-json,,,database,,,untyped_json_response +get,/v1/projects/{ref}/functions,v1-list-all-functions,Edge Functions,ref,ref,,n,,,,,,bare-array,,,functions,functions,select, +post,/v1/projects/{ref}/functions,v1-create-a-function,Edge Functions,ref,ref,,y,application/vnd.denoland.eszip;application/json,,,,y,object,,,functions,functions,insert, +put,/v1/projects/{ref}/functions,v1-bulk-update-functions,Edge Functions,ref,ref,,y,application/json,y,put-replace-unverified,,,object,functions,,functions,,,bare_array_bulk_body +post,/v1/projects/{ref}/functions/deploy,v1-deploy-a-function,Edge Functions,ref,ref,,y,multipart/form-data,,,,,object,,,functions,,,multipart_eszip_deploy +get,/v1/projects/{ref}/functions/{function_slug},v1-get-a-function,Edge Functions,ref,ref;function_slug,,n,,,,,,object,,,functions,functions,select, +patch,/v1/projects/{ref}/functions/{function_slug},v1-update-a-function,Edge Functions,ref,ref;function_slug,,y,application/vnd.denoland.eszip;application/json,,patch-partial-presumed,,,object,,,functions,functions,update, +delete,/v1/projects/{ref}/functions/{function_slug},v1-delete-a-function,Edge Functions,ref,ref;function_slug,,n,,,,,,none,,,functions,functions,delete, +get,/v1/projects/{ref}/functions/{function_slug}/body,v1-get-a-function-body,Edge Functions,ref,ref;function_slug,,n,,,,,,untyped-json,,,functions,,,untyped_function_body +get,/v1/projects/{ref}/storage/buckets,v1-list-all-buckets,Storage,ref,ref,,n,,,,,,bare-array,,,storage,buckets,select, +get,/v1/projects/{ref}/config/disk,v1-get-database-disk,Projects,ref,ref,,n,,,,,,object,,,projects,config_disks,select, +post,/v1/projects/{ref}/config/disk,v1-modify-database-disk,Projects,ref,ref,,y,application/json,,,,,none,,,projects,config_disks,insert, +get,/v1/projects/{ref}/config/disk/util,v1-get-disk-utilization,Projects,ref,ref,,n,,,,,,object,,,projects,config_disk_utils,select, +get,/v1/projects/{ref}/config/disk/autoscale,v1-get-project-disk-autoscale-config,Projects,ref,ref,,n,,,,,,object,,,projects,config_disk_autoscales,select, +get,/v1/projects/{ref}/config/storage,v1-get-storage-config,Storage,ref,ref,,n,,,,,,object,,,config,storages,select, +patch,/v1/projects/{ref}/config/storage,v1-update-storage-config,Storage,ref,ref,,y,application/json,,patch-partial-presumed,,,none,,,config,storages,update, +get,/v1/projects/{ref}/config/database/pgbouncer,v1-get-project-pgbouncer-config,Database,ref,ref,,n,,,,,,object,,,config,database_pgbouncers,select, +get,/v1/projects/{ref}/config/database/pooler,v1-get-pooler-config,Database,ref,ref,,n,,,,,,bare-array,,,config,database_poolers,select, +patch,/v1/projects/{ref}/config/database/pooler,v1-update-pooler-config,Database,ref,ref,,y,application/json,,patch-partial-presumed,,,object,,,config,database_poolers,update, +get,/v1/projects/{ref}/config/database/postgres,v1-get-postgres-config,Database,ref,ref,,n,,,,,,object,,,config,database_postgres,select, +put,/v1/projects/{ref}/config/database/postgres,v1-update-postgres-config,Database,ref,ref,,y,application/json,,put-replace-unverified,,,object,,,config,database_postgres,update, +get,/v1/projects/{ref}/config/realtime,v1-get-realtime-config,Realtime,ref,ref,,n,,,,,,object,,,config,realtimes,select, +patch,/v1/projects/{ref}/config/realtime,v1-update-realtime-config,Realtime,ref,ref,,y,application/json,,patch-partial-presumed,,,none,,,config,realtimes,update, +post,/v1/projects/{ref}/config/realtime/shutdown,v1-shutdown-realtime,Realtime,ref,ref,,n,,,,,,none,,,config,realtimes,exec, +get,/v1/projects/{ref}/config/auth/sso/providers,v1-list-all-sso-provider,Auth,ref,ref,,n,,,,,,object,items,,config,auth_sso_providers,select, +post,/v1/projects/{ref}/config/auth/sso/providers,v1-create-a-sso-provider,Auth,ref,ref,,y,application/json,,,,,object,domains,,config,auth_sso_providers,insert, +get,/v1/projects/{ref}/config/auth/sso/providers/{provider_id},v1-get-a-sso-provider,Auth,ref,ref;provider_id,,n,,,,,,object,domains,,config,auth_sso_providers,select, +put,/v1/projects/{ref}/config/auth/sso/providers/{provider_id},v1-update-a-sso-provider,Auth,ref,ref;provider_id,,y,application/json,,put-replace-unverified,,,object,domains,,config,auth_sso_providers,update, +delete,/v1/projects/{ref}/config/auth/sso/providers/{provider_id},v1-delete-a-sso-provider,Auth,ref,ref;provider_id,,n,,,,,,object,domains,,config,auth_sso_providers,delete, +get,/v1/projects/{ref}/database/backups,v1-list-all-backups,Database,ref,ref,,n,,,,,,object,backups,,database,backups,select, +post,/v1/projects/{ref}/database/backups/restore-pitr,v1-restore-pitr-backup,Database,ref,ref,,y,application/json,,,,,none,,,database,backups,exec, +get,/v1/projects/{ref}/database/backups/restore-point,v1-get-restore-point,Database,ref,ref,,n,,,,,,object,,,database,backups_restore_points,select, +post,/v1/projects/{ref}/database/backups/restore-point,v1-create-restore-point,Database,ref,ref,,y,application/json,,,,,object,,,database,backups_restore_points,insert, +post,/v1/projects/{ref}/database/backups/restore,v1-restore-physical-backup,Database,ref,ref,,y,application/json,,,,,none,,,database,backups,exec, +get,/v1/projects/{ref}/database/backups/schedule,v1-get-backup-schedule,Database,ref,ref,,n,,,,,,object,,,database,backups_schedules,select, +patch,/v1/projects/{ref}/database/backups/schedule,v1-update-backup-schedule,Database,ref,ref,,y,application/json,,patch-partial-presumed,,,object,,,database,backups_schedules,update, +post,/v1/projects/{ref}/database/backups/undo,v1-undo,Database,ref,ref,,y,application/json,,,,,none,,,database,backups,exec, +get,/v1/organizations/{slug}/entitlements,v1-get-organization-entitlements,Organizations,slug,slug,,n,,,,,,object,entitlements,,organizations,entitlements,select, +get,/v1/organizations/{slug}/members,v1-list-organization-members,Organizations,slug,slug,,n,,,,,,bare-array,,,organizations,members,select, +get,/v1/organizations/{slug},v1-get-an-organization,Organizations,slug,slug,,n,,,,,,object,opt_in_tags;allowed_release_channels,,organizations,organizations,select, +get,/v1/organizations/{slug}/project-claim/{token},v1-get-organization-project-claim,Organizations,slug,slug;token,,n,,,,,,object,,,organizations,project_claims,select, +post,/v1/organizations/{slug}/project-claim/{token},v1-claim-project-for-organization,Organizations,slug,slug;token,,n,,,,,,none,,,organizations,project_claims,insert, +get,/v1/organizations/{slug}/projects,v1-get-all-projects-for-organization,Projects,slug,slug,offset;limit,n,,,,,,object,projects,,projects,projects,select, diff --git a/provider-dev/config/servers.json b/provider-dev/config/servers.json new file mode 100644 index 0000000..732c043 --- /dev/null +++ b/provider-dev/config/servers.json @@ -0,0 +1,11 @@ +[ + { + "url": "https://api.supabase.com/v1/projects/{ref}", + "variables": { + "ref": { + "description": "Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment.", + "x-stackQL-envVar": "SUPABASE_PROJECT_ID" + } + } + } +] diff --git a/provider-dev/config/service_names.json b/provider-dev/config/service_names.json new file mode 100644 index 0000000..9a06485 --- /dev/null +++ b/provider-dev/config/service_names.json @@ -0,0 +1,130 @@ +{ + "description": "Service split for the supabase provider. Ordered path rules, first match wins; every operation path must match a rule (the terminal catch-all assigns remaining project-scoped resources to the projects service). Used by bin/split.mjs and provider-dev/scripts/build_inventory.mjs via lib/spec_helpers.mjs. Deviations from the CLAUDE.md candidate list, decided from the endpoint inventory: analytics (logs and usage), advisors (security/performance lints), oauth (the OAuth-app flow, skip-coded), and profile (the PAT identity read) are surfaces the candidate list did not enumerate; api-keys sit in secrets (vendor tag Secrets); JIT access config sits in database beside the JIT role mappings. A rule with \"excluded\": true still classifies its paths (the inventory records them, reason-coded) but bin/split.mjs does not emit the service - oauth is the OAuth-app user-agent flow (browser redirects and a form token exchange), entirely skip-coded, so it would be an empty service.", + "rules": [ + { + "pathRegex": "^/v1/oauth/", + "service": "oauth", + "excluded": true + }, + { + "pathRegex": "^/v1/profile$", + "service": "profile" + }, + { + "pathRegex": "^/v1/snippets", + "service": "database" + }, + { + "pathRegex": "^/v1/branches/", + "service": "branches" + }, + { + "pathRegex": "^/v1/organizations/\\{slug\\}/projects", + "service": "projects" + }, + { + "pathRegex": "^/v1/organizations", + "service": "organizations" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/branches", + "service": "branches" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/actions", + "service": "branches" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/config/auth", + "service": "config" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/config/database", + "service": "config" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/config/realtime", + "service": "config" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/config/storage", + "service": "config" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/postgrest", + "service": "config" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/ssl-enforcement", + "service": "config" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/pgsodium", + "service": "config" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/jit-access", + "service": "database" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/network-", + "service": "network" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/custom-hostname", + "service": "domains" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/vanity-subdomain", + "service": "domains" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/functions", + "service": "functions" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/secrets", + "service": "secrets" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/api-keys", + "service": "secrets" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/database/", + "service": "database" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/readonly", + "service": "database" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/types/typescript", + "service": "database" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/cli/login-role", + "service": "database" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/storage/", + "service": "storage" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/billing/", + "service": "billing" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/analytics/", + "service": "analytics" + }, + { + "pathRegex": "^/v1/projects/\\{ref\\}/advisors/", + "service": "advisors" + }, + { + "pathRegex": "^/v1/projects", + "service": "projects" + } + ] +} diff --git a/provider-dev/config/spec_pin.json b/provider-dev/config/spec_pin.json new file mode 100644 index 0000000..c56228a --- /dev/null +++ b/provider-dev/config/spec_pin.json @@ -0,0 +1,25 @@ +{ + "specs": { + "supabase-v1": { + "url": "https://api.supabase.com/api/v1-json", + "filename": "supabase-v1.json", + "spec_version": "1.0.0", + "openapi": "3.0.0", + "paths": 115, + "operations": 170, + "sha256": "660e5634fab8f9bf906f816f29fe3cee6827a1d373cfdd4ead0c57f63ed4627e", + "sanitized_sha256": "2840ef6c90422e1567de6a9a5034c04c6516e10c1c1cbf99ad849ee1ca5e5e33", + "fixes": { + "type_null_to_nullable": 5, + "hide_definitions_removed": 0, + "property_names_removed": 3, + "exclusive_bound_lowered": 3, + "schema_dialect_key_removed": 2, + "const_to_enum": 2 + }, + "redactions": {}, + "bytes": 335177, + "fetched": "2026-08-27" + } + } +} diff --git a/provider-dev/docgen/provider-data/.gitkeep b/provider-dev/docgen/provider-data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/provider-dev/docgen/provider-data/headerContent1.txt b/provider-dev/docgen/provider-data/headerContent1.txt new file mode 100644 index 0000000..8eac074 --- /dev/null +++ b/provider-dev/docgen/provider-data/headerContent1.txt @@ -0,0 +1,23 @@ +--- +title: supabase +hide_title: false +hide_table_of_contents: false +keywords: + - supabase + - supabase management api + - postgres + - edge functions + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory + - security posture +description: Query, provision and manage Supabase organizations, projects, branches, edge functions, secrets, auth and Postgres configuration, network restrictions and the project database itself using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +id: 'provider-intro' +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; + +Query, provision and operate the Supabase control plane using SQL - organizations and members, the project estate, preview branches, edge functions, secrets and API keys, project configuration (auth, Postgres, pooler, API, storage, realtime, SSL enforcement), custom domains, network restrictions and bans, backups and restore points, add-ons, security and performance advisors, and the project SQL query endpoint, so the control plane and the project database itself are queryable in one place. The project security posture (which projects allow signups, lack MFA or SSL enforcement, or accept connections from anywhere) and the estate inventory are the queries this provider exists for. diff --git a/provider-dev/docgen/provider-data/headerContent2.txt b/provider-dev/docgen/provider-data/headerContent2.txt new file mode 100644 index 0000000..ad0a500 --- /dev/null +++ b/provider-dev/docgen/provider-data/headerContent2.txt @@ -0,0 +1,195 @@ +See also: +[[` SHOW `]](https://stackql.io/docs/language-spec/show) [[` DESCRIBE `]](https://stackql.io/docs/language-spec/describe) [[` REGISTRY `]](https://stackql.io/docs/language-spec/registry) +* * * + +## Installation + +To pull the latest version of the `supabase` provider, run the following command: + +```bash +REGISTRY PULL supabase; +``` +> To view previous provider versions or to pull a specific provider version, see [here](https://stackql.io/docs/language-spec/registry). + +## Scope + +This provider covers the Supabase Management API at `https://api.supabase.com` (the control plane): organizations, projects, branches, functions, secrets, configuration, domains, networking, backups, billing add-ons, advisors, analytics and the project SQL query endpoint. The per-project data APIs (PostgREST at `.supabase.co/rest/v1`, Realtime, Storage object I/O, GoTrue user-facing auth) are per-project hosts with per-project keys - a different surface, reserved as a possible future `supabase_project` sibling provider. Supabase's official Terraform provider is labelled Public Alpha by the vendor and covers seven resources; this provider's surface is generated mechanically from the vendor's published OpenAPI document (159 operations across 15 services). + +## Authentication + +The provider authenticates with a personal access token as a bearer token. Create one in the Supabase dashboard under Account -> Access Tokens, export it as (the same variable the Supabase CLI and the Terraform provider read), and StackQL picks it up with no further configuration: + +```bash +export SUPABASE_ACCESS_TOKEN='sbp_...' +export SUPABASE_PROJECT_ID='abcdefghijklmnopqrst' # optional, see project scope +``` + +or using PowerShell: + +```powershell +$env:SUPABASE_ACCESS_TOKEN = 'sbp_...' +$env:SUPABASE_PROJECT_ID = 'abcdefghijklmnopqrst' +``` + +## Project scope + +Most resources are scoped to a project, addressed by its reference (`ref` - the Project ID shown in the dashboard under Settings -> General). `ref` is a server variable resolved from the environment variable when it is set, so queries against one project need no `WHERE ref` clause: + +```sql +SELECT disable_signup, mfa_totp_enroll_enabled, password_min_length +FROM supabase.config.auth_configs; +``` + +A `WHERE ref = '...'` value always takes precedence over the environment, which is how a single session addresses several projects. With the variable unset, `ref` is a required parameter on every project-scoped method (visible in `SHOW METHODS`) and must be supplied per query. To discover project refs: + +```sql +SELECT id, name, region, status, organization_slug FROM supabase.projects.projects; +``` + +Organization resources scope by `slug`; preview branches by `branch_id_or_ref`. + +## Rate limit + +The Management API allows a fixed number of requests per minute per user (documented as 120, with lower limits on analytics and database context endpoints) and answers `429 Too Many Requests` for the remainder of the minute. Queries that fan out across many projects (a config read for every project in the estate) consume the budget quickly; sequence wide scans rather than issuing them in parallel. + +## Beta endpoints + +The vendor labels part of the surface `[Beta]` (and one endpoint `[Alpha]`); the label is carried through as the first line of each method's description. The query endpoint, network restrictions and bans, custom domains, SSL enforcement, read replicas, JIT access and the upgrade surface are beta. A few operations are deprecated by the vendor (the advisors reads, `logs.all`, the database context read and the JSON edge function create) and stay mapped with the deprecation noted. Refreshes of the provider are reviewed spec diffs against a content-hash pin. + +## Example queries + +### Project estate inventory + +Every project the token can see, with status and region: + +```sql +SELECT id, name, region, status, organization_slug, created_at +FROM supabase.projects.projects +ORDER BY organization_slug, name; +``` + +### Project security posture in four statements + +With `SUPABASE_PROJECT_ID` set to the project under review. Signups, MFA and password policy: + +```sql +SELECT disable_signup, external_anonymous_users_enabled, + mfa_totp_enroll_enabled, mfa_phone_enroll_enabled, + password_min_length, password_hibp_enabled, mailer_otp_exp +FROM supabase.config.auth_configs; +``` + +SSL enforcement on the database: + +```sql +SELECT applied_successfully, + json_extract(current_config, '$.database') AS ssl_enforced +FROM supabase.config.ssl_enforcement_configs; +``` + +Network restrictions - `0.0.0.0/0` means any address may reach the database: + +```sql +SELECT entitlement, status, + json_extract(config, '$.dbAllowedCidrs') AS allowed_v4, + json_extract(config, '$.dbAllowedCidrsV6') AS allowed_v6 +FROM supabase.network.network_restrictions; +``` + +The vendor's own security lints for the project: + +```sql +SELECT name, level, title, json_extract(metadata, '$.name') AS object +FROM supabase.advisors.security_lints +WHERE level = 'ERROR'; +``` + +To review several projects in one statement, address each by `ref`: + +```sql +SELECT 'abcdefghijklmnopqrst' AS ref, disable_signup, mfa_totp_enroll_enabled +FROM supabase.config.auth_configs WHERE ref = 'abcdefghijklmnopqrst' +UNION ALL +SELECT 'tsrqponmlkjihgfedcba', disable_signup, mfa_totp_enroll_enabled +FROM supabase.config.auth_configs WHERE ref = 'tsrqponmlkjihgfedcba'; +``` + +### Control plane to Postgres rows in two statements + +List the projects, then query one of them. The query endpoint runs arbitrary SQL against the project database as the service role; the result rows depend on the statement and arrive as one row whose `rows` column carries the result set: + +```sql +SELECT id, name FROM supabase.projects.projects; + +INSERT INTO supabase.database.queries (ref, query) +SELECT 'abcdefghijklmnopqrst', + 'select schemaname, relname, n_live_tup from pg_stat_user_tables order by n_live_tup desc limit 10' +RETURNING rows; +``` + +Address values in the result with `json_extract(rows, '$[0].relname')`. The statement is executed as written - a `drop table` is a `drop table`; prefer the `read_only` flag (`INSERT ... (ref, query, read_only) SELECT ..., true`) or the `run_read_only` method for inspection queries. + +### Secrets and function inventory + +```sql +SELECT name, updated_at FROM supabase.secrets.secrets; + +SELECT slug, name, status, verify_jwt, version +FROM supabase.functions.edge_functions; +``` + +### Branch hygiene + +Preview branches that are not persistent and have not been updated recently: + +```sql +SELECT name, git_branch, status, persistent, updated_at +FROM supabase.branches.branches +WHERE persistent = false +ORDER BY updated_at; +``` + +### Provisioning + +Secrets are created one per statement (the wire call is the bulk endpoint): + +```sql +INSERT INTO supabase.secrets.secrets (name, value) +SELECT 'STRIPE_WEBHOOK_SECRET', 'whsec_...'; + +DELETE FROM supabase.secrets.secrets WHERE name = 'STRIPE_WEBHOOK_SECRET'; +``` + +Configuration is updated in place (`UPDATE` sends only the columns you set; values are sent as strings): + +```sql +UPDATE supabase.config.auth_configs +SET disable_signup = 'true', password_min_length = '12'; +``` + +Network restrictions are applied with an `EXEC` (the body takes the allow-lists as JSON arrays): + +```sql +EXEC supabase.network.network_restrictions.apply + @db_allowed_cidrs = '["203.0.113.0/24"]', + @db_allowed_cidrs_v6 = '[]'; +``` + +Project lifecycle operations are `EXEC` methods on `projects.projects`: + +```sql +EXEC supabase.projects.projects.pause @ref = 'abcdefghijklmnopqrst'; +EXEC supabase.projects.projects.restore @ref = 'abcdefghijklmnopqrst'; +``` + +### The serverless Postgres estate + +Supabase projects alongside Neon projects, once the `neon` provider ships: + +```sql +SELECT 'supabase' AS platform, name, region, status +FROM supabase.projects.projects +UNION ALL +SELECT 'neon', name, region_id, NULL +FROM neon.projects.projects; +``` diff --git a/provider-dev/downloaded/.gitkeep b/provider-dev/downloaded/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/provider-dev/downloaded/supabase-v1.json b/provider-dev/downloaded/supabase-v1.json new file mode 100644 index 0000000..ff6e823 --- /dev/null +++ b/provider-dev/downloaded/supabase-v1.json @@ -0,0 +1 @@ +{"openapi":"3.0.0","paths":{"/v1/branches/{branch_id_or_ref}":{"get":{"description":"Fetches configurations of the specified database branch","operationId":"v1-get-a-branch-config","parameters":[{"name":"branch_id_or_ref","required":true,"in":"path","description":"Branch ref or deprecated branch ID","schema":{"example":"abcdefghijklmnopqrst","anyOf":[{"type":"string","minLength":20,"maxLength":20,"pattern":"^[a-z]+$","description":"Project ref","example":"abcdefghijklmnopqrst"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","deprecated":true}]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchDetailResponse"}}}},"500":{"description":"Failed to retrieve database branch"}},"security":[{"bearer":[]}],"summary":"Get database branch config","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:read","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_development_read"],["branching_production_read"]],"x-oauth-scope":"environment:read"},"patch":{"description":"Updates the configuration of the specified database branch","operationId":"v1-update-a-branch-config","parameters":[{"name":"branch_id_or_ref","required":true,"in":"path","description":"Branch ref or deprecated branch ID","schema":{"example":"abcdefghijklmnopqrst","anyOf":[{"type":"string","minLength":20,"maxLength":20,"pattern":"^[a-z]+$","description":"Project ref","example":"abcdefghijklmnopqrst"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","deprecated":true}]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBranchBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchResponse"}}}},"500":{"description":"Failed to update database branch"}},"security":[{"bearer":[]}],"summary":"Update database branch config","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_development_write"],["branching_production_write"]],"x-oauth-scope":"environment:write"},"delete":{"description":"Deletes the specified database branch. By default, deletes immediately. Use force=false to schedule deletion with 1-hour grace period (only when soft deletion is enabled).","operationId":"v1-delete-a-branch","parameters":[{"name":"branch_id_or_ref","required":true,"in":"path","description":"Branch ref or deprecated branch ID","schema":{"example":"abcdefghijklmnopqrst","anyOf":[{"type":"string","minLength":20,"maxLength":20,"pattern":"^[a-z]+$","description":"Project ref","example":"abcdefghijklmnopqrst"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","deprecated":true}]}},{"name":"force","required":false,"in":"query","description":"If set to false, schedule deletion with 1-hour grace period (only when soft deletion is enabled).","schema":{"example":false,"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchDeleteResponse"}}}},"500":{"description":"Failed to delete database branch"}},"security":[{"bearer":[]}],"summary":"Delete a database branch","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_development_delete"],["branching_production_delete"]],"x-oauth-scope":"environment:write"}},"/v1/branches/{branch_id_or_ref}/push":{"post":{"description":"Pushes the specified database branch","operationId":"v1-push-a-branch","parameters":[{"name":"branch_id_or_ref","required":true,"in":"path","description":"Branch ref or deprecated branch ID","schema":{"example":"abcdefghijklmnopqrst","anyOf":[{"type":"string","minLength":20,"maxLength":20,"pattern":"^[a-z]+$","description":"Project ref","example":"abcdefghijklmnopqrst"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","deprecated":true}]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchActionBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchUpdateResponse"}}}},"500":{"description":"Failed to push database branch"}},"security":[{"bearer":[]}],"summary":"Pushes a database branch","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_development_write"],["branching_production_write"]],"x-oauth-scope":"environment:write"}},"/v1/branches/{branch_id_or_ref}/merge":{"post":{"description":"Merges the specified database branch","operationId":"v1-merge-a-branch","parameters":[{"name":"branch_id_or_ref","required":true,"in":"path","description":"Branch ref or deprecated branch ID","schema":{"example":"abcdefghijklmnopqrst","anyOf":[{"type":"string","minLength":20,"maxLength":20,"pattern":"^[a-z]+$","description":"Project ref","example":"abcdefghijklmnopqrst"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","deprecated":true}]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchActionBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchUpdateResponse"}}}},"500":{"description":"Failed to merge database branch"}},"security":[{"bearer":[]}],"summary":"Merges a database branch","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_development_write"],["branching_production_write"]],"x-oauth-scope":"environment:write"}},"/v1/branches/{branch_id_or_ref}/reset":{"post":{"description":"Resets the specified database branch","operationId":"v1-reset-a-branch","parameters":[{"name":"branch_id_or_ref","required":true,"in":"path","description":"Branch ref or deprecated branch ID","schema":{"example":"abcdefghijklmnopqrst","anyOf":[{"type":"string","minLength":20,"maxLength":20,"pattern":"^[a-z]+$","description":"Project ref","example":"abcdefghijklmnopqrst"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","deprecated":true}]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchActionBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchUpdateResponse"}}}},"500":{"description":"Failed to reset database branch"}},"security":[{"bearer":[]}],"summary":"Resets a database branch","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_development_write"],["branching_production_write"]],"x-oauth-scope":"environment:write"}},"/v1/branches/{branch_id_or_ref}/restore":{"post":{"description":"Cancels scheduled deletion and restores the branch to active state","operationId":"v1-restore-a-branch","parameters":[{"name":"branch_id_or_ref","required":true,"in":"path","description":"Branch ref or deprecated branch ID","schema":{"example":"abcdefghijklmnopqrst","anyOf":[{"type":"string","minLength":20,"maxLength":20,"pattern":"^[a-z]+$","description":"Project ref","example":"abcdefghijklmnopqrst"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","deprecated":true}]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchRestoreResponse"}}}},"500":{"description":"Failed to restore database branch"}},"security":[{"bearer":[]}],"summary":"Restore a scheduled branch deletion","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_development_write"],["branching_production_write"]],"x-oauth-scope":"environment:write"}},"/v1/branches/{branch_id_or_ref}/diff":{"get":{"description":"Diffs the specified database branch","operationId":"v1-diff-a-branch","parameters":[{"name":"branch_id_or_ref","required":true,"in":"path","description":"Branch ref or deprecated branch ID","schema":{"example":"abcdefghijklmnopqrst","anyOf":[{"type":"string","minLength":20,"maxLength":20,"pattern":"^[a-z]+$","description":"Project ref","example":"abcdefghijklmnopqrst"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","deprecated":true}]}},{"name":"included_schemas","required":false,"in":"query","schema":{"example":"public,auth","type":"string"}},{"name":"pgdelta","required":false,"in":"query","description":"Use pg-delta instead of Migra for diffing when true. \nBoolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`","schema":{"example":"true","type":"string"}}],"responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":""},"500":{"description":"Failed to diff database branch"}},"security":[{"bearer":[]}],"summary":"[Beta] Diffs a database branch","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_development_write"],["branching_production_write"]],"x-oauth-scope":"environment:write"}},"/v1/projects":{"get":{"description":"Returns a list of all projects you've previously created.","operationId":"v1-list-all-projects","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/V1ProjectWithDatabaseResponse"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"List all projects","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["projects_read"]],"x-oauth-scope":"projects:read"},"post":{"operationId":"v1-create-a-project","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1CreateProjectBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ProjectResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Create a project","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:write","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["organization_projects_create"]],"x-oauth-scope":"projects:write"}},"/v1/projects/available-regions":{"get":{"operationId":"v1-get-available-regions","parameters":[{"name":"organization_slug","required":true,"in":"query","description":"Slug of your organization","schema":{"example":"tsrqponmlkjihgfedcba","type":"string"}},{"name":"continent","required":false,"in":"query","description":"Continent code to determine regional recommendations: NA (North America), SA (South America), EU (Europe), AF (Africa), AS (Asia), OC (Oceania), AN (Antarctica)","schema":{"example":"NA","type":"string","enum":["NA","SA","EU","AF","AS","OC","AN"]}},{"name":"desired_instance_size","required":false,"in":"query","description":"Desired instance size. Omit this field to always default to the smallest possible size.","schema":{"type":"string","enum":["nano","micro","small","medium","large","xlarge","2xlarge","4xlarge","8xlarge","12xlarge","16xlarge","24xlarge","24xlarge_optimized_memory","24xlarge_optimized_cpu","24xlarge_high_memory","48xlarge","48xlarge_optimized_memory","48xlarge_optimized_cpu","48xlarge_high_memory"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegionsInfo"}}}}},"security":[{"bearer":[]}],"summary":"[Beta] Gets the list of available regions that can be used for a new project","tags":["Projects"],"x-badges":[{"name":"OAuth scope: organizations:read","position":"after"}],"x-endpoint-owners":["infra"],"x-oauth-scope":"organizations:read"}},"/v1/organizations":{"get":{"description":"Returns a list of organizations that you currently belong to.","operationId":"v1-list-all-organizations","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationResponseV1"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Unexpected error listing organizations"}},"security":[{"bearer":[]}],"summary":"List all organizations","tags":["Organizations"],"x-badges":[{"name":"OAuth scope: organizations:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["organizations_read"]],"x-oauth-scope":"organizations:read"},"post":{"operationId":"v1-create-an-organization","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrganizationV1"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponseV1"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Unexpected error creating an organization"}},"security":[{"bearer":[]}],"summary":"Create an organization","tags":["Organizations"],"x-endpoint-owners":["control-plane","billing"],"x-fga-permissions":[["organizations_create"]]}},"/v1/oauth/authorize":{"get":{"operationId":"v1-authorize-user","parameters":[{"name":"client_id","required":true,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"66666666-6666-4666-8666-666666666666","type":"string"}},{"name":"response_type","required":true,"in":"query","schema":{"example":"code","type":"string","enum":["code","token","id_token token"]}},{"name":"redirect_uri","required":true,"in":"query","schema":{"example":"https://app.acme.com/auth/callback","type":"string"}},{"name":"scope","required":false,"in":"query","schema":{"example":"projects:read projects:write","type":"string"}},{"name":"state","required":false,"in":"query","schema":{"example":"st_9f4d3a206b2e4a7e8c91","type":"string"}},{"name":"response_mode","required":false,"in":"query","schema":{"example":"query","type":"string"}},{"name":"code_challenge","required":false,"in":"query","schema":{"example":"Z_P4EKbGwIkA01e3Y5fp4tMCvn_Ae5nUw7qY7XwkTrQ","type":"string"}},{"name":"code_challenge_method","required":false,"in":"query","schema":{"example":"S256","type":"string","enum":["plain","sha256","S256"]}},{"name":"organization_slug","required":false,"in":"query","description":"Organization slug","schema":{"pattern":"^[\\w-]+$","example":"tsrqponmlkjihgfedcba","type":"string"}},{"name":"target_flow","required":false,"in":"query","schema":{"type":"string"}},{"name":"resource","required":false,"in":"query","description":"Resource indicator for MCP (Model Context Protocol) clients","schema":{"format":"uri","example":"https://mcp.supabase.com/projects","type":"string"}}],"responses":{"204":{"description":""}},"summary":"[Beta] Authorize user through oauth","tags":["OAuth"],"x-endpoint-owners":["auth","control-plane"]}},"/v1/oauth/token":{"post":{"description":"Supports `authorization_code`, `refresh_token`, and `urn:ietf:params:oauth:grant-type:jwt-bearer` grant types. The `jwt-bearer` grant type (IDJAG — identity-directed JWT assertion) is in beta and available on Team and Enterprise plans only.","operationId":"v1-exchange-oauth-token","parameters":[],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/OAuthTokenBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthTokenResponse"}}}}},"summary":"[Beta] Exchange auth code for user's access and refresh token","tags":["OAuth"],"x-endpoint-owners":["auth","control-plane"]}},"/v1/oauth/revoke":{"post":{"operationId":"v1-revoke-token","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthRevokeTokenBody"}}}},"responses":{"204":{"description":""}},"summary":"[Beta] Revoke oauth app authorization and it's corresponding tokens","tags":["OAuth"],"x-endpoint-owners":["auth","control-plane"]}},"/v1/oauth/authorize/project-claim":{"get":{"description":"Initiates the OAuth authorization flow for the specified provider. After successful authentication, the user can claim ownership of the specified project.","operationId":"v1-oauth-authorize-project-claim","parameters":[{"name":"project_ref","required":true,"in":"query","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"client_id","required":true,"in":"query","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"66666666-6666-4666-8666-666666666666","type":"string"}},{"name":"response_type","required":true,"in":"query","schema":{"example":"code","type":"string","enum":["code","token","id_token token"]}},{"name":"redirect_uri","required":true,"in":"query","schema":{"example":"https://app.acme.com/auth/callback","type":"string"}},{"name":"state","required":false,"in":"query","schema":{"example":"st_9f4d3a206b2e4a7e8c91","type":"string"}},{"name":"response_mode","required":false,"in":"query","schema":{"example":"query","type":"string"}},{"name":"code_challenge","required":false,"in":"query","schema":{"example":"Z_P4EKbGwIkA01e3Y5fp4tMCvn_Ae5nUw7qY7XwkTrQ","type":"string"}},{"name":"code_challenge_method","required":false,"in":"query","schema":{"example":"S256","type":"string","enum":["plain","sha256","S256"]}}],"responses":{"204":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Authorize user through oauth and claim a project","tags":["OAuth"],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["organization_admin_write","project_admin_write"]]}},"/v1/snippets":{"get":{"operationId":"v1-list-all-snippets","parameters":[{"name":"project_ref","required":false,"in":"query","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string","minimum":1,"maximum":100}},{"name":"sort_by","required":false,"in":"query","schema":{"enum":["name","inserted_at"],"type":"string"}},{"name":"sort_order","required":false,"in":"query","schema":{"enum":["asc","desc"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnippetList"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to list user's SQL snippets"}},"security":[{"bearer":[]}],"summary":"Lists SQL snippets for the logged in user","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["snippets_read"]],"x-oauth-scope":"database:read"}},"/v1/snippets/{id}":{"get":{"operationId":"v1-get-a-snippet","parameters":[{"name":"id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"44444444-4444-4444-8444-444444444444","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnippetResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve SQL snippet"}},"security":[{"bearer":[]}],"summary":"Gets a specific SQL snippet","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["snippets_read"]],"x-oauth-scope":"database:read"}},"/v1/profile":{"get":{"operationId":"v1-get-profile","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ProfileResponse"}}}}},"security":[{"bearer":[]}],"summary":"Gets the user's profile","tags":["Profile"],"x-endpoint-owners":["control-plane"]}},"/v1/projects/{ref}/actions":{"head":{"description":"Returns the total number of action runs of the specified project.","operationId":"v1-count-action-runs","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"headers":{"X-Total-Count":{"schema":{"type":"integer","format":"int64","minimum":0},"description":"total count value"}},"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to count action runs"}},"security":[{"bearer":[]}],"summary":"Count the number of action runs","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:read","position":"after"}],"x-fga-permissions":[["action_runs_read"]],"x-oauth-scope":"environment:read"},"get":{"description":"Returns a paginated list of action runs of the specified project.","operationId":"v1-list-action-runs","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"example":0,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":10,"example":20,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListActionRunResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to list action runs"}},"security":[{"bearer":[]}],"summary":"List all action runs","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:read","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["action_runs_read"]],"x-oauth-scope":"environment:read"}},"/v1/projects/{ref}/actions/{run_id}":{"get":{"description":"Returns the current status of the specified action run.","operationId":"v1-get-action-run","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"run_id","required":true,"in":"path","description":"Action Run ID","schema":{"example":"run_01hq3q9m7y5q7e4a7x2c8m1p4n","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionRunResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get action run status"}},"security":[{"bearer":[]}],"summary":"Get the status of an action run","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:read","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["action_runs_read"]],"x-oauth-scope":"environment:read"}},"/v1/projects/{ref}/actions/{run_id}/status":{"patch":{"description":"Updates the status of an ongoing action run.","operationId":"v1-update-action-run-status","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"run_id","required":true,"in":"path","description":"Action Run ID","schema":{"example":"run_01hq3q9m7y5q7e4a7x2c8m1p4n","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRunStatusBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRunStatusResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update action run status"}},"security":[{"bearer":[]}],"summary":"Update the status of an action run","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["action_runs_write"]],"x-oauth-scope":"environment:write"}},"/v1/projects/{ref}/actions/{run_id}/logs":{"get":{"description":"Returns the logs from the specified action run.","operationId":"v1-get-action-run-logs","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"run_id","required":true,"in":"path","description":"Action Run ID","schema":{"example":"run_01hq3q9m7y5q7e4a7x2c8m1p4n","type":"string"}}],"responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get action run logs"}},"security":[{"bearer":[]}],"summary":"Get the logs of an action run","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:read","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["action_runs_read"]],"x-oauth-scope":"environment:read"}},"/v1/projects/{ref}/api-keys":{"get":{"operationId":"v1-get-project-api-keys","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"reveal","required":false,"in":"query","description":"Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`","schema":{"example":"true","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyResponse"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Get project api keys","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:read","position":"after"}],"x-endpoint-owners":["auth","control-plane"],"x-fga-permissions":[["api_gateway_keys_read"]],"x-oauth-scope":"secrets:read"},"post":{"operationId":"v1-create-project-api-key","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"reveal","required":false,"in":"query","description":"Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`","schema":{"example":"true","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Creates a new API key for the project","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:write","position":"after"}],"x-endpoint-owners":["auth","control-plane"],"x-fga-permissions":[["api_gateway_keys_write"]],"x-oauth-scope":"secrets:write"}},"/v1/projects/{ref}/api-keys/legacy":{"get":{"operationId":"v1-get-project-legacy-api-keys","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyApiKeysResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Check whether JWT based legacy (anon, service_role) API keys are enabled. This API endpoint will be removed in the future, check for HTTP 404 Not Found.","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:read","position":"after"}],"x-endpoint-owners":["auth","control-plane"],"x-fga-permissions":[["api_gateway_keys_read"]],"x-oauth-scope":"secrets:read"},"put":{"operationId":"v1-update-project-legacy-api-keys","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"enabled","required":true,"in":"query","description":"Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`","schema":{"example":"true","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyApiKeysResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Disable or re-enable JWT based legacy (anon, service_role) API keys. This API endpoint will be removed in the future, check for HTTP 404 Not Found.","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:write","position":"after"}],"x-endpoint-owners":["auth","control-plane"],"x-fga-permissions":[["api_gateway_keys_write"]],"x-oauth-scope":"secrets:write"}},"/v1/projects/{ref}/api-keys/{id}":{"patch":{"operationId":"v1-update-project-api-key","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"22222222-2222-4222-8222-222222222222","type":"string"}},{"name":"reveal","required":false,"in":"query","description":"Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`","schema":{"example":"true","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKeyBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Updates an API key for the project","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:write","position":"after"}],"x-endpoint-owners":["auth","control-plane"],"x-fga-permissions":[["api_gateway_keys_write"]],"x-oauth-scope":"secrets:write"},"get":{"operationId":"v1-get-project-api-key","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"22222222-2222-4222-8222-222222222222","type":"string"}},{"name":"reveal","required":false,"in":"query","description":"Boolean string.\n\nTruthy values: `true`, `1`, `yes`, `on`, `y`, `enabled`\n\nFalsy values: `false`, `0`, `no`, `off`, `n`, `disabled`","schema":{"example":"true","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Get API key","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:read","position":"after"}],"x-endpoint-owners":["auth","control-plane"],"x-fga-permissions":[["api_gateway_keys_read"]],"x-oauth-scope":"secrets:read"},"delete":{"operationId":"v1-delete-project-api-key","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"22222222-2222-4222-8222-222222222222","type":"string"}},{"name":"reveal","required":false,"in":"query","description":"Boolean string, true or false","schema":{"example":true,"type":"string"}},{"name":"was_compromised","required":false,"in":"query","description":"Boolean string, true or false","schema":{"example":false,"type":"string"}},{"name":"reason","required":false,"in":"query","schema":{"example":"rotating_key","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Deletes an API key for the project","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:write","position":"after"}],"x-endpoint-owners":["auth","control-plane"],"x-fga-permissions":[["api_gateway_keys_write"]],"x-oauth-scope":"secrets:write"}},"/v1/projects/{ref}/branches":{"get":{"description":"Returns all database branches of the specified project.","operationId":"v1-list-all-branches","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BranchResponse"}}}}},"500":{"description":"Failed to retrieve database branches"}},"security":[{"bearer":[]}],"summary":"List all database branches","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:read","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_development_read"],["branching_production_read"]],"x-oauth-scope":"environment:read"},"post":{"description":"Creates a database branch from the specified project.","operationId":"v1-create-a-branch","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBranchBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchResponse"}}}},"500":{"description":"Failed to create database branch"}},"security":[{"bearer":[]}],"summary":"Create a database branch","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_development_create"],["branching_production_create"]],"x-oauth-scope":"environment:write"},"delete":{"description":"Disables preview branching for the specified project","operationId":"v1-disable-preview-branching","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to disable preview branching"}},"security":[{"bearer":[]}],"summary":"Disables preview branching","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_production_delete"]],"x-oauth-scope":"environment:write"}},"/v1/projects/{ref}/branches/{name}":{"get":{"description":"Fetches the specified database branch by its name.","operationId":"v1-get-a-branch","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"name","required":true,"in":"path","schema":{"example":"preview-login-page","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BranchResponse"}}}},"500":{"description":"Failed to fetch database branch"}},"security":[{"bearer":[]}],"summary":"Get a database branch","tags":["Environments"],"x-badges":[{"name":"OAuth scope: environment:read","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["branching_development_read"],["branching_production_read"]],"x-oauth-scope":"environment:read"}},"/v1/projects/{ref}/custom-hostname":{"get":{"operationId":"v1-get-hostname-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomHostnameResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's custom hostname config"}},"security":[{"bearer":[]}],"summary":"[Beta] Gets project's custom hostname config","tags":["Domains"],"x-badges":[{"name":"OAuth scope: domains:read","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["custom_domain_read"]],"x-oauth-scope":"domains:read"},"delete":{"operationId":"v1-Delete hostname config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"remove_addon","required":false,"in":"query","description":"If true, also removes the custom domain add-on from the project subscription.","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to delete project custom hostname configuration"}},"security":[{"bearer":[]}],"summary":"[Beta] Deletes a project's custom hostname configuration","tags":["Domains"],"x-badges":[{"name":"OAuth scope: domains:write","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["custom_domain_write"]],"x-oauth-scope":"domains:write"}},"/v1/projects/{ref}/custom-hostname/initialize":{"post":{"operationId":"v1-update-hostname-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomHostnameBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomHostnameResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project custom hostname configuration"}},"security":[{"bearer":[]}],"summary":"[Beta] Updates project's custom hostname configuration","tags":["Domains"],"x-badges":[{"name":"OAuth scope: domains:write","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["custom_domain_write"]],"x-oauth-scope":"domains:write"}},"/v1/projects/{ref}/custom-hostname/reverify":{"post":{"operationId":"v1-verify-dns-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomHostnameResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to verify project custom hostname configuration"}},"security":[{"bearer":[]}],"summary":"[Beta] Attempts to verify the DNS configuration for project's custom hostname configuration","tags":["Domains"],"x-badges":[{"name":"OAuth scope: domains:write","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["custom_domain_write"]],"x-oauth-scope":"domains:write"}},"/v1/projects/{ref}/custom-hostname/activate":{"post":{"operationId":"v1-activate-custom-hostname","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomHostnameResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to activate project custom hostname configuration"}},"security":[{"bearer":[]}],"summary":"[Beta] Activates a custom hostname for a project.","tags":["Domains"],"x-badges":[{"name":"OAuth scope: domains:write","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["custom_domain_write"]],"x-oauth-scope":"domains:write"}},"/v1/projects/{ref}/jit-access":{"get":{"operationId":"v1-get-jit-access-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"state":{"type":"string","enum":["enabled","disabled"]},"appliedSuccessfully":{"type":"boolean"}},"required":["state"],"additionalProperties":false},{"type":"object","properties":{"state":{"type":"string","enum":["unavailable"]},"unavailableReason":{"type":"string","enum":["postgres_upgrade_required","ssl_enforcement_required","temporarily_unavailable"]}},"required":["state","unavailableReason"],"additionalProperties":false}]}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's temporary access configuration."}},"security":[{"bearer":[]}],"summary":"[Beta] Get project's temporary access configuration.","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["security","control-plane"],"x-fga-permissions":[["project_admin_read"]],"x-oauth-scope":"database:read"},"put":{"operationId":"v1-update-jit-access-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JitAccessRequestRequest"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"state":{"type":"string","enum":["enabled","disabled"]},"appliedSuccessfully":{"type":"boolean"}},"required":["state"],"additionalProperties":false},{"type":"object","properties":{"state":{"type":"string","enum":["unavailable"]},"unavailableReason":{"type":"string","enum":["postgres_upgrade_required","ssl_enforcement_required","temporarily_unavailable"]}},"required":["state","unavailableReason"],"additionalProperties":false}]}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project's temporary access configuration."}},"security":[{"bearer":[]}],"summary":"[Beta] Update project's temporary access configuration.","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["security","control-plane"],"x-fga-permissions":[["project_admin_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/network-bans/retrieve":{"post":{"operationId":"v1-list-all-network-bans","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkBanResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's network bans"}},"security":[{"bearer":[]}],"summary":"[Beta] Gets project's network bans","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:read","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["database_network_bans_read"]],"x-oauth-scope":"projects:read"}},"/v1/projects/{ref}/network-bans/retrieve/enriched":{"post":{"operationId":"v1-list-all-network-bans-enriched","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkBanResponseEnriched"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's enriched network bans"}},"security":[{"bearer":[]}],"summary":"[Beta] Gets project's network bans with additional information about which databases they affect","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:read","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["database_network_bans_read"]],"x-oauth-scope":"projects:read"}},"/v1/projects/{ref}/network-bans":{"delete":{"operationId":"v1-delete-network-bans","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveNetworkBanRequest"}}}},"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to remove network bans."}},"security":[{"bearer":[]}],"summary":"[Beta] Remove network bans.","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:write","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["database_network_bans_write"]],"x-oauth-scope":"projects:write"}},"/v1/projects/{ref}/network-restrictions":{"get":{"operationId":"v1-get-network-restrictions","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkRestrictionsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's network restrictions"}},"security":[{"bearer":[]}],"summary":"[Beta] Gets project's network restrictions","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:read","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["database_network_restrictions_read"]],"x-oauth-scope":"projects:read"},"patch":{"operationId":"v1-patch-network-restrictions","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkRestrictionsPatchRequest"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkRestrictionsV2Response"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project network restrictions"}},"security":[{"bearer":[]}],"summary":"[Alpha] Updates project's network restrictions by adding or removing CIDRs","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:write","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["database_network_restrictions_write"]],"x-oauth-scope":"projects:write"}},"/v1/projects/{ref}/network-restrictions/apply":{"post":{"operationId":"v1-update-network-restrictions","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkRestrictionsRequest"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkRestrictionsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project network restrictions"}},"security":[{"bearer":[]}],"summary":"[Beta] Updates project's network restrictions","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:write","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["database_network_restrictions_write"]],"x-oauth-scope":"projects:write"}},"/v1/projects/{ref}/pgsodium":{"get":{"operationId":"v1-get-pgsodium-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgsodiumConfigResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's pgsodium config"}},"security":[{"bearer":[]}],"summary":"[Beta] Gets project's pgsodium config","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:read","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["project_admin_write"]],"x-oauth-scope":"secrets:read"},"put":{"operationId":"v1-update-pgsodium-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePgsodiumConfigBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PgsodiumConfigResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project's pgsodium config"}},"security":[{"bearer":[]}],"summary":"[Beta] Updates project's pgsodium config. Updating the root_key can cause all data encrypted with the older key to become inaccessible.","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:write","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["project_admin_write"]],"x-oauth-scope":"secrets:write"}},"/v1/projects/{ref}/postgrest":{"get":{"operationId":"v1-get-postgrest-service-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostgrestConfigWithJWTSecretResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's postgrest config"}},"security":[{"bearer":[]}],"summary":"Gets project's postgrest config","tags":["Rest"],"x-badges":[{"name":"OAuth scope: rest:read","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["data_api_config_read"]],"x-oauth-scope":"rest:read"},"patch":{"operationId":"v1-update-postgrest-service-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1UpdatePostgrestConfigBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1PostgrestConfigResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project's postgrest config"}},"security":[{"bearer":[]}],"summary":"Updates project's postgrest config","tags":["Rest"],"x-badges":[{"name":"OAuth scope: rest:write","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["data_api_config_write"]],"x-oauth-scope":"rest:write"}},"/v1/projects/{ref}":{"get":{"operationId":"v1-get-project","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ProjectWithDatabaseResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project"}},"security":[{"bearer":[]}],"summary":"Gets a specific project that belongs to the authenticated user","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["project_admin_read"]],"x-oauth-scope":"projects:read"},"delete":{"operationId":"v1-delete-a-project","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ProjectRefResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Deletes the given project","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:write","position":"after"}],"x-endpoint-owners":["control-plane","infra","dev-workflows"],"x-fga-permissions":[["project_admin_write"]],"x-oauth-scope":"projects:write"},"patch":{"operationId":"v1-update-a-project","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1UpdateProjectBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ProjectRefResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project"}},"security":[{"bearer":[]}],"summary":"Updates the given project","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:write","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["project_admin_write"]],"x-oauth-scope":"projects:write"}},"/v1/projects/{ref}/secrets":{"get":{"description":"Returns all secrets you've previously added to the specified project.","operationId":"v1-list-all-secrets","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SecretResponse"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's secrets"}},"security":[{"bearer":[]}],"summary":"List all secrets","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:read","position":"after"}],"x-endpoint-owners":["functions"],"x-fga-permissions":[["edge_functions_secrets_read"]],"x-oauth-scope":"secrets:read"},"post":{"description":"Creates multiple secrets and adds them to the specified project.","operationId":"v1-bulk-create-secrets","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSecretBody"}}}},"responses":{"201":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to create project's secrets"}},"security":[{"bearer":[]}],"summary":"Bulk create secrets","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:write","position":"after"}],"x-endpoint-owners":["functions"],"x-fga-permissions":[["edge_functions_secrets_write"]],"x-oauth-scope":"secrets:write"},"delete":{"description":"Deletes all secrets with the given names from the specified project","operationId":"v1-bulk-delete-secrets","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteSecretsBody"}}}},"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to delete secrets with given names"}},"security":[{"bearer":[]}],"summary":"Bulk delete secrets","tags":["Secrets"],"x-badges":[{"name":"OAuth scope: secrets:write","position":"after"}],"x-endpoint-owners":["functions"],"x-fga-permissions":[["edge_functions_secrets_write"]],"x-oauth-scope":"secrets:write"}},"/v1/projects/{ref}/ssl-enforcement":{"get":{"operationId":"v1-get-ssl-enforcement-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SslEnforcementResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's SSL enforcement config"}},"security":[{"bearer":[]}],"summary":"[Beta] Get project's SSL enforcement configuration.","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["database_ssl_config_read"]],"x-oauth-scope":"database:read"},"put":{"operationId":"v1-update-ssl-enforcement-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SslEnforcementRequest"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SslEnforcementResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project's SSL enforcement configuration."}},"security":[{"bearer":[]}],"summary":"[Beta] Update project's SSL enforcement configuration.","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["database_ssl_config_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/types/typescript":{"get":{"description":"Returns the TypeScript types of your schema for use with supabase-js.","operationId":"v1-generate-typescript-types","parameters":[{"name":"included_schemas","required":false,"in":"query","schema":{"default":"public","example":"public,auth","type":"string"}},{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TypescriptResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to generate TypeScript types"}},"security":[{"bearer":[]}],"summary":"Generate TypeScript types","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["database_read"]],"x-oauth-scope":"database:read"}},"/v1/projects/{ref}/vanity-subdomain":{"get":{"operationId":"v1-get-vanity-subdomain-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VanitySubdomainConfigResponse"}}}},"400":{"description":"This feature requires the Pro, Team, or Enterprise organization plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanGateErrorBody"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get project vanity subdomain configuration"}},"security":[{"bearer":[]}],"summary":"[Beta] Gets current vanity subdomain config","tags":["Domains"],"x-allowed-plans":["Pro","Team","Enterprise"],"x-badges":[{"name":"OAuth scope: domains:read","position":"after"},{"name":"Only available on Pro, Team, Enterprise","position":"before"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["vanity_subdomain_read"]],"x-oauth-scope":"domains:read"},"delete":{"operationId":"v1-deactivate-vanity-subdomain-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to delete project vanity subdomain configuration"}},"security":[{"bearer":[]}],"summary":"[Beta] Deletes a project's vanity subdomain configuration","tags":["Domains"],"x-badges":[{"name":"OAuth scope: domains:write","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["vanity_subdomain_write"]],"x-oauth-scope":"domains:write"}},"/v1/projects/{ref}/vanity-subdomain/check-availability":{"post":{"operationId":"v1-check-vanity-subdomain-availability","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VanitySubdomainBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubdomainAvailabilityResponse"}}}},"400":{"description":"This feature requires the Pro, Team, or Enterprise organization plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanGateErrorBody"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to check project vanity subdomain configuration"}},"security":[{"bearer":[]}],"summary":"[Beta] Checks vanity subdomain availability","tags":["Domains"],"x-allowed-plans":["Pro","Team","Enterprise"],"x-badges":[{"name":"OAuth scope: domains:write","position":"after"},{"name":"Only available on Pro, Team, Enterprise","position":"before"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["vanity_subdomain_write"]],"x-oauth-scope":"domains:write"}},"/v1/projects/{ref}/vanity-subdomain/activate":{"post":{"operationId":"v1-activate-vanity-subdomain-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VanitySubdomainBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateVanitySubdomainResponse"}}}},"400":{"description":"This feature requires the Pro, Team, or Enterprise organization plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanGateErrorBody"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to activate project vanity subdomain configuration"}},"security":[{"bearer":[]}],"summary":"[Beta] Activates a vanity subdomain for a project.","tags":["Domains"],"x-allowed-plans":["Pro","Team","Enterprise"],"x-badges":[{"name":"OAuth scope: domains:write","position":"after"},{"name":"Only available on Pro, Team, Enterprise","position":"before"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["vanity_subdomain_write"]],"x-oauth-scope":"domains:write"}},"/v1/projects/{ref}/upgrade":{"post":{"operationId":"v1-upgrade-postgres-version","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeDatabaseBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpgradeInitiateResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to initiate project upgrade"}},"security":[{"bearer":[]}],"summary":"[Beta] Upgrades the project's Postgres version","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:write","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["project_admin_write","database_write"]],"x-oauth-scope":"projects:write"}},"/v1/projects/{ref}/upgrade/eligibility":{"get":{"operationId":"v1-get-postgres-upgrade-eligibility","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpgradeEligibilityResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to determine project upgrade eligibility"}},"security":[{"bearer":[]}],"summary":"[Beta] Returns the project's eligibility for upgrades","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:read","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["project_admin_read","database_read"]],"x-oauth-scope":"projects:read"}},"/v1/projects/{ref}/upgrade/status":{"get":{"operationId":"v1-get-postgres-upgrade-status","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"tracking_id","required":false,"in":"query","schema":{"example":"9f4d3a20-6b2e-4a7e-8c91-1d5f3e7a2b4c","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseUpgradeStatusResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project upgrade status"}},"security":[{"bearer":[]}],"summary":"[Beta] Gets the latest status of the project's upgrade","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:read","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["project_admin_read","database_read"]],"x-oauth-scope":"projects:read"}},"/v1/projects/{ref}/readonly":{"get":{"operationId":"v1-get-readonly-mode-status","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadOnlyStatusResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get project readonly mode status"}},"security":[{"bearer":[]}],"summary":"Returns project's readonly mode status","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["control-plane","infra","support-tooling"],"x-fga-permissions":[["database_readonly_config_read"]],"x-oauth-scope":"database:read"}},"/v1/projects/{ref}/readonly/temporary-disable":{"post":{"operationId":"v1-disable-readonly-mode-temporarily","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"201":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to disable project's readonly mode"}},"security":[{"bearer":[]}],"summary":"Disables project's readonly mode for the next 15 minutes","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["control-plane","infra","support-tooling"],"x-fga-permissions":[["database_readonly_config_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/read-replicas/setup":{"post":{"operationId":"v1-setup-a-read-replica","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetUpReadReplicaBody"}}}},"responses":{"204":{"description":""},"401":{"description":"Unauthorized"},"402":{"description":"This feature requires the Pro, Team, or Enterprise organization plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanGateErrorBody"}}}},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to set up read replica"}},"security":[{"bearer":[]}],"summary":"[Beta] Set up a read replica","tags":["Database"],"x-allowed-plans":["Pro","Team","Enterprise"],"x-badges":[{"name":"Only available on Pro, Team, Enterprise","position":"before"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["infra_read_replicas_write"]]}},"/v1/projects/{ref}/read-replicas/remove":{"post":{"operationId":"v1-remove-a-read-replica","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveReadReplicaBody"}}}},"responses":{"204":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to remove read replica"}},"security":[{"bearer":[]}],"summary":"[Beta] Remove a read replica","tags":["Database"],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["infra_read_replicas_write"]]}},"/v1/projects/{ref}/health":{"get":{"operationId":"v1-get-services-health","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"services","required":true,"in":"query","description":"Comma-separated list of enums or array of enums.","schema":{"example":["auth,db","auth"],"anyOf":[{"type":"string","description":"Comma-separated list of enums:\n\n- `auth`\n- `db`\n- `db_postgres_user`\n- `pooler`\n- `realtime`\n- `rest`\n- `storage`\n- `pg_bouncer`","example":["auth,db","auth"]},{"type":"array","items":{"type":"string","enum":["auth","db","db_postgres_user","pooler","realtime","rest","storage","pg_bouncer"]},"description":"Array of enums.","example":["{field}=auth&{field}=db","{field}=auth"]}]}},{"name":"timeout_ms","required":false,"in":"query","schema":{"minimum":0,"maximum":10000,"example":2000,"type":"integer"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/V1ServiceHealthResponse"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's service health status"}},"security":[{"bearer":[]}],"summary":"Gets project's service health status","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:read","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["project_admin_read"]],"x-oauth-scope":"projects:read"}},"/v1/projects/{ref}/config/auth/signing-keys/legacy":{"post":{"operationId":"v1-create-legacy-signing-key","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SigningKeyResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Set up the project's existing JWT secret as an in_use JWT signing key. This endpoint will be removed in the future always check for HTTP 404 Not Found.","tags":["Auth"],"x-badges":[{"name":"OAuth scope: secrets:write","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_signing_keys_write"]],"x-oauth-scope":"secrets:write"},"get":{"operationId":"v1-get-legacy-signing-key","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SigningKeyResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Get the signing key information for the JWT secret imported as signing key for this project. This endpoint will be removed in the future, check for HTTP 404 Not Found.","tags":["Auth"],"x-badges":[{"name":"OAuth scope: secrets:read","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_signing_keys_read"]],"x-oauth-scope":"secrets:read"}},"/v1/projects/{ref}/config/auth/signing-keys":{"post":{"operationId":"v1-create-project-signing-key","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSigningKeyBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SigningKeyResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Create a new signing key for the project in standby status","tags":["Auth"],"x-badges":[{"name":"OAuth scope: secrets:write","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_signing_keys_write"]],"x-oauth-scope":"secrets:write"},"get":{"operationId":"v1-get-project-signing-keys","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SigningKeysResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"List all signing keys for the project","tags":["Auth"],"x-badges":[{"name":"OAuth scope: secrets:read","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_signing_keys_read"]],"x-oauth-scope":"secrets:read"}},"/v1/projects/{ref}/config/auth/signing-keys/{id}":{"get":{"operationId":"v1-get-project-signing-key","parameters":[{"name":"id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"33333333-3333-4333-8333-333333333333","type":"string"}},{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SigningKeyResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Get information about a signing key","tags":["Auth"],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_signing_keys_read"]]},"delete":{"operationId":"v1-remove-project-signing-key","parameters":[{"name":"id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"33333333-3333-4333-8333-333333333333","type":"string"}},{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SigningKeyResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Remove a signing key from a project. Only possible if the key has been in revoked status for a while.","tags":["Auth"],"x-badges":[{"name":"OAuth scope: secrets:write","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_signing_keys_write"]],"x-oauth-scope":"secrets:write"},"patch":{"operationId":"v1-update-project-signing-key","parameters":[{"name":"id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"33333333-3333-4333-8333-333333333333","type":"string"}},{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSigningKeyBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SigningKeyResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Update a signing key, mainly its status","tags":["Auth"],"x-badges":[{"name":"OAuth scope: secrets:write","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_signing_keys_write"]],"x-oauth-scope":"secrets:write"}},"/v1/projects/{ref}/config/auth":{"get":{"operationId":"v1-get-auth-service-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthConfigResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's auth config"}},"security":[{"bearer":[]}],"summary":"Gets project's auth config","tags":["Auth"],"x-badges":[{"name":"OAuth scope: auth:read","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_config_read"]],"x-oauth-scope":"auth:read"},"patch":{"operationId":"v1-update-auth-service-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAuthConfigBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthConfigResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project's auth config"}},"security":[{"bearer":[]}],"summary":"Updates a project's auth config","tags":["Auth"],"x-badges":[{"name":"OAuth scope: auth:write","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_config_write","project_admin_write"]],"x-oauth-scope":"auth:write"}},"/v1/projects/{ref}/config/auth/third-party-auth":{"post":{"operationId":"v1-create-project-tpa-integration","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateThirdPartyAuthBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThirdPartyAuth"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Creates a new third-party auth integration","tags":["Auth"],"x-badges":[{"name":"OAuth scope: auth:write","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_config_write"]],"x-oauth-scope":"auth:write"},"get":{"operationId":"v1-list-project-tpa-integrations","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ThirdPartyAuth"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Lists all third-party auth integrations","tags":["Auth"],"x-badges":[{"name":"OAuth scope: auth:read","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_config_read"]],"x-oauth-scope":"auth:read"}},"/v1/projects/{ref}/config/auth/third-party-auth/{tpa_id}":{"delete":{"operationId":"v1-delete-project-tpa-integration","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"tpa_id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"88888888-8888-4888-8888-888888888888","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThirdPartyAuth"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Removes a third-party auth integration","tags":["Auth"],"x-badges":[{"name":"OAuth scope: auth:write","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_config_write"]],"x-oauth-scope":"auth:write"},"get":{"operationId":"v1-get-project-tpa-integration","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"tpa_id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"88888888-8888-4888-8888-888888888888","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThirdPartyAuth"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Get a third-party integration","tags":["Auth"],"x-badges":[{"name":"OAuth scope: auth:read","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_config_read"]],"x-oauth-scope":"auth:read"}},"/v1/projects/{ref}/pause":{"post":{"operationId":"v1-pause-a-project","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Pauses the given project","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:write","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["project_admin_write"]],"x-oauth-scope":"projects:write"}},"/v1/projects/{ref}/restart":{"post":{"operationId":"v1-restart-a-project","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Restarts the given project","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:write","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["project_admin_write"]],"x-oauth-scope":"projects:write"}},"/v1/projects/{ref}/restore":{"get":{"operationId":"v1-list-available-restore-versions","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetProjectAvailableRestoreVersionsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Lists available restore versions for the given project","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:read","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["project_admin_read"]],"x-oauth-scope":"projects:read"},"post":{"operationId":"v1-restore-a-project","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Restores the given project","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:write","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["project_admin_write"]],"x-oauth-scope":"projects:write"}},"/v1/projects/{ref}/restore/cancel":{"post":{"operationId":"v1-cancel-a-project-restoration","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Cancels the given project restoration","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:write","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["project_admin_write"]],"x-oauth-scope":"projects:write"}},"/v1/projects/{ref}/billing/addons":{"get":{"description":"Returns the billing addons that are currently applied, including the active compute instance size, and lists every addon option that can be provisioned with pricing metadata.","operationId":"v1-list-project-addons","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListProjectAddonsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to list project addons"}},"security":[{"bearer":[]}],"summary":"List billing addons and compute instance selections","tags":["Billing"],"x-endpoint-owners":["billing"],"x-fga-permissions":[["infra_add_ons_read"]]},"patch":{"description":"Selects an addon variant, for example scaling the project’s compute instance up or down, and applies it to the project.","operationId":"v1-apply-project-addon","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyProjectAddonBody"}}}},"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to apply project addon"}},"security":[{"bearer":[]}],"summary":"Apply or update billing addons, including compute instance size","tags":["Billing"],"x-endpoint-owners":["billing"],"x-fga-permissions":[["infra_add_ons_write"]]}},"/v1/projects/{ref}/billing/addons/{addon_variant}":{"delete":{"description":"Disables the selected addon variant, including rolling the compute instance back to its previous size.","operationId":"v1-remove-project-addon","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"addon_variant","required":true,"in":"path","schema":{"example":"pitr_7","anyOf":[{"type":"string","enum":["ci_micro","ci_small","ci_medium","ci_large","ci_xlarge","ci_2xlarge","ci_4xlarge","ci_8xlarge","ci_12xlarge","ci_16xlarge","ci_24xlarge","ci_24xlarge_optimized_cpu","ci_24xlarge_optimized_memory","ci_24xlarge_high_memory","ci_48xlarge","ci_48xlarge_optimized_cpu","ci_48xlarge_optimized_memory","ci_48xlarge_high_memory"]},{"type":"string","enum":["cd_default"]},{"type":"string","enum":["pitr_7","pitr_14","pitr_28"]},{"type":"string","enum":["ipv4_default"]}]}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to remove project addon"}},"security":[{"bearer":[]}],"summary":"Remove billing addons or revert compute instance sizing","tags":["Billing"],"x-endpoint-owners":["billing"],"x-fga-permissions":[["infra_add_ons_write"]]}},"/v1/projects/{ref}/claim-token":{"get":{"operationId":"v1-get-project-claim-token","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectClaimTokenResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Gets project claim token","tags":["Projects"],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["project_admin_read"]],"x-internal":true},"post":{"operationId":"v1-create-project-claim-token","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectClaimTokenResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Creates project claim token","tags":["Projects"],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["organization_admin_write","project_admin_write"]],"x-internal":true},"delete":{"operationId":"v1-delete-project-claim-token","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"204":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Revokes project claim token","tags":["Projects"],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["organization_admin_write","project_admin_write"]],"x-internal":true}},"/v1/projects/{ref}/advisors/performance":{"get":{"deprecated":true,"description":"This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.","operationId":"v1-get-performance-advisors","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ProjectAdvisorsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Gets project performance advisors.","tags":["Advisors"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["advisors_read"]],"x-oauth-scope":"database:read"}},"/v1/projects/{ref}/advisors/security":{"get":{"deprecated":true,"description":"This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.","operationId":"v1-get-security-advisors","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"lint_type","required":false,"in":"query","schema":{"example":"sql","type":"string","enum":["sql"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ProjectAdvisorsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Gets project security advisors.","tags":["Advisors"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["advisors_read"]],"x-oauth-scope":"database:read"}},"/v1/projects/{ref}/analytics/endpoints/logs.all":{"get":{"deprecated":true,"description":"Executes a SQL query on the project's logs.\n\nEither the `iso_timestamp_start` and `iso_timestamp_end` parameters must be provided.\nIf both are not provided, only the last 1 minute of logs will be queried.\nThe timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown.\n\nNote: Unless the `sql` parameter is provided, only edge_logs will be queried. See the [log query docs](https://supabase.com/docs/guides/monitoring-and-debugging/logs#logs-explorer) for all available sources.\n","operationId":"v1-get-project-logs-all","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"sql","required":false,"in":"query","description":"Custom SQL query to execute on the logs. See [querying logs](https://supabase.com/docs/guides/monitoring-and-debugging/logs#querying-with-the-logs-explorer) for more details.","schema":{"example":"select event_message from edge_logs limit 10","type":"string"}},{"name":"iso_timestamp_start","required":false,"in":"query","schema":{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2025-03-01T00:00:00Z","type":"string"}},{"name":"iso_timestamp_end","required":false,"in":"query","schema":{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2025-03-01T23:59:59Z","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsResponse"}}}},"401":{"description":"Unauthorized"},"402":{"description":"Usage exceeded. Enable additional usage to continue querying"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Gets project's logs","tags":["Analytics"],"x-badges":[{"name":"OAuth scope: analytics:read","position":"after"}],"x-endpoint-owners":["observability"],"x-fga-permissions":[["analytics_logs_read"]],"x-oauth-scope":"analytics:read"}},"/v1/projects/{ref}/analytics/endpoints/logs":{"get":{"deprecated":false,"description":"Executes an SQL or LQL query on the project's unified logs stream.\n\nEither the `iso_timestamp_start` and `iso_timestamp_end` parameters must be provided.\nIf both are not provided, only the last 1 minute of logs will be queried.\nThe timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown.\n\nFilter by the `source` column to specify specific log sources, such as edge_logs, postgres_logs, etc.\n\nNote: SQL must be written in **ClickHouse SQL dialect**.\n","operationId":"v1-get-project-logs","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"sql","required":false,"in":"query","description":"Custom SQL query to execute on the logs. See [querying logs](https://supabase.com/docs/guides/monitoring-and-debugging/logs#querying-with-the-logs-explorer) for more details.","schema":{"example":"select event_message from edge_logs limit 10","type":"string"}},{"name":"iso_timestamp_start","required":false,"in":"query","schema":{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2025-03-01T00:00:00Z","type":"string"}},{"name":"iso_timestamp_end","required":false,"in":"query","schema":{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","example":"2025-03-01T23:59:59Z","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsResponse"}}}},"401":{"description":"Unauthorized"},"402":{"description":"Usage exceeded. Enable additional usage to continue querying"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Gets all project's logs in a single log stream","tags":["Analytics"],"x-badges":[{"name":"OAuth scope: analytics:read","position":"after"}],"x-endpoint-owners":["observability"],"x-fga-permissions":[["analytics_logs_read"]],"x-oauth-scope":"analytics:read"}},"/v1/projects/{ref}/analytics/endpoints/usage.api-counts":{"get":{"operationId":"v1-get-project-usage-api-count","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"interval","required":false,"in":"query","schema":{"example":"1day","type":"string","enum":["15min","30min","1hr","3hr","1day","3day","7day"]}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1GetUsageApiCountResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get project's usage api counts"}},"security":[{"bearer":[]}],"summary":"Gets project's usage api counts","tags":["Analytics"],"x-endpoint-owners":["observability"],"x-fga-permissions":[["analytics_usage_read"]]}},"/v1/projects/{ref}/analytics/endpoints/usage.api-requests-count":{"get":{"operationId":"v1-get-project-usage-request-count","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1GetUsageApiRequestsCountResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get project's usage api requests count"}},"security":[{"bearer":[]}],"summary":"Gets project's usage api requests count","tags":["Analytics"],"x-endpoint-owners":["observability"],"x-fga-permissions":[["analytics_usage_read"]]}},"/v1/projects/{ref}/analytics/endpoints/functions.combined-stats":{"get":{"operationId":"v1-get-project-function-combined-stats","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"interval","required":true,"in":"query","schema":{"example":"1hr","type":"string","enum":["15min","1hr","3hr","1day"]}},{"name":"function_id","required":true,"in":"query","schema":{"example":"3c078cce-ad70-4148-9f37-4da362789053","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get project's function combined statistics"}},"security":[{"bearer":[]}],"summary":"Gets a project's function combined statistics","tags":["Analytics"],"x-endpoint-owners":["observability"],"x-fga-permissions":[["analytics_usage_read"]]}},"/v1/projects/{ref}/analytics/endpoints/metrics":{"get":{"description":"Prometheus scrape endpoint. Returns metrics of a customer project in the Prometheus open exposition format.","operationId":"v1-scrape-project-metrics","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"Prometheus / OpenMetrics text exposition","content":{"text/plain":{"schema":{"type":"string"}},"application/openmetrics-text":{"schema":{"type":"string"}}}},"400":{"description":"Project must be active and healthy, or metrics are not available for this project"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to fetch project's metrics"}},"security":[{"bearer":[]}],"summary":"Scrape a project's metrics","tags":["Analytics"],"x-badges":[{"name":"OAuth scope: analytics:read","position":"after"}],"x-endpoint-owners":["observability"],"x-fga-permissions":[["analytics_logs_read"]],"x-oauth-scope":"analytics:read"}},"/v1/projects/{ref}/cli/login-role":{"post":{"operationId":"v1-create-login-role","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRoleBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRoleResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to create login role"}},"security":[{"bearer":[]}],"summary":"[Beta] Create a login role for CLI with temporary password","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["database_write"]],"x-oauth-scope":"database:write"},"delete":{"operationId":"v1-delete-login-roles","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteRolesResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to delete login roles"}},"security":[{"bearer":[]}],"summary":"[Beta] Delete existing login roles used by CLI","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["dev-workflows"],"x-fga-permissions":[["database_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/database/migrations":{"get":{"operationId":"v1-list-migration-history","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ListMigrationsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to list database migrations"}},"security":[{"bearer":[]}],"summary":"List applied migration versions","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["database_migrations_read"]],"x-oauth-scope":"database:read"},"post":{"operationId":"v1-apply-a-migration","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"A unique key to ensure the same migration is tracked only once.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1CreateMigrationBody"}}}},"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to apply database migration"}},"security":[{"bearer":[]}],"summary":"Apply a database migration","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["database_migrations_write"]],"x-oauth-scope":"database:write"},"put":{"operationId":"v1-upsert-a-migration","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"A unique key to ensure the same migration is tracked only once.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1UpsertMigrationBody"}}}},"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to upsert database migration"}},"security":[{"bearer":[]}],"summary":"Upsert a database migration without applying","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["database_migrations_write"]],"x-oauth-scope":"database:write"},"delete":{"operationId":"v1-rollback-migrations","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"gte","required":true,"in":"query","description":"Rollback migrations greater or equal to this version","schema":{"pattern":"^\\d+$","example":"20250312000000","type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to rollback database migration"}},"security":[{"bearer":[]}],"summary":"Rollback database migrations and remove them from history table","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["database_migrations_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/database/migrations/{version}":{"get":{"operationId":"v1-get-a-migration","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"version","required":true,"in":"path","schema":{"pattern":"^\\d+$","example":"20250312000000","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1GetMigrationResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get database migration"}},"security":[{"bearer":[]}],"summary":"Fetch an existing entry from migration history","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["database_migrations_read"]],"x-oauth-scope":"database:read"},"patch":{"operationId":"v1-patch-a-migration","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"version","required":true,"in":"path","schema":{"pattern":"^\\d+$","example":"20250312000000","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1PatchMigrationBody"}}}},"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to patch database migration"}},"security":[{"bearer":[]}],"summary":"Patch an existing entry in migration history","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["database_migrations_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/database/query":{"post":{"operationId":"v1-run-a-query","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1RunQueryBody"}}}},"responses":{"201":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to run sql query"}},"security":[{"bearer":[]}],"summary":"[Beta] Run sql query","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["database_read"],["database_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/database/query/read-only":{"post":{"description":"All entity references must be schema qualified.","operationId":"v1-read-only-query","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ReadOnlyQueryBody"}}}},"responses":{"201":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to run read-only sql query"}},"security":[{"bearer":[]}],"summary":"[Beta] Run a sql query as supabase_read_only_user","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["database_read"]],"x-oauth-scope":"database:read"}},"/v1/projects/{ref}/database/webhooks/enable":{"post":{"operationId":"v1-enable-database-webhook","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"201":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to enable Database Webhooks on the project"}},"security":[{"bearer":[]}],"summary":"[Beta] Enables Database Webhooks on the project","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["database_webhooks_config_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/database/context":{"get":{"deprecated":true,"description":"This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.","operationId":"v1-get-database-metadata","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetProjectDbMetadataResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Gets database metadata for the given project.","tags":["Database"],"x-badges":[{"name":"OAuth scope: projects:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["database_read"]],"x-oauth-scope":"projects:read"}},"/v1/projects/{ref}/database/password":{"patch":{"operationId":"v1-update-database-password","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1UpdatePasswordBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1UpdatePasswordResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update database password"}},"security":[{"bearer":[]}],"summary":"Updates the database password","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["database_config_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/database/jit":{"get":{"description":"Mappings of roles a user can assume in the project database","operationId":"v1-get-jit-access","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JitAccessResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to list database jit access"}},"security":[{"bearer":[]}],"summary":"Get user-id to role mappings for JIT access","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["security"],"x-fga-permissions":[["database_jit_read"]],"x-oauth-scope":"database:read"},"post":{"description":"Authorizes the request to assume a role in the project database","operationId":"v1-authorize-jit-access","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizeJitAccessBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JitAuthorizeAccessResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to authorize database jit access"}},"security":[{"bearer":[]}],"summary":"Authorize user-id to role mappings for JIT access","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["security"],"x-fga-permissions":[["database_jit_read"]],"x-oauth-scope":"database:read"},"put":{"description":"Modifies the roles that can be assumed and for how long","operationId":"v1-update-jit-access","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateJitAccessBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JitAccessResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update JIT access"}},"security":[{"bearer":[]}],"summary":"Updates a user mapping for JIT access","tags":["Database"],"x-endpoint-owners":["security"],"x-fga-permissions":[["database_jit_write"]]}},"/v1/projects/{ref}/database/jit/list":{"get":{"description":"Mappings of roles a user can assume in the project database","operationId":"v1-list-jit-access","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JitListAccessResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to list database jit access"}},"security":[{"bearer":[]}],"summary":"List all user-id to role mappings for JIT access","tags":["Database"],"x-endpoint-owners":["security"],"x-fga-permissions":[["database_jit_write"]]}},"/v1/projects/{ref}/database/jit/invite":{"post":{"description":"Invites the external user and sets initial roles that can be assumed and for how long","operationId":"v1-invite-external-jit-access","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteExternalUserJitAccessBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteExternalUserJitResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to invite external user"}},"security":[{"bearer":[]}],"summary":"Invites an external user to a database for JIT access","tags":["Database"],"x-endpoint-owners":["security"],"x-fga-permissions":[["database_jit_write"]]}},"/v1/projects/{ref}/database/jit/invite/accept":{"post":{"description":"Accepts the invitation to JIT database access","operationId":"v1-accept-invite-external-jit-access","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInviteExternalUserJitAccessBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JitAccessResponse"}}}},"500":{"description":"Failed to accept invitation"}},"security":[{"bearer":[]}],"summary":"Accepts invitation for JIT database access","tags":["Database"],"x-endpoint-owners":["security"]}},"/v1/projects/{ref}/database/jit/invite/{invite_id}":{"delete":{"description":"Revokes and deletes the invitation","operationId":"v1-delete-invite-external-jit-access","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"invite_id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"55555555-5555-4555-8555-555555555555","type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to revoke invite for external user"}},"security":[{"bearer":[]}],"summary":"Deletes the invite for an external user to a database for JIT access","tags":["Database"],"x-endpoint-owners":["security"],"x-fga-permissions":[["database_jit_write"]]}},"/v1/projects/{ref}/database/jit/{user_id}":{"delete":{"description":"Remove JIT mappings of a user, revoking all JIT database access","operationId":"v1-delete-jit-access","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"user_id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"55555555-5555-4555-8555-555555555555","type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to remove JIT access"}},"security":[{"bearer":[]}],"summary":"Delete JIT access by user-id","tags":["Database"],"x-endpoint-owners":["security"],"x-fga-permissions":[["database_jit_write"]]}},"/v1/projects/{ref}/database/openapi":{"get":{"description":"Returns the PostgREST OpenAPI specification for the project. This is the replacement for querying `/rest/v1/` directly with the anon key.","operationId":"v1-get-database-openapi","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"schema","required":false,"in":"query","description":"The database schema to generate the OpenAPI spec for","schema":{"default":"public","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to fetch PostgREST OpenAPI spec"}},"security":[{"bearer":[]}],"summary":"Get PostgREST OpenAPI spec","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["database_read"]],"x-oauth-scope":"database:read"}},"/v1/projects/{ref}/functions":{"get":{"description":"Returns all functions you've previously added to the specified project.","operationId":"v1-list-all-functions","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FunctionResponse"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's functions"}},"security":[{"bearer":[]}],"summary":"List all functions","tags":["Edge Functions"],"x-badges":[{"name":"OAuth scope: edge_functions:read","position":"after"}],"x-endpoint-owners":["functions"],"x-fga-permissions":[["edge_functions_read"]],"x-oauth-scope":"edge_functions:read"},"post":{"deprecated":true,"description":"This endpoint is deprecated - use the deploy endpoint. Creates a function and adds it to the specified project.","operationId":"v1-create-a-function","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"slug","required":false,"in":"query","schema":{"pattern":"^[A-Za-z0-9_-]+$","example":"hello-world","type":"string"}},{"name":"name","required":false,"in":"query","schema":{"example":"Hello World","type":"string"}},{"name":"verify_jwt","required":false,"in":"query","schema":{"example":true,"type":"string"}},{"name":"import_map","required":false,"in":"query","schema":{"example":false,"type":"string"}},{"name":"entrypoint_path","required":false,"in":"query","schema":{"example":"index.ts","type":"string"}},{"name":"import_map_path","required":false,"in":"query","schema":{"example":"import_map.json","type":"string"}},{"name":"ezbr_sha256","required":false,"in":"query","schema":{"example":"44c691990518d25498f0fd80cf6631ecf2b58eb9c5eb2a087dd1688f2904dac7","type":"string"}}],"requestBody":{"required":true,"content":{"application/vnd.denoland.eszip":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"$ref":"#/components/schemas/V1CreateFunctionBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionResponse"}}}},"401":{"description":"Unauthorized"},"402":{"description":"Maximum number of functions reached for Plan"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to create project's function"}},"security":[{"bearer":[]}],"summary":"Create a function","tags":["Edge Functions"],"x-badges":[{"name":"OAuth scope: edge_functions:write","position":"after"}],"x-endpoint-owners":["functions"],"x-fga-permissions":[["edge_functions_write"]],"x-oauth-scope":"edge_functions:write"},"put":{"description":"Bulk update functions. It will create a new function or replace existing. The operation is idempotent. NOTE: You will need to manually bump the version.","operationId":"v1-bulk-update-functions","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateFunctionBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateFunctionResponse"}}}},"401":{"description":"Unauthorized"},"402":{"description":"Maximum number of functions reached for Plan"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update functions"}},"security":[{"bearer":[]}],"summary":"Bulk update functions","tags":["Edge Functions"],"x-badges":[{"name":"OAuth scope: edge_functions:write","position":"after"}],"x-endpoint-owners":["functions"],"x-fga-permissions":[["edge_functions_write"]],"x-oauth-scope":"edge_functions:write"}},"/v1/projects/{ref}/functions/deploy":{"post":{"description":"A new endpoint to deploy functions. It will create if function does not exist.","operationId":"v1-deploy-a-function","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"slug","required":false,"in":"query","schema":{"pattern":"^[A-Za-z][A-Za-z0-9_-]*$","example":"hello-world","type":"string"}},{"name":"bundleOnly","required":false,"in":"query","schema":{"example":false,"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FunctionDeployBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployFunctionResponse"}}}},"401":{"description":"Unauthorized"},"402":{"description":"Maximum number of functions reached for Plan"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to deploy function"}},"security":[{"bearer":[]}],"summary":"Deploy a function","tags":["Edge Functions"],"x-badges":[{"name":"OAuth scope: edge_functions:write","position":"after"}],"x-endpoint-owners":["functions"],"x-fga-permissions":[["edge_functions_write"]],"x-oauth-scope":"edge_functions:write"}},"/v1/projects/{ref}/functions/{function_slug}":{"get":{"description":"Retrieves a function with the specified slug and project.","operationId":"v1-get-a-function","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"function_slug","required":true,"in":"path","description":"Function slug","schema":{"pattern":"^[A-Za-z0-9_-]+$","example":"hello-world","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionSlugResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve function with given slug"}},"security":[{"bearer":[]}],"summary":"Retrieve a function","tags":["Edge Functions"],"x-badges":[{"name":"OAuth scope: edge_functions:read","position":"after"}],"x-endpoint-owners":["functions"],"x-fga-permissions":[["edge_functions_read"]],"x-oauth-scope":"edge_functions:read"},"patch":{"description":"Updates a function with the specified slug and project.","operationId":"v1-update-a-function","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"function_slug","required":true,"in":"path","description":"Function slug","schema":{"pattern":"^[A-Za-z0-9_-]+$","example":"hello-world","type":"string"}},{"name":"slug","required":false,"in":"query","schema":{"pattern":"^[A-Za-z0-9_-]+$","example":"hello-world","type":"string"}},{"name":"name","required":false,"in":"query","schema":{"example":"Hello World","type":"string"}},{"name":"verify_jwt","required":false,"in":"query","schema":{"example":true,"type":"string"}},{"name":"import_map","required":false,"in":"query","schema":{"example":false,"type":"string"}},{"name":"entrypoint_path","required":false,"in":"query","schema":{"example":"index.ts","type":"string"}},{"name":"import_map_path","required":false,"in":"query","schema":{"example":"import_map.json","type":"string"}},{"name":"ezbr_sha256","required":false,"in":"query","schema":{"example":"44c691990518d25498f0fd80cf6631ecf2b58eb9c5eb2a087dd1688f2904dac7","type":"string"}}],"requestBody":{"required":true,"content":{"application/vnd.denoland.eszip":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"$ref":"#/components/schemas/V1UpdateFunctionBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunctionResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update function with given slug"}},"security":[{"bearer":[]}],"summary":"Update a function","tags":["Edge Functions"],"x-badges":[{"name":"OAuth scope: edge_functions:write","position":"after"}],"x-endpoint-owners":["functions"],"x-fga-permissions":[["edge_functions_write"]],"x-oauth-scope":"edge_functions:write"},"delete":{"description":"Deletes a function with the specified slug from the specified project.","operationId":"v1-delete-a-function","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"function_slug","required":true,"in":"path","description":"Function slug","schema":{"pattern":"^[A-Za-z0-9_-]+$","example":"hello-world","type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to delete function with given slug"}},"security":[{"bearer":[]}],"summary":"Delete a function","tags":["Edge Functions"],"x-badges":[{"name":"OAuth scope: edge_functions:write","position":"after"}],"x-endpoint-owners":["functions"],"x-fga-permissions":[["edge_functions_write"]],"x-oauth-scope":"edge_functions:write"}},"/v1/projects/{ref}/functions/{function_slug}/body":{"get":{"description":"Retrieves a function body for the specified slug and project.","operationId":"v1-get-a-function-body","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"function_slug","required":true,"in":"path","description":"Function slug","schema":{"pattern":"^[A-Za-z0-9_-]+$","example":"hello-world","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamableFile"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve function body with given slug"}},"security":[{"bearer":[]}],"summary":"Retrieve a function body","tags":["Edge Functions"],"x-badges":[{"name":"OAuth scope: edge_functions:read","position":"after"}],"x-endpoint-owners":["functions"],"x-fga-permissions":[["edge_functions_read"]],"x-oauth-scope":"edge_functions:read"}},"/v1/projects/{ref}/storage/buckets":{"get":{"operationId":"v1-list-all-buckets","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/V1StorageBucketResponse"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get list of buckets"}},"security":[{"bearer":[]}],"summary":"Lists all buckets","tags":["Storage"],"x-badges":[{"name":"OAuth scope: storage:read","position":"after"}],"x-endpoint-owners":["storage"],"x-fga-permissions":[["storage_read"]],"x-oauth-scope":"storage:read"}},"/v1/projects/{ref}/config/disk":{"get":{"operationId":"v1-get-database-disk","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiskResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get database disk attributes"}},"security":[{"bearer":[]}],"summary":"Get database disk attributes","tags":["Projects"],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["infra_disk_config_read"]]},"post":{"operationId":"v1-modify-database-disk","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiskRequestBody"}}}},"responses":{"201":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to modify database disk"}},"security":[{"bearer":[]}],"summary":"Modify database disk","tags":["Projects"],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["infra_disk_config_write"]]}},"/v1/projects/{ref}/config/disk/util":{"get":{"operationId":"v1-get-disk-utilization","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiskUtilMetricsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get disk utilization"}},"security":[{"bearer":[]}],"summary":"Get disk utilization","tags":["Projects"],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["infra_disk_config_read"]]}},"/v1/projects/{ref}/config/disk/autoscale":{"get":{"operationId":"v1-get-project-disk-autoscale-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiskAutoscaleConfig"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get project disk autoscale config"}},"security":[{"bearer":[]}],"summary":"Gets project disk autoscale config","tags":["Projects"],"x-endpoint-owners":["control-plane","infra"],"x-fga-permissions":[["infra_disk_config_read"]]}},"/v1/projects/{ref}/config/storage":{"get":{"operationId":"v1-get-storage-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageConfigResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's storage config"}},"security":[{"bearer":[]}],"summary":"Gets project's storage config","tags":["Storage"],"x-endpoint-owners":["storage"],"x-fga-permissions":[["storage_config_read"]]},"patch":{"operationId":"v1-update-storage-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStorageConfigBody"}}}},"responses":{"200":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project's storage config"}},"security":[{"bearer":[]}],"summary":"Updates project's storage config","tags":["Storage"],"x-endpoint-owners":["storage"],"x-fga-permissions":[["storage_config_write"]]}},"/v1/projects/{ref}/config/database/pgbouncer":{"get":{"operationId":"v1-get-project-pgbouncer-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1PgbouncerConfigResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's pgbouncer config"}},"summary":"Get project's pgbouncer config","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["database_read"]],"x-oauth-scope":"database:read"}},"/v1/projects/{ref}/config/database/pooler":{"get":{"operationId":"v1-get-pooler-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SupavisorConfigResponse"}}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's supavisor config"}},"security":[{"bearer":[]}],"summary":"Gets project's supavisor config","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["database_pooling_config_read"]],"x-oauth-scope":"database:read"},"patch":{"operationId":"v1-update-pooler-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSupavisorConfigBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSupavisorConfigResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project's supavisor config"}},"security":[{"bearer":[]}],"summary":"Updates project's supavisor config","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["database_pooling_config_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/config/database/postgres":{"get":{"operationId":"v1-get-postgres-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostgresConfigResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve project's Postgres config"}},"security":[{"bearer":[]}],"summary":"Gets project's Postgres config","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["database_config_read"]],"x-oauth-scope":"database:read"},"put":{"operationId":"v1-update-postgres-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePostgresConfigBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostgresConfigResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update project's Postgres config"}},"security":[{"bearer":[]}],"summary":"Updates project's Postgres config","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["infra","control-plane"],"x-fga-permissions":[["database_config_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/config/realtime":{"get":{"operationId":"v1-get-realtime-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"Gets project's realtime configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RealtimeConfigResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Gets realtime configuration","tags":["Realtime"],"x-endpoint-owners":["realtime"],"x-fga-permissions":[["realtime_config_read"]]},"patch":{"operationId":"v1-update-realtime-config","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRealtimeConfigBody"}}}},"responses":{"204":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Updates realtime configuration","tags":["Realtime"],"x-endpoint-owners":["realtime"],"x-fga-permissions":[["realtime_config_write"]]}},"/v1/projects/{ref}/config/realtime/shutdown":{"post":{"operationId":"v1-shutdown-realtime","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"204":{"description":"Realtime connections shutdown successfully"},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"404":{"description":"Tenant not found"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Shutdowns realtime connections for a project","tags":["Realtime"],"x-endpoint-owners":["realtime"],"x-fga-permissions":[["realtime_config_write"]]}},"/v1/projects/{ref}/config/auth/sso/providers":{"post":{"operationId":"v1-create-a-sso-provider","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProviderBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProviderResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"404":{"description":"SAML 2.0 support is not enabled for this project"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Creates a new SSO provider","tags":["Auth"],"x-badges":[{"name":"OAuth scope: auth:write","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_config_write"]],"x-oauth-scope":"auth:write"},"get":{"operationId":"v1-list-all-sso-provider","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListProvidersResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"404":{"description":"SAML 2.0 support is not enabled for this project"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Lists all SSO providers","tags":["Auth"],"x-badges":[{"name":"OAuth scope: auth:read","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_config_read"]],"x-oauth-scope":"auth:read"}},"/v1/projects/{ref}/config/auth/sso/providers/{provider_id}":{"get":{"operationId":"v1-get-a-sso-provider","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"provider_id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"77777777-7777-4777-8777-777777777777","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetProviderResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"404":{"description":"Either SAML 2.0 was not enabled for this project, or the provider does not exist"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Gets a SSO provider by its UUID","tags":["Auth"],"x-badges":[{"name":"OAuth scope: auth:read","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_config_read"]],"x-oauth-scope":"auth:read"},"put":{"operationId":"v1-update-a-sso-provider","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"provider_id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"77777777-7777-4777-8777-777777777777","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProviderBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProviderResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"404":{"description":"Either SAML 2.0 was not enabled for this project, or the provider does not exist"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Updates a SSO provider by its UUID","tags":["Auth"],"x-badges":[{"name":"OAuth scope: auth:write","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_config_write"]],"x-oauth-scope":"auth:write"},"delete":{"operationId":"v1-delete-a-sso-provider","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"provider_id","required":true,"in":"path","schema":{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","example":"77777777-7777-4777-8777-777777777777","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteProviderResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"404":{"description":"Either SAML 2.0 was not enabled for this project, or the provider does not exist"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Removes a SSO provider by its UUID","tags":["Auth"],"x-badges":[{"name":"OAuth scope: auth:write","position":"after"}],"x-endpoint-owners":["auth"],"x-fga-permissions":[["auth_config_write"]],"x-oauth-scope":"auth:write"}},"/v1/projects/{ref}/database/backups":{"get":{"operationId":"v1-list-all-backups","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1BackupsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get backups"}},"security":[{"bearer":[]}],"summary":"Lists all backups","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["backups_read"]],"x-oauth-scope":"database:read"}},"/v1/projects/{ref}/database/backups/restore-pitr":{"post":{"operationId":"v1-restore-pitr-backup","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1RestorePitrBody"}}}},"responses":{"201":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Restores a PITR backup for a database","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["backups_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/database/backups/restore-point":{"post":{"operationId":"v1-create-restore-point","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1RestorePointPostBody"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1RestorePointResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Initiates a creation of a restore point for a database","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["backups_write"]],"x-internal":true,"x-oauth-scope":"database:write"},"get":{"operationId":"v1-get-restore-point","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}},{"name":"name","required":false,"in":"query","schema":{"maxLength":20,"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1RestorePointResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to get requested restore points"}},"security":[{"bearer":[]}],"summary":"Get restore points for project","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["backups_read"]],"x-internal":true,"x-oauth-scope":"database:read"}},"/v1/projects/{ref}/database/backups/restore":{"post":{"operationId":"v1-restore-physical-backup","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1RestoreBackupBody"}}}},"responses":{"201":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Restores a physical backup for a database","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["backups_write"]],"x-internal":true,"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/database/backups/schedule":{"get":{"operationId":"v1-get-backup-schedule","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1BackupScheduleResponse"}}}},"401":{"description":"Unauthorized"},"402":{"description":"This feature requires the Enterprise organization plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanGateErrorBody"}}}},"403":{"description":"Forbidden action"},"404":{"description":"Project or backup schedule not found"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve backup schedule"}},"security":[{"bearer":[]}],"summary":"Gets the backup schedule for a project","tags":["Database"],"x-allowed-plans":["Enterprise"],"x-badges":[{"name":"OAuth scope: database:read","position":"after"},{"name":"Only available on Enterprise","position":"before"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["backups_read"]],"x-oauth-scope":"database:read"},"patch":{"description":"Sets the time at which the daily backup runs. The change takes effect on the next backup window that includes the new time. If the new time has already passed for today, the first backup at the new time will occur the following day. It can only be updated 3 times per 24 hours.","operationId":"v1-update-backup-schedule","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1UpdateBackupScheduleBody"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1BackupScheduleResponse"}}}},"400":{"description":"Invalid schedule_for format"},"401":{"description":"Unauthorized"},"402":{"description":"This feature requires the Enterprise organization plan.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanGateErrorBody"}}}},"403":{"description":"Forbidden action"},"404":{"description":"Project or backup schedule not found"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to update backup schedule"}},"security":[{"bearer":[]}],"summary":"Updates the backup schedule time for a project","tags":["Database"],"x-allowed-plans":["Enterprise"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"},{"name":"Only available on Enterprise","position":"before"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["backups_write"]],"x-oauth-scope":"database:write"}},"/v1/projects/{ref}/database/backups/undo":{"post":{"operationId":"v1-undo","parameters":[{"name":"ref","required":true,"in":"path","description":"Project ref","schema":{"minLength":20,"maxLength":20,"pattern":"^[a-z]+$","example":"abcdefghijklmnopqrst","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1UndoBody"}}}},"responses":{"201":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Initiates an undo to a given restore point","tags":["Database"],"x-badges":[{"name":"OAuth scope: database:write","position":"after"}],"x-endpoint-owners":["infra"],"x-fga-permissions":[["backups_write"]],"x-internal":true,"x-oauth-scope":"database:write"}},"/v1/organizations/{slug}/entitlements":{"get":{"description":"Returns the entitlements available to the organization based on their plan and any overrides.","operationId":"v1-get-organization-entitlements","parameters":[{"name":"slug","required":true,"in":"path","description":"Organization slug","schema":{"pattern":"^[\\w-]+$","example":"tsrqponmlkjihgfedcba","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ListEntitlementsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Get entitlements for an organization","tags":["Organizations"],"x-badges":[{"name":"OAuth scope: organizations:read","position":"after"}],"x-endpoint-owners":["billing"],"x-fga-permissions":[["organization_admin_read"]],"x-oauth-scope":"organizations:read"}},"/v1/organizations/{slug}/members":{"get":{"operationId":"v1-list-organization-members","parameters":[{"name":"slug","required":true,"in":"path","description":"Organization slug","schema":{"pattern":"^[\\w-]+$","example":"tsrqponmlkjihgfedcba","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/V1OrganizationMemberResponse"}}}}}},"security":[{"bearer":[]}],"summary":"List members of an organization","tags":["Organizations"],"x-badges":[{"name":"OAuth scope: organizations:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["members_read"]],"x-oauth-scope":"organizations:read"}},"/v1/organizations/{slug}":{"get":{"operationId":"v1-get-an-organization","parameters":[{"name":"slug","required":true,"in":"path","description":"Organization slug","schema":{"pattern":"^[\\w-]+$","example":"tsrqponmlkjihgfedcba","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1OrganizationSlugResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Gets information about the organization","tags":["Organizations"],"x-badges":[{"name":"OAuth scope: organizations:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["organization_admin_read"]],"x-oauth-scope":"organizations:read"}},"/v1/organizations/{slug}/project-claim/{token}":{"get":{"operationId":"v1-get-organization-project-claim","parameters":[{"name":"slug","required":true,"in":"path","description":"Organization slug","schema":{"pattern":"^[\\w-]+$","example":"tsrqponmlkjihgfedcba","type":"string"}},{"name":"token","required":true,"in":"path","schema":{"example":"0123456789abcdef0123456789abcdef01234567","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationProjectClaimResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Gets project details for the specified organization and claim token","tags":["Organizations"],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["organization_admin_write"]],"x-internal":true},"post":{"operationId":"v1-claim-project-for-organization","parameters":[{"name":"slug","required":true,"in":"path","description":"Organization slug","schema":{"pattern":"^[\\w-]+$","example":"tsrqponmlkjihgfedcba","type":"string"}},{"name":"token","required":true,"in":"path","schema":{"example":"0123456789abcdef0123456789abcdef01234567","type":"string"}}],"responses":{"204":{"description":""},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Claims project for the specified organization","tags":["Organizations"],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["organization_admin_write"]],"x-internal":true}},"/v1/organizations/{slug}/projects":{"get":{"description":"Returns a paginated list of projects for the specified organization.\n\nThis endpoint uses offset-based pagination. Use the `offset` parameter to skip a number of projects and the `limit` parameter to control the number of projects returned per page.","operationId":"v1-get-all-projects-for-organization","parameters":[{"name":"slug","required":true,"in":"path","description":"Organization slug","schema":{"pattern":"^[\\w-]+$","example":"tsrqponmlkjihgfedcba","type":"string"}},{"name":"offset","required":false,"in":"query","description":"Number of projects to skip","schema":{"minimum":0,"maximum":9007199254740991,"default":0,"example":0,"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of projects to return per page","schema":{"minimum":1,"maximum":100,"default":100,"example":20,"type":"integer"}},{"name":"search","required":false,"in":"query","description":"Search projects by name","schema":{"example":"acme","type":"string"}},{"name":"sort","required":false,"in":"query","description":"Sort order for projects","schema":{"default":"name_asc","example":"created_desc","type":"string","enum":["name_asc","name_desc","created_asc","created_desc"]}},{"name":"statuses","required":false,"in":"query","description":"A comma-separated list of project statuses to filter by.\n\nThe following values are supported: `ACTIVE_HEALTHY`, `INACTIVE`.","schema":{"example":"ACTIVE_HEALTHY,INACTIVE","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationProjectsResponse"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden action"},"429":{"description":"Rate limit exceeded"},"500":{"description":"Failed to retrieve projects"}},"security":[{"bearer":[]}],"summary":"Gets all projects for the given organization","tags":["Projects"],"x-badges":[{"name":"OAuth scope: projects:read","position":"after"}],"x-endpoint-owners":["control-plane"],"x-fga-permissions":[["organization_projects_read"]],"x-oauth-scope":"projects:read"}}},"info":{"title":"Supabase API (v1)","description":"Supabase API generated from the OpenAPI specification.
Visit [https://supabase.com/docs](https://supabase.com/docs) for a complete documentation.","version":"1.0.0","contact":{}},"tags":[{"name":"Advisors","description":"Advisors related endpoints"},{"name":"Analytics","description":"Analytics related endpoints"},{"name":"Auth","description":"Auth related endpoints"},{"name":"Billing","description":"Billing related endpoints"},{"name":"Database","description":"Database related endpoints"},{"name":"Domains","description":"Domains related endpoints"},{"name":"Edge Functions","description":"Edge related endpoints"},{"name":"Environments","description":"Environments related endpoints"},{"name":"OAuth","description":"OAuth related endpoints"},{"name":"Organizations","description":"Organizations related endpoints"},{"name":"Projects","description":"Projects related endpoints"},{"name":"Rest","description":"Rest related endpoints"},{"name":"Secrets","description":"Secrets related endpoints"},{"name":"Storage","description":"Visit [https://supabase.github.io/storage/](https://supabase.github.io/storage/) for complete documentation."}],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"BranchDetailResponse":{"type":"object","properties":{"ref":{"type":"string"},"postgres_version":{"type":"string"},"postgres_engine":{"type":"string"},"release_channel":{"type":"string"},"status":{"type":"string","enum":["INACTIVE","ACTIVE_HEALTHY","ACTIVE_UNHEALTHY","COMING_UP","UNKNOWN","GOING_DOWN","INIT_FAILED","REMOVED","RESTORING","UPGRADING","PAUSING","RESTORE_FAILED","RESTARTING","PAUSE_FAILED","RESIZING"]},"db_host":{"type":"string"},"db_port":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"db_user":{"type":"string"},"db_pass":{"type":"string"},"jwt_secret":{"type":"string"}},"required":["ref","postgres_version","postgres_engine","release_channel","status","db_host","db_port"]},"UpdateBranchBody":{"type":"object","properties":{"branch_name":{"type":"string"},"git_branch":{"type":"string"},"reset_on_push":{"description":"This field is deprecated and will be ignored. Use v1-reset-a-branch endpoint directly instead.","deprecated":true,"type":"boolean"},"persistent":{"type":"boolean"},"status":{"type":"string","enum":["CREATING_PROJECT","RUNNING_MIGRATIONS","MIGRATIONS_PASSED","MIGRATIONS_FAILED","FUNCTIONS_DEPLOYED","FUNCTIONS_FAILED"]},"request_review":{"type":"boolean"},"notify_url":{"type":"string","format":"uri","description":"HTTP endpoint to receive branch status updates."}},"example":{"branch_name":"preview-login-page","git_branch":"feature/login-page","persistent":true,"request_review":true,"notify_url":"https://example.com/webhooks/branches"}},"BranchResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"project_ref":{"type":"string"},"parent_project_ref":{"type":"string"},"is_default":{"type":"boolean"},"git_branch":{"type":"string"},"pr_number":{"type":"integer","format":"int32","minimum":-9007199254740991,"maximum":9007199254740991},"latest_check_run_id":{"description":"This field is deprecated and will not be populated.","deprecated":true,"type":"number"},"persistent":{"type":"boolean"},"status":{"type":"string","enum":["CREATING_PROJECT","RUNNING_MIGRATIONS","MIGRATIONS_PASSED","MIGRATIONS_FAILED","FUNCTIONS_DEPLOYED","FUNCTIONS_FAILED"],"description":"This field is deprecated. List action runs to get branch status instead.","deprecated":true},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"review_requested_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"with_data":{"type":"boolean"},"notify_url":{"type":"string","format":"uri"},"deletion_scheduled_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"preview_project_status":{"type":"string","enum":["INACTIVE","ACTIVE_HEALTHY","ACTIVE_UNHEALTHY","COMING_UP","UNKNOWN","GOING_DOWN","INIT_FAILED","REMOVED","RESTORING","UPGRADING","PAUSING","RESTORE_FAILED","RESTARTING","PAUSE_FAILED","RESIZING"]}},"required":["id","name","project_ref","parent_project_ref","is_default","persistent","status","created_at","updated_at","with_data"]},"BranchDeleteResponse":{"type":"object","properties":{"message":{"type":"string","enum":["ok"]}},"required":["message"]},"BranchActionBody":{"type":"object","properties":{"migration_version":{"type":"string"}},"example":{"migration_version":"20250312000000"}},"BranchUpdateResponse":{"type":"object","properties":{"workflow_run_id":{"type":"string"},"message":{"type":"string","enum":["ok"]}},"required":["workflow_run_id","message"]},"BranchRestoreResponse":{"type":"object","properties":{"message":{"type":"string","enum":["Branch restoration initiated"]}},"required":["message"]},"V1ProjectWithDatabaseResponse":{"type":"object","properties":{"id":{"type":"string","deprecated":true,"description":"Deprecated: Use `ref` instead."},"ref":{"type":"string","minLength":20,"maxLength":20,"pattern":"^[a-z]+$","description":"Project ref","example":"abcdefghijklmnopqrst"},"organization_id":{"type":"string","description":"Deprecated: Use `organization_slug` instead.","deprecated":true},"organization_slug":{"type":"string","pattern":"^[\\w-]+$","description":"Organization slug","example":"tsrqponmlkjihgfedcba"},"name":{"type":"string","description":"Name of your project"},"region":{"type":"string","description":"Region of your project"},"created_at":{"type":"string","description":"Creation timestamp"},"status":{"type":"string","enum":["INACTIVE","ACTIVE_HEALTHY","ACTIVE_UNHEALTHY","COMING_UP","UNKNOWN","GOING_DOWN","INIT_FAILED","REMOVED","RESTORING","UPGRADING","PAUSING","RESTORE_FAILED","RESTARTING","PAUSE_FAILED","RESIZING"]},"database":{"type":"object","properties":{"host":{"type":"string","description":"Database host"},"version":{"type":"string","description":"Database version"},"postgres_engine":{"type":"string","description":"Database engine"},"release_channel":{"type":"string","description":"Release channel"}},"required":["host","version","postgres_engine","release_channel"]}},"required":["id","ref","organization_id","organization_slug","name","region","created_at","status","database"]},"V1CreateProjectBody":{"type":"object","properties":{"db_pass":{"type":"string","description":"Database password"},"name":{"type":"string","maxLength":256,"description":"Name of your project"},"organization_id":{"deprecated":true,"description":"Deprecated: Use `organization_slug` instead.","type":"string"},"organization_slug":{"type":"string","pattern":"^[\\w-]+$","description":"Organization slug","example":"tsrqponmlkjihgfedcba"},"plan":{"deprecated":true,"description":"Subscription Plan is now set on organization level and is ignored in this request","type":"string","enum":["free","pro"]},"region":{"description":"Region you want your server to reside in. Use region_selection instead.","deprecated":true,"enum":["us-east-1","us-east-2","us-west-1","us-west-2","ap-east-1","ap-southeast-1","ap-northeast-1","ap-northeast-2","ap-southeast-2","eu-west-1","eu-west-2","eu-west-3","eu-north-1","eu-central-1","eu-central-2","ca-central-1","ap-south-1","sa-east-1"],"type":"string"},"region_selection":{"description":"Region selection. Only one of region or region_selection can be specified.","oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["specific"]},"code":{"type":"string","description":"Specific region code. The codes supported are not a stable API, and should be retrieved from the /available-regions endpoint.","enum":["us-east-1","us-east-2","us-west-1","us-west-2","ap-east-1","ap-southeast-1","ap-northeast-1","ap-northeast-2","ap-southeast-2","eu-west-1","eu-west-2","eu-west-3","eu-north-1","eu-central-1","eu-central-2","ca-central-1","ap-south-1","sa-east-1"]}},"required":["type","code"]},{"type":"object","properties":{"type":{"type":"string","enum":["smartGroup"]},"code":{"type":"string","enum":["americas","emea","apac"],"description":"The Smart Region Group's code. The codes supported are not a stable API, and should be retrieved from the /available-regions endpoint."}},"required":["type","code"]}]},"kps_enabled":{"deprecated":true,"description":"This field is deprecated and is ignored in this request","type":"boolean"},"desired_instance_size":{"description":"Desired instance size. Omit this field to always default to the smallest possible size.","type":"string","enum":["nano","micro","small","medium","large","xlarge","2xlarge","4xlarge","8xlarge","12xlarge","16xlarge","24xlarge","24xlarge_optimized_memory","24xlarge_optimized_cpu","24xlarge_high_memory","48xlarge","48xlarge_optimized_memory","48xlarge_optimized_cpu","48xlarge_high_memory"]},"template_url":{"description":"Template URL used to create the project from the CLI.","type":"string","format":"uri"},"release_channel":{"deprecated":true,"nullable":true},"postgres_engine":{"deprecated":true,"nullable":true},"high_availability":{"description":"[Experimental] Whether to enable high availability for the project.","type":"boolean"}},"required":["db_pass","name","organization_slug"],"example":{"db_pass":"correct-horse-battery-staple","name":"acme-prod","organization_slug":"tsrqponmlkjihgfedcba","region":"us-east-1"},"additionalProperties":false},"V1ProjectResponse":{"type":"object","properties":{"id":{"type":"string","deprecated":true,"description":"Deprecated: Use `ref` instead."},"ref":{"type":"string","minLength":20,"maxLength":20,"pattern":"^[a-z]+$","description":"Project ref","example":"abcdefghijklmnopqrst"},"organization_id":{"type":"string","description":"Deprecated: Use `organization_slug` instead.","deprecated":true},"organization_slug":{"type":"string","pattern":"^[\\w-]+$","description":"Organization slug","example":"tsrqponmlkjihgfedcba"},"name":{"type":"string","description":"Name of your project"},"region":{"type":"string","description":"Region of your project"},"created_at":{"type":"string","description":"Creation timestamp"},"status":{"type":"string","enum":["INACTIVE","ACTIVE_HEALTHY","ACTIVE_UNHEALTHY","COMING_UP","UNKNOWN","GOING_DOWN","INIT_FAILED","REMOVED","RESTORING","UPGRADING","PAUSING","RESTORE_FAILED","RESTARTING","PAUSE_FAILED","RESIZING"]}},"required":["id","ref","organization_id","organization_slug","name","region","created_at","status"]},"RegionsInfo":{"type":"object","properties":{"recommendations":{"type":"object","properties":{"smartGroup":{"type":"object","properties":{"name":{"type":"string"},"code":{"type":"string","enum":["americas","emea","apac"]},"type":{"type":"string","enum":["smartGroup"]}},"required":["name","code","type"]},"specific":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"code":{"type":"string","enum":["us-east-1","us-east-2","us-west-1","us-west-2","ap-southeast-1","ap-northeast-1","ap-northeast-2","ap-east-1","ap-southeast-2","eu-west-1","eu-west-2","eu-west-3","eu-north-1","eu-central-1","eu-central-2","ca-central-1","ap-south-1","sa-east-1"]},"type":{"type":"string","enum":["specific"]},"provider":{"type":"string","enum":["AWS","AWS_K8S","AWS_NIMBUS"]},"status":{"type":"string","enum":["capacity","other"]}},"required":["name","code","type","provider"]}}},"required":["smartGroup","specific"]},"all":{"type":"object","properties":{"smartGroup":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"code":{"type":"string","enum":["americas","emea","apac"]},"type":{"type":"string","enum":["smartGroup"]}},"required":["name","code","type"]}},"specific":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"code":{"type":"string","enum":["us-east-1","us-east-2","us-west-1","us-west-2","ap-southeast-1","ap-northeast-1","ap-northeast-2","ap-east-1","ap-southeast-2","eu-west-1","eu-west-2","eu-west-3","eu-north-1","eu-central-1","eu-central-2","ca-central-1","ap-south-1","sa-east-1"]},"type":{"type":"string","enum":["specific"]},"provider":{"type":"string","enum":["AWS","AWS_K8S","AWS_NIMBUS"]},"status":{"type":"string","enum":["capacity","other"]}},"required":["name","code","type","provider"]}}},"required":["smartGroup","specific"]}},"required":["recommendations","all"]},"OrganizationResponseV1":{"type":"object","properties":{"id":{"type":"string","description":"Deprecated: Use `slug` instead.","deprecated":true},"slug":{"type":"string","pattern":"^[\\w-]+$","description":"Organization slug","example":"tsrqponmlkjihgfedcba"},"name":{"type":"string"}},"required":["id","slug","name"]},"CreateOrganizationV1":{"type":"object","properties":{"name":{"type":"string","maxLength":256}},"required":["name"],"example":{"name":"Acme"},"additionalProperties":false},"OAuthTokenBody":{"type":"object","properties":{"grant_type":{"type":"string","enum":["authorization_code","refresh_token","urn:ietf:params:oauth:grant-type:jwt-bearer"]},"client_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"client_secret":{"type":"string"},"code":{"type":"string"},"code_verifier":{"type":"string"},"redirect_uri":{"type":"string"},"refresh_token":{"type":"string"},"assertion":{"description":"IDJAG assertion JWT for grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer. Beta - available on Team and Enterprise plans only.","type":"string"},"resource":{"description":"Resource indicator for MCP (Model Context Protocol) clients","type":"string","format":"uri"},"scope":{"type":"string"}},"example":{"grant_type":"authorization_code","client_id":"66666666-6666-4666-8666-666666666666","client_secret":"sb_secret_live_example_9f4d3a206b2e4a7e8c91","code":"oauth_code_9f4d3a206b2e4a7e8c91","code_verifier":"qW0Z6d9pQnW0mL1dK1q9wFq6Yz2nV5rA8jT3mP7sH4c","redirect_uri":"https://app.acme.com/auth/callback","scope":"projects:read projects:write"},"additionalProperties":false},"OAuthTokenResponse":{"type":"object","properties":{"access_token":{"type":"string"},"refresh_token":{"description":"The `urn:ietf:params:oauth:grant-type:jwt-bearer` grant type issues access tokens only, no refresh token is returned and the token cannot be revoked via `/v1/oauth/revoke`.","type":"string"},"expires_in":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"token_type":{"type":"string","enum":["Bearer"]}},"required":["access_token","expires_in","token_type"],"additionalProperties":false},"OAuthRevokeTokenBody":{"type":"object","properties":{"client_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"client_secret":{"type":"string"},"refresh_token":{"type":"string"}},"required":["client_id","client_secret","refresh_token"],"example":{"client_id":"66666666-6666-4666-8666-666666666666","client_secret":"sb_secret_live_example_9f4d3a206b2e4a7e8c91","refresh_token":"oauth_refresh_9f4d3a206b2e4a7e8c91"},"additionalProperties":false},"SnippetList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"inserted_at":{"type":"string"},"updated_at":{"type":"string"},"type":{"type":"string","enum":["sql"]},"visibility":{"type":"string","enum":["user","project","org","public"]},"name":{"type":"string"},"description":{"type":"string","nullable":true},"project":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"}},"required":["id","name"]},"owner":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"}},"required":["id","username"]},"updated_by":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"}},"required":["id","username"]},"favorite":{"type":"boolean"}},"required":["id","inserted_at","updated_at","type","visibility","name","description","project","owner","updated_by","favorite"]}},"cursor":{"type":"string"}},"required":["data"]},"SnippetResponse":{"type":"object","properties":{"id":{"type":"string"},"inserted_at":{"type":"string"},"updated_at":{"type":"string"},"type":{"type":"string","enum":["sql"]},"visibility":{"type":"string","enum":["user","project","org","public"]},"name":{"type":"string"},"description":{"type":"string","nullable":true},"project":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"}},"required":["id","name"]},"owner":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"}},"required":["id","username"]},"updated_by":{"type":"object","properties":{"id":{"type":"number"},"username":{"type":"string"}},"required":["id","username"]},"favorite":{"type":"boolean"},"content":{"type":"object","properties":{"favorite":{"deprecated":true,"description":"Deprecated: Rely on root-level favorite property instead.","type":"boolean"},"schema_version":{"type":"string"},"sql":{"type":"string"}},"required":["schema_version","sql"]}},"required":["id","inserted_at","updated_at","type","visibility","name","description","project","owner","updated_by","favorite","content"]},"V1ProfileResponse":{"type":"object","properties":{"gotrue_id":{"type":"string"},"primary_email":{"type":"string"},"username":{"type":"string"}},"required":["gotrue_id","primary_email","username"]},"ListActionRunResponse":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"branch_id":{"type":"string"},"run_steps":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","enum":["clone","pull","health","configure","migrate","seed","deploy"]},"status":{"type":"string","enum":["CREATED","DEAD","EXITED","PAUSED","REMOVING","RESTARTING","RUNNING"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["name","status","created_at","updated_at"]}},"git_config":{"nullable":true},"workdir":{"type":"string","nullable":true},"check_run_id":{"type":"number","nullable":true},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","branch_id","run_steps","workdir","check_run_id","created_at","updated_at"]}},"ActionRunResponse":{"type":"object","properties":{"id":{"type":"string"},"branch_id":{"type":"string"},"run_steps":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","enum":["clone","pull","health","configure","migrate","seed","deploy"]},"status":{"type":"string","enum":["CREATED","DEAD","EXITED","PAUSED","REMOVING","RESTARTING","RUNNING"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["name","status","created_at","updated_at"]}},"git_config":{"nullable":true},"workdir":{"type":"string","nullable":true},"check_run_id":{"type":"number","nullable":true},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","branch_id","run_steps","workdir","check_run_id","created_at","updated_at"]},"UpdateRunStatusBody":{"type":"object","properties":{"clone":{"type":"string","enum":["CREATED","DEAD","EXITED","PAUSED","REMOVING","RESTARTING","RUNNING"]},"pull":{"type":"string","enum":["CREATED","DEAD","EXITED","PAUSED","REMOVING","RESTARTING","RUNNING"]},"health":{"type":"string","enum":["CREATED","DEAD","EXITED","PAUSED","REMOVING","RESTARTING","RUNNING"]},"configure":{"type":"string","enum":["CREATED","DEAD","EXITED","PAUSED","REMOVING","RESTARTING","RUNNING"]},"migrate":{"type":"string","enum":["CREATED","DEAD","EXITED","PAUSED","REMOVING","RESTARTING","RUNNING"]},"seed":{"type":"string","enum":["CREATED","DEAD","EXITED","PAUSED","REMOVING","RESTARTING","RUNNING"]},"deploy":{"type":"string","enum":["CREATED","DEAD","EXITED","PAUSED","REMOVING","RESTARTING","RUNNING"]}},"example":{"clone":"RUNNING","configure":"RUNNING","migrate":"RUNNING","deploy":"CREATED"}},"UpdateRunStatusResponse":{"type":"object","properties":{"message":{"type":"string","enum":["ok"]}},"required":["message"]},"ApiKeyResponse":{"type":"object","properties":{"api_key":{"type":"string","nullable":true},"id":{"type":"string","nullable":true},"type":{"type":"string","enum":["legacy","publishable","secret",null],"nullable":true},"prefix":{"type":"string","nullable":true},"name":{"type":"string"},"description":{"type":"string","nullable":true},"hash":{"type":"string","nullable":true},"secret_jwt_template":{"type":"object","additionalProperties":{},"nullable":true},"inserted_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","nullable":true},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","nullable":true}},"required":["name"]},"LegacyApiKeysResponse":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"CreateApiKeyBody":{"type":"object","properties":{"type":{"type":"string","enum":["publishable","secret"]},"name":{"type":"string","minLength":4,"maxLength":64,"pattern":"^[a-z_][a-z0-9_]+$"},"description":{"type":"string","nullable":true},"secret_jwt_template":{"type":"object","additionalProperties":{},"nullable":true}},"required":["type","name"],"example":{"type":"secret","name":"ci_secret_key","description":"CI deploy key"}},"UpdateApiKeyBody":{"type":"object","properties":{"name":{"type":"string","minLength":4,"maxLength":64,"pattern":"^[a-z_][a-z0-9_]+$"},"description":{"type":"string","nullable":true},"secret_jwt_template":{"type":"object","additionalProperties":{},"nullable":true}},"example":{"name":"ci_secret_key_rotated","description":"Rotated after March release"}},"CreateBranchBody":{"type":"object","properties":{"branch_name":{"type":"string","minLength":1},"git_branch":{"type":"string"},"is_default":{"type":"boolean"},"persistent":{"type":"boolean"},"region":{"type":"string"},"desired_instance_size":{"type":"string","enum":["pico","nano","micro","small","medium","large","xlarge","2xlarge","4xlarge","8xlarge","12xlarge","16xlarge","24xlarge","24xlarge_optimized_memory","24xlarge_optimized_cpu","24xlarge_high_memory","48xlarge","48xlarge_optimized_memory","48xlarge_optimized_cpu","48xlarge_high_memory"]},"release_channel":{"type":"string","enum":["internal","alpha","beta","ga","withdrawn","preview"],"description":"Release channel. If not provided, GA will be used."},"postgres_engine":{"type":"string","enum":["15","17","17-oriole"],"description":"Postgres engine version. If not provided, the latest version will be used."},"secrets":{"type":"object","additionalProperties":{"type":"string"}},"with_data":{"type":"boolean"},"notify_url":{"type":"string","format":"uri","description":"HTTP endpoint to receive branch status updates."}},"required":["branch_name"],"example":{"branch_name":"preview-login-page","git_branch":"feature/login-page","persistent":true,"with_data":false,"notify_url":"https://example.com/webhooks/branches"}},"UpdateCustomHostnameResponseJsonValue":{"description":"Any JSON-serializable value","anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}],"nullable":true},{"type":"array","items":{"$ref":"#/components/schemas/UpdateCustomHostnameResponseJsonValue"}},{"type":"object","additionalProperties":{"$ref":"#/components/schemas/UpdateCustomHostnameResponseJsonValue"}}]},"UpdateCustomHostnameResponse":{"type":"object","properties":{"status":{"type":"string","enum":["1_not_started","2_initiated","3_challenge_verified","4_origin_setup_completed","5_services_reconfigured"]},"custom_hostname":{"type":"string"},"data":{"type":"object","properties":{"success":{"type":"boolean"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateCustomHostnameResponseJsonValue"}},"messages":{"type":"array","items":{"$ref":"#/components/schemas/UpdateCustomHostnameResponseJsonValue"}},"result":{"type":"object","properties":{"id":{"type":"string"},"hostname":{"type":"string"},"ssl":{"type":"object","properties":{"status":{"type":"string"},"validation_records":{"type":"array","items":{"type":"object","properties":{"txt_name":{"type":"string"},"txt_value":{"type":"string"}},"required":["txt_name","txt_value"]}},"validation_errors":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"required":["status","validation_records"]},"ownership_verification":{"type":"object","properties":{"type":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"}},"required":["type","name","value"]},"custom_origin_server":{"type":"string"},"verification_errors":{"type":"array","items":{"type":"string"}},"status":{"type":"string"}},"required":["id","hostname","ssl","ownership_verification","custom_origin_server","status"]}},"required":["success","errors","messages","result"]}},"required":["status","custom_hostname","data"]},"UpdateCustomHostnameBody":{"type":"object","properties":{"custom_hostname":{"type":"string","minLength":1,"maxLength":253}},"required":["custom_hostname"],"example":{"custom_hostname":"docs.example.com"}},"JitAccessRequestRequest":{"type":"object","properties":{"state":{"type":"string","enum":["enabled","disabled"]}},"required":["state"],"example":{"state":"enabled"}},"NetworkBanResponse":{"type":"object","properties":{"banned_ipv4_addresses":{"type":"array","items":{"type":"string"}}},"required":["banned_ipv4_addresses"]},"NetworkBanResponseEnriched":{"type":"object","properties":{"banned_ipv4_addresses":{"type":"array","items":{"type":"object","properties":{"banned_address":{"type":"string"},"identifier":{"type":"string"},"type":{"type":"string"}},"required":["banned_address","identifier","type"]}}},"required":["banned_ipv4_addresses"]},"RemoveNetworkBanRequest":{"type":"object","properties":{"ipv4_addresses":{"type":"array","items":{"type":"string"},"description":"List of IP addresses to unban."},"requester_ip":{"default":false,"description":"Include requester's public IP in the list of addresses to unban.","type":"boolean"},"identifier":{"type":"string"}},"required":["ipv4_addresses"],"example":{"ipv4_addresses":["203.0.113.10"],"requester_ip":false}},"NetworkRestrictionsResponse":{"type":"object","properties":{"entitlement":{"type":"string","enum":["disallowed","allowed"]},"config":{"type":"object","properties":{"dbAllowedCidrs":{"type":"array","items":{"type":"string"}},"dbAllowedCidrsV6":{"type":"array","items":{"type":"string"}}},"example":{"dbAllowedCidrs":["203.0.113.0/24"],"dbAllowedCidrsV6":["2001:db8::/32"]},"description":"At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`."},"old_config":{"description":"Populated when a new config has been received, but not registered as successfully applied to a project.","type":"object","properties":{"dbAllowedCidrs":{"type":"array","items":{"type":"string"}},"dbAllowedCidrsV6":{"type":"array","items":{"type":"string"}}},"example":{"dbAllowedCidrs":["203.0.113.0/24"],"dbAllowedCidrsV6":["2001:db8::/32"]}},"status":{"type":"string","enum":["stored","applied"]},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"applied_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["entitlement","config","status"]},"NetworkRestrictionsRequest":{"type":"object","properties":{"dbAllowedCidrs":{"type":"array","items":{"type":"string"}},"dbAllowedCidrsV6":{"type":"array","items":{"type":"string"}}},"example":{"dbAllowedCidrs":["203.0.113.0/24"],"dbAllowedCidrsV6":["2001:db8::/32"]}},"NetworkRestrictionsPatchRequest":{"type":"object","properties":{"add":{"type":"object","properties":{"dbAllowedCidrs":{"type":"array","items":{"type":"string"}},"dbAllowedCidrsV6":{"type":"array","items":{"type":"string"}}}},"remove":{"type":"object","properties":{"dbAllowedCidrs":{"type":"array","items":{"type":"string"}},"dbAllowedCidrsV6":{"type":"array","items":{"type":"string"}}}}},"example":{"add":{"dbAllowedCidrs":["203.0.113.0/24"]},"remove":{"dbAllowedCidrs":["198.51.100.0/24"]}}},"NetworkRestrictionsV2Response":{"type":"object","properties":{"entitlement":{"type":"string","enum":["disallowed","allowed"]},"config":{"type":"object","properties":{"dbAllowedCidrs":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"type":{"type":"string","enum":["v4","v6"]}},"required":["address","type"]}}},"description":"At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`."},"old_config":{"description":"Populated when a new config has been received, but not registered as successfully applied to a project.","type":"object","properties":{"dbAllowedCidrs":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"type":{"type":"string","enum":["v4","v6"]}},"required":["address","type"]}}}},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"applied_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"status":{"type":"string","enum":["stored","applied"]}},"required":["entitlement","config","status"]},"PgsodiumConfigResponse":{"type":"object","properties":{"root_key":{"type":"string","description":"The pgsodium root key: 32 bytes, hex-encoded (64 characters)."}},"required":["root_key"],"example":{"root_key":"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"}},"UpdatePgsodiumConfigBody":{"type":"object","properties":{"root_key":{"type":"string","description":"The pgsodium root key: 32 bytes, hex-encoded (64 characters)."}},"required":["root_key"],"example":{"root_key":"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"}},"PostgrestConfigWithJWTSecretResponse":{"type":"object","properties":{"db_schema":{"type":"string"},"max_rows":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"db_extra_search_path":{"type":"string"},"db_pool":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"If `null`, the value is automatically configured based on compute size.","nullable":true},"db_pool_acquisition_timeout":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"If `null`, the value is automatically configured to 10.","nullable":true},"jwt_secret":{"type":"string"}},"required":["db_schema","max_rows","db_extra_search_path","db_pool","db_pool_acquisition_timeout"]},"V1UpdatePostgrestConfigBody":{"type":"object","properties":{"db_extra_search_path":{"type":"string"},"db_schema":{"type":"string"},"max_rows":{"type":"integer","minimum":0,"maximum":1000000},"db_pool":{"type":"integer","minimum":0,"maximum":1000},"db_pool_acquisition_timeout":{"type":"integer","minimum":0,"maximum":60}},"example":{"db_schema":"public,storage","db_pool":20,"max_rows":1000}},"V1PostgrestConfigResponse":{"type":"object","properties":{"db_schema":{"type":"string"},"max_rows":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"db_extra_search_path":{"type":"string"},"db_pool":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"If `null`, the value is automatically configured based on compute size.","nullable":true},"db_pool_acquisition_timeout":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"If `null`, the value is automatically configured to 10.","nullable":true}},"required":["db_schema","max_rows","db_extra_search_path","db_pool","db_pool_acquisition_timeout"]},"V1ProjectRefResponse":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ref":{"type":"string"},"name":{"type":"string"}},"required":["id","ref","name"]},"V1UpdateProjectBody":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":256}},"required":["name"],"example":{"name":"Acme Platform"}},"SecretResponse":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"},"updated_at":{"type":"string"}},"required":["name","value"]},"CreateSecretBody":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":256,"pattern":"^(?!SUPABASE_).*","description":"Secret name must not start with the SUPABASE_ prefix."},"value":{"type":"string","maxLength":24576}},"required":["name","value"]},"example":[{"name":"OPENAI_API_KEY","value":"sk-example-secret"},{"name":"STRIPE_WEBHOOK_SECRET","value":"whsec_example"}]},"DeleteSecretsBody":{"type":"array","items":{"type":"string"},"example":["OPENAI_API_KEY"]},"SslEnforcementResponse":{"type":"object","properties":{"currentConfig":{"type":"object","properties":{"database":{"type":"boolean"}},"required":["database"]},"appliedSuccessfully":{"type":"boolean"}},"required":["currentConfig","appliedSuccessfully"]},"SslEnforcementRequest":{"type":"object","properties":{"requestedConfig":{"type":"object","properties":{"database":{"type":"boolean"}},"required":["database"]}},"required":["requestedConfig"],"example":{"requestedConfig":{"database":true}}},"TypescriptResponse":{"type":"object","properties":{"types":{"type":"string"}},"required":["types"]},"VanitySubdomainConfigResponse":{"type":"object","properties":{"status":{"type":"string","enum":["not-used","custom-domain-used","active"]},"custom_domain":{"type":"string","minLength":1}},"required":["status"]},"PlanGateErrorBody":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable explanation of the plan gate"},"error":{"description":"Present on entitlement denials. Other errors with this status code (validation, billing state) carry only message.","type":"object","properties":{"code":{"type":"string","description":"Machine-readable marker for plan-gated denials","enum":["entitlement_required"]},"feature":{"type":"string","description":"Entitlement feature key that failed the check"},"upgrade_url":{"description":"Billing page URL for the organization, present when the org is resolvable","type":"string"}},"required":["code","feature"]}},"required":["message"]},"VanitySubdomainBody":{"type":"object","properties":{"vanity_subdomain":{"type":"string","maxLength":63}},"required":["vanity_subdomain"],"example":{"vanity_subdomain":"acme-prod"}},"SubdomainAvailabilityResponse":{"type":"object","properties":{"available":{"type":"boolean"}},"required":["available"]},"ActivateVanitySubdomainResponse":{"type":"object","properties":{"custom_domain":{"type":"string"}},"required":["custom_domain"]},"UpgradeDatabaseBody":{"type":"object","properties":{"target_version":{"type":"string"},"release_channel":{"type":"string","enum":["internal","alpha","beta","ga","withdrawn","preview"]}},"required":["target_version"],"example":{"target_version":"17","release_channel":"ga"}},"ProjectUpgradeInitiateResponse":{"type":"object","properties":{"tracking_id":{"type":"string"}},"required":["tracking_id"]},"ProjectUpgradeEligibilityResponse":{"type":"object","properties":{"eligible":{"type":"boolean"},"current_app_version":{"type":"string"},"current_app_version_release_channel":{"type":"string","enum":["internal","alpha","beta","ga","withdrawn","preview"]},"latest_app_version":{"type":"string"},"target_upgrade_versions":{"type":"array","items":{"type":"object","properties":{"postgres_version":{"type":"string","enum":["13","14","15","17","17-oriole"]},"release_channel":{"type":"string","enum":["internal","alpha","beta","ga","withdrawn","preview"]},"app_version":{"type":"string"}},"required":["postgres_version","release_channel","app_version"]}},"duration_estimate_hours":{"type":"number"},"legacy_auth_custom_roles":{"type":"array","items":{"type":"string"}},"objects_to_be_dropped":{"type":"array","items":{"type":"string"},"deprecated":true,"description":"Use validation_errors instead."},"unsupported_extensions":{"type":"array","items":{"type":"string"},"deprecated":true,"description":"Use validation_errors instead."},"user_defined_objects_in_internal_schemas":{"type":"array","items":{"type":"string"},"deprecated":true,"description":"Use validation_errors instead."},"validation_errors":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["objects_depending_on_pg_cron"]},"dependents":{"type":"array","items":{"type":"string"}}},"required":["type","dependents"]},{"type":"object","properties":{"type":{"type":"string","enum":["indexes_referencing_ll_to_earth"]},"schema_name":{"type":"string"},"table_name":{"type":"string"},"index_name":{"type":"string"}},"required":["type","schema_name","table_name","index_name"]},{"type":"object","properties":{"type":{"type":"string","enum":["function_using_obsolete_lang"]},"schema_name":{"type":"string"},"function_name":{"type":"string"},"lang_name":{"type":"string"}},"required":["type","schema_name","function_name","lang_name"]},{"type":"object","properties":{"type":{"type":"string","enum":["unsupported_extension"]},"extension_name":{"type":"string"}},"required":["type","extension_name"]},{"type":"object","properties":{"type":{"type":"string","enum":["unsupported_fdw_handler"]},"fdw_name":{"type":"string"},"fdw_handler_name":{"type":"string"}},"required":["type","fdw_name","fdw_handler_name"]},{"type":"object","properties":{"type":{"type":"string","enum":["unlogged_table_with_persistent_sequence"]},"schema_name":{"type":"string"},"table_name":{"type":"string"},"sequence_name":{"type":"string"}},"required":["type","schema_name","table_name","sequence_name"]},{"type":"object","properties":{"type":{"type":"string","enum":["user_defined_objects_in_internal_schemas"]},"obj_type":{"anyOf":[{"type":"string","enum":["table"]},{"type":"string","enum":["function"]}]},"schema_name":{"type":"string"},"obj_name":{"type":"string"}},"required":["type","obj_type","schema_name","obj_name"]},{"type":"object","properties":{"type":{"type":"string","enum":["active_replication_slot"]},"slot_name":{"type":"string"}},"required":["type","slot_name"]},{"type":"object","properties":{"type":{"type":"string","enum":["x86_architecture"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["project_hibernating"]}},"required":["type"]}]}},"warnings":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["pg_graphql_introspection_change"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["ltree_reindex_required"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["operator_estimator_gate"]}},"required":["type"]}]}}},"required":["eligible","current_app_version","current_app_version_release_channel","latest_app_version","target_upgrade_versions","duration_estimate_hours","legacy_auth_custom_roles","objects_to_be_dropped","unsupported_extensions","user_defined_objects_in_internal_schemas","validation_errors","warnings"]},"DatabaseUpgradeStatusResponse":{"type":"object","properties":{"databaseUpgradeStatus":{"type":"object","properties":{"initiated_at":{"type":"string"},"latest_status_at":{"type":"string"},"target_version":{"type":"number"},"error":{"type":"string","enum":["1_upgraded_instance_launch_failed","2_volume_detachchment_from_upgraded_instance_failed","3_volume_attachment_to_original_instance_failed","4_data_upgrade_initiation_failed","5_data_upgrade_completion_failed","6_volume_detachchment_from_original_instance_failed","7_volume_attachment_to_upgraded_instance_failed","8_upgrade_completion_failed","9_post_physical_backup_failed"]},"progress":{"type":"string","enum":["0_requested","1_started","2_launched_upgraded_instance","3_detached_volume_from_upgraded_instance","4_attached_volume_to_original_instance","5_initiated_data_upgrade","6_completed_data_upgrade","7_detached_volume_from_original_instance","8_attached_volume_to_upgraded_instance","9_completed_upgrade","10_completed_post_physical_backup"]},"status":{"type":"number"}},"required":["initiated_at","latest_status_at","target_version","status"],"nullable":true}},"required":["databaseUpgradeStatus"]},"ReadOnlyStatusResponse":{"type":"object","properties":{"enabled":{"type":"boolean"},"override_enabled":{"type":"boolean"},"override_active_until":{"type":"string"}},"required":["enabled","override_enabled","override_active_until"]},"SetUpReadReplicaBody":{"type":"object","properties":{"read_replica_region":{"type":"string","enum":["us-east-1","us-east-2","us-west-1","us-west-2","ap-east-1","ap-southeast-1","ap-northeast-1","ap-northeast-2","ap-southeast-2","eu-west-1","eu-west-2","eu-west-3","eu-north-1","eu-central-1","eu-central-2","ca-central-1","ap-south-1","sa-east-1"],"description":"Region you want your read replica to reside in"}},"required":["read_replica_region"],"example":{"read_replica_region":"us-west-1"}},"RemoveReadReplicaBody":{"type":"object","properties":{"database_identifier":{"type":"string"}},"required":["database_identifier"],"example":{"database_identifier":"abcdefghijklmnopqrst-rr-us-west-1-abcde"}},"V1ServiceHealthResponse":{"type":"object","properties":{"name":{"type":"string","enum":["auth","db","db_postgres_user","pooler","realtime","rest","storage","pg_bouncer"]},"healthy":{"type":"boolean","deprecated":true,"description":"Deprecated. Use `status` instead."},"status":{"type":"string","enum":["COMING_UP","ACTIVE_HEALTHY","UNHEALTHY"]},"info":{"anyOf":[{"type":"object","properties":{"name":{"type":"string","enum":["GoTrue"]},"version":{"type":"string"},"description":{"type":"string"}},"required":["name","version","description"]},{"type":"object","properties":{"healthy":{"type":"boolean","deprecated":true,"description":"Deprecated. Use `status` instead."},"db_connected":{"type":"boolean"},"replication_connected":{"type":"boolean"},"connected_cluster":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["healthy","db_connected","replication_connected","connected_cluster"]},{"type":"object","properties":{"db_schema":{"type":"string"}},"required":["db_schema"]}]},"error":{"type":"string"}},"required":["name","healthy","status"]},"SigningKeyResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"algorithm":{"type":"string","enum":["EdDSA","ES256","RS256","HS256"]},"status":{"type":"string","enum":["in_use","previously_used","revoked","standby"]},"public_jwk":{"nullable":true},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","algorithm","status","public_jwk","created_at","updated_at"],"additionalProperties":false},"CreateSigningKeyBody":{"type":"object","properties":{"algorithm":{"type":"string","enum":["EdDSA","ES256","RS256","HS256"]},"status":{"type":"string","enum":["in_use","standby"]},"private_jwk":{"oneOf":[{"type":"object","properties":{"kid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"use":{"type":"string","enum":["sig"]},"key_ops":{"minItems":2,"maxItems":2,"type":"array","items":{"type":"string","enum":["sign","verify"]}},"ext":{"type":"boolean","enum":[true]},"kty":{"type":"string","enum":["RSA"]},"alg":{"type":"string","enum":["RS256"]},"n":{"type":"string"},"e":{"type":"string","enum":["AQAB"]},"d":{"type":"string"},"p":{"type":"string"},"q":{"type":"string"},"dp":{"type":"string"},"dq":{"type":"string"},"qi":{"type":"string"}},"required":["kty","n","e","d","p","q","dp","dq","qi"],"additionalProperties":false},{"type":"object","properties":{"kid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"use":{"type":"string","enum":["sig"]},"key_ops":{"minItems":2,"maxItems":2,"type":"array","items":{"type":"string","enum":["sign","verify"]}},"ext":{"type":"boolean","enum":[true]},"kty":{"type":"string","enum":["EC"]},"alg":{"type":"string","enum":["ES256"]},"crv":{"type":"string","enum":["P-256"]},"x":{"type":"string"},"y":{"type":"string"},"d":{"type":"string"}},"required":["kty","crv","x","y","d"],"additionalProperties":false},{"type":"object","properties":{"kid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"use":{"type":"string","enum":["sig"]},"key_ops":{"minItems":2,"maxItems":2,"type":"array","items":{"type":"string","enum":["sign","verify"]}},"ext":{"type":"boolean","enum":[true]},"kty":{"type":"string","enum":["OKP"]},"alg":{"type":"string","enum":["EdDSA"]},"crv":{"type":"string","enum":["Ed25519"]},"x":{"type":"string"},"d":{"type":"string"}},"required":["kty","crv","x","d"],"additionalProperties":false},{"type":"object","properties":{"kid":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"use":{"type":"string","enum":["sig"]},"key_ops":{"minItems":2,"maxItems":2,"type":"array","items":{"type":"string","enum":["sign","verify"]}},"ext":{"type":"boolean","enum":[true]},"kty":{"type":"string","enum":["oct"]},"alg":{"type":"string","enum":["HS256"]},"k":{"type":"string","minLength":16}},"required":["kty","k"],"additionalProperties":false}]}},"required":["algorithm"],"example":{"algorithm":"RS256","status":"standby"},"additionalProperties":false},"SigningKeysResponse":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"algorithm":{"type":"string","enum":["EdDSA","ES256","RS256","HS256"]},"status":{"type":"string","enum":["in_use","previously_used","revoked","standby"]},"public_jwk":{"nullable":true},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","algorithm","status","public_jwk","created_at","updated_at"],"additionalProperties":false}}},"required":["keys"],"additionalProperties":false},"UpdateSigningKeyBody":{"type":"object","properties":{"status":{"type":"string","enum":["in_use","previously_used","revoked","standby"]}},"required":["status"],"example":{"status":"standby"},"additionalProperties":false},"AuthConfigResponse":{"type":"object","properties":{"api_max_request_duration":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"db_max_pool_size":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"db_max_pool_size_unit":{"type":"string","enum":["connections","percent",null],"nullable":true},"disable_signup":{"type":"boolean","nullable":true},"external_anonymous_users_enabled":{"type":"boolean","nullable":true},"external_apple_additional_client_ids":{"type":"string","nullable":true},"external_apple_client_id":{"type":"string","nullable":true},"external_apple_email_optional":{"type":"boolean","nullable":true},"external_apple_enabled":{"type":"boolean","nullable":true},"external_apple_secret":{"type":"string","nullable":true},"external_azure_client_id":{"type":"string","nullable":true},"external_azure_email_optional":{"type":"boolean","nullable":true},"external_azure_enabled":{"type":"boolean","nullable":true},"external_azure_secret":{"type":"string","nullable":true},"external_azure_url":{"type":"string","nullable":true},"external_bitbucket_client_id":{"type":"string","nullable":true},"external_bitbucket_email_optional":{"type":"boolean","nullable":true},"external_bitbucket_enabled":{"type":"boolean","nullable":true},"external_bitbucket_secret":{"type":"string","nullable":true},"external_discord_client_id":{"type":"string","nullable":true},"external_discord_email_optional":{"type":"boolean","nullable":true},"external_discord_enabled":{"type":"boolean","nullable":true},"external_discord_secret":{"type":"string","nullable":true},"external_email_enabled":{"type":"boolean","nullable":true},"external_facebook_client_id":{"type":"string","nullable":true},"external_facebook_email_optional":{"type":"boolean","nullable":true},"external_facebook_enabled":{"type":"boolean","nullable":true},"external_facebook_secret":{"type":"string","nullable":true},"external_figma_client_id":{"type":"string","nullable":true},"external_figma_email_optional":{"type":"boolean","nullable":true},"external_figma_enabled":{"type":"boolean","nullable":true},"external_figma_secret":{"type":"string","nullable":true},"external_github_client_id":{"type":"string","nullable":true},"external_github_email_optional":{"type":"boolean","nullable":true},"external_github_enabled":{"type":"boolean","nullable":true},"external_github_secret":{"type":"string","nullable":true},"external_gitlab_client_id":{"type":"string","nullable":true},"external_gitlab_email_optional":{"type":"boolean","nullable":true},"external_gitlab_enabled":{"type":"boolean","nullable":true},"external_gitlab_secret":{"type":"string","nullable":true},"external_gitlab_url":{"type":"string","nullable":true},"external_google_additional_client_ids":{"type":"string","nullable":true},"external_google_client_id":{"type":"string","nullable":true},"external_google_email_optional":{"type":"boolean","nullable":true},"external_google_enabled":{"type":"boolean","nullable":true},"external_google_secret":{"type":"string","nullable":true},"external_google_skip_nonce_check":{"type":"boolean","nullable":true},"external_kakao_client_id":{"type":"string","nullable":true},"external_kakao_email_optional":{"type":"boolean","nullable":true},"external_kakao_enabled":{"type":"boolean","nullable":true},"external_kakao_secret":{"type":"string","nullable":true},"external_keycloak_client_id":{"type":"string","nullable":true},"external_keycloak_email_optional":{"type":"boolean","nullable":true},"external_keycloak_enabled":{"type":"boolean","nullable":true},"external_keycloak_secret":{"type":"string","nullable":true},"external_keycloak_url":{"type":"string","nullable":true},"external_linkedin_oidc_client_id":{"type":"string","nullable":true},"external_linkedin_oidc_email_optional":{"type":"boolean","nullable":true},"external_linkedin_oidc_enabled":{"type":"boolean","nullable":true},"external_linkedin_oidc_secret":{"type":"string","nullable":true},"external_slack_oidc_client_id":{"type":"string","nullable":true},"external_slack_oidc_email_optional":{"type":"boolean","nullable":true},"external_slack_oidc_enabled":{"type":"boolean","nullable":true},"external_slack_oidc_secret":{"type":"string","nullable":true},"external_notion_client_id":{"type":"string","nullable":true},"external_notion_email_optional":{"type":"boolean","nullable":true},"external_notion_enabled":{"type":"boolean","nullable":true},"external_notion_secret":{"type":"string","nullable":true},"external_phone_enabled":{"type":"boolean","nullable":true},"external_slack_client_id":{"type":"string","nullable":true},"external_slack_email_optional":{"type":"boolean","nullable":true},"external_slack_enabled":{"type":"boolean","nullable":true},"external_slack_secret":{"type":"string","nullable":true},"external_spotify_client_id":{"type":"string","nullable":true},"external_spotify_email_optional":{"type":"boolean","nullable":true},"external_spotify_enabled":{"type":"boolean","nullable":true},"external_spotify_secret":{"type":"string","nullable":true},"external_twitch_client_id":{"type":"string","nullable":true},"external_twitch_email_optional":{"type":"boolean","nullable":true},"external_twitch_enabled":{"type":"boolean","nullable":true},"external_twitch_secret":{"type":"string","nullable":true},"external_twitter_client_id":{"type":"string","nullable":true},"external_twitter_email_optional":{"type":"boolean","nullable":true},"external_twitter_enabled":{"type":"boolean","nullable":true},"external_twitter_secret":{"type":"string","nullable":true},"external_x_client_id":{"type":"string","nullable":true},"external_x_email_optional":{"type":"boolean","nullable":true},"external_x_enabled":{"type":"boolean","nullable":true},"external_x_secret":{"type":"string","nullable":true},"external_workos_client_id":{"type":"string","nullable":true},"external_workos_enabled":{"type":"boolean","nullable":true},"external_workos_secret":{"type":"string","nullable":true},"external_workos_url":{"type":"string","nullable":true},"external_web3_solana_enabled":{"type":"boolean","nullable":true},"external_web3_ethereum_enabled":{"type":"boolean","nullable":true},"external_zoom_client_id":{"type":"string","nullable":true},"external_zoom_email_optional":{"type":"boolean","nullable":true},"external_zoom_enabled":{"type":"boolean","nullable":true},"external_zoom_secret":{"type":"string","nullable":true},"hook_custom_access_token_enabled":{"type":"boolean","nullable":true},"hook_custom_access_token_uri":{"type":"string","nullable":true},"hook_custom_access_token_secrets":{"type":"string","nullable":true},"hook_mfa_verification_attempt_enabled":{"type":"boolean","nullable":true},"hook_mfa_verification_attempt_uri":{"type":"string","nullable":true},"hook_mfa_verification_attempt_secrets":{"type":"string","nullable":true},"hook_password_verification_attempt_enabled":{"type":"boolean","nullable":true},"hook_password_verification_attempt_uri":{"type":"string","nullable":true},"hook_password_verification_attempt_secrets":{"type":"string","nullable":true},"hook_send_sms_enabled":{"type":"boolean","nullable":true},"hook_send_sms_uri":{"type":"string","nullable":true},"hook_send_sms_secrets":{"type":"string","nullable":true},"hook_send_email_enabled":{"type":"boolean","nullable":true},"hook_send_email_uri":{"type":"string","nullable":true},"hook_send_email_secrets":{"type":"string","nullable":true},"hook_before_user_created_enabled":{"type":"boolean","nullable":true},"hook_before_user_created_uri":{"type":"string","nullable":true},"hook_before_user_created_secrets":{"type":"string","nullable":true},"hook_after_user_created_enabled":{"type":"boolean","nullable":true},"hook_after_user_created_uri":{"type":"string","nullable":true},"hook_after_user_created_secrets":{"type":"string","nullable":true},"jwt_exp":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"mailer_allow_unverified_email_sign_ins":{"type":"boolean","nullable":true},"mailer_autoconfirm":{"type":"boolean","nullable":true},"mailer_otp_exp":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"mailer_otp_length":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"mailer_secure_email_change_enabled":{"type":"boolean","nullable":true},"mailer_subjects_confirmation":{"type":"string","nullable":true},"mailer_subjects_email_change":{"type":"string","nullable":true},"mailer_subjects_invite":{"type":"string","nullable":true},"mailer_subjects_magic_link":{"type":"string","nullable":true},"mailer_subjects_reauthentication":{"type":"string","nullable":true},"mailer_subjects_recovery":{"type":"string","nullable":true},"mailer_subjects_password_changed_notification":{"type":"string","nullable":true},"mailer_subjects_email_changed_notification":{"type":"string","nullable":true},"mailer_subjects_phone_changed_notification":{"type":"string","nullable":true},"mailer_subjects_mfa_factor_enrolled_notification":{"type":"string","nullable":true},"mailer_subjects_mfa_factor_unenrolled_notification":{"type":"string","nullable":true},"mailer_subjects_identity_linked_notification":{"type":"string","nullable":true},"mailer_subjects_identity_unlinked_notification":{"type":"string","nullable":true},"mailer_templates_confirmation_content":{"type":"string","nullable":true},"mailer_templates_email_change_content":{"type":"string","nullable":true},"mailer_templates_invite_content":{"type":"string","nullable":true},"mailer_templates_magic_link_content":{"type":"string","nullable":true},"mailer_templates_reauthentication_content":{"type":"string","nullable":true},"mailer_templates_recovery_content":{"type":"string","nullable":true},"mailer_templates_password_changed_notification_content":{"type":"string","nullable":true},"mailer_templates_email_changed_notification_content":{"type":"string","nullable":true},"mailer_templates_phone_changed_notification_content":{"type":"string","nullable":true},"mailer_templates_mfa_factor_enrolled_notification_content":{"type":"string","nullable":true},"mailer_templates_mfa_factor_unenrolled_notification_content":{"type":"string","nullable":true},"mailer_templates_identity_linked_notification_content":{"type":"string","nullable":true},"mailer_templates_identity_unlinked_notification_content":{"type":"string","nullable":true},"mailer_notifications_password_changed_enabled":{"type":"boolean","nullable":true},"mailer_notifications_email_changed_enabled":{"type":"boolean","nullable":true},"mailer_notifications_phone_changed_enabled":{"type":"boolean","nullable":true},"mailer_notifications_mfa_factor_enrolled_enabled":{"type":"boolean","nullable":true},"mailer_notifications_mfa_factor_unenrolled_enabled":{"type":"boolean","nullable":true},"mailer_notifications_identity_linked_enabled":{"type":"boolean","nullable":true},"mailer_notifications_identity_unlinked_enabled":{"type":"boolean","nullable":true},"mfa_max_enrolled_factors":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"mfa_totp_enroll_enabled":{"type":"boolean","nullable":true},"mfa_totp_verify_enabled":{"type":"boolean","nullable":true},"mfa_phone_enroll_enabled":{"type":"boolean","nullable":true},"mfa_phone_verify_enabled":{"type":"boolean","nullable":true},"mfa_web_authn_enroll_enabled":{"type":"boolean","nullable":true},"mfa_web_authn_verify_enabled":{"type":"boolean","nullable":true},"passkey_enabled":{"type":"boolean"},"webauthn_rp_display_name":{"type":"string","nullable":true},"webauthn_rp_id":{"type":"string","nullable":true},"webauthn_rp_origins":{"type":"string","nullable":true},"mfa_phone_otp_length":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"mfa_phone_template":{"type":"string","nullable":true},"mfa_phone_max_frequency":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"nimbus_oauth_client_id":{"type":"string","nullable":true},"nimbus_oauth_email_optional":{"type":"boolean","nullable":true},"nimbus_oauth_client_secret":{"type":"string","nullable":true},"password_hibp_enabled":{"type":"boolean","nullable":true},"password_min_length":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"password_required_characters":{"type":"string","enum":["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789","abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789","abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~","",null],"nullable":true},"rate_limit_anonymous_users":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"rate_limit_email_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"rate_limit_sms_sent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"rate_limit_token_refresh":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"rate_limit_verify":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"rate_limit_otp":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"rate_limit_web3":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"refresh_token_rotation_enabled":{"type":"boolean","nullable":true},"saml_enabled":{"type":"boolean","nullable":true},"saml_external_url":{"type":"string","nullable":true},"saml_allow_encrypted_assertions":{"type":"boolean","nullable":true},"security_sb_forwarded_for_enabled":{"type":"boolean","nullable":true},"security_captcha_enabled":{"type":"boolean","nullable":true},"security_captcha_provider":{"type":"string","enum":["turnstile","hcaptcha",null],"nullable":true},"security_captcha_secret":{"type":"string","nullable":true},"security_manual_linking_enabled":{"type":"boolean","nullable":true},"security_refresh_token_reuse_interval":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"security_update_password_require_reauthentication":{"type":"boolean","nullable":true},"sessions_inactivity_timeout":{"type":"number","nullable":true},"sessions_single_per_user":{"type":"boolean","nullable":true},"sessions_tags":{"type":"string","nullable":true},"sessions_timebox":{"type":"number","nullable":true},"site_url":{"type":"string","nullable":true},"sms_autoconfirm":{"type":"boolean","nullable":true},"sms_max_frequency":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"sms_messagebird_access_key":{"type":"string","nullable":true},"sms_messagebird_originator":{"type":"string","nullable":true},"sms_otp_exp":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"sms_otp_length":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sms_provider":{"type":"string","enum":["messagebird","textlocal","twilio","twilio_verify","vonage",null],"nullable":true},"sms_template":{"type":"string","nullable":true},"sms_test_otp":{"type":"string","nullable":true},"sms_test_otp_valid_until":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","nullable":true},"sms_textlocal_api_key":{"type":"string","nullable":true},"sms_textlocal_sender":{"type":"string","nullable":true},"sms_twilio_account_sid":{"type":"string","nullable":true},"sms_twilio_auth_token":{"type":"string","nullable":true},"sms_twilio_content_sid":{"type":"string","nullable":true},"sms_twilio_message_service_sid":{"type":"string","nullable":true},"sms_twilio_verify_account_sid":{"type":"string","nullable":true},"sms_twilio_verify_auth_token":{"type":"string","nullable":true},"sms_twilio_verify_message_service_sid":{"type":"string","nullable":true},"sms_vonage_api_key":{"type":"string","nullable":true},"sms_vonage_api_secret":{"type":"string","nullable":true},"sms_vonage_from":{"type":"string","nullable":true},"smtp_admin_email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","nullable":true},"smtp_host":{"type":"string","nullable":true},"smtp_max_frequency":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"smtp_pass":{"type":"string","nullable":true},"smtp_port":{"type":"string","nullable":true},"smtp_sender_name":{"type":"string","nullable":true},"smtp_user":{"type":"string","nullable":true},"uri_allow_list":{"type":"string","nullable":true},"oauth_server_enabled":{"type":"boolean"},"oauth_server_allow_dynamic_registration":{"type":"boolean"},"oauth_server_authorization_path":{"type":"string","nullable":true},"custom_oauth_enabled":{"type":"boolean"},"custom_oauth_max_providers":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["api_max_request_duration","db_max_pool_size","db_max_pool_size_unit","disable_signup","external_anonymous_users_enabled","external_apple_additional_client_ids","external_apple_client_id","external_apple_email_optional","external_apple_enabled","external_apple_secret","external_azure_client_id","external_azure_email_optional","external_azure_enabled","external_azure_secret","external_azure_url","external_bitbucket_client_id","external_bitbucket_email_optional","external_bitbucket_enabled","external_bitbucket_secret","external_discord_client_id","external_discord_email_optional","external_discord_enabled","external_discord_secret","external_email_enabled","external_facebook_client_id","external_facebook_email_optional","external_facebook_enabled","external_facebook_secret","external_figma_client_id","external_figma_email_optional","external_figma_enabled","external_figma_secret","external_github_client_id","external_github_email_optional","external_github_enabled","external_github_secret","external_gitlab_client_id","external_gitlab_email_optional","external_gitlab_enabled","external_gitlab_secret","external_gitlab_url","external_google_additional_client_ids","external_google_client_id","external_google_email_optional","external_google_enabled","external_google_secret","external_google_skip_nonce_check","external_kakao_client_id","external_kakao_email_optional","external_kakao_enabled","external_kakao_secret","external_keycloak_client_id","external_keycloak_email_optional","external_keycloak_enabled","external_keycloak_secret","external_keycloak_url","external_linkedin_oidc_client_id","external_linkedin_oidc_email_optional","external_linkedin_oidc_enabled","external_linkedin_oidc_secret","external_slack_oidc_client_id","external_slack_oidc_email_optional","external_slack_oidc_enabled","external_slack_oidc_secret","external_notion_client_id","external_notion_email_optional","external_notion_enabled","external_notion_secret","external_phone_enabled","external_slack_client_id","external_slack_email_optional","external_slack_enabled","external_slack_secret","external_spotify_client_id","external_spotify_email_optional","external_spotify_enabled","external_spotify_secret","external_twitch_client_id","external_twitch_email_optional","external_twitch_enabled","external_twitch_secret","external_twitter_client_id","external_twitter_email_optional","external_twitter_enabled","external_twitter_secret","external_x_client_id","external_x_email_optional","external_x_enabled","external_x_secret","external_workos_client_id","external_workos_enabled","external_workos_secret","external_workos_url","external_web3_solana_enabled","external_web3_ethereum_enabled","external_zoom_client_id","external_zoom_email_optional","external_zoom_enabled","external_zoom_secret","hook_custom_access_token_enabled","hook_custom_access_token_uri","hook_custom_access_token_secrets","hook_mfa_verification_attempt_enabled","hook_mfa_verification_attempt_uri","hook_mfa_verification_attempt_secrets","hook_password_verification_attempt_enabled","hook_password_verification_attempt_uri","hook_password_verification_attempt_secrets","hook_send_sms_enabled","hook_send_sms_uri","hook_send_sms_secrets","hook_send_email_enabled","hook_send_email_uri","hook_send_email_secrets","hook_before_user_created_enabled","hook_before_user_created_uri","hook_before_user_created_secrets","hook_after_user_created_enabled","hook_after_user_created_uri","hook_after_user_created_secrets","jwt_exp","mailer_allow_unverified_email_sign_ins","mailer_autoconfirm","mailer_otp_exp","mailer_otp_length","mailer_secure_email_change_enabled","mailer_subjects_confirmation","mailer_subjects_email_change","mailer_subjects_invite","mailer_subjects_magic_link","mailer_subjects_reauthentication","mailer_subjects_recovery","mailer_subjects_password_changed_notification","mailer_subjects_email_changed_notification","mailer_subjects_phone_changed_notification","mailer_subjects_mfa_factor_enrolled_notification","mailer_subjects_mfa_factor_unenrolled_notification","mailer_subjects_identity_linked_notification","mailer_subjects_identity_unlinked_notification","mailer_templates_confirmation_content","mailer_templates_email_change_content","mailer_templates_invite_content","mailer_templates_magic_link_content","mailer_templates_reauthentication_content","mailer_templates_recovery_content","mailer_templates_password_changed_notification_content","mailer_templates_email_changed_notification_content","mailer_templates_phone_changed_notification_content","mailer_templates_mfa_factor_enrolled_notification_content","mailer_templates_mfa_factor_unenrolled_notification_content","mailer_templates_identity_linked_notification_content","mailer_templates_identity_unlinked_notification_content","mailer_notifications_password_changed_enabled","mailer_notifications_email_changed_enabled","mailer_notifications_phone_changed_enabled","mailer_notifications_mfa_factor_enrolled_enabled","mailer_notifications_mfa_factor_unenrolled_enabled","mailer_notifications_identity_linked_enabled","mailer_notifications_identity_unlinked_enabled","mfa_max_enrolled_factors","mfa_totp_enroll_enabled","mfa_totp_verify_enabled","mfa_phone_enroll_enabled","mfa_phone_verify_enabled","mfa_web_authn_enroll_enabled","mfa_web_authn_verify_enabled","passkey_enabled","webauthn_rp_display_name","webauthn_rp_id","webauthn_rp_origins","mfa_phone_otp_length","mfa_phone_template","mfa_phone_max_frequency","nimbus_oauth_client_id","nimbus_oauth_email_optional","nimbus_oauth_client_secret","password_hibp_enabled","password_min_length","password_required_characters","rate_limit_anonymous_users","rate_limit_email_sent","rate_limit_sms_sent","rate_limit_token_refresh","rate_limit_verify","rate_limit_otp","rate_limit_web3","refresh_token_rotation_enabled","saml_enabled","saml_external_url","saml_allow_encrypted_assertions","security_sb_forwarded_for_enabled","security_captcha_enabled","security_captcha_provider","security_captcha_secret","security_manual_linking_enabled","security_refresh_token_reuse_interval","security_update_password_require_reauthentication","sessions_inactivity_timeout","sessions_single_per_user","sessions_tags","sessions_timebox","site_url","sms_autoconfirm","sms_max_frequency","sms_messagebird_access_key","sms_messagebird_originator","sms_otp_exp","sms_otp_length","sms_provider","sms_template","sms_test_otp","sms_test_otp_valid_until","sms_textlocal_api_key","sms_textlocal_sender","sms_twilio_account_sid","sms_twilio_auth_token","sms_twilio_content_sid","sms_twilio_message_service_sid","sms_twilio_verify_account_sid","sms_twilio_verify_auth_token","sms_twilio_verify_message_service_sid","sms_vonage_api_key","sms_vonage_api_secret","sms_vonage_from","smtp_admin_email","smtp_host","smtp_max_frequency","smtp_pass","smtp_port","smtp_sender_name","smtp_user","uri_allow_list","oauth_server_enabled","oauth_server_allow_dynamic_registration","oauth_server_authorization_path","custom_oauth_enabled","custom_oauth_max_providers"]},"UpdateAuthConfigBody":{"type":"object","properties":{"site_url":{"type":"string","pattern":"^[^,]+$","nullable":true},"disable_signup":{"type":"boolean","nullable":true},"jwt_exp":{"type":"integer","minimum":0,"maximum":604800,"nullable":true},"smtp_admin_email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","nullable":true},"smtp_host":{"type":"string","nullable":true},"smtp_port":{"type":"string","nullable":true},"smtp_user":{"type":"string","nullable":true},"smtp_pass":{"type":"string","nullable":true},"smtp_max_frequency":{"type":"integer","minimum":0,"maximum":32767,"nullable":true},"smtp_sender_name":{"type":"string","nullable":true},"mailer_allow_unverified_email_sign_ins":{"type":"boolean","nullable":true},"mailer_autoconfirm":{"type":"boolean","nullable":true},"mailer_subjects_invite":{"type":"string","nullable":true},"mailer_subjects_confirmation":{"type":"string","nullable":true},"mailer_subjects_recovery":{"type":"string","nullable":true},"mailer_subjects_email_change":{"type":"string","nullable":true},"mailer_subjects_magic_link":{"type":"string","nullable":true},"mailer_subjects_reauthentication":{"type":"string","nullable":true},"mailer_subjects_password_changed_notification":{"type":"string","nullable":true},"mailer_subjects_email_changed_notification":{"type":"string","nullable":true},"mailer_subjects_phone_changed_notification":{"type":"string","nullable":true},"mailer_subjects_mfa_factor_enrolled_notification":{"type":"string","nullable":true},"mailer_subjects_mfa_factor_unenrolled_notification":{"type":"string","nullable":true},"mailer_subjects_identity_linked_notification":{"type":"string","nullable":true},"mailer_subjects_identity_unlinked_notification":{"type":"string","nullable":true},"mailer_templates_invite_content":{"type":"string","nullable":true},"mailer_templates_confirmation_content":{"type":"string","nullable":true},"mailer_templates_recovery_content":{"type":"string","nullable":true},"mailer_templates_email_change_content":{"type":"string","nullable":true},"mailer_templates_magic_link_content":{"type":"string","nullable":true},"mailer_templates_reauthentication_content":{"type":"string","nullable":true},"mailer_templates_password_changed_notification_content":{"type":"string","nullable":true},"mailer_templates_email_changed_notification_content":{"type":"string","nullable":true},"mailer_templates_phone_changed_notification_content":{"type":"string","nullable":true},"mailer_templates_mfa_factor_enrolled_notification_content":{"type":"string","nullable":true},"mailer_templates_mfa_factor_unenrolled_notification_content":{"type":"string","nullable":true},"mailer_templates_identity_linked_notification_content":{"type":"string","nullable":true},"mailer_templates_identity_unlinked_notification_content":{"type":"string","nullable":true},"mailer_notifications_password_changed_enabled":{"type":"boolean","nullable":true},"mailer_notifications_email_changed_enabled":{"type":"boolean","nullable":true},"mailer_notifications_phone_changed_enabled":{"type":"boolean","nullable":true},"mailer_notifications_mfa_factor_enrolled_enabled":{"type":"boolean","nullable":true},"mailer_notifications_mfa_factor_unenrolled_enabled":{"type":"boolean","nullable":true},"mailer_notifications_identity_linked_enabled":{"type":"boolean","nullable":true},"mailer_notifications_identity_unlinked_enabled":{"type":"boolean","nullable":true},"mfa_max_enrolled_factors":{"type":"integer","minimum":0,"maximum":2147483647,"nullable":true},"uri_allow_list":{"type":"string","nullable":true},"external_anonymous_users_enabled":{"type":"boolean","nullable":true},"external_email_enabled":{"type":"boolean","nullable":true},"external_phone_enabled":{"type":"boolean","nullable":true},"saml_enabled":{"type":"boolean","nullable":true},"saml_external_url":{"type":"string","pattern":"^[^,]+$","nullable":true},"security_sb_forwarded_for_enabled":{"type":"boolean","nullable":true},"security_captcha_enabled":{"type":"boolean","nullable":true},"security_captcha_provider":{"type":"string","enum":["turnstile","hcaptcha",null],"nullable":true},"security_captcha_secret":{"type":"string","nullable":true},"sessions_timebox":{"type":"number","minimum":0,"nullable":true},"sessions_inactivity_timeout":{"type":"number","minimum":0,"nullable":true},"sessions_single_per_user":{"type":"boolean","nullable":true},"sessions_tags":{"type":"string","pattern":"^\\s*([a-zA-Z0-9_-]+(\\s*,+\\s*)?)*\\s*$","nullable":true},"rate_limit_anonymous_users":{"type":"integer","minimum":1,"maximum":2147483647,"nullable":true},"rate_limit_email_sent":{"type":"integer","minimum":1,"maximum":2147483647,"nullable":true},"rate_limit_sms_sent":{"type":"integer","minimum":1,"maximum":2147483647,"nullable":true},"rate_limit_verify":{"type":"integer","minimum":1,"maximum":2147483647,"nullable":true},"rate_limit_token_refresh":{"type":"integer","minimum":1,"maximum":2147483647,"nullable":true},"rate_limit_otp":{"type":"integer","minimum":1,"maximum":2147483647,"nullable":true},"rate_limit_web3":{"type":"integer","minimum":1,"maximum":2147483647,"nullable":true},"mailer_secure_email_change_enabled":{"type":"boolean","nullable":true},"refresh_token_rotation_enabled":{"type":"boolean","nullable":true},"password_hibp_enabled":{"type":"boolean","nullable":true},"password_min_length":{"type":"integer","minimum":6,"maximum":32767,"nullable":true},"password_required_characters":{"type":"string","enum":["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789","abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789","abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\\\:\"|<>?,./`~","",null],"nullable":true},"security_manual_linking_enabled":{"type":"boolean","nullable":true},"security_update_password_require_reauthentication":{"type":"boolean","nullable":true},"security_refresh_token_reuse_interval":{"type":"integer","minimum":0,"maximum":2147483647,"nullable":true},"mailer_otp_exp":{"type":"integer","minimum":0,"maximum":2147483647},"mailer_otp_length":{"type":"integer","minimum":6,"maximum":10,"nullable":true},"sms_autoconfirm":{"type":"boolean","nullable":true},"sms_max_frequency":{"type":"integer","minimum":0,"maximum":32767,"nullable":true},"sms_otp_exp":{"type":"integer","minimum":0,"maximum":2147483647,"nullable":true},"sms_otp_length":{"type":"integer","minimum":0,"maximum":32767},"sms_provider":{"type":"string","enum":["messagebird","textlocal","twilio","twilio_verify","vonage",null],"nullable":true},"sms_messagebird_access_key":{"type":"string","nullable":true},"sms_messagebird_originator":{"type":"string","nullable":true},"sms_test_otp":{"type":"string","pattern":"^([0-9]{1,15}=[0-9]+,?)*$","nullable":true},"sms_test_otp_valid_until":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","nullable":true},"sms_textlocal_api_key":{"type":"string","nullable":true},"sms_textlocal_sender":{"type":"string","nullable":true},"sms_twilio_account_sid":{"type":"string","nullable":true},"sms_twilio_auth_token":{"type":"string","nullable":true},"sms_twilio_content_sid":{"type":"string","nullable":true},"sms_twilio_message_service_sid":{"type":"string","nullable":true},"sms_twilio_verify_account_sid":{"type":"string","nullable":true},"sms_twilio_verify_auth_token":{"type":"string","nullable":true},"sms_twilio_verify_message_service_sid":{"type":"string","nullable":true},"sms_vonage_api_key":{"type":"string","nullable":true},"sms_vonage_api_secret":{"type":"string","nullable":true},"sms_vonage_from":{"type":"string","nullable":true},"sms_template":{"type":"string","nullable":true},"hook_mfa_verification_attempt_enabled":{"type":"boolean","nullable":true},"hook_mfa_verification_attempt_uri":{"type":"string","nullable":true},"hook_mfa_verification_attempt_secrets":{"type":"string","nullable":true},"hook_password_verification_attempt_enabled":{"type":"boolean","nullable":true},"hook_password_verification_attempt_uri":{"type":"string","nullable":true},"hook_password_verification_attempt_secrets":{"type":"string","nullable":true},"hook_custom_access_token_enabled":{"type":"boolean","nullable":true},"hook_custom_access_token_uri":{"type":"string","nullable":true},"hook_custom_access_token_secrets":{"type":"string","nullable":true},"hook_send_sms_enabled":{"type":"boolean","nullable":true},"hook_send_sms_uri":{"type":"string","nullable":true},"hook_send_sms_secrets":{"type":"string","nullable":true},"hook_send_email_enabled":{"type":"boolean","nullable":true},"hook_send_email_uri":{"type":"string","nullable":true},"hook_send_email_secrets":{"type":"string","nullable":true},"hook_before_user_created_enabled":{"type":"boolean","nullable":true},"hook_before_user_created_uri":{"type":"string","nullable":true},"hook_before_user_created_secrets":{"type":"string","nullable":true},"hook_after_user_created_enabled":{"type":"boolean","nullable":true},"hook_after_user_created_uri":{"type":"string","nullable":true},"hook_after_user_created_secrets":{"type":"string","nullable":true},"external_apple_enabled":{"type":"boolean","nullable":true},"external_apple_client_id":{"type":"string","nullable":true},"external_apple_email_optional":{"type":"boolean","nullable":true},"external_apple_secret":{"type":"string","nullable":true},"external_apple_additional_client_ids":{"type":"string","nullable":true},"external_azure_enabled":{"type":"boolean","nullable":true},"external_azure_client_id":{"type":"string","nullable":true},"external_azure_email_optional":{"type":"boolean","nullable":true},"external_azure_secret":{"type":"string","nullable":true},"external_azure_url":{"type":"string","nullable":true},"external_bitbucket_enabled":{"type":"boolean","nullable":true},"external_bitbucket_client_id":{"type":"string","nullable":true},"external_bitbucket_email_optional":{"type":"boolean","nullable":true},"external_bitbucket_secret":{"type":"string","nullable":true},"external_discord_enabled":{"type":"boolean","nullable":true},"external_discord_client_id":{"type":"string","nullable":true},"external_discord_email_optional":{"type":"boolean","nullable":true},"external_discord_secret":{"type":"string","nullable":true},"external_facebook_enabled":{"type":"boolean","nullable":true},"external_facebook_client_id":{"type":"string","nullable":true},"external_facebook_email_optional":{"type":"boolean","nullable":true},"external_facebook_secret":{"type":"string","nullable":true},"external_figma_enabled":{"type":"boolean","nullable":true},"external_figma_client_id":{"type":"string","nullable":true},"external_figma_email_optional":{"type":"boolean","nullable":true},"external_figma_secret":{"type":"string","nullable":true},"external_github_enabled":{"type":"boolean","nullable":true},"external_github_client_id":{"type":"string","nullable":true},"external_github_email_optional":{"type":"boolean","nullable":true},"external_github_secret":{"type":"string","nullable":true},"external_gitlab_enabled":{"type":"boolean","nullable":true},"external_gitlab_client_id":{"type":"string","nullable":true},"external_gitlab_email_optional":{"type":"boolean","nullable":true},"external_gitlab_secret":{"type":"string","nullable":true},"external_gitlab_url":{"type":"string","nullable":true},"external_google_enabled":{"type":"boolean","nullable":true},"external_google_client_id":{"type":"string","nullable":true},"external_google_email_optional":{"type":"boolean","nullable":true},"external_google_secret":{"type":"string","nullable":true},"external_google_additional_client_ids":{"type":"string","nullable":true},"external_google_skip_nonce_check":{"type":"boolean","nullable":true},"external_kakao_enabled":{"type":"boolean","nullable":true},"external_kakao_client_id":{"type":"string","nullable":true},"external_kakao_email_optional":{"type":"boolean","nullable":true},"external_kakao_secret":{"type":"string","nullable":true},"external_keycloak_enabled":{"type":"boolean","nullable":true},"external_keycloak_client_id":{"type":"string","nullable":true},"external_keycloak_email_optional":{"type":"boolean","nullable":true},"external_keycloak_secret":{"type":"string","nullable":true},"external_keycloak_url":{"type":"string","nullable":true},"external_linkedin_oidc_enabled":{"type":"boolean","nullable":true},"external_linkedin_oidc_client_id":{"type":"string","nullable":true},"external_linkedin_oidc_email_optional":{"type":"boolean","nullable":true},"external_linkedin_oidc_secret":{"type":"string","nullable":true},"external_slack_oidc_enabled":{"type":"boolean","nullable":true},"external_slack_oidc_client_id":{"type":"string","nullable":true},"external_slack_oidc_email_optional":{"type":"boolean","nullable":true},"external_slack_oidc_secret":{"type":"string","nullable":true},"external_notion_enabled":{"type":"boolean","nullable":true},"external_notion_client_id":{"type":"string","nullable":true},"external_notion_email_optional":{"type":"boolean","nullable":true},"external_notion_secret":{"type":"string","nullable":true},"external_slack_enabled":{"type":"boolean","nullable":true},"external_slack_client_id":{"type":"string","nullable":true},"external_slack_email_optional":{"type":"boolean","nullable":true},"external_slack_secret":{"type":"string","nullable":true},"external_spotify_enabled":{"type":"boolean","nullable":true},"external_spotify_client_id":{"type":"string","nullable":true},"external_spotify_email_optional":{"type":"boolean","nullable":true},"external_spotify_secret":{"type":"string","nullable":true},"external_twitch_enabled":{"type":"boolean","nullable":true},"external_twitch_client_id":{"type":"string","nullable":true},"external_twitch_email_optional":{"type":"boolean","nullable":true},"external_twitch_secret":{"type":"string","nullable":true},"external_twitter_enabled":{"type":"boolean","nullable":true},"external_twitter_client_id":{"type":"string","nullable":true},"external_twitter_email_optional":{"type":"boolean","nullable":true},"external_twitter_secret":{"type":"string","nullable":true},"external_x_enabled":{"type":"boolean","nullable":true},"external_x_client_id":{"type":"string","nullable":true},"external_x_email_optional":{"type":"boolean","nullable":true},"external_x_secret":{"type":"string","nullable":true},"external_workos_enabled":{"type":"boolean","nullable":true},"external_workos_client_id":{"type":"string","nullable":true},"external_workos_secret":{"type":"string","nullable":true},"external_workos_url":{"type":"string","nullable":true},"external_web3_solana_enabled":{"type":"boolean","nullable":true},"external_web3_ethereum_enabled":{"type":"boolean","nullable":true},"external_zoom_enabled":{"type":"boolean","nullable":true},"external_zoom_client_id":{"type":"string","nullable":true},"external_zoom_email_optional":{"type":"boolean","nullable":true},"external_zoom_secret":{"type":"string","nullable":true},"db_max_pool_size":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"db_max_pool_size_unit":{"type":"string","enum":["connections","percent",null],"nullable":true},"api_max_request_duration":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"mfa_totp_enroll_enabled":{"type":"boolean","nullable":true},"mfa_totp_verify_enabled":{"type":"boolean","nullable":true},"mfa_web_authn_enroll_enabled":{"type":"boolean","nullable":true},"mfa_web_authn_verify_enabled":{"type":"boolean","nullable":true},"passkey_enabled":{"type":"boolean"},"webauthn_rp_display_name":{"type":"string","nullable":true},"webauthn_rp_id":{"type":"string","nullable":true},"webauthn_rp_origins":{"type":"string","nullable":true},"mfa_phone_enroll_enabled":{"type":"boolean","nullable":true},"mfa_phone_verify_enabled":{"type":"boolean","nullable":true},"mfa_phone_max_frequency":{"type":"integer","minimum":0,"maximum":32767,"nullable":true},"mfa_phone_otp_length":{"type":"integer","minimum":0,"maximum":32767,"nullable":true},"mfa_phone_template":{"type":"string","nullable":true},"nimbus_oauth_client_id":{"type":"string","nullable":true},"nimbus_oauth_client_secret":{"type":"string","nullable":true},"oauth_server_enabled":{"type":"boolean","nullable":true},"oauth_server_allow_dynamic_registration":{"type":"boolean","nullable":true},"oauth_server_authorization_path":{"type":"string","nullable":true},"custom_oauth_enabled":{"type":"boolean"}},"example":{"site_url":"https://app.example.com","disable_signup":false,"jwt_exp":3600}},"CreateThirdPartyAuthBody":{"type":"object","properties":{"oidc_issuer_url":{"type":"string"},"jwks_url":{"type":"string"},"custom_jwks":{}},"example":{"oidc_issuer_url":"https://login.acme.com","jwks_url":"https://login.acme.com/.well-known/jwks.json"}},"ThirdPartyAuth":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string"},"oidc_issuer_url":{"type":"string","nullable":true},"jwks_url":{"type":"string","nullable":true},"custom_jwks":{"nullable":true},"resolved_jwks":{"nullable":true},"inserted_at":{"type":"string"},"updated_at":{"type":"string"},"resolved_at":{"type":"string","nullable":true}},"required":["id","type","inserted_at","updated_at"]},"GetProjectAvailableRestoreVersionsResponse":{"type":"object","properties":{"available_versions":{"type":"array","items":{"type":"object","properties":{"version":{"type":"string"},"release_channel":{"type":"string","enum":["internal","alpha","beta","ga","withdrawn","preview"]},"postgres_engine":{"type":"string","enum":["13","14","15","17","17-oriole"]}},"required":["version","release_channel","postgres_engine"]}}},"required":["available_versions"]},"ListProjectAddonsResponseJsonValue":{"description":"Any JSON-serializable value","anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}],"nullable":true},{"type":"array","items":{"$ref":"#/components/schemas/ListProjectAddonsResponseJsonValue"}},{"type":"object","additionalProperties":{"$ref":"#/components/schemas/ListProjectAddonsResponseJsonValue"}}]},"ListProjectAddonsResponse":{"type":"object","properties":{"selected_addons":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["custom_domain","compute_instance","pitr","ipv4","auth_mfa_phone","auth_mfa_web_authn","log_drain","etl_pipeline"]},"variant":{"type":"object","properties":{"id":{"anyOf":[{"type":"string","enum":["ci_micro","ci_small","ci_medium","ci_large","ci_xlarge","ci_2xlarge","ci_4xlarge","ci_8xlarge","ci_12xlarge","ci_16xlarge","ci_24xlarge","ci_24xlarge_optimized_cpu","ci_24xlarge_optimized_memory","ci_24xlarge_high_memory","ci_48xlarge","ci_48xlarge_optimized_cpu","ci_48xlarge_optimized_memory","ci_48xlarge_high_memory"]},{"type":"string","enum":["cd_default"]},{"type":"string","enum":["pitr_7","pitr_14","pitr_28"]},{"type":"string","enum":["ipv4_default"]},{"type":"string","enum":["auth_mfa_phone_default"]},{"type":"string","enum":["auth_mfa_web_authn_default"]},{"type":"string","enum":["log_drain_default"]},{"type":"string","enum":["etl_pipeline_default"]}]},"name":{"type":"string"},"price":{"type":"object","properties":{"description":{"type":"string"},"type":{"type":"string","enum":["fixed","usage"]},"interval":{"type":"string","enum":["monthly","hourly"]},"amount":{"type":"number"}},"required":["description","type","interval","amount"]},"meta":{"$ref":"#/components/schemas/ListProjectAddonsResponseJsonValue"}},"required":["id","name","price"]}},"required":["type","variant"]}},"available_addons":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["custom_domain","compute_instance","pitr","ipv4","auth_mfa_phone","auth_mfa_web_authn","log_drain","etl_pipeline"]},"name":{"type":"string"},"variants":{"type":"array","items":{"type":"object","properties":{"id":{"anyOf":[{"type":"string","enum":["ci_micro","ci_small","ci_medium","ci_large","ci_xlarge","ci_2xlarge","ci_4xlarge","ci_8xlarge","ci_12xlarge","ci_16xlarge","ci_24xlarge","ci_24xlarge_optimized_cpu","ci_24xlarge_optimized_memory","ci_24xlarge_high_memory","ci_48xlarge","ci_48xlarge_optimized_cpu","ci_48xlarge_optimized_memory","ci_48xlarge_high_memory"]},{"type":"string","enum":["cd_default"]},{"type":"string","enum":["pitr_7","pitr_14","pitr_28"]},{"type":"string","enum":["ipv4_default"]},{"type":"string","enum":["auth_mfa_phone_default"]},{"type":"string","enum":["auth_mfa_web_authn_default"]},{"type":"string","enum":["log_drain_default"]},{"type":"string","enum":["etl_pipeline_default"]}]},"name":{"type":"string"},"price":{"type":"object","properties":{"description":{"type":"string"},"type":{"type":"string","enum":["fixed","usage"]},"interval":{"type":"string","enum":["monthly","hourly"]},"amount":{"type":"number"}},"required":["description","type","interval","amount"]},"meta":{"$ref":"#/components/schemas/ListProjectAddonsResponseJsonValue"}},"required":["id","name","price"]}}},"required":["type","name","variants"]}}},"required":["selected_addons","available_addons"]},"ApplyProjectAddonBody":{"type":"object","properties":{"addon_variant":{"anyOf":[{"type":"string","enum":["ci_micro","ci_small","ci_medium","ci_large","ci_xlarge","ci_2xlarge","ci_4xlarge","ci_8xlarge","ci_12xlarge","ci_16xlarge","ci_24xlarge","ci_24xlarge_optimized_cpu","ci_24xlarge_optimized_memory","ci_24xlarge_high_memory","ci_48xlarge","ci_48xlarge_optimized_cpu","ci_48xlarge_optimized_memory","ci_48xlarge_high_memory"]},{"type":"string","enum":["cd_default"]},{"type":"string","enum":["pitr_7","pitr_14","pitr_28"]},{"type":"string","enum":["ipv4_default"]}]},"addon_type":{"type":"string","enum":["custom_domain","compute_instance","pitr","ipv4","auth_mfa_phone","auth_mfa_web_authn","log_drain","etl_pipeline"]}},"required":["addon_variant","addon_type"],"example":{"addon_variant":"pitr_7","addon_type":"pitr"}},"ProjectClaimTokenResponse":{"type":"object","properties":{"token_alias":{"type":"string"},"expires_at":{"type":"string"},"created_at":{"type":"string"},"created_by":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["token_alias","expires_at","created_at","created_by"]},"CreateProjectClaimTokenResponse":{"type":"object","properties":{"token":{"type":"string"},"token_alias":{"type":"string"},"expires_at":{"type":"string"},"created_at":{"type":"string"},"created_by":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["token","token_alias","expires_at","created_at","created_by"]},"V1ProjectAdvisorsResponse":{"type":"object","properties":{"lints":{"type":"array","items":{"type":"object","properties":{"name":{"enum":["unindexed_foreign_keys","auth_users_exposed","auth_rls_initplan","no_primary_key","unused_index","multiple_permissive_policies","policy_exists_rls_disabled","rls_enabled_no_policy","duplicate_index","security_definer_view","function_search_path_mutable","rls_disabled_in_public","extension_in_public","rls_references_user_metadata","materialized_view_in_api","foreign_table_in_api","unsupported_reg_types","auth_otp_long_expiry","auth_otp_short_length","ssl_not_enforced","log_connections_not_enabled","network_restrictions_not_set","password_requirements_min_length","pitr_not_enabled","auth_leaked_password_protection","auth_insufficient_mfa_options","auth_password_policy_missing","leaked_service_key","no_backup_admin","vulnerable_postgres_version","db_not_reachable","db_connection_failing","db_connection_limit_reached","instance_telemetry_lost","instance_db_down","instance_alert_firing","log_service_error_rate_high","project_not_active","advisor_check_unavailable"],"type":"string"},"title":{"type":"string"},"level":{"type":"string","enum":["ERROR","WARN","INFO"]},"facing":{"type":"string","enum":["EXTERNAL"]},"categories":{"type":"array","items":{"type":"string","enum":["PERFORMANCE","SECURITY","HEALTH"]},"x-ignore-array-items-must-be-objects":true},"description":{"type":"string"},"detail":{"type":"string"},"remediation":{"type":"string"},"metadata":{"type":"object","properties":{"schema":{"type":"string"},"name":{"type":"string"},"entity":{"type":"string"},"type":{"enum":["table","view","materialized view","foreign table","auth","function","extension","compliance","health"],"type":"string"},"fkey_name":{"type":"string"},"fkey_columns":{"x-ignore-array-items-must-be-objects":true,"type":"array","items":{"type":"number"}}}},"cache_key":{"type":"string"},"observed_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["name","title","level","facing","categories","description","detail","remediation","cache_key"],"additionalProperties":{}}}},"required":["lints"]},"AnalyticsResponse":{"type":"object","properties":{"result":{"type":"array","items":{}},"error":{"anyOf":[{"type":"string"},{"type":"object","properties":{"code":{"type":"number"},"errors":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"location":{"type":"string"},"locationType":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"}},"required":["domain","location","locationType","message","reason"]}},"message":{"type":"string"},"status":{"type":"string"}},"required":["code","errors","message","status"]}]}}},"V1GetUsageApiCountResponse":{"type":"object","properties":{"result":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|))$"},"total_auth_requests":{"type":"number"},"total_realtime_requests":{"type":"number"},"total_rest_requests":{"type":"number"},"total_storage_requests":{"type":"number"}},"required":["timestamp","total_auth_requests","total_realtime_requests","total_rest_requests","total_storage_requests"]}},"error":{"anyOf":[{"type":"string"},{"type":"object","properties":{"code":{"type":"number"},"errors":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"location":{"type":"string"},"locationType":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"}},"required":["domain","location","locationType","message","reason"]}},"message":{"type":"string"},"status":{"type":"string"}},"required":["code","errors","message","status"]}]}}},"V1GetUsageApiRequestsCountResponse":{"type":"object","properties":{"result":{"type":"array","items":{"type":"object","properties":{"count":{"type":"number"}},"required":["count"]}},"error":{"anyOf":[{"type":"string"},{"type":"object","properties":{"code":{"type":"number"},"errors":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"location":{"type":"string"},"locationType":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"}},"required":["domain","location","locationType","message","reason"]}},"message":{"type":"string"},"status":{"type":"string"}},"required":["code","errors","message","status"]}]}}},"CreateRoleBody":{"type":"object","properties":{"read_only":{"type":"boolean"}},"required":["read_only"],"example":{"read_only":true}},"CreateRoleResponse":{"type":"object","properties":{"role":{"type":"string","minLength":1},"password":{"type":"string","minLength":1},"ttl_seconds":{"type":"integer","minimum":1,"maximum":9007199254740991,"format":"int64"}},"required":["role","password","ttl_seconds"]},"DeleteRolesResponse":{"type":"object","properties":{"message":{"type":"string","enum":["ok"]}},"required":["message"]},"V1ListMigrationsResponse":{"type":"array","items":{"type":"object","properties":{"version":{"type":"string","minLength":1},"name":{"type":"string"}},"required":["version"]}},"V1CreateMigrationBody":{"type":"object","properties":{"query":{"type":"string","minLength":1},"name":{"type":"string"},"rollback":{"type":"string"}},"required":["query"],"example":{"query":"create table public.widgets(id bigint primary key);","name":"create_widgets_table","rollback":"drop table if exists public.widgets;"}},"V1UpsertMigrationBody":{"type":"object","properties":{"query":{"type":"string","minLength":1},"name":{"type":"string"},"rollback":{"type":"string"}},"required":["query"],"example":{"query":"create table public.widgets(id bigint primary key);","name":"create_widgets_table","rollback":"drop table if exists public.widgets;"}},"V1GetMigrationResponse":{"type":"object","properties":{"version":{"type":"string","minLength":1},"name":{"type":"string"},"statements":{"type":"array","items":{"type":"string"}},"rollback":{"type":"array","items":{"type":"string"}},"created_by":{"type":"string"},"idempotency_key":{"type":"string"}},"required":["version"]},"V1PatchMigrationBody":{"type":"object","properties":{"name":{"type":"string"},"rollback":{"type":"string"}},"example":{"name":"create_widgets_table","rollback":"drop table if exists public.widgets;"}},"V1RunQueryBody":{"type":"object","properties":{"query":{"type":"string","minLength":1},"parameters":{"type":"array","items":{}},"read_only":{"type":"boolean"}},"required":["query"],"example":{"query":"select * from pg_stat_activity limit 1;","read_only":true}},"V1ReadOnlyQueryBody":{"type":"object","properties":{"query":{"type":"string","minLength":1},"parameters":{"type":"array","items":{}}},"required":["query"],"example":{"query":"select * from pg_stat_activity limit 1;"}},"GetProjectDbMetadataResponse":{"type":"object","properties":{"databases":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"schemas":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"],"additionalProperties":{}}}},"required":["name","schemas"],"additionalProperties":{}}}},"required":["databases"]},"V1UpdatePasswordBody":{"type":"object","properties":{"password":{"type":"string","minLength":4}},"required":["password"],"example":{"password":"correct-horse-battery-staple"}},"V1UpdatePasswordResponse":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"JitAccessResponse":{"type":"object","properties":{"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_roles":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","minLength":1},"expires_at":{"type":"number"},"allowed_networks":{"type":"object","properties":{"allowed_cidrs":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv4","pattern":"^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$"}},"required":["cidr"]}},"allowed_cidrs_v6":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$"}},"required":["cidr"]}}}},"branches_only":{"type":"boolean"}},"required":["role"]}}},"required":["user_roles"]},"AuthorizeJitAccessBody":{"type":"object","properties":{"role":{"type":"string","minLength":1},"rhost":{"anyOf":[{"type":"string","format":"ipv4","pattern":"^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$"},{"type":"string","format":"ipv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$"}]}},"required":["role","rhost"],"example":{"role":"postgres","rhost":"203.0.113.10"}},"JitAuthorizeAccessResponse":{"type":"object","properties":{"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_role":{"type":"object","properties":{"role":{"type":"string","minLength":1},"expires_at":{"type":"number"},"allowed_networks":{"type":"object","properties":{"allowed_cidrs":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv4","pattern":"^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$"}},"required":["cidr"]}},"allowed_cidrs_v6":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$"}},"required":["cidr"]}}}},"branches_only":{"type":"boolean"}},"required":["role"]}},"required":["user_id","user_role"]},"JitListAccessResponse":{"type":"object","properties":{"items":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"user_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"primary_email":{"type":"string","nullable":true},"invite_id":{"nullable":true},"expires_at":{"nullable":true},"user_roles":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","minLength":1},"expires_at":{"type":"number"},"allowed_networks":{"type":"object","properties":{"allowed_cidrs":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv4","pattern":"^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$"}},"required":["cidr"]}},"allowed_cidrs_v6":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$"}},"required":["cidr"]}}}},"branches_only":{"type":"boolean"}},"required":["role"]}}},"required":["user_id","primary_email","invite_id","expires_at","user_roles"]},{"type":"object","properties":{"user_id":{"nullable":true},"primary_email":{"type":"string"},"invite_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"expires_at":{"type":"string"},"user_roles":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","minLength":1},"expires_at":{"type":"number"},"allowed_networks":{"type":"object","properties":{"allowed_cidrs":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv4","pattern":"^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$"}},"required":["cidr"]}},"allowed_cidrs_v6":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$"}},"required":["cidr"]}}}},"branches_only":{"type":"boolean"}},"required":["role"]}}},"required":["user_id","primary_email","invite_id","expires_at","user_roles"]}]}}},"required":["items"]},"UpdateJitAccessBody":{"type":"object","properties":{"user_id":{"type":"string","minLength":1,"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"roles":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","minLength":1},"expires_at":{"type":"number"},"allowed_networks":{"type":"object","properties":{"allowed_cidrs":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv4","pattern":"^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$"}},"required":["cidr"]}},"allowed_cidrs_v6":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$"}},"required":["cidr"]}}}},"branches_only":{"type":"boolean"}},"required":["role"]}}},"required":["user_id","roles"],"example":{"user_id":"55555555-5555-4555-8555-555555555555","roles":[{"role":"postgres","expires_at":1740787200,"allowed_networks":{"allowed_cidrs":[{"cidr":"203.0.113.0/24"}]},"branches_only":false}]}},"InviteExternalUserJitAccessBody":{"type":"object","properties":{"email":{"type":"string","minLength":1,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"roles":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","minLength":1},"expires_at":{"type":"number"},"allowed_networks":{"type":"object","properties":{"allowed_cidrs":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv4","pattern":"^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$"}},"required":["cidr"]}},"allowed_cidrs_v6":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$"}},"required":["cidr"]}}}},"branches_only":{"type":"boolean"}},"required":["role"]}}},"required":["email","roles"],"example":{"email":"external-user@somedomain.xyz","roles":[{"role":"postgres","expires_at":1740787200,"allowed_networks":{"allowed_cidrs":[{"cidr":"203.0.113.0/24"}]},"branches_only":false}]}},"InviteExternalUserJitResponse":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"invite_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_roles":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","minLength":1},"expires_at":{"type":"number"},"allowed_networks":{"type":"object","properties":{"allowed_cidrs":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv4","pattern":"^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$"}},"required":["cidr"]}},"allowed_cidrs_v6":{"type":"array","items":{"type":"object","properties":{"cidr":{"type":"string","format":"cidrv6","pattern":"^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$"}},"required":["cidr"]}}}},"branches_only":{"type":"boolean"}},"required":["role"]}}},"required":["email","invite_id","user_roles"]},"AcceptInviteExternalUserJitAccessBody":{"type":"object","properties":{"email":{"type":"string","minLength":1,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"token":{"type":"string","minLength":1}},"required":["email","token"],"example":{"email":"external-user@somedomain.xyz","token":""}},"FunctionResponse":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","REMOVED","THROTTLED"]},"version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"format":"int64"},"updated_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"format":"int64"},"verify_jwt":{"type":"boolean"},"import_map":{"type":"boolean"},"entrypoint_path":{"type":"string"},"import_map_path":{"type":"string"},"ezbr_sha256":{"type":"string"}},"required":["id","slug","name","status","version","created_at","updated_at"]},"V1CreateFunctionBody":{"type":"object","properties":{"slug":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_-]*$"},"name":{"type":"string"},"body":{"type":"string"},"verify_jwt":{"type":"boolean"}},"required":["slug","name","body"],"example":{"slug":"hello-world","name":"Hello World","body":"Deno.serve(() => new Response('Hello, world!'))","verify_jwt":true}},"BulkUpdateFunctionBody":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_-]*$"},"name":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","REMOVED","THROTTLED"]},"version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"type":"integer","format":"int64","minimum":-9007199254740991,"maximum":9007199254740991},"verify_jwt":{"type":"boolean"},"import_map":{"type":"boolean"},"entrypoint_path":{"type":"string"},"import_map_path":{"type":"string"},"ezbr_sha256":{"type":"string"}},"required":["id","slug","name","status","version"]},"example":[{"id":"3c078cce-ad70-4148-9f37-4da362789053","slug":"hello-world","name":"Hello World","status":"ACTIVE","version":2,"verify_jwt":true,"entrypoint_path":"index.ts"}]},"BulkUpdateFunctionResponse":{"type":"object","properties":{"functions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","REMOVED","THROTTLED"]},"version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"format":"int64"},"updated_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"format":"int64"},"verify_jwt":{"type":"boolean"},"import_map":{"type":"boolean"},"entrypoint_path":{"type":"string"},"import_map_path":{"type":"string"},"ezbr_sha256":{"type":"string"}},"required":["id","slug","name","status","version","created_at","updated_at"]}}},"required":["functions"]},"FunctionDeployBody":{"type":"object","properties":{"file":{"type":"array","items":{"type":"string","format":"binary"}},"metadata":{"type":"object","properties":{"entrypoint_path":{"type":"string"},"import_map_path":{"type":"string"},"static_patterns":{"type":"array","items":{"type":"string"}},"verify_jwt":{"type":"boolean"},"name":{"type":"string"}},"required":["entrypoint_path"]}},"required":["file","metadata"],"example":{"file":["./supabase/functions/hello-world/index.ts"],"metadata":{"entrypoint_path":"index.ts","verify_jwt":true,"name":"Hello World"}}},"DeployFunctionResponse":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","REMOVED","THROTTLED"]},"version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"type":"integer","format":"int64","minimum":-9007199254740991,"maximum":9007199254740991},"updated_at":{"type":"integer","format":"int64","minimum":-9007199254740991,"maximum":9007199254740991},"verify_jwt":{"type":"boolean"},"import_map":{"type":"boolean"},"entrypoint_path":{"type":"string"},"import_map_path":{"type":"string"},"ezbr_sha256":{"type":"string"}},"required":["id","slug","name","status","version"]},"FunctionSlugResponse":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["ACTIVE","REMOVED","THROTTLED"]},"version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"format":"int64"},"updated_at":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"format":"int64"},"verify_jwt":{"type":"boolean"},"import_map":{"type":"boolean"},"entrypoint_path":{"type":"string"},"import_map_path":{"type":"string"},"ezbr_sha256":{"type":"string"}},"required":["id","slug","name","status","version","created_at","updated_at"]},"StreamableFile":{"type":"object","properties":{}},"V1UpdateFunctionBody":{"type":"object","properties":{"name":{"type":"string"},"body":{"type":"string"},"verify_jwt":{"type":"boolean"}},"example":{"name":"Hello World","body":"Deno.serve(() => new Response('Hello again!'))","verify_jwt":true}},"V1StorageBucketResponse":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"owner":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string"},"public":{"type":"boolean"}},"required":["id","name","owner","created_at","updated_at","public"]},"DiskResponse":{"type":"object","properties":{"attributes":{"anyOf":[{"type":"object","properties":{"iops":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"size_gb":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"throughput_mibps":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"type":{"type":"string","enum":["gp3"]}},"required":["iops","size_gb","type"]},{"type":"object","properties":{"iops":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"size_gb":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"type":{"type":"string","enum":["io2"]}},"required":["iops","size_gb","type"]}]},"last_modified_at":{"type":"string"}},"required":["attributes"]},"DiskRequestBody":{"type":"object","properties":{"attributes":{"oneOf":[{"type":"object","properties":{"iops":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"size_gb":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"throughput_mibps":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"type":{"type":"string","enum":["gp3"]}},"required":["iops","size_gb","type"]},{"type":"object","properties":{"iops":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"size_gb":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0},"type":{"type":"string","enum":["io2"]}},"required":["iops","size_gb","type"]}]}},"required":["attributes"],"example":{"attributes":{"type":"gp3","size_gb":100,"iops":3000,"throughput_mibps":125}}},"DiskUtilMetricsResponse":{"type":"object","properties":{"timestamp":{"type":"string"},"metrics":{"type":"object","properties":{"fs_size_bytes":{"type":"number"},"fs_avail_bytes":{"type":"number"},"fs_used_bytes":{"type":"number"}},"required":["fs_size_bytes","fs_avail_bytes","fs_used_bytes"]}},"required":["timestamp","metrics"]},"DiskAutoscaleConfig":{"type":"object","properties":{"growth_percent":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"Growth percentage for disk autoscaling","nullable":true,"minimum":0},"min_increment_gb":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"Minimum increment size for disk autoscaling in GB","nullable":true,"minimum":0},"max_size_gb":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"description":"Maximum limit the disk size will grow to in GB","nullable":true,"minimum":0}},"required":["growth_percent","min_increment_gb","max_size_gb"]},"StorageConfigResponse":{"type":"object","properties":{"fileSizeLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"format":"int64"},"features":{"type":"object","properties":{"imageTransformation":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"s3Protocol":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"purgeCache":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"icebergCatalog":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxNamespaces":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxTables":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxCatalogs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["enabled","maxNamespaces","maxTables","maxCatalogs"]},"vectorBuckets":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxBuckets":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxIndexes":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["enabled","maxBuckets","maxIndexes"]}},"required":["imageTransformation","s3Protocol","purgeCache","icebergCatalog","vectorBuckets"]},"capabilities":{"type":"object","properties":{"list_v2":{"type":"boolean"},"iceberg_catalog":{"type":"boolean"}},"required":["list_v2","iceberg_catalog"]},"external":{"type":"object","properties":{"upstreamTarget":{"type":"string","enum":["main","canary"]}},"required":["upstreamTarget"]},"migrationVersion":{"type":"string"},"databasePoolMode":{"type":"string"}},"required":["fileSizeLimit","features","capabilities","external","migrationVersion","databasePoolMode"]},"UpdateStorageConfigBody":{"type":"object","properties":{"fileSizeLimit":{"type":"integer","format":"int64","minimum":0,"maximum":536870912000},"features":{"type":"object","properties":{"imageTransformation":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"s3Protocol":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"purgeCache":{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},"icebergCatalog":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxNamespaces":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxTables":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxCatalogs":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["enabled","maxNamespaces","maxTables","maxCatalogs"]},"vectorBuckets":{"type":"object","properties":{"enabled":{"type":"boolean"},"maxBuckets":{"type":"integer","minimum":0,"maximum":9007199254740991},"maxIndexes":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["enabled","maxBuckets","maxIndexes"]}}},"external":{"type":"object","properties":{"upstreamTarget":{"type":"string","enum":["main","canary"]}},"required":["upstreamTarget"]}},"example":{"fileSizeLimit":10485760,"features":{"imageTransformation":{"enabled":true}}},"additionalProperties":false},"V1PgbouncerConfigResponse":{"type":"object","properties":{"default_pool_size":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ignore_startup_parameters":{"type":"string"},"max_client_conn":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pool_mode":{"type":"string","enum":["transaction","session","statement"]},"connection_string":{"type":"string"},"server_idle_timeout":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"server_lifetime":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"query_wait_timeout":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"reserve_pool_size":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"SupavisorConfigResponse":{"type":"object","properties":{"identifier":{"type":"string"},"database_type":{"type":"string","enum":["PRIMARY","READ_REPLICA"]},"is_using_scram_auth":{"type":"boolean"},"db_user":{"type":"string"},"db_host":{"type":"string"},"db_port":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"db_name":{"type":"string"},"connection_string":{"type":"string"},"connectionString":{"type":"string","description":"Use connection_string instead"},"default_pool_size":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"max_client_conn":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"pool_mode":{"type":"string","enum":["transaction","session"]}},"required":["identifier","database_type","is_using_scram_auth","db_user","db_host","db_port","db_name","connection_string","connectionString","default_pool_size","max_client_conn","pool_mode"]},"UpdateSupavisorConfigBody":{"type":"object","properties":{"default_pool_size":{"type":"integer","minimum":0,"maximum":3000,"nullable":true},"pool_mode":{"description":"Dedicated pooler mode for the project","type":"string","enum":["transaction","session"]}},"example":{"default_pool_size":25,"pool_mode":"transaction"}},"UpdateSupavisorConfigResponse":{"type":"object","properties":{"default_pool_size":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"nullable":true},"pool_mode":{"type":"string"}},"required":["default_pool_size","pool_mode"]},"PostgresConfigResponse":{"type":"object","properties":{"effective_cache_size":{"type":"string"},"logical_decoding_work_mem":{"type":"string"},"cron.log_statement":{"type":"boolean"},"log_autovacuum_min_duration":{"type":"string","description":"Default unit: ms","pattern":"^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$"},"log_checkpoints":{"type":"boolean"},"log_connections":{"type":"boolean"},"log_disconnections":{"type":"boolean"},"log_duration":{"type":"boolean"},"log_lock_waits":{"type":"boolean"},"log_recovery_conflict_waits":{"type":"boolean"},"log_replication_commands":{"type":"boolean"},"log_startup_progress_interval":{"type":"string","description":"Default unit: ms","pattern":"^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$"},"log_temp_files":{"type":"string"},"maintenance_work_mem":{"type":"string"},"track_activity_query_size":{"type":"string"},"max_connections":{"type":"integer","minimum":1,"maximum":262143},"max_locks_per_transaction":{"type":"integer","minimum":10,"maximum":2147483640},"max_logical_replication_workers":{"type":"integer","minimum":0,"maximum":262143},"max_parallel_maintenance_workers":{"type":"integer","minimum":0,"maximum":1024},"max_parallel_workers":{"type":"integer","minimum":0,"maximum":1024},"max_parallel_workers_per_gather":{"type":"integer","minimum":0,"maximum":1024},"max_replication_slots":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_slot_wal_keep_size":{"type":"string"},"max_standby_archive_delay":{"type":"string"},"max_standby_streaming_delay":{"type":"string"},"max_sync_workers_per_subscription":{"type":"integer","minimum":0,"maximum":262143},"max_wal_size":{"type":"string"},"max_wal_senders":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_worker_processes":{"type":"integer","minimum":0,"maximum":262143},"session_replication_role":{"type":"string","enum":["origin","replica","local"]},"shared_buffers":{"type":"string"},"statement_timeout":{"type":"string","description":"Default unit: ms","pattern":"^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$"},"track_commit_timestamp":{"type":"boolean"},"wal_keep_size":{"type":"string"},"wal_sender_timeout":{"type":"string","description":"Default unit: ms","pattern":"^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$"},"work_mem":{"type":"string"},"checkpoint_timeout":{"type":"string","description":"Default unit: s","pattern":"^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$"},"hot_standby_feedback":{"type":"boolean"}}},"UpdatePostgresConfigBody":{"type":"object","properties":{"effective_cache_size":{"type":"string"},"logical_decoding_work_mem":{"type":"string"},"cron.log_statement":{"type":"boolean"},"log_autovacuum_min_duration":{"type":"string","description":"Default unit: ms","pattern":"^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$"},"log_checkpoints":{"type":"boolean"},"log_connections":{"type":"boolean"},"log_disconnections":{"type":"boolean"},"log_duration":{"type":"boolean"},"log_lock_waits":{"type":"boolean"},"log_recovery_conflict_waits":{"type":"boolean"},"log_replication_commands":{"type":"boolean"},"log_startup_progress_interval":{"type":"string","description":"Default unit: ms","pattern":"^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$"},"log_temp_files":{"type":"string"},"maintenance_work_mem":{"type":"string"},"track_activity_query_size":{"type":"string"},"max_connections":{"type":"integer","minimum":1,"maximum":262143},"max_locks_per_transaction":{"type":"integer","minimum":10,"maximum":2147483640},"max_logical_replication_workers":{"type":"integer","minimum":0,"maximum":262143},"max_parallel_maintenance_workers":{"type":"integer","minimum":0,"maximum":1024},"max_parallel_workers":{"type":"integer","minimum":0,"maximum":1024},"max_parallel_workers_per_gather":{"type":"integer","minimum":0,"maximum":1024},"max_replication_slots":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_slot_wal_keep_size":{"type":"string"},"max_standby_archive_delay":{"type":"string"},"max_standby_streaming_delay":{"type":"string"},"max_sync_workers_per_subscription":{"type":"integer","minimum":0,"maximum":262143},"max_wal_size":{"type":"string"},"max_wal_senders":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_worker_processes":{"type":"integer","minimum":0,"maximum":262143},"session_replication_role":{"type":"string","enum":["origin","replica","local"]},"shared_buffers":{"type":"string"},"statement_timeout":{"type":"string","description":"Default unit: ms","pattern":"^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$"},"track_commit_timestamp":{"type":"boolean"},"wal_keep_size":{"type":"string"},"wal_sender_timeout":{"type":"string","description":"Default unit: ms","pattern":"^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$"},"work_mem":{"type":"string"},"checkpoint_timeout":{"type":"string","description":"Default unit: s","pattern":"^(-?[0-9]+(?:\\.[0-9]+)?)(us|ms|s|min|h|d)?$"},"hot_standby_feedback":{"type":"boolean"},"restart_database":{"type":"boolean"}},"example":{"max_connections":120,"shared_buffers":"256MB","work_mem":"4MB","statement_timeout":"60000ms"},"additionalProperties":false},"RealtimeConfigResponse":{"type":"object","properties":{"private_only":{"type":"boolean","description":"Whether to only allow private channels","nullable":true},"connection_pool":{"type":"integer","minimum":1,"maximum":100,"description":"Sets connection pool size for Realtime Authorization","nullable":true},"postgres_changes_pool":{"type":"integer","minimum":1,"maximum":100,"description":"Sets connection pool size used to create Postgres Changes subscriptions","nullable":true},"max_concurrent_users":{"type":"integer","minimum":1,"maximum":50000,"description":"Sets maximum number of concurrent users rate limit","nullable":true},"max_events_per_second":{"type":"integer","minimum":1,"maximum":50000,"description":"Sets maximum number of events per second rate per channel limit","nullable":true},"max_bytes_per_second":{"type":"integer","minimum":1,"maximum":10000000,"description":"Sets maximum number of bytes per second rate per channel limit","nullable":true},"max_channels_per_client":{"type":"integer","minimum":1,"maximum":10000,"description":"Sets maximum number of channels per client rate limit","nullable":true},"max_joins_per_second":{"type":"integer","minimum":1,"maximum":5000,"description":"Sets maximum number of joins per second rate limit","nullable":true},"max_presence_events_per_second":{"type":"integer","minimum":1,"maximum":5000,"description":"Sets maximum number of presence events per second rate limit","nullable":true},"max_payload_size_in_kb":{"type":"integer","minimum":1,"maximum":10000,"description":"Sets maximum number of payload size in KB rate limit","nullable":true},"suspend":{"type":"boolean","description":"Disables the Realtime service for this project when true. Set to false to re-enable it.","nullable":true},"presence_enabled":{"type":"boolean","description":"Whether to enable presence"}},"required":["private_only","connection_pool","postgres_changes_pool","max_concurrent_users","max_events_per_second","max_bytes_per_second","max_channels_per_client","max_joins_per_second","max_presence_events_per_second","max_payload_size_in_kb","suspend","presence_enabled"]},"UpdateRealtimeConfigBody":{"type":"object","properties":{"private_only":{"type":"boolean","description":"Whether to only allow private channels"},"connection_pool":{"type":"integer","minimum":1,"maximum":100,"description":"Sets connection pool size for Realtime Authorization"},"postgres_changes_pool":{"type":"integer","minimum":1,"maximum":100,"description":"Sets connection pool size used to create Postgres Changes subscriptions"},"max_concurrent_users":{"type":"integer","minimum":1,"maximum":50000,"description":"Sets maximum number of concurrent users rate limit"},"max_events_per_second":{"type":"integer","minimum":1,"maximum":50000,"description":"Sets maximum number of events per second rate per channel limit"},"max_bytes_per_second":{"type":"integer","minimum":1,"maximum":10000000,"description":"Sets maximum number of bytes per second rate per channel limit"},"max_channels_per_client":{"type":"integer","minimum":1,"maximum":10000,"description":"Sets maximum number of channels per client rate limit"},"max_joins_per_second":{"type":"integer","minimum":1,"maximum":5000,"description":"Sets maximum number of joins per second rate limit"},"max_presence_events_per_second":{"type":"integer","minimum":1,"maximum":5000,"description":"Sets maximum number of presence events per second rate limit"},"max_payload_size_in_kb":{"type":"integer","minimum":1,"maximum":10000,"description":"Sets maximum number of payload size in KB rate limit"},"suspend":{"type":"boolean","description":"Disables the Realtime service for this project when true. Set to false to re-enable it."},"presence_enabled":{"type":"boolean","description":"Whether to enable presence"}},"example":{"private_only":false,"max_concurrent_users":1000,"max_channels_per_client":100},"additionalProperties":false},"CreateProviderBody":{"type":"object","properties":{"type":{"type":"string","enum":["saml"],"description":"What type of provider will be created"},"metadata_xml":{"type":"string"},"metadata_url":{"type":"string"},"domains":{"type":"array","items":{"type":"string"}},"attribute_mapping":{"type":"object","properties":{"keys":{"type":"object","additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"names":{"type":"array","items":{"type":"string"}},"default":{"anyOf":[{"type":"object","properties":{}},{"type":"number"},{"type":"string"},{"type":"boolean"}]},"array":{"type":"boolean"}}}}},"required":["keys"]},"name_id_format":{"type":"string","enum":["urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified","urn:oasis:names:tc:SAML:2.0:nameid-format:transient","urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress","urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"]}},"required":["type"],"example":{"type":"saml","metadata_url":"https://sso.acme.com/metadata.xml","domains":["acme.com"],"attribute_mapping":{"keys":{"email":{"name":"email"},"first_name":{"name":"first_name"},"last_name":{"name":"last_name"}}}}},"CreateProviderResponse":{"type":"object","properties":{"id":{"type":"string"},"saml":{"type":"object","properties":{"entity_id":{"type":"string"},"metadata_url":{"type":"string"},"metadata_xml":{"type":"string"},"attribute_mapping":{"type":"object","properties":{"keys":{"type":"object","additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"names":{"type":"array","items":{"type":"string"}},"default":{"anyOf":[{"type":"object","properties":{}},{"type":"number"},{"type":"string"},{"type":"boolean"}]},"array":{"type":"boolean"}}}}},"required":["keys"]},"name_id_format":{"type":"string","enum":["urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified","urn:oasis:names:tc:SAML:2.0:nameid-format:transient","urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress","urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"]}},"required":["entity_id"]},"domains":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string"}}}},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id"]},"ListProvidersResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"saml":{"type":"object","properties":{"entity_id":{"type":"string"},"metadata_url":{"type":"string"},"metadata_xml":{"type":"string"},"attribute_mapping":{"type":"object","properties":{"keys":{"type":"object","additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"names":{"type":"array","items":{"type":"string"}},"default":{"anyOf":[{"type":"object","properties":{}},{"type":"number"},{"type":"string"},{"type":"boolean"}]},"array":{"type":"boolean"}}}}},"required":["keys"]},"name_id_format":{"type":"string","enum":["urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified","urn:oasis:names:tc:SAML:2.0:nameid-format:transient","urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress","urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"]}},"required":["entity_id"]},"domains":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string"}}}},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id"]}}},"required":["items"]},"GetProviderResponse":{"type":"object","properties":{"id":{"type":"string"},"saml":{"type":"object","properties":{"entity_id":{"type":"string"},"metadata_url":{"type":"string"},"metadata_xml":{"type":"string"},"attribute_mapping":{"type":"object","properties":{"keys":{"type":"object","additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"names":{"type":"array","items":{"type":"string"}},"default":{"anyOf":[{"type":"object","properties":{}},{"type":"number"},{"type":"string"},{"type":"boolean"}]},"array":{"type":"boolean"}}}}},"required":["keys"]},"name_id_format":{"type":"string","enum":["urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified","urn:oasis:names:tc:SAML:2.0:nameid-format:transient","urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress","urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"]}},"required":["entity_id"]},"domains":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string"}}}},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id"]},"UpdateProviderBody":{"type":"object","properties":{"metadata_xml":{"type":"string"},"metadata_url":{"type":"string"},"domains":{"type":"array","items":{"type":"string"}},"attribute_mapping":{"type":"object","properties":{"keys":{"type":"object","additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"names":{"type":"array","items":{"type":"string"}},"default":{"anyOf":[{"type":"object","properties":{}},{"type":"number"},{"type":"string"},{"type":"boolean"}]},"array":{"type":"boolean"}}}}},"required":["keys"]},"name_id_format":{"type":"string","enum":["urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified","urn:oasis:names:tc:SAML:2.0:nameid-format:transient","urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress","urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"]}},"example":{"metadata_url":"https://sso.acme.com/metadata.xml","domains":["acme.com","contractors.acme.com"]}},"UpdateProviderResponse":{"type":"object","properties":{"id":{"type":"string"},"saml":{"type":"object","properties":{"entity_id":{"type":"string"},"metadata_url":{"type":"string"},"metadata_xml":{"type":"string"},"attribute_mapping":{"type":"object","properties":{"keys":{"type":"object","additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"names":{"type":"array","items":{"type":"string"}},"default":{"anyOf":[{"type":"object","properties":{}},{"type":"number"},{"type":"string"},{"type":"boolean"}]},"array":{"type":"boolean"}}}}},"required":["keys"]},"name_id_format":{"type":"string","enum":["urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified","urn:oasis:names:tc:SAML:2.0:nameid-format:transient","urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress","urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"]}},"required":["entity_id"]},"domains":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string"}}}},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id"]},"DeleteProviderResponse":{"type":"object","properties":{"id":{"type":"string"},"saml":{"type":"object","properties":{"entity_id":{"type":"string"},"metadata_url":{"type":"string"},"metadata_xml":{"type":"string"},"attribute_mapping":{"type":"object","properties":{"keys":{"type":"object","additionalProperties":{"type":"object","properties":{"name":{"type":"string"},"names":{"type":"array","items":{"type":"string"}},"default":{"anyOf":[{"type":"object","properties":{}},{"type":"number"},{"type":"string"},{"type":"boolean"}]},"array":{"type":"boolean"}}}}},"required":["keys"]},"name_id_format":{"type":"string","enum":["urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified","urn:oasis:names:tc:SAML:2.0:nameid-format:transient","urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress","urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"]}},"required":["entity_id"]},"domains":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string"}}}},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id"]},"V1BackupsResponse":{"type":"object","properties":{"region":{"type":"string"},"walg_enabled":{"type":"boolean"},"pitr_enabled":{"type":"boolean"},"backups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"is_physical_backup":{"type":"boolean"},"status":{"type":"string","enum":["COMPLETED","FAILED","PENDING","REMOVED","ARCHIVED","CANCELLED"]},"inserted_at":{"type":"string"}},"required":["id","is_physical_backup","status","inserted_at"]}},"physical_backup_data":{"type":"object","properties":{"earliest_physical_backup_date_unix":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"latest_physical_backup_date_unix":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}}},"required":["region","walg_enabled","pitr_enabled","backups","physical_backup_data"]},"V1RestorePitrBody":{"type":"object","properties":{"recovery_time_target_unix":{"type":"integer","minimum":0,"maximum":9007199254740991,"format":"int64"}},"required":["recovery_time_target_unix"],"example":{"recovery_time_target_unix":1740787200}},"V1RestorePointPostBody":{"type":"object","properties":{"name":{"type":"string","maxLength":20}},"required":["name"],"example":{"name":"before-upgrade"}},"V1RestorePointResponse":{"type":"object","properties":{"name":{"type":"string"},"status":{"type":"string","enum":["AVAILABLE","PENDING","REMOVED","FAILED"]},"completed_on":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","nullable":true}},"required":["name","status","completed_on"]},"V1RestoreBackupBody":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id"],"example":{"id":12345}},"V1BackupScheduleResponse":{"type":"object","properties":{"schedule_for":{"type":"string","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?$","description":"Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.","example":"04:00:00"},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Timestamp of when the backup schedule was last updated.","example":"2026-05-04T14:40:44+00:00"}},"required":["schedule_for","updated_at"]},"V1UpdateBackupScheduleBody":{"type":"object","properties":{"schedule_for":{"type":"string","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?$","description":"Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.","example":"04:00:00"}},"required":["schedule_for"],"example":{"schedule_for":"04:00:00"}},"V1UndoBody":{"type":"object","properties":{"name":{"type":"string","maxLength":20}},"required":["name"],"example":{"name":"before-upgrade"}},"V1ListEntitlementsResponse":{"type":"object","properties":{"entitlements":{"type":"array","items":{"type":"object","properties":{"feature":{"type":"object","properties":{"key":{"type":"string","enum":["instances.compute_update_available_sizes","instances.read_replicas","instances.disk_modifications","instances.high_availability","instances.orioledb","replication.etl","storage.max_file_size","storage.max_file_size.configurable","storage.image_transformations","storage.vector_buckets","storage.iceberg_catalog","storage.purge_cache","security.audit_logs_days","security.questionnaire","security.soc2_report","security.iso27001_certificate","security.private_link","security.enforce_mfa","log.retention_days","custom_domain","vanity_subdomain","ipv4","pitr.available_variants","log_drains","audit_log_drains","branching_limit","branching_persistent","auth.mfa_phone","auth.mfa_web_authn","auth.mfa_enhanced_security","auth.hooks","auth.platform.sso","auth.custom_jwt_template","auth.saml_2","auth.user_sessions","auth.leaked_password_protection","auth.advanced_auth_settings","auth.performance_settings","auth.password_hibp","auth.custom_oauth.max_providers","backup.retention_days","backup.restore_to_new_project","backup.schedule","function.max_count","function.size_limit_mb","realtime.max_concurrent_users","realtime.max_events_per_second","realtime.max_joins_per_second","realtime.max_channels_per_client","realtime.max_bytes_per_second","realtime.max_presence_events_per_second","realtime.max_payload_size_in_kb","project_scoped_roles","security.member_roles","project_pausing","project_cloning","project_restore_after_expiry","assistant.advance_model","integrations.github_connections","integrations.github_push_webhooks_limit","dedicated_pooler","observability.dashboard_advanced_metrics","api.members.invitations","api.members.roles"]},"type":{"type":"string","enum":["boolean","numeric","set"]}},"required":["key","type"]},"hasAccess":{"type":"boolean"},"type":{"type":"string","enum":["boolean","numeric","set"]},"config":{"anyOf":[{"type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"]},{"type":"object","properties":{"enabled":{"type":"boolean"},"value":{"type":"number"},"unlimited":{"type":"boolean"},"unit":{"type":"string"}},"required":["enabled","value","unlimited","unit"]},{"type":"object","properties":{"enabled":{"type":"boolean"},"set":{"type":"array","items":{"type":"string"}}},"required":["enabled","set"]}]}},"required":["feature","hasAccess","type","config"]}}},"required":["entitlements"]},"V1OrganizationMemberResponse":{"type":"object","properties":{"user_id":{"type":"string"},"user_name":{"type":"string"},"email":{"type":"string"},"role_name":{"type":"string"},"mfa_enabled":{"type":"boolean"},"avatar_url":{"type":"string","nullable":true}},"required":["user_id","user_name","role_name","mfa_enabled","avatar_url"]},"V1OrganizationSlugResponse":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"plan":{"type":"string","enum":["free","pro","team","enterprise","platform"]},"opt_in_tags":{"type":"array","items":{"enum":["AI_SQL_GENERATOR_OPT_IN","AI_DATA_GENERATOR_OPT_IN","AI_LOG_GENERATOR_OPT_IN"]}},"allowed_release_channels":{"type":"array","items":{"type":"string","enum":["internal","alpha","beta","ga","withdrawn","preview"]}}},"required":["id","name","opt_in_tags","allowed_release_channels"]},"OrganizationProjectClaimResponse":{"type":"object","properties":{"project":{"type":"object","properties":{"ref":{"type":"string"},"name":{"type":"string"}},"required":["ref","name"]},"preview":{"type":"object","properties":{"valid":{"type":"boolean"},"warnings":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"message":{"type":"string"}},"required":["key","message"]}},"errors":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"message":{"type":"string"}},"required":["key","message"]}},"info":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"message":{"type":"string"}},"required":["key","message"]}},"members_exceeding_free_project_limit":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"limit":{"type":"number"}},"required":["name","limit"]}},"source_subscription_plan":{"type":"string","enum":["free","pro","team","enterprise","platform"]},"target_subscription_plan":{"type":"string","enum":["free","pro","team","enterprise","platform",null],"nullable":true}},"required":["valid","warnings","errors","info","members_exceeding_free_project_limit","source_subscription_plan","target_subscription_plan"]},"expires_at":{"type":"string"},"created_at":{"type":"string"},"created_by":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["project","preview","expires_at","created_at","created_by"]},"OrganizationProjectsResponse":{"type":"object","properties":{"projects":{"type":"array","items":{"type":"object","properties":{"ref":{"type":"string"},"name":{"type":"string"},"cloud_provider":{"type":"string"},"region":{"type":"string"},"is_branch":{"type":"boolean"},"status":{"type":"string","enum":["INACTIVE","ACTIVE_HEALTHY","ACTIVE_UNHEALTHY","COMING_UP","UNKNOWN","GOING_DOWN","INIT_FAILED","REMOVED","RESTORING","UPGRADING","PAUSING","RESTORE_FAILED","RESTARTING","PAUSE_FAILED","RESIZING"]},"inserted_at":{"type":"string"},"databases":{"type":"array","items":{"type":"object","properties":{"infra_compute_size":{"type":"string","enum":["pico","nano","micro","small","medium","large","xlarge","2xlarge","4xlarge","8xlarge","12xlarge","16xlarge","24xlarge","24xlarge_optimized_memory","24xlarge_optimized_cpu","24xlarge_high_memory","48xlarge","48xlarge_optimized_memory","48xlarge_optimized_cpu","48xlarge_high_memory"]},"region":{"type":"string"},"status":{"type":"string","enum":["ACTIVE_HEALTHY","ACTIVE_UNHEALTHY","COMING_UP","GOING_DOWN","INIT_FAILED","REMOVED","RESTORING","UNKNOWN","INIT_READ_REPLICA","INIT_READ_REPLICA_FAILED","RESTARTING","RESIZING"]},"cloud_provider":{"type":"string"},"identifier":{"type":"string"},"type":{"type":"string","enum":["PRIMARY","READ_REPLICA"]},"disk_volume_size_gb":{"type":"number"},"disk_type":{"type":"string","enum":["gp3","io2"]},"disk_throughput_mbps":{"type":"number"},"disk_last_modified_at":{"type":"string"}},"required":["region","status","cloud_provider","identifier","type"]}}},"required":["ref","name","cloud_provider","region","is_branch","status","inserted_at","databases"]}},"pagination":{"type":"object","properties":{"count":{"type":"number","description":"Total number of projects. Use this to calculate the total number of pages."},"limit":{"type":"number","description":"Maximum number of projects per page"},"offset":{"type":"number","description":"Number of projects skipped in this response"}},"required":["count","limit","offset"]}},"required":["projects","pagination"]}}}} \ No newline at end of file diff --git a/provider-dev/openapi/.gitkeep b/provider-dev/openapi/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/provider.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/provider.yaml new file mode 100644 index 0000000..6f8277a --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/provider.yaml @@ -0,0 +1,138 @@ +id: supabase +name: supabase +version: v00.00.00000 +providerServices: + advisors: + id: advisors:v00.00.00000 + name: advisors + preferred: true + service: + $ref: supabase/v00.00.00000/services/advisors.yaml + title: advisors API + version: v00.00.00000 + description: Advisors related endpoints + analytics: + id: analytics:v00.00.00000 + name: analytics + preferred: true + service: + $ref: supabase/v00.00.00000/services/analytics.yaml + title: analytics API + version: v00.00.00000 + description: Analytics related endpoints + billing: + id: billing:v00.00.00000 + name: billing + preferred: true + service: + $ref: supabase/v00.00.00000/services/billing.yaml + title: billing API + version: v00.00.00000 + description: Billing related endpoints + branches: + id: branches:v00.00.00000 + name: branches + preferred: true + service: + $ref: supabase/v00.00.00000/services/branches.yaml + title: branches API + version: v00.00.00000 + description: supabase branches API + config: + id: config:v00.00.00000 + name: config + preferred: true + service: + $ref: supabase/v00.00.00000/services/config.yaml + title: config API + version: v00.00.00000 + description: supabase config API + database: + id: database:v00.00.00000 + name: database + preferred: true + service: + $ref: supabase/v00.00.00000/services/database.yaml + title: database API + version: v00.00.00000 + description: Database related endpoints + domains: + id: domains:v00.00.00000 + name: domains + preferred: true + service: + $ref: supabase/v00.00.00000/services/domains.yaml + title: domains API + version: v00.00.00000 + description: Domains related endpoints + functions: + id: functions:v00.00.00000 + name: functions + preferred: true + service: + $ref: supabase/v00.00.00000/services/functions.yaml + title: functions API + version: v00.00.00000 + description: supabase functions API + network: + id: network:v00.00.00000 + name: network + preferred: true + service: + $ref: supabase/v00.00.00000/services/network.yaml + title: network API + version: v00.00.00000 + description: supabase network API + organizations: + id: organizations:v00.00.00000 + name: organizations + preferred: true + service: + $ref: supabase/v00.00.00000/services/organizations.yaml + title: organizations API + version: v00.00.00000 + description: Organizations related endpoints + profile: + id: profile:v00.00.00000 + name: profile + preferred: true + service: + $ref: supabase/v00.00.00000/services/profile.yaml + title: profile API + version: v00.00.00000 + description: supabase profile API + projects: + id: projects:v00.00.00000 + name: projects + preferred: true + service: + $ref: supabase/v00.00.00000/services/projects.yaml + title: projects API + version: v00.00.00000 + description: Projects related endpoints + secrets: + id: secrets:v00.00.00000 + name: secrets + preferred: true + service: + $ref: supabase/v00.00.00000/services/secrets.yaml + title: secrets API + version: v00.00.00000 + description: Secrets related endpoints + storage: + id: storage:v00.00.00000 + name: storage + preferred: true + service: + $ref: supabase/v00.00.00000/services/storage.yaml + title: storage API + version: v00.00.00000 + description: >- + Visit + [https://supabase.github.io/storage/](https://supabase.github.io/storage/) + for complete documentation. +config: + auth: + type: bearer + credentialsenvvar: SUPABASE_ACCESS_TOKEN + snake_case_aliases: true diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/advisors.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/advisors.yaml new file mode 100644 index 0000000..ddc07b6 --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/advisors.yaml @@ -0,0 +1,249 @@ +openapi: 3.0.0 +info: + title: advisors API + description: Advisors related endpoints + version: 1.0.0 +paths: + /advisors/performance: + get: + deprecated: true + description: This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable. + operationId: v1-get-performance-advisors + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectAdvisorsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets project performance advisors. + tags: + - Advisors + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - advisors_read + x-oauth-scope: database:read + /advisors/security: + get: + deprecated: true + description: This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable. + operationId: v1-get-security-advisors + parameters: + - name: lint_type + required: false + in: query + schema: + example: sql + type: string + enum: + - sql + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectAdvisorsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets project security advisors. + tags: + - Advisors + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - advisors_read + x-oauth-scope: database:read +components: + schemas: + V1ProjectAdvisorsResponse: + type: object + properties: + lints: + type: array + items: + type: object + properties: + name: + enum: + - unindexed_foreign_keys + - auth_users_exposed + - auth_rls_initplan + - no_primary_key + - unused_index + - multiple_permissive_policies + - policy_exists_rls_disabled + - rls_enabled_no_policy + - duplicate_index + - security_definer_view + - function_search_path_mutable + - rls_disabled_in_public + - extension_in_public + - rls_references_user_metadata + - materialized_view_in_api + - foreign_table_in_api + - unsupported_reg_types + - auth_otp_long_expiry + - auth_otp_short_length + - ssl_not_enforced + - log_connections_not_enabled + - network_restrictions_not_set + - password_requirements_min_length + - pitr_not_enabled + - auth_leaked_password_protection + - auth_insufficient_mfa_options + - auth_password_policy_missing + - leaked_service_key + - no_backup_admin + - vulnerable_postgres_version + - db_not_reachable + - db_connection_failing + - db_connection_limit_reached + - instance_telemetry_lost + - instance_db_down + - instance_alert_firing + - log_service_error_rate_high + - project_not_active + - advisor_check_unavailable + type: string + title: + type: string + level: + type: string + enum: + - ERROR + - WARN + - INFO + facing: + type: string + enum: + - EXTERNAL + categories: + type: array + items: + type: string + enum: + - PERFORMANCE + - SECURITY + - HEALTH + x-ignore-array-items-must-be-objects: true + description: + type: string + detail: + type: string + remediation: + type: string + metadata: + type: object + properties: + schema: + type: string + name: + type: string + entity: + type: string + type: + enum: + - table + - view + - materialized view + - foreign table + - auth + - function + - extension + - compliance + - health + type: string + fkey_name: + type: string + fkey_columns: + x-ignore-array-items-must-be-objects: true + type: array + items: + type: number + cache_key: + type: string + observed_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + required: + - name + - title + - level + - facing + - categories + - description + - detail + - remediation + - cache_key + additionalProperties: {} + required: + - lints + x-stackQL-resources: + performance_lints: + id: supabase.advisors.performance_lints + name: performance_lints + title: Performance Lints + methods: + list: + operation: + $ref: '#/paths/~1advisors~1performance/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.lints + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/performance_lints/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + security_lints: + id: supabase.advisors.security_lints + name: security_lints + title: Security Lints + methods: + list: + operation: + $ref: '#/paths/~1advisors~1security/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.lints + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/security_lints/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/analytics.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/analytics.yaml new file mode 100644 index 0000000..c88b9be --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/analytics.yaml @@ -0,0 +1,537 @@ +openapi: 3.0.0 +info: + title: analytics API + description: Analytics related endpoints + version: 1.0.0 +paths: + /analytics/endpoints/logs.all: + get: + deprecated: true + description: | + Executes a SQL query on the project's logs. + + Either the `iso_timestamp_start` and `iso_timestamp_end` parameters must be provided. + If both are not provided, only the last 1 minute of logs will be queried. + The timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown. + + Note: Unless the `sql` parameter is provided, only edge_logs will be queried. See the [log query docs](https://supabase.com/docs/guides/monitoring-and-debugging/logs#logs-explorer) for all available sources. + operationId: v1-get-project-logs-all + parameters: + - name: sql + required: false + in: query + description: Custom SQL query to execute on the logs. See [querying logs](https://supabase.com/docs/guides/monitoring-and-debugging/logs#querying-with-the-logs-explorer) for more details. + schema: + example: select event_message from edge_logs limit 10 + type: string + - name: iso_timestamp_start + required: false + in: query + schema: + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + example: '2025-03-01T00:00:00Z' + type: string + - name: iso_timestamp_end + required: false + in: query + schema: + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + example: '2025-03-01T23:59:59Z' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyticsResponse' + '401': + description: Unauthorized + '402': + description: Usage exceeded. Enable additional usage to continue querying + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets project's logs + tags: + - Analytics + x-badges: + - name: 'OAuth scope: analytics:read' + position: after + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_logs_read + x-oauth-scope: analytics:read + /analytics/endpoints/logs: + get: + deprecated: false + description: | + Executes an SQL or LQL query on the project's unified logs stream. + + Either the `iso_timestamp_start` and `iso_timestamp_end` parameters must be provided. + If both are not provided, only the last 1 minute of logs will be queried. + The timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown. + + Filter by the `source` column to specify specific log sources, such as edge_logs, postgres_logs, etc. + + Note: SQL must be written in **ClickHouse SQL dialect**. + operationId: v1-get-project-logs + parameters: + - name: sql + required: false + in: query + description: Custom SQL query to execute on the logs. See [querying logs](https://supabase.com/docs/guides/monitoring-and-debugging/logs#querying-with-the-logs-explorer) for more details. + schema: + example: select event_message from edge_logs limit 10 + type: string + - name: iso_timestamp_start + required: false + in: query + schema: + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + example: '2025-03-01T00:00:00Z' + type: string + - name: iso_timestamp_end + required: false + in: query + schema: + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + example: '2025-03-01T23:59:59Z' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyticsResponse' + '401': + description: Unauthorized + '402': + description: Usage exceeded. Enable additional usage to continue querying + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets all project's logs in a single log stream + tags: + - Analytics + x-badges: + - name: 'OAuth scope: analytics:read' + position: after + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_logs_read + x-oauth-scope: analytics:read + /analytics/endpoints/usage.api-counts: + get: + operationId: v1-get-project-usage-api-count + parameters: + - name: interval + required: false + in: query + schema: + example: 1day + type: string + enum: + - 15min + - 30min + - 1hr + - 3hr + - 1day + - 3day + - 7day + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1GetUsageApiCountResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project's usage api counts + security: + - bearer: [] + summary: Gets project's usage api counts + tags: + - Analytics + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_usage_read + /analytics/endpoints/usage.api-requests-count: + get: + operationId: v1-get-project-usage-request-count + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1GetUsageApiRequestsCountResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project's usage api requests count + security: + - bearer: [] + summary: Gets project's usage api requests count + tags: + - Analytics + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_usage_read + /analytics/endpoints/functions.combined-stats: + get: + operationId: v1-get-project-function-combined-stats + parameters: + - name: interval + required: true + in: query + schema: + example: 1hr + type: string + enum: + - 15min + - 1hr + - 3hr + - 1day + - name: function_id + required: true + in: query + schema: + example: 3c078cce-ad70-4148-9f37-4da362789053 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyticsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project's function combined statistics + security: + - bearer: [] + summary: Gets a project's function combined statistics + tags: + - Analytics + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_usage_read + /analytics/endpoints/metrics: + get: + description: Prometheus scrape endpoint. Returns metrics of a customer project in the Prometheus open exposition format. + operationId: v1-scrape-project-metrics + parameters: [] + responses: + '200': + description: Prometheus / OpenMetrics text exposition + content: + text/plain: + schema: + type: string + application/openmetrics-text: + schema: + type: string + '400': + description: Project must be active and healthy, or metrics are not available for this project + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to fetch project's metrics + security: + - bearer: [] + summary: Scrape a project's metrics + tags: + - Analytics + x-badges: + - name: 'OAuth scope: analytics:read' + position: after + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_logs_read + x-oauth-scope: analytics:read +components: + schemas: + AnalyticsResponse: + type: object + properties: + result: + type: array + items: {} + error: + type: string + properties: + code: + type: number + errors: + type: array + items: + type: object + properties: + domain: + type: string + location: + type: string + locationType: + type: string + message: + type: string + reason: + type: string + required: + - domain + - location + - locationType + - message + - reason + message: + type: string + status: + type: string + required: + - code + - errors + - message + - status + V1GetUsageApiCountResponse: + type: object + properties: + result: + type: array + items: + type: object + properties: + timestamp: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|))$ + total_auth_requests: + type: number + total_realtime_requests: + type: number + total_rest_requests: + type: number + total_storage_requests: + type: number + required: + - timestamp + - total_auth_requests + - total_realtime_requests + - total_rest_requests + - total_storage_requests + error: + type: string + properties: + code: + type: number + errors: + type: array + items: + type: object + properties: + domain: + type: string + location: + type: string + locationType: + type: string + message: + type: string + reason: + type: string + required: + - domain + - location + - locationType + - message + - reason + message: + type: string + status: + type: string + required: + - code + - errors + - message + - status + V1GetUsageApiRequestsCountResponse: + type: object + properties: + result: + type: array + items: + type: object + properties: + count: + type: number + required: + - count + error: + type: string + properties: + code: + type: number + errors: + type: array + items: + type: object + properties: + domain: + type: string + location: + type: string + locationType: + type: string + message: + type: string + reason: + type: string + required: + - domain + - location + - locationType + - message + - reason + message: + type: string + status: + type: string + required: + - code + - errors + - message + - status + x-stackQL-resources: + all_logs: + id: supabase.analytics.all_logs + name: all_logs + title: All Logs + methods: + get: + operation: + $ref: '#/paths/~1analytics~1endpoints~1logs.all/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/all_logs/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + logs: + id: supabase.analytics.logs + name: logs + title: Logs + methods: + get: + operation: + $ref: '#/paths/~1analytics~1endpoints~1logs/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/logs/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + api_counts: + id: supabase.analytics.api_counts + name: api_counts + title: Api Counts + methods: + get: + operation: + $ref: '#/paths/~1analytics~1endpoints~1usage.api-counts/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/api_counts/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + api_request_counts: + id: supabase.analytics.api_request_counts + name: api_request_counts + title: Api Request Counts + methods: + get: + operation: + $ref: '#/paths/~1analytics~1endpoints~1usage.api-requests-count/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/api_request_counts/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + function_stats: + id: supabase.analytics.function_stats + name: function_stats + title: Function Stats + methods: + get: + operation: + $ref: '#/paths/~1analytics~1endpoints~1functions.combined-stats/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/function_stats/methods/get' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/billing.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/billing.yaml new file mode 100644 index 0000000..4b6d6c5 --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/billing.yaml @@ -0,0 +1,430 @@ +openapi: 3.0.0 +info: + title: billing API + description: Billing related endpoints + version: 1.0.0 +paths: + /billing/addons: + get: + description: Returns the billing addons that are currently applied, including the active compute instance size, and lists every addon option that can be provisioned with pricing metadata. + operationId: v1-list-project-addons + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListProjectAddonsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list project addons + security: + - bearer: [] + summary: List billing addons and compute instance selections + tags: + - Billing + x-endpoint-owners: + - billing + x-fga-permissions: + - - infra_add_ons_read + patch: + description: Selects an addon variant, for example scaling the project’s compute instance up or down, and applies it to the project. + operationId: v1-apply-project-addon + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ApplyProjectAddonBody' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to apply project addon + security: + - bearer: [] + summary: Apply or update billing addons, including compute instance size + tags: + - Billing + x-endpoint-owners: + - billing + x-fga-permissions: + - - infra_add_ons_write + /billing/addons/{addon_variant}: + delete: + description: Disables the selected addon variant, including rolling the compute instance back to its previous size. + operationId: v1-remove-project-addon + parameters: + - name: addon_variant + required: true + in: path + schema: + example: pitr_7 + anyOf: + - type: string + enum: + - ci_micro + - ci_small + - ci_medium + - ci_large + - ci_xlarge + - ci_2xlarge + - ci_4xlarge + - ci_8xlarge + - ci_12xlarge + - ci_16xlarge + - ci_24xlarge + - ci_24xlarge_optimized_cpu + - ci_24xlarge_optimized_memory + - ci_24xlarge_high_memory + - ci_48xlarge + - ci_48xlarge_optimized_cpu + - ci_48xlarge_optimized_memory + - ci_48xlarge_high_memory + - type: string + enum: + - cd_default + - type: string + enum: + - pitr_7 + - pitr_14 + - pitr_28 + - type: string + enum: + - ipv4_default + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to remove project addon + security: + - bearer: [] + summary: Remove billing addons or revert compute instance sizing + tags: + - Billing + x-endpoint-owners: + - billing + x-fga-permissions: + - - infra_add_ons_write +components: + schemas: + ListProjectAddonsResponse: + type: object + properties: + selected_addons: + type: array + items: + type: object + properties: + type: + type: string + enum: + - custom_domain + - compute_instance + - pitr + - ipv4 + - auth_mfa_phone + - auth_mfa_web_authn + - log_drain + - etl_pipeline + variant: + type: object + properties: + id: + anyOf: + - type: string + enum: + - ci_micro + - ci_small + - ci_medium + - ci_large + - ci_xlarge + - ci_2xlarge + - ci_4xlarge + - ci_8xlarge + - ci_12xlarge + - ci_16xlarge + - ci_24xlarge + - ci_24xlarge_optimized_cpu + - ci_24xlarge_optimized_memory + - ci_24xlarge_high_memory + - ci_48xlarge + - ci_48xlarge_optimized_cpu + - ci_48xlarge_optimized_memory + - ci_48xlarge_high_memory + - type: string + enum: + - cd_default + - type: string + enum: + - pitr_7 + - pitr_14 + - pitr_28 + - type: string + enum: + - ipv4_default + - type: string + enum: + - auth_mfa_phone_default + - type: string + enum: + - auth_mfa_web_authn_default + - type: string + enum: + - log_drain_default + - type: string + enum: + - etl_pipeline_default + name: + type: string + price: + type: object + properties: + description: + type: string + type: + type: string + enum: + - fixed + - usage + interval: + type: string + enum: + - monthly + - hourly + amount: + type: number + required: + - description + - type + - interval + - amount + meta: + $ref: '#/components/schemas/ListProjectAddonsResponseJsonValue' + required: + - id + - name + - price + required: + - type + - variant + available_addons: + type: array + items: + type: object + properties: + type: + type: string + enum: + - custom_domain + - compute_instance + - pitr + - ipv4 + - auth_mfa_phone + - auth_mfa_web_authn + - log_drain + - etl_pipeline + name: + type: string + variants: + type: array + items: + type: object + properties: + id: + anyOf: + - type: string + enum: + - ci_micro + - ci_small + - ci_medium + - ci_large + - ci_xlarge + - ci_2xlarge + - ci_4xlarge + - ci_8xlarge + - ci_12xlarge + - ci_16xlarge + - ci_24xlarge + - ci_24xlarge_optimized_cpu + - ci_24xlarge_optimized_memory + - ci_24xlarge_high_memory + - ci_48xlarge + - ci_48xlarge_optimized_cpu + - ci_48xlarge_optimized_memory + - ci_48xlarge_high_memory + - type: string + enum: + - cd_default + - type: string + enum: + - pitr_7 + - pitr_14 + - pitr_28 + - type: string + enum: + - ipv4_default + - type: string + enum: + - auth_mfa_phone_default + - type: string + enum: + - auth_mfa_web_authn_default + - type: string + enum: + - log_drain_default + - type: string + enum: + - etl_pipeline_default + name: + type: string + price: + type: object + properties: + description: + type: string + type: + type: string + enum: + - fixed + - usage + interval: + type: string + enum: + - monthly + - hourly + amount: + type: number + required: + - description + - type + - interval + - amount + meta: + $ref: '#/components/schemas/ListProjectAddonsResponseJsonValue' + required: + - id + - name + - price + required: + - type + - name + - variants + required: + - selected_addons + - available_addons + ApplyProjectAddonBody: + type: object + properties: + addon_variant: + type: string + enum: + - ci_micro + - ci_small + - ci_medium + - ci_large + - ci_xlarge + - ci_2xlarge + - ci_4xlarge + - ci_8xlarge + - ci_12xlarge + - ci_16xlarge + - ci_24xlarge + - ci_24xlarge_optimized_cpu + - ci_24xlarge_optimized_memory + - ci_24xlarge_high_memory + - ci_48xlarge + - ci_48xlarge_optimized_cpu + - ci_48xlarge_optimized_memory + - ci_48xlarge_high_memory + addon_type: + type: string + enum: + - custom_domain + - compute_instance + - pitr + - ipv4 + - auth_mfa_phone + - auth_mfa_web_authn + - log_drain + - etl_pipeline + required: + - addon_variant + - addon_type + example: + addon_variant: pitr_7 + addon_type: pitr + ListProjectAddonsResponseJsonValue: + description: Any JSON-serializable value + anyOf: + - type: string + - type: number + - type: boolean + nullable: true + type: array + items: + $ref: '#/components/schemas/ListProjectAddonsResponseJsonValue' + additionalProperties: + $ref: '#/components/schemas/ListProjectAddonsResponseJsonValue' + x-stackQL-resources: + addons: + id: supabase.billing.addons + name: addons + title: Addons + methods: + list: + operation: + $ref: '#/paths/~1billing~1addons/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.selected_addons + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1billing~1addons/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1billing~1addons~1{addon_variant}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/addons/methods/list' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/addons/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/addons/methods/delete' + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/branches.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/branches.yaml new file mode 100644 index 0000000..248cdec --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/branches.yaml @@ -0,0 +1,1501 @@ +openapi: 3.0.0 +info: + title: branches API + description: supabase branches API + version: 1.0.0 +paths: + /v1/branches/{branch_id_or_ref}: + get: + description: Fetches configurations of the specified database branch + operationId: v1-get-a-branch-config + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchDetailResponse' + '500': + description: Failed to retrieve database branch + security: + - bearer: [] + summary: Get database branch config + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_read + - - branching_production_read + x-oauth-scope: environment:read + patch: + description: Updates the configuration of the specified database branch + operationId: v1-update-a-branch-config + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateBranchBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchResponse' + '500': + description: Failed to update database branch + security: + - bearer: [] + summary: Update database branch config + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + delete: + description: Deletes the specified database branch. By default, deletes immediately. Use force=false to schedule deletion with 1-hour grace period (only when soft deletion is enabled). + operationId: v1-delete-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + - name: force + required: false + in: query + description: If set to false, schedule deletion with 1-hour grace period (only when soft deletion is enabled). + schema: + example: false + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchDeleteResponse' + '500': + description: Failed to delete database branch + security: + - bearer: [] + summary: Delete a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_delete + - - branching_production_delete + x-oauth-scope: environment:write + servers: + - url: https://api.supabase.com + /v1/branches/{branch_id_or_ref}/push: + post: + description: Pushes the specified database branch + operationId: v1-push-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BranchActionBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchUpdateResponse' + '500': + description: Failed to push database branch + security: + - bearer: [] + summary: Pushes a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + servers: + - url: https://api.supabase.com + /v1/branches/{branch_id_or_ref}/merge: + post: + description: Merges the specified database branch + operationId: v1-merge-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BranchActionBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchUpdateResponse' + '500': + description: Failed to merge database branch + security: + - bearer: [] + summary: Merges a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + servers: + - url: https://api.supabase.com + /v1/branches/{branch_id_or_ref}/reset: + post: + description: Resets the specified database branch + operationId: v1-reset-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BranchActionBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchUpdateResponse' + '500': + description: Failed to reset database branch + security: + - bearer: [] + summary: Resets a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + servers: + - url: https://api.supabase.com + /v1/branches/{branch_id_or_ref}/restore: + post: + description: Cancels scheduled deletion and restores the branch to active state + operationId: v1-restore-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchRestoreResponse' + '500': + description: Failed to restore database branch + security: + - bearer: [] + summary: Restore a scheduled branch deletion + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + servers: + - url: https://api.supabase.com + /v1/branches/{branch_id_or_ref}/diff: + get: + description: Diffs the specified database branch + operationId: v1-diff-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + - name: included_schemas + required: false + in: query + schema: + example: public,auth + type: string + - name: pgdelta + required: false + in: query + description: |- + Use pg-delta instead of Migra for diffing when true. + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + responses: + '200': + content: + text/plain: + schema: + type: string + description: '' + '500': + description: Failed to diff database branch + security: + - bearer: [] + summary: '[Beta] Diffs a database branch' + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + servers: + - url: https://api.supabase.com + /actions: + head: + description: Returns the total number of action runs of the specified project. + operationId: v1-count-action-runs + parameters: + - name: ref + required: true + in: path + description: Project ref + schema: + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + example: abcdefghijklmnopqrst + type: string + responses: + '200': + headers: + X-Total-Count: + schema: + type: integer + format: int64 + minimum: 0 + description: total count value + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to count action runs + security: + - bearer: [] + summary: Count the number of action runs + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-fga-permissions: + - - action_runs_read + x-oauth-scope: environment:read + get: + description: Returns a paginated list of action runs of the specified project. + operationId: v1-list-action-runs + parameters: + - name: offset + required: false + in: query + schema: + minimum: 0 + example: 0 + type: number + - name: limit + required: false + in: query + schema: + minimum: 10 + example: 20 + type: number + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-action-runsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list action runs + security: + - bearer: [] + summary: List all action runs + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - action_runs_read + x-oauth-scope: environment:read + /actions/{run_id}: + get: + description: Returns the current status of the specified action run. + operationId: v1-get-action-run + parameters: + - name: run_id + required: true + in: path + description: Action Run ID + schema: + example: run_01hq3q9m7y5q7e4a7x2c8m1p4n + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ActionRunResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get action run status + security: + - bearer: [] + summary: Get the status of an action run + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - action_runs_read + x-oauth-scope: environment:read + /actions/{run_id}/status: + patch: + description: Updates the status of an ongoing action run. + operationId: v1-update-action-run-status + parameters: + - name: run_id + required: true + in: path + description: Action Run ID + schema: + example: run_01hq3q9m7y5q7e4a7x2c8m1p4n + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateRunStatusBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateRunStatusResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update action run status + security: + - bearer: [] + summary: Update the status of an action run + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - action_runs_write + x-oauth-scope: environment:write + /actions/{run_id}/logs: + get: + description: Returns the logs from the specified action run. + operationId: v1-get-action-run-logs + parameters: + - name: run_id + required: true + in: path + description: Action Run ID + schema: + example: run_01hq3q9m7y5q7e4a7x2c8m1p4n + type: string + responses: + '200': + content: + text/plain: + schema: + type: string + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get action run logs + security: + - bearer: [] + summary: Get the logs of an action run + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - action_runs_read + x-oauth-scope: environment:read + /branches: + get: + description: Returns all database branches of the specified project. + operationId: v1-list-all-branches + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-branchesResponse' + '500': + description: Failed to retrieve database branches + security: + - bearer: [] + summary: List all database branches + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_read + - - branching_production_read + x-oauth-scope: environment:read + post: + description: Creates a database branch from the specified project. + operationId: v1-create-a-branch + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateBranchBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchResponse' + '500': + description: Failed to create database branch + security: + - bearer: [] + summary: Create a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_create + - - branching_production_create + x-oauth-scope: environment:write + delete: + description: Disables preview branching for the specified project + operationId: v1-disable-preview-branching + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to disable preview branching + security: + - bearer: [] + summary: Disables preview branching + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_production_delete + x-oauth-scope: environment:write + /branches/{name}: + get: + description: Fetches the specified database branch by its name. + operationId: v1-get-a-branch + parameters: + - name: name + required: true + in: path + schema: + example: preview-login-page + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchResponse' + '500': + description: Failed to fetch database branch + security: + - bearer: [] + summary: Get a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_read + - - branching_production_read + x-oauth-scope: environment:read +components: + schemas: + BranchDetailResponse: + type: object + properties: + ref: + type: string + postgres_version: + type: string + postgres_engine: + type: string + release_channel: + type: string + status: + type: string + enum: + - INACTIVE + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - UNKNOWN + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UPGRADING + - PAUSING + - RESTORE_FAILED + - RESTARTING + - PAUSE_FAILED + - RESIZING + db_host: + type: string + db_port: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + db_user: + type: string + db_pass: + type: string + jwt_secret: + type: string + required: + - ref + - postgres_version + - postgres_engine + - release_channel + - status + - db_host + - db_port + UpdateBranchBody: + type: object + properties: + branch_name: + type: string + git_branch: + type: string + reset_on_push: + description: This field is deprecated and will be ignored. Use v1-reset-a-branch endpoint directly instead. + deprecated: true + type: boolean + persistent: + type: boolean + status: + type: string + enum: + - CREATING_PROJECT + - RUNNING_MIGRATIONS + - MIGRATIONS_PASSED + - MIGRATIONS_FAILED + - FUNCTIONS_DEPLOYED + - FUNCTIONS_FAILED + request_review: + type: boolean + notify_url: + type: string + format: uri + description: HTTP endpoint to receive branch status updates. + example: + branch_name: preview-login-page + git_branch: feature/login-page + persistent: true + request_review: true + notify_url: https://example.com/webhooks/branches + BranchResponse: + type: object + properties: + id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + name: + type: string + project_ref: + type: string + parent_project_ref: + type: string + is_default: + type: boolean + git_branch: + type: string + pr_number: + type: integer + format: int32 + minimum: -9007199254740991 + maximum: 9007199254740991 + latest_check_run_id: + description: This field is deprecated and will not be populated. + deprecated: true + type: number + persistent: + type: boolean + status: + type: string + enum: + - CREATING_PROJECT + - RUNNING_MIGRATIONS + - MIGRATIONS_PASSED + - MIGRATIONS_FAILED + - FUNCTIONS_DEPLOYED + - FUNCTIONS_FAILED + description: This field is deprecated. List action runs to get branch status instead. + deprecated: true + created_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + review_requested_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + with_data: + type: boolean + notify_url: + type: string + format: uri + deletion_scheduled_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + preview_project_status: + type: string + enum: + - INACTIVE + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - UNKNOWN + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UPGRADING + - PAUSING + - RESTORE_FAILED + - RESTARTING + - PAUSE_FAILED + - RESIZING + required: + - id + - name + - project_ref + - parent_project_ref + - is_default + - persistent + - status + - created_at + - updated_at + - with_data + BranchDeleteResponse: + type: object + properties: + message: + type: string + enum: + - ok + required: + - message + BranchActionBody: + type: object + properties: + migration_version: + type: string + example: + migration_version: '20250312000000' + BranchUpdateResponse: + type: object + properties: + workflow_run_id: + type: string + message: + type: string + enum: + - ok + required: + - workflow_run_id + - message + BranchRestoreResponse: + type: object + properties: + message: + type: string + enum: + - Branch restoration initiated + required: + - message + ListActionRunResponse: + type: array + items: + type: object + properties: + id: + type: string + branch_id: + type: string + run_steps: + type: array + items: + type: object + properties: + name: + type: string + enum: + - clone + - pull + - health + - configure + - migrate + - seed + - deploy + status: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + created_at: + type: string + updated_at: + type: string + required: + - name + - status + - created_at + - updated_at + git_config: + nullable: true + workdir: + type: string + nullable: true + check_run_id: + type: number + nullable: true + created_at: + type: string + updated_at: + type: string + required: + - id + - branch_id + - run_steps + - workdir + - check_run_id + - created_at + - updated_at + ActionRunResponse: + type: object + properties: + id: + type: string + branch_id: + type: string + run_steps: + type: array + items: + type: object + properties: + name: + type: string + enum: + - clone + - pull + - health + - configure + - migrate + - seed + - deploy + status: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + created_at: + type: string + updated_at: + type: string + required: + - name + - status + - created_at + - updated_at + git_config: + nullable: true + workdir: + type: string + nullable: true + check_run_id: + type: number + nullable: true + created_at: + type: string + updated_at: + type: string + required: + - id + - branch_id + - run_steps + - workdir + - check_run_id + - created_at + - updated_at + UpdateRunStatusBody: + type: object + properties: + clone: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + pull: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + health: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + configure: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + migrate: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + seed: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + deploy: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + example: + clone: RUNNING + configure: RUNNING + migrate: RUNNING + deploy: CREATED + UpdateRunStatusResponse: + type: object + properties: + message: + type: string + enum: + - ok + required: + - message + CreateBranchBody: + type: object + properties: + branch_name: + type: string + minLength: 1 + git_branch: + type: string + is_default: + type: boolean + persistent: + type: boolean + region: + type: string + desired_instance_size: + type: string + enum: + - pico + - nano + - micro + - small + - medium + - large + - xlarge + - 2xlarge + - 4xlarge + - 8xlarge + - 12xlarge + - 16xlarge + - 24xlarge + - 24xlarge_optimized_memory + - 24xlarge_optimized_cpu + - 24xlarge_high_memory + - 48xlarge + - 48xlarge_optimized_memory + - 48xlarge_optimized_cpu + - 48xlarge_high_memory + release_channel: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + description: Release channel. If not provided, GA will be used. + postgres_engine: + type: string + enum: + - '15' + - '17' + - 17-oriole + description: Postgres engine version. If not provided, the latest version will be used. + secrets: + type: object + additionalProperties: + type: string + with_data: + type: boolean + notify_url: + type: string + format: uri + description: HTTP endpoint to receive branch status updates. + required: + - branch_name + example: + branch_name: preview-login-page + git_branch: feature/login-page + persistent: true + with_data: false + notify_url: https://example.com/webhooks/branches + V1-list-action-runsResponse: + type: object + properties: + v1_list_action_runs: + type: array + items: + type: object + properties: + id: + type: string + branch_id: + type: string + run_steps: + type: array + items: + type: object + properties: + name: + type: string + enum: + - clone + - pull + - health + - configure + - migrate + - seed + - deploy + status: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + created_at: + type: string + updated_at: + type: string + required: + - name + - status + - created_at + - updated_at + git_config: + nullable: true + workdir: + type: string + nullable: true + check_run_id: + type: number + nullable: true + created_at: + type: string + updated_at: + type: string + required: + - id + - branch_id + - run_steps + - workdir + - check_run_id + - created_at + - updated_at + V1-list-all-branchesResponse: + type: object + properties: + v1_list_all_branches: + type: array + items: + $ref: '#/components/schemas/BranchResponse' + x-stackQL-resources: + branch_configs: + id: supabase.branches.branch_configs + name: branch_configs + title: Branch Configs + methods: + get: + operation: + $ref: '#/paths/~1v1~1branches~1{branch_id_or_ref}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/branch_configs/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + branches: + id: supabase.branches.branches + name: branches + title: Branches + methods: + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1branches~1{branch_id_or_ref}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1v1~1branches~1{branch_id_or_ref}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + push: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1branches~1{branch_id_or_ref}~1push/post' + response: + mediaType: application/json + openAPIDocKey: '201' + merge: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1branches~1{branch_id_or_ref}~1merge/post' + response: + mediaType: application/json + openAPIDocKey: '201' + reset: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1branches~1{branch_id_or_ref}~1reset/post' + response: + mediaType: application/json + openAPIDocKey: '201' + restore: + operation: + $ref: '#/paths/~1v1~1branches~1{branch_id_or_ref}~1restore/post' + response: + mediaType: application/json + openAPIDocKey: '200' + list: + operation: + $ref: '#/paths/~1branches/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_list_all_branches + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-list-all-branchesResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_list_all_branches\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1branches/post' + response: + mediaType: application/json + openAPIDocKey: '201' + disable_branching: + operation: + $ref: '#/paths/~1branches/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + get: + operation: + $ref: '#/paths/~1branches~1{name}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/branches/methods/get' + - $ref: '#/components/x-stackQL-resources/branches/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/branches/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/branches/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/branches/methods/delete' + replace: [] + action_runs: + id: supabase.branches.action_runs + name: action_runs + title: Action Runs + methods: + list: + operation: + $ref: '#/paths/~1actions/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_list_action_runs + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-list-action-runsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_list_action_runs\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + get: + operation: + $ref: '#/paths/~1actions~1{run_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update_status: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1actions~1{run_id}~1status/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/action_runs/methods/get' + - $ref: '#/components/x-stackQL-resources/action_runs/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/config.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/config.yaml new file mode 100644 index 0000000..91f2c22 --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/config.yaml @@ -0,0 +1,4926 @@ +openapi: 3.0.0 +info: + title: config API + description: supabase config API + version: 1.0.0 +paths: + /pgsodium: + get: + operationId: v1-get-pgsodium-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PgsodiumConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's pgsodium config + security: + - bearer: [] + summary: '[Beta] Gets project''s pgsodium config' + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - project_admin_write + x-oauth-scope: secrets:read + put: + operationId: v1-update-pgsodium-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdatePgsodiumConfigBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PgsodiumConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's pgsodium config + security: + - bearer: [] + summary: '[Beta] Updates project''s pgsodium config. Updating the root_key can cause all data encrypted with the older key to become inaccessible.' + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - project_admin_write + x-oauth-scope: secrets:write + /postgrest: + get: + operationId: v1-get-postgrest-service-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PostgrestConfigWithJWTSecretResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's postgrest config + security: + - bearer: [] + summary: Gets project's postgrest config + tags: + - Rest + x-badges: + - name: 'OAuth scope: rest:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - data_api_config_read + x-oauth-scope: rest:read + patch: + operationId: v1-update-postgrest-service-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdatePostgrestConfigBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1PostgrestConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's postgrest config + security: + - bearer: [] + summary: Updates project's postgrest config + tags: + - Rest + x-badges: + - name: 'OAuth scope: rest:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - data_api_config_write + x-oauth-scope: rest:write + /ssl-enforcement: + get: + operationId: v1-get-ssl-enforcement-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SslEnforcementResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's SSL enforcement config + security: + - bearer: [] + summary: '[Beta] Get project''s SSL enforcement configuration.' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_ssl_config_read + x-oauth-scope: database:read + put: + operationId: v1-update-ssl-enforcement-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SslEnforcementRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SslEnforcementResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's SSL enforcement configuration. + security: + - bearer: [] + summary: '[Beta] Update project''s SSL enforcement configuration.' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_ssl_config_write + x-oauth-scope: database:write + /config/auth/signing-keys/legacy: + post: + operationId: v1-create-legacy-signing-key + parameters: [] + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Set up the project's existing JWT secret as an in_use JWT signing key. This endpoint will be removed in the future always check for HTTP 404 Not Found. + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_write + x-oauth-scope: secrets:write + get: + operationId: v1-get-legacy-signing-key + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get the signing key information for the JWT secret imported as signing key for this project. This endpoint will be removed in the future, check for HTTP 404 Not Found. + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_read + x-oauth-scope: secrets:read + /config/auth/signing-keys: + post: + operationId: v1-create-project-signing-key + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateSigningKeyBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Create a new signing key for the project in standby status + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_write + x-oauth-scope: secrets:write + get: + operationId: v1-get-project-signing-keys + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeysResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: List all signing keys for the project + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_read + x-oauth-scope: secrets:read + /config/auth/signing-keys/{id}: + get: + operationId: v1-get-project-signing-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 33333333-3333-4333-8333-333333333333 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get information about a signing key + tags: + - Auth + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_read + delete: + operationId: v1-remove-project-signing-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 33333333-3333-4333-8333-333333333333 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Remove a signing key from a project. Only possible if the key has been in revoked status for a while. + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_write + x-oauth-scope: secrets:write + patch: + operationId: v1-update-project-signing-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 33333333-3333-4333-8333-333333333333 + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateSigningKeyBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Update a signing key, mainly its status + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_write + x-oauth-scope: secrets:write + /config/auth: + get: + operationId: v1-get-auth-service-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AuthConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's auth config + security: + - bearer: [] + summary: Gets project's auth config + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_read + x-oauth-scope: auth:read + patch: + operationId: v1-update-auth-service-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateAuthConfigBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AuthConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's auth config + security: + - bearer: [] + summary: Updates a project's auth config + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + - project_admin_write + x-oauth-scope: auth:write + /config/auth/third-party-auth: + post: + operationId: v1-create-project-tpa-integration + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateThirdPartyAuthBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ThirdPartyAuth' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Creates a new third-party auth integration + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + x-oauth-scope: auth:write + get: + operationId: v1-list-project-tpa-integrations + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-project-tpa-integrationsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Lists all third-party auth integrations + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_read + x-oauth-scope: auth:read + /config/auth/third-party-auth/{tpa_id}: + delete: + operationId: v1-delete-project-tpa-integration + parameters: + - name: tpa_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 88888888-8888-4888-8888-888888888888 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ThirdPartyAuth' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Removes a third-party auth integration + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + x-oauth-scope: auth:write + get: + operationId: v1-get-project-tpa-integration + parameters: + - name: tpa_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 88888888-8888-4888-8888-888888888888 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ThirdPartyAuth' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get a third-party integration + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_read + x-oauth-scope: auth:read + /config/storage: + get: + operationId: v1-get-storage-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/StorageConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's storage config + security: + - bearer: [] + summary: Gets project's storage config + tags: + - Storage + x-endpoint-owners: + - storage + x-fga-permissions: + - - storage_config_read + patch: + operationId: v1-update-storage-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateStorageConfigBody' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's storage config + security: + - bearer: [] + summary: Updates project's storage config + tags: + - Storage + x-endpoint-owners: + - storage + x-fga-permissions: + - - storage_config_write + /config/database/pgbouncer: + get: + operationId: v1-get-project-pgbouncer-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1PgbouncerConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's pgbouncer config + summary: Get project's pgbouncer config + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_read + x-oauth-scope: database:read + /config/database/pooler: + get: + operationId: v1-get-pooler-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-get-pooler-configResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's supavisor config + security: + - bearer: [] + summary: Gets project's supavisor config + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_pooling_config_read + x-oauth-scope: database:read + patch: + operationId: v1-update-pooler-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateSupavisorConfigBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateSupavisorConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's supavisor config + security: + - bearer: [] + summary: Updates project's supavisor config + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_pooling_config_write + x-oauth-scope: database:write + /config/database/postgres: + get: + operationId: v1-get-postgres-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PostgresConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's Postgres config + security: + - bearer: [] + summary: Gets project's Postgres config + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_config_read + x-oauth-scope: database:read + put: + operationId: v1-update-postgres-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdatePostgresConfigBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PostgresConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's Postgres config + security: + - bearer: [] + summary: Updates project's Postgres config + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_config_write + x-oauth-scope: database:write + /config/realtime: + get: + operationId: v1-get-realtime-config + parameters: [] + responses: + '200': + description: Gets project's realtime configuration + content: + application/json: + schema: + $ref: '#/components/schemas/RealtimeConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets realtime configuration + tags: + - Realtime + x-endpoint-owners: + - realtime + x-fga-permissions: + - - realtime_config_read + patch: + operationId: v1-update-realtime-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateRealtimeConfigBody' + responses: + '204': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Updates realtime configuration + tags: + - Realtime + x-endpoint-owners: + - realtime + x-fga-permissions: + - - realtime_config_write + /config/realtime/shutdown: + post: + operationId: v1-shutdown-realtime + parameters: [] + responses: + '204': + description: Realtime connections shutdown successfully + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: Tenant not found + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Shutdowns realtime connections for a project + tags: + - Realtime + x-endpoint-owners: + - realtime + x-fga-permissions: + - - realtime_config_write + /config/auth/sso/providers: + post: + operationId: v1-create-a-sso-provider + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateProviderBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CreateProviderResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: SAML 2.0 support is not enabled for this project + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Creates a new SSO provider + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + x-oauth-scope: auth:write + get: + operationId: v1-list-all-sso-provider + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListProvidersResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: SAML 2.0 support is not enabled for this project + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Lists all SSO providers + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_read + x-oauth-scope: auth:read + /config/auth/sso/providers/{provider_id}: + get: + operationId: v1-get-a-sso-provider + parameters: + - name: provider_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 77777777-7777-4777-8777-777777777777 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GetProviderResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: Either SAML 2.0 was not enabled for this project, or the provider does not exist + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets a SSO provider by its UUID + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_read + x-oauth-scope: auth:read + put: + operationId: v1-update-a-sso-provider + parameters: + - name: provider_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 77777777-7777-4777-8777-777777777777 + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateProviderBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateProviderResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: Either SAML 2.0 was not enabled for this project, or the provider does not exist + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Updates a SSO provider by its UUID + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + x-oauth-scope: auth:write + delete: + operationId: v1-delete-a-sso-provider + parameters: + - name: provider_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 77777777-7777-4777-8777-777777777777 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteProviderResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: Either SAML 2.0 was not enabled for this project, or the provider does not exist + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Removes a SSO provider by its UUID + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + x-oauth-scope: auth:write +components: + schemas: + PgsodiumConfigResponse: + type: object + properties: + root_key: + type: string + description: 'The pgsodium root key: 32 bytes, hex-encoded (64 characters).' + required: + - root_key + example: + root_key: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef + UpdatePgsodiumConfigBody: + type: object + properties: + root_key: + type: string + description: 'The pgsodium root key: 32 bytes, hex-encoded (64 characters).' + required: + - root_key + example: + root_key: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef + PostgrestConfigWithJWTSecretResponse: + type: object + properties: + db_schema: + type: string + max_rows: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + db_extra_search_path: + type: string + db_pool: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + description: If `null`, the value is automatically configured based on compute size. + nullable: true + db_pool_acquisition_timeout: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + description: If `null`, the value is automatically configured to 10. + nullable: true + jwt_secret: + type: string + required: + - db_schema + - max_rows + - db_extra_search_path + - db_pool + - db_pool_acquisition_timeout + V1UpdatePostgrestConfigBody: + type: object + properties: + db_extra_search_path: + type: string + db_schema: + type: string + max_rows: + type: integer + minimum: 0 + maximum: 1000000 + db_pool: + type: integer + minimum: 0 + maximum: 1000 + db_pool_acquisition_timeout: + type: integer + minimum: 0 + maximum: 60 + example: + db_schema: public,storage + db_pool: 20 + max_rows: 1000 + V1PostgrestConfigResponse: + type: object + properties: + db_schema: + type: string + max_rows: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + db_extra_search_path: + type: string + db_pool: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + description: If `null`, the value is automatically configured based on compute size. + nullable: true + db_pool_acquisition_timeout: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + description: If `null`, the value is automatically configured to 10. + nullable: true + required: + - db_schema + - max_rows + - db_extra_search_path + - db_pool + - db_pool_acquisition_timeout + SslEnforcementResponse: + type: object + properties: + currentConfig: + type: object + properties: + database: + type: boolean + required: + - database + appliedSuccessfully: + type: boolean + required: + - currentConfig + - appliedSuccessfully + SslEnforcementRequest: + type: object + properties: + requestedConfig: + type: object + properties: + database: + type: boolean + required: + - database + required: + - requestedConfig + example: + requestedConfig: + database: true + SigningKeyResponse: + type: object + properties: + id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + algorithm: + type: string + enum: + - EdDSA + - ES256 + - RS256 + - HS256 + status: + type: string + enum: + - in_use + - previously_used + - revoked + - standby + public_jwk: + nullable: true + created_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + required: + - id + - algorithm + - status + - public_jwk + - created_at + - updated_at + additionalProperties: false + CreateSigningKeyBody: + type: object + properties: + algorithm: + type: string + enum: + - EdDSA + - ES256 + - RS256 + - HS256 + status: + type: string + enum: + - in_use + - standby + private_jwk: + type: object + properties: + kid: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + use: + type: string + enum: + - sig + key_ops: + minItems: 2 + maxItems: 2 + type: array + items: + type: string + enum: + - sign + - verify + ext: + type: boolean + enum: + - true + kty: + type: string + enum: + - RSA + alg: + type: string + enum: + - RS256 + 'n': + type: string + e: + type: string + enum: + - AQAB + d: + type: string + p: + type: string + q: + type: string + dp: + type: string + dq: + type: string + qi: + type: string + crv: + type: string + enum: + - P-256 + x: + type: string + 'y': + type: string + k: + type: string + minLength: 16 + required: + - kty + - 'n' + - e + - d + - p + - q + - dp + - dq + - qi + - crv + - x + - 'y' + - k + additionalProperties: false + required: + - algorithm + example: + algorithm: RS256 + status: standby + additionalProperties: false + SigningKeysResponse: + type: object + properties: + keys: + type: array + items: + type: object + properties: + id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + algorithm: + type: string + enum: + - EdDSA + - ES256 + - RS256 + - HS256 + status: + type: string + enum: + - in_use + - previously_used + - revoked + - standby + public_jwk: + nullable: true + created_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + required: + - id + - algorithm + - status + - public_jwk + - created_at + - updated_at + additionalProperties: false + required: + - keys + additionalProperties: false + UpdateSigningKeyBody: + type: object + properties: + status: + type: string + enum: + - in_use + - previously_used + - revoked + - standby + required: + - status + example: + status: standby + additionalProperties: false + AuthConfigResponse: + type: object + properties: + api_max_request_duration: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + db_max_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + db_max_pool_size_unit: + type: string + enum: + - connections + - percent + - null + nullable: true + disable_signup: + type: boolean + nullable: true + external_anonymous_users_enabled: + type: boolean + nullable: true + external_apple_additional_client_ids: + type: string + nullable: true + external_apple_client_id: + type: string + nullable: true + external_apple_email_optional: + type: boolean + nullable: true + external_apple_enabled: + type: boolean + nullable: true + external_apple_secret: + type: string + nullable: true + external_azure_client_id: + type: string + nullable: true + external_azure_email_optional: + type: boolean + nullable: true + external_azure_enabled: + type: boolean + nullable: true + external_azure_secret: + type: string + nullable: true + external_azure_url: + type: string + nullable: true + external_bitbucket_client_id: + type: string + nullable: true + external_bitbucket_email_optional: + type: boolean + nullable: true + external_bitbucket_enabled: + type: boolean + nullable: true + external_bitbucket_secret: + type: string + nullable: true + external_discord_client_id: + type: string + nullable: true + external_discord_email_optional: + type: boolean + nullable: true + external_discord_enabled: + type: boolean + nullable: true + external_discord_secret: + type: string + nullable: true + external_email_enabled: + type: boolean + nullable: true + external_facebook_client_id: + type: string + nullable: true + external_facebook_email_optional: + type: boolean + nullable: true + external_facebook_enabled: + type: boolean + nullable: true + external_facebook_secret: + type: string + nullable: true + external_figma_client_id: + type: string + nullable: true + external_figma_email_optional: + type: boolean + nullable: true + external_figma_enabled: + type: boolean + nullable: true + external_figma_secret: + type: string + nullable: true + external_github_client_id: + type: string + nullable: true + external_github_email_optional: + type: boolean + nullable: true + external_github_enabled: + type: boolean + nullable: true + external_github_secret: + type: string + nullable: true + external_gitlab_client_id: + type: string + nullable: true + external_gitlab_email_optional: + type: boolean + nullable: true + external_gitlab_enabled: + type: boolean + nullable: true + external_gitlab_secret: + type: string + nullable: true + external_gitlab_url: + type: string + nullable: true + external_google_additional_client_ids: + type: string + nullable: true + external_google_client_id: + type: string + nullable: true + external_google_email_optional: + type: boolean + nullable: true + external_google_enabled: + type: boolean + nullable: true + external_google_secret: + type: string + nullable: true + external_google_skip_nonce_check: + type: boolean + nullable: true + external_kakao_client_id: + type: string + nullable: true + external_kakao_email_optional: + type: boolean + nullable: true + external_kakao_enabled: + type: boolean + nullable: true + external_kakao_secret: + type: string + nullable: true + external_keycloak_client_id: + type: string + nullable: true + external_keycloak_email_optional: + type: boolean + nullable: true + external_keycloak_enabled: + type: boolean + nullable: true + external_keycloak_secret: + type: string + nullable: true + external_keycloak_url: + type: string + nullable: true + external_linkedin_oidc_client_id: + type: string + nullable: true + external_linkedin_oidc_email_optional: + type: boolean + nullable: true + external_linkedin_oidc_enabled: + type: boolean + nullable: true + external_linkedin_oidc_secret: + type: string + nullable: true + external_slack_oidc_client_id: + type: string + nullable: true + external_slack_oidc_email_optional: + type: boolean + nullable: true + external_slack_oidc_enabled: + type: boolean + nullable: true + external_slack_oidc_secret: + type: string + nullable: true + external_notion_client_id: + type: string + nullable: true + external_notion_email_optional: + type: boolean + nullable: true + external_notion_enabled: + type: boolean + nullable: true + external_notion_secret: + type: string + nullable: true + external_phone_enabled: + type: boolean + nullable: true + external_slack_client_id: + type: string + nullable: true + external_slack_email_optional: + type: boolean + nullable: true + external_slack_enabled: + type: boolean + nullable: true + external_slack_secret: + type: string + nullable: true + external_spotify_client_id: + type: string + nullable: true + external_spotify_email_optional: + type: boolean + nullable: true + external_spotify_enabled: + type: boolean + nullable: true + external_spotify_secret: + type: string + nullable: true + external_twitch_client_id: + type: string + nullable: true + external_twitch_email_optional: + type: boolean + nullable: true + external_twitch_enabled: + type: boolean + nullable: true + external_twitch_secret: + type: string + nullable: true + external_twitter_client_id: + type: string + nullable: true + external_twitter_email_optional: + type: boolean + nullable: true + external_twitter_enabled: + type: boolean + nullable: true + external_twitter_secret: + type: string + nullable: true + external_x_client_id: + type: string + nullable: true + external_x_email_optional: + type: boolean + nullable: true + external_x_enabled: + type: boolean + nullable: true + external_x_secret: + type: string + nullable: true + external_workos_client_id: + type: string + nullable: true + external_workos_enabled: + type: boolean + nullable: true + external_workos_secret: + type: string + nullable: true + external_workos_url: + type: string + nullable: true + external_web3_solana_enabled: + type: boolean + nullable: true + external_web3_ethereum_enabled: + type: boolean + nullable: true + external_zoom_client_id: + type: string + nullable: true + external_zoom_email_optional: + type: boolean + nullable: true + external_zoom_enabled: + type: boolean + nullable: true + external_zoom_secret: + type: string + nullable: true + hook_custom_access_token_enabled: + type: boolean + nullable: true + hook_custom_access_token_uri: + type: string + nullable: true + hook_custom_access_token_secrets: + type: string + nullable: true + hook_mfa_verification_attempt_enabled: + type: boolean + nullable: true + hook_mfa_verification_attempt_uri: + type: string + nullable: true + hook_mfa_verification_attempt_secrets: + type: string + nullable: true + hook_password_verification_attempt_enabled: + type: boolean + nullable: true + hook_password_verification_attempt_uri: + type: string + nullable: true + hook_password_verification_attempt_secrets: + type: string + nullable: true + hook_send_sms_enabled: + type: boolean + nullable: true + hook_send_sms_uri: + type: string + nullable: true + hook_send_sms_secrets: + type: string + nullable: true + hook_send_email_enabled: + type: boolean + nullable: true + hook_send_email_uri: + type: string + nullable: true + hook_send_email_secrets: + type: string + nullable: true + hook_before_user_created_enabled: + type: boolean + nullable: true + hook_before_user_created_uri: + type: string + nullable: true + hook_before_user_created_secrets: + type: string + nullable: true + hook_after_user_created_enabled: + type: boolean + nullable: true + hook_after_user_created_uri: + type: string + nullable: true + hook_after_user_created_secrets: + type: string + nullable: true + jwt_exp: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + mailer_allow_unverified_email_sign_ins: + type: boolean + nullable: true + mailer_autoconfirm: + type: boolean + nullable: true + mailer_otp_exp: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + mailer_otp_length: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + mailer_secure_email_change_enabled: + type: boolean + nullable: true + mailer_subjects_confirmation: + type: string + nullable: true + mailer_subjects_email_change: + type: string + nullable: true + mailer_subjects_invite: + type: string + nullable: true + mailer_subjects_magic_link: + type: string + nullable: true + mailer_subjects_reauthentication: + type: string + nullable: true + mailer_subjects_recovery: + type: string + nullable: true + mailer_subjects_password_changed_notification: + type: string + nullable: true + mailer_subjects_email_changed_notification: + type: string + nullable: true + mailer_subjects_phone_changed_notification: + type: string + nullable: true + mailer_subjects_mfa_factor_enrolled_notification: + type: string + nullable: true + mailer_subjects_mfa_factor_unenrolled_notification: + type: string + nullable: true + mailer_subjects_identity_linked_notification: + type: string + nullable: true + mailer_subjects_identity_unlinked_notification: + type: string + nullable: true + mailer_templates_confirmation_content: + type: string + nullable: true + mailer_templates_email_change_content: + type: string + nullable: true + mailer_templates_invite_content: + type: string + nullable: true + mailer_templates_magic_link_content: + type: string + nullable: true + mailer_templates_reauthentication_content: + type: string + nullable: true + mailer_templates_recovery_content: + type: string + nullable: true + mailer_templates_password_changed_notification_content: + type: string + nullable: true + mailer_templates_email_changed_notification_content: + type: string + nullable: true + mailer_templates_phone_changed_notification_content: + type: string + nullable: true + mailer_templates_mfa_factor_enrolled_notification_content: + type: string + nullable: true + mailer_templates_mfa_factor_unenrolled_notification_content: + type: string + nullable: true + mailer_templates_identity_linked_notification_content: + type: string + nullable: true + mailer_templates_identity_unlinked_notification_content: + type: string + nullable: true + mailer_notifications_password_changed_enabled: + type: boolean + nullable: true + mailer_notifications_email_changed_enabled: + type: boolean + nullable: true + mailer_notifications_phone_changed_enabled: + type: boolean + nullable: true + mailer_notifications_mfa_factor_enrolled_enabled: + type: boolean + nullable: true + mailer_notifications_mfa_factor_unenrolled_enabled: + type: boolean + nullable: true + mailer_notifications_identity_linked_enabled: + type: boolean + nullable: true + mailer_notifications_identity_unlinked_enabled: + type: boolean + nullable: true + mfa_max_enrolled_factors: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + mfa_totp_enroll_enabled: + type: boolean + nullable: true + mfa_totp_verify_enabled: + type: boolean + nullable: true + mfa_phone_enroll_enabled: + type: boolean + nullable: true + mfa_phone_verify_enabled: + type: boolean + nullable: true + mfa_web_authn_enroll_enabled: + type: boolean + nullable: true + mfa_web_authn_verify_enabled: + type: boolean + nullable: true + passkey_enabled: + type: boolean + webauthn_rp_display_name: + type: string + nullable: true + webauthn_rp_id: + type: string + nullable: true + webauthn_rp_origins: + type: string + nullable: true + mfa_phone_otp_length: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + mfa_phone_template: + type: string + nullable: true + mfa_phone_max_frequency: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + nimbus_oauth_client_id: + type: string + nullable: true + nimbus_oauth_email_optional: + type: boolean + nullable: true + nimbus_oauth_client_secret: + type: string + nullable: true + password_hibp_enabled: + type: boolean + nullable: true + password_min_length: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + password_required_characters: + type: string + enum: + - abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789 + - abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789 + - abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\:"|<>?,./`~ + - '' + - null + nullable: true + rate_limit_anonymous_users: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_email_sent: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_sms_sent: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_token_refresh: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_verify: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_otp: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_web3: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + refresh_token_rotation_enabled: + type: boolean + nullable: true + saml_enabled: + type: boolean + nullable: true + saml_external_url: + type: string + nullable: true + saml_allow_encrypted_assertions: + type: boolean + nullable: true + security_sb_forwarded_for_enabled: + type: boolean + nullable: true + security_captcha_enabled: + type: boolean + nullable: true + security_captcha_provider: + type: string + enum: + - turnstile + - hcaptcha + - null + nullable: true + security_captcha_secret: + type: string + nullable: true + security_manual_linking_enabled: + type: boolean + nullable: true + security_refresh_token_reuse_interval: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + security_update_password_require_reauthentication: + type: boolean + nullable: true + sessions_inactivity_timeout: + type: number + nullable: true + sessions_single_per_user: + type: boolean + nullable: true + sessions_tags: + type: string + nullable: true + sessions_timebox: + type: number + nullable: true + site_url: + type: string + nullable: true + sms_autoconfirm: + type: boolean + nullable: true + sms_max_frequency: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + sms_messagebird_access_key: + type: string + nullable: true + sms_messagebird_originator: + type: string + nullable: true + sms_otp_exp: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + sms_otp_length: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + sms_provider: + type: string + enum: + - messagebird + - textlocal + - twilio + - twilio_verify + - vonage + - null + nullable: true + sms_template: + type: string + nullable: true + sms_test_otp: + type: string + nullable: true + sms_test_otp_valid_until: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$ + nullable: true + sms_textlocal_api_key: + type: string + nullable: true + sms_textlocal_sender: + type: string + nullable: true + sms_twilio_account_sid: + type: string + nullable: true + sms_twilio_auth_token: + type: string + nullable: true + sms_twilio_content_sid: + type: string + nullable: true + sms_twilio_message_service_sid: + type: string + nullable: true + sms_twilio_verify_account_sid: + type: string + nullable: true + sms_twilio_verify_auth_token: + type: string + nullable: true + sms_twilio_verify_message_service_sid: + type: string + nullable: true + sms_vonage_api_key: + type: string + nullable: true + sms_vonage_api_secret: + type: string + nullable: true + sms_vonage_from: + type: string + nullable: true + smtp_admin_email: + type: string + format: email + pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ + nullable: true + smtp_host: + type: string + nullable: true + smtp_max_frequency: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + smtp_pass: + type: string + nullable: true + smtp_port: + type: string + nullable: true + smtp_sender_name: + type: string + nullable: true + smtp_user: + type: string + nullable: true + uri_allow_list: + type: string + nullable: true + oauth_server_enabled: + type: boolean + oauth_server_allow_dynamic_registration: + type: boolean + oauth_server_authorization_path: + type: string + nullable: true + custom_oauth_enabled: + type: boolean + custom_oauth_max_providers: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + required: + - api_max_request_duration + - db_max_pool_size + - db_max_pool_size_unit + - disable_signup + - external_anonymous_users_enabled + - external_apple_additional_client_ids + - external_apple_client_id + - external_apple_email_optional + - external_apple_enabled + - external_apple_secret + - external_azure_client_id + - external_azure_email_optional + - external_azure_enabled + - external_azure_secret + - external_azure_url + - external_bitbucket_client_id + - external_bitbucket_email_optional + - external_bitbucket_enabled + - external_bitbucket_secret + - external_discord_client_id + - external_discord_email_optional + - external_discord_enabled + - external_discord_secret + - external_email_enabled + - external_facebook_client_id + - external_facebook_email_optional + - external_facebook_enabled + - external_facebook_secret + - external_figma_client_id + - external_figma_email_optional + - external_figma_enabled + - external_figma_secret + - external_github_client_id + - external_github_email_optional + - external_github_enabled + - external_github_secret + - external_gitlab_client_id + - external_gitlab_email_optional + - external_gitlab_enabled + - external_gitlab_secret + - external_gitlab_url + - external_google_additional_client_ids + - external_google_client_id + - external_google_email_optional + - external_google_enabled + - external_google_secret + - external_google_skip_nonce_check + - external_kakao_client_id + - external_kakao_email_optional + - external_kakao_enabled + - external_kakao_secret + - external_keycloak_client_id + - external_keycloak_email_optional + - external_keycloak_enabled + - external_keycloak_secret + - external_keycloak_url + - external_linkedin_oidc_client_id + - external_linkedin_oidc_email_optional + - external_linkedin_oidc_enabled + - external_linkedin_oidc_secret + - external_slack_oidc_client_id + - external_slack_oidc_email_optional + - external_slack_oidc_enabled + - external_slack_oidc_secret + - external_notion_client_id + - external_notion_email_optional + - external_notion_enabled + - external_notion_secret + - external_phone_enabled + - external_slack_client_id + - external_slack_email_optional + - external_slack_enabled + - external_slack_secret + - external_spotify_client_id + - external_spotify_email_optional + - external_spotify_enabled + - external_spotify_secret + - external_twitch_client_id + - external_twitch_email_optional + - external_twitch_enabled + - external_twitch_secret + - external_twitter_client_id + - external_twitter_email_optional + - external_twitter_enabled + - external_twitter_secret + - external_x_client_id + - external_x_email_optional + - external_x_enabled + - external_x_secret + - external_workos_client_id + - external_workos_enabled + - external_workos_secret + - external_workos_url + - external_web3_solana_enabled + - external_web3_ethereum_enabled + - external_zoom_client_id + - external_zoom_email_optional + - external_zoom_enabled + - external_zoom_secret + - hook_custom_access_token_enabled + - hook_custom_access_token_uri + - hook_custom_access_token_secrets + - hook_mfa_verification_attempt_enabled + - hook_mfa_verification_attempt_uri + - hook_mfa_verification_attempt_secrets + - hook_password_verification_attempt_enabled + - hook_password_verification_attempt_uri + - hook_password_verification_attempt_secrets + - hook_send_sms_enabled + - hook_send_sms_uri + - hook_send_sms_secrets + - hook_send_email_enabled + - hook_send_email_uri + - hook_send_email_secrets + - hook_before_user_created_enabled + - hook_before_user_created_uri + - hook_before_user_created_secrets + - hook_after_user_created_enabled + - hook_after_user_created_uri + - hook_after_user_created_secrets + - jwt_exp + - mailer_allow_unverified_email_sign_ins + - mailer_autoconfirm + - mailer_otp_exp + - mailer_otp_length + - mailer_secure_email_change_enabled + - mailer_subjects_confirmation + - mailer_subjects_email_change + - mailer_subjects_invite + - mailer_subjects_magic_link + - mailer_subjects_reauthentication + - mailer_subjects_recovery + - mailer_subjects_password_changed_notification + - mailer_subjects_email_changed_notification + - mailer_subjects_phone_changed_notification + - mailer_subjects_mfa_factor_enrolled_notification + - mailer_subjects_mfa_factor_unenrolled_notification + - mailer_subjects_identity_linked_notification + - mailer_subjects_identity_unlinked_notification + - mailer_templates_confirmation_content + - mailer_templates_email_change_content + - mailer_templates_invite_content + - mailer_templates_magic_link_content + - mailer_templates_reauthentication_content + - mailer_templates_recovery_content + - mailer_templates_password_changed_notification_content + - mailer_templates_email_changed_notification_content + - mailer_templates_phone_changed_notification_content + - mailer_templates_mfa_factor_enrolled_notification_content + - mailer_templates_mfa_factor_unenrolled_notification_content + - mailer_templates_identity_linked_notification_content + - mailer_templates_identity_unlinked_notification_content + - mailer_notifications_password_changed_enabled + - mailer_notifications_email_changed_enabled + - mailer_notifications_phone_changed_enabled + - mailer_notifications_mfa_factor_enrolled_enabled + - mailer_notifications_mfa_factor_unenrolled_enabled + - mailer_notifications_identity_linked_enabled + - mailer_notifications_identity_unlinked_enabled + - mfa_max_enrolled_factors + - mfa_totp_enroll_enabled + - mfa_totp_verify_enabled + - mfa_phone_enroll_enabled + - mfa_phone_verify_enabled + - mfa_web_authn_enroll_enabled + - mfa_web_authn_verify_enabled + - passkey_enabled + - webauthn_rp_display_name + - webauthn_rp_id + - webauthn_rp_origins + - mfa_phone_otp_length + - mfa_phone_template + - mfa_phone_max_frequency + - nimbus_oauth_client_id + - nimbus_oauth_email_optional + - nimbus_oauth_client_secret + - password_hibp_enabled + - password_min_length + - password_required_characters + - rate_limit_anonymous_users + - rate_limit_email_sent + - rate_limit_sms_sent + - rate_limit_token_refresh + - rate_limit_verify + - rate_limit_otp + - rate_limit_web3 + - refresh_token_rotation_enabled + - saml_enabled + - saml_external_url + - saml_allow_encrypted_assertions + - security_sb_forwarded_for_enabled + - security_captcha_enabled + - security_captcha_provider + - security_captcha_secret + - security_manual_linking_enabled + - security_refresh_token_reuse_interval + - security_update_password_require_reauthentication + - sessions_inactivity_timeout + - sessions_single_per_user + - sessions_tags + - sessions_timebox + - site_url + - sms_autoconfirm + - sms_max_frequency + - sms_messagebird_access_key + - sms_messagebird_originator + - sms_otp_exp + - sms_otp_length + - sms_provider + - sms_template + - sms_test_otp + - sms_test_otp_valid_until + - sms_textlocal_api_key + - sms_textlocal_sender + - sms_twilio_account_sid + - sms_twilio_auth_token + - sms_twilio_content_sid + - sms_twilio_message_service_sid + - sms_twilio_verify_account_sid + - sms_twilio_verify_auth_token + - sms_twilio_verify_message_service_sid + - sms_vonage_api_key + - sms_vonage_api_secret + - sms_vonage_from + - smtp_admin_email + - smtp_host + - smtp_max_frequency + - smtp_pass + - smtp_port + - smtp_sender_name + - smtp_user + - uri_allow_list + - oauth_server_enabled + - oauth_server_allow_dynamic_registration + - oauth_server_authorization_path + - custom_oauth_enabled + - custom_oauth_max_providers + UpdateAuthConfigBody: + type: object + properties: + site_url: + type: string + pattern: ^[^,]+$ + nullable: true + disable_signup: + type: boolean + nullable: true + jwt_exp: + type: integer + minimum: 0 + maximum: 604800 + nullable: true + smtp_admin_email: + type: string + format: email + pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ + nullable: true + smtp_host: + type: string + nullable: true + smtp_port: + type: string + nullable: true + smtp_user: + type: string + nullable: true + smtp_pass: + type: string + nullable: true + smtp_max_frequency: + type: integer + minimum: 0 + maximum: 32767 + nullable: true + smtp_sender_name: + type: string + nullable: true + mailer_allow_unverified_email_sign_ins: + type: boolean + nullable: true + mailer_autoconfirm: + type: boolean + nullable: true + mailer_subjects_invite: + type: string + nullable: true + mailer_subjects_confirmation: + type: string + nullable: true + mailer_subjects_recovery: + type: string + nullable: true + mailer_subjects_email_change: + type: string + nullable: true + mailer_subjects_magic_link: + type: string + nullable: true + mailer_subjects_reauthentication: + type: string + nullable: true + mailer_subjects_password_changed_notification: + type: string + nullable: true + mailer_subjects_email_changed_notification: + type: string + nullable: true + mailer_subjects_phone_changed_notification: + type: string + nullable: true + mailer_subjects_mfa_factor_enrolled_notification: + type: string + nullable: true + mailer_subjects_mfa_factor_unenrolled_notification: + type: string + nullable: true + mailer_subjects_identity_linked_notification: + type: string + nullable: true + mailer_subjects_identity_unlinked_notification: + type: string + nullable: true + mailer_templates_invite_content: + type: string + nullable: true + mailer_templates_confirmation_content: + type: string + nullable: true + mailer_templates_recovery_content: + type: string + nullable: true + mailer_templates_email_change_content: + type: string + nullable: true + mailer_templates_magic_link_content: + type: string + nullable: true + mailer_templates_reauthentication_content: + type: string + nullable: true + mailer_templates_password_changed_notification_content: + type: string + nullable: true + mailer_templates_email_changed_notification_content: + type: string + nullable: true + mailer_templates_phone_changed_notification_content: + type: string + nullable: true + mailer_templates_mfa_factor_enrolled_notification_content: + type: string + nullable: true + mailer_templates_mfa_factor_unenrolled_notification_content: + type: string + nullable: true + mailer_templates_identity_linked_notification_content: + type: string + nullable: true + mailer_templates_identity_unlinked_notification_content: + type: string + nullable: true + mailer_notifications_password_changed_enabled: + type: boolean + nullable: true + mailer_notifications_email_changed_enabled: + type: boolean + nullable: true + mailer_notifications_phone_changed_enabled: + type: boolean + nullable: true + mailer_notifications_mfa_factor_enrolled_enabled: + type: boolean + nullable: true + mailer_notifications_mfa_factor_unenrolled_enabled: + type: boolean + nullable: true + mailer_notifications_identity_linked_enabled: + type: boolean + nullable: true + mailer_notifications_identity_unlinked_enabled: + type: boolean + nullable: true + mfa_max_enrolled_factors: + type: integer + minimum: 0 + maximum: 2147483647 + nullable: true + uri_allow_list: + type: string + nullable: true + external_anonymous_users_enabled: + type: boolean + nullable: true + external_email_enabled: + type: boolean + nullable: true + external_phone_enabled: + type: boolean + nullable: true + saml_enabled: + type: boolean + nullable: true + saml_external_url: + type: string + pattern: ^[^,]+$ + nullable: true + security_sb_forwarded_for_enabled: + type: boolean + nullable: true + security_captcha_enabled: + type: boolean + nullable: true + security_captcha_provider: + type: string + enum: + - turnstile + - hcaptcha + - null + nullable: true + security_captcha_secret: + type: string + nullable: true + sessions_timebox: + type: number + minimum: 0 + nullable: true + sessions_inactivity_timeout: + type: number + minimum: 0 + nullable: true + sessions_single_per_user: + type: boolean + nullable: true + sessions_tags: + type: string + pattern: ^\s*([a-zA-Z0-9_-]+(\s*,+\s*)?)*\s*$ + nullable: true + rate_limit_anonymous_users: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_email_sent: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_sms_sent: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_verify: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_token_refresh: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_otp: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_web3: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + mailer_secure_email_change_enabled: + type: boolean + nullable: true + refresh_token_rotation_enabled: + type: boolean + nullable: true + password_hibp_enabled: + type: boolean + nullable: true + password_min_length: + type: integer + minimum: 6 + maximum: 32767 + nullable: true + password_required_characters: + type: string + enum: + - abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789 + - abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789 + - abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\:"|<>?,./`~ + - '' + - null + nullable: true + security_manual_linking_enabled: + type: boolean + nullable: true + security_update_password_require_reauthentication: + type: boolean + nullable: true + security_refresh_token_reuse_interval: + type: integer + minimum: 0 + maximum: 2147483647 + nullable: true + mailer_otp_exp: + type: integer + minimum: 0 + maximum: 2147483647 + mailer_otp_length: + type: integer + minimum: 6 + maximum: 10 + nullable: true + sms_autoconfirm: + type: boolean + nullable: true + sms_max_frequency: + type: integer + minimum: 0 + maximum: 32767 + nullable: true + sms_otp_exp: + type: integer + minimum: 0 + maximum: 2147483647 + nullable: true + sms_otp_length: + type: integer + minimum: 0 + maximum: 32767 + sms_provider: + type: string + enum: + - messagebird + - textlocal + - twilio + - twilio_verify + - vonage + - null + nullable: true + sms_messagebird_access_key: + type: string + nullable: true + sms_messagebird_originator: + type: string + nullable: true + sms_test_otp: + type: string + pattern: ^([0-9]{1,15}=[0-9]+,?)*$ + nullable: true + sms_test_otp_valid_until: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$ + nullable: true + sms_textlocal_api_key: + type: string + nullable: true + sms_textlocal_sender: + type: string + nullable: true + sms_twilio_account_sid: + type: string + nullable: true + sms_twilio_auth_token: + type: string + nullable: true + sms_twilio_content_sid: + type: string + nullable: true + sms_twilio_message_service_sid: + type: string + nullable: true + sms_twilio_verify_account_sid: + type: string + nullable: true + sms_twilio_verify_auth_token: + type: string + nullable: true + sms_twilio_verify_message_service_sid: + type: string + nullable: true + sms_vonage_api_key: + type: string + nullable: true + sms_vonage_api_secret: + type: string + nullable: true + sms_vonage_from: + type: string + nullable: true + sms_template: + type: string + nullable: true + hook_mfa_verification_attempt_enabled: + type: boolean + nullable: true + hook_mfa_verification_attempt_uri: + type: string + nullable: true + hook_mfa_verification_attempt_secrets: + type: string + nullable: true + hook_password_verification_attempt_enabled: + type: boolean + nullable: true + hook_password_verification_attempt_uri: + type: string + nullable: true + hook_password_verification_attempt_secrets: + type: string + nullable: true + hook_custom_access_token_enabled: + type: boolean + nullable: true + hook_custom_access_token_uri: + type: string + nullable: true + hook_custom_access_token_secrets: + type: string + nullable: true + hook_send_sms_enabled: + type: boolean + nullable: true + hook_send_sms_uri: + type: string + nullable: true + hook_send_sms_secrets: + type: string + nullable: true + hook_send_email_enabled: + type: boolean + nullable: true + hook_send_email_uri: + type: string + nullable: true + hook_send_email_secrets: + type: string + nullable: true + hook_before_user_created_enabled: + type: boolean + nullable: true + hook_before_user_created_uri: + type: string + nullable: true + hook_before_user_created_secrets: + type: string + nullable: true + hook_after_user_created_enabled: + type: boolean + nullable: true + hook_after_user_created_uri: + type: string + nullable: true + hook_after_user_created_secrets: + type: string + nullable: true + external_apple_enabled: + type: boolean + nullable: true + external_apple_client_id: + type: string + nullable: true + external_apple_email_optional: + type: boolean + nullable: true + external_apple_secret: + type: string + nullable: true + external_apple_additional_client_ids: + type: string + nullable: true + external_azure_enabled: + type: boolean + nullable: true + external_azure_client_id: + type: string + nullable: true + external_azure_email_optional: + type: boolean + nullable: true + external_azure_secret: + type: string + nullable: true + external_azure_url: + type: string + nullable: true + external_bitbucket_enabled: + type: boolean + nullable: true + external_bitbucket_client_id: + type: string + nullable: true + external_bitbucket_email_optional: + type: boolean + nullable: true + external_bitbucket_secret: + type: string + nullable: true + external_discord_enabled: + type: boolean + nullable: true + external_discord_client_id: + type: string + nullable: true + external_discord_email_optional: + type: boolean + nullable: true + external_discord_secret: + type: string + nullable: true + external_facebook_enabled: + type: boolean + nullable: true + external_facebook_client_id: + type: string + nullable: true + external_facebook_email_optional: + type: boolean + nullable: true + external_facebook_secret: + type: string + nullable: true + external_figma_enabled: + type: boolean + nullable: true + external_figma_client_id: + type: string + nullable: true + external_figma_email_optional: + type: boolean + nullable: true + external_figma_secret: + type: string + nullable: true + external_github_enabled: + type: boolean + nullable: true + external_github_client_id: + type: string + nullable: true + external_github_email_optional: + type: boolean + nullable: true + external_github_secret: + type: string + nullable: true + external_gitlab_enabled: + type: boolean + nullable: true + external_gitlab_client_id: + type: string + nullable: true + external_gitlab_email_optional: + type: boolean + nullable: true + external_gitlab_secret: + type: string + nullable: true + external_gitlab_url: + type: string + nullable: true + external_google_enabled: + type: boolean + nullable: true + external_google_client_id: + type: string + nullable: true + external_google_email_optional: + type: boolean + nullable: true + external_google_secret: + type: string + nullable: true + external_google_additional_client_ids: + type: string + nullable: true + external_google_skip_nonce_check: + type: boolean + nullable: true + external_kakao_enabled: + type: boolean + nullable: true + external_kakao_client_id: + type: string + nullable: true + external_kakao_email_optional: + type: boolean + nullable: true + external_kakao_secret: + type: string + nullable: true + external_keycloak_enabled: + type: boolean + nullable: true + external_keycloak_client_id: + type: string + nullable: true + external_keycloak_email_optional: + type: boolean + nullable: true + external_keycloak_secret: + type: string + nullable: true + external_keycloak_url: + type: string + nullable: true + external_linkedin_oidc_enabled: + type: boolean + nullable: true + external_linkedin_oidc_client_id: + type: string + nullable: true + external_linkedin_oidc_email_optional: + type: boolean + nullable: true + external_linkedin_oidc_secret: + type: string + nullable: true + external_slack_oidc_enabled: + type: boolean + nullable: true + external_slack_oidc_client_id: + type: string + nullable: true + external_slack_oidc_email_optional: + type: boolean + nullable: true + external_slack_oidc_secret: + type: string + nullable: true + external_notion_enabled: + type: boolean + nullable: true + external_notion_client_id: + type: string + nullable: true + external_notion_email_optional: + type: boolean + nullable: true + external_notion_secret: + type: string + nullable: true + external_slack_enabled: + type: boolean + nullable: true + external_slack_client_id: + type: string + nullable: true + external_slack_email_optional: + type: boolean + nullable: true + external_slack_secret: + type: string + nullable: true + external_spotify_enabled: + type: boolean + nullable: true + external_spotify_client_id: + type: string + nullable: true + external_spotify_email_optional: + type: boolean + nullable: true + external_spotify_secret: + type: string + nullable: true + external_twitch_enabled: + type: boolean + nullable: true + external_twitch_client_id: + type: string + nullable: true + external_twitch_email_optional: + type: boolean + nullable: true + external_twitch_secret: + type: string + nullable: true + external_twitter_enabled: + type: boolean + nullable: true + external_twitter_client_id: + type: string + nullable: true + external_twitter_email_optional: + type: boolean + nullable: true + external_twitter_secret: + type: string + nullable: true + external_x_enabled: + type: boolean + nullable: true + external_x_client_id: + type: string + nullable: true + external_x_email_optional: + type: boolean + nullable: true + external_x_secret: + type: string + nullable: true + external_workos_enabled: + type: boolean + nullable: true + external_workos_client_id: + type: string + nullable: true + external_workos_secret: + type: string + nullable: true + external_workos_url: + type: string + nullable: true + external_web3_solana_enabled: + type: boolean + nullable: true + external_web3_ethereum_enabled: + type: boolean + nullable: true + external_zoom_enabled: + type: boolean + nullable: true + external_zoom_client_id: + type: string + nullable: true + external_zoom_email_optional: + type: boolean + nullable: true + external_zoom_secret: + type: string + nullable: true + db_max_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + db_max_pool_size_unit: + type: string + enum: + - connections + - percent + - null + nullable: true + api_max_request_duration: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + mfa_totp_enroll_enabled: + type: boolean + nullable: true + mfa_totp_verify_enabled: + type: boolean + nullable: true + mfa_web_authn_enroll_enabled: + type: boolean + nullable: true + mfa_web_authn_verify_enabled: + type: boolean + nullable: true + passkey_enabled: + type: boolean + webauthn_rp_display_name: + type: string + nullable: true + webauthn_rp_id: + type: string + nullable: true + webauthn_rp_origins: + type: string + nullable: true + mfa_phone_enroll_enabled: + type: boolean + nullable: true + mfa_phone_verify_enabled: + type: boolean + nullable: true + mfa_phone_max_frequency: + type: integer + minimum: 0 + maximum: 32767 + nullable: true + mfa_phone_otp_length: + type: integer + minimum: 0 + maximum: 32767 + nullable: true + mfa_phone_template: + type: string + nullable: true + nimbus_oauth_client_id: + type: string + nullable: true + nimbus_oauth_client_secret: + type: string + nullable: true + oauth_server_enabled: + type: boolean + nullable: true + oauth_server_allow_dynamic_registration: + type: boolean + nullable: true + oauth_server_authorization_path: + type: string + nullable: true + custom_oauth_enabled: + type: boolean + example: + site_url: https://app.example.com + disable_signup: false + jwt_exp: 3600 + CreateThirdPartyAuthBody: + type: object + properties: + oidc_issuer_url: + type: string + jwks_url: + type: string + custom_jwks: {} + example: + oidc_issuer_url: https://login.acme.com + jwks_url: https://login.acme.com/.well-known/jwks.json + ThirdPartyAuth: + type: object + properties: + id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + type: + type: string + oidc_issuer_url: + type: string + nullable: true + jwks_url: + type: string + nullable: true + custom_jwks: + nullable: true + resolved_jwks: + nullable: true + inserted_at: + type: string + updated_at: + type: string + resolved_at: + type: string + nullable: true + required: + - id + - type + - inserted_at + - updated_at + StorageConfigResponse: + type: object + properties: + fileSizeLimit: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + features: + type: object + properties: + imageTransformation: + type: object + properties: + enabled: + type: boolean + required: + - enabled + s3Protocol: + type: object + properties: + enabled: + type: boolean + required: + - enabled + purgeCache: + type: object + properties: + enabled: + type: boolean + required: + - enabled + icebergCatalog: + type: object + properties: + enabled: + type: boolean + maxNamespaces: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxTables: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxCatalogs: + type: integer + minimum: 0 + maximum: 9007199254740991 + required: + - enabled + - maxNamespaces + - maxTables + - maxCatalogs + vectorBuckets: + type: object + properties: + enabled: + type: boolean + maxBuckets: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxIndexes: + type: integer + minimum: 0 + maximum: 9007199254740991 + required: + - enabled + - maxBuckets + - maxIndexes + required: + - imageTransformation + - s3Protocol + - purgeCache + - icebergCatalog + - vectorBuckets + capabilities: + type: object + properties: + list_v2: + type: boolean + iceberg_catalog: + type: boolean + required: + - list_v2 + - iceberg_catalog + external: + type: object + properties: + upstreamTarget: + type: string + enum: + - main + - canary + required: + - upstreamTarget + migrationVersion: + type: string + databasePoolMode: + type: string + required: + - fileSizeLimit + - features + - capabilities + - external + - migrationVersion + - databasePoolMode + UpdateStorageConfigBody: + type: object + properties: + fileSizeLimit: + type: integer + format: int64 + minimum: 0 + maximum: 536870912000 + features: + type: object + properties: + imageTransformation: + type: object + properties: + enabled: + type: boolean + required: + - enabled + s3Protocol: + type: object + properties: + enabled: + type: boolean + required: + - enabled + purgeCache: + type: object + properties: + enabled: + type: boolean + required: + - enabled + icebergCatalog: + type: object + properties: + enabled: + type: boolean + maxNamespaces: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxTables: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxCatalogs: + type: integer + minimum: 0 + maximum: 9007199254740991 + required: + - enabled + - maxNamespaces + - maxTables + - maxCatalogs + vectorBuckets: + type: object + properties: + enabled: + type: boolean + maxBuckets: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxIndexes: + type: integer + minimum: 0 + maximum: 9007199254740991 + required: + - enabled + - maxBuckets + - maxIndexes + external: + type: object + properties: + upstreamTarget: + type: string + enum: + - main + - canary + required: + - upstreamTarget + example: + fileSizeLimit: 10485760 + features: + imageTransformation: + enabled: true + additionalProperties: false + V1PgbouncerConfigResponse: + type: object + properties: + default_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + ignore_startup_parameters: + type: string + max_client_conn: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + pool_mode: + type: string + enum: + - transaction + - session + - statement + connection_string: + type: string + server_idle_timeout: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + server_lifetime: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + query_wait_timeout: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + reserve_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + SupavisorConfigResponse: + type: object + properties: + identifier: + type: string + database_type: + type: string + enum: + - PRIMARY + - READ_REPLICA + is_using_scram_auth: + type: boolean + db_user: + type: string + db_host: + type: string + db_port: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + db_name: + type: string + connection_string: + type: string + default_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + max_client_conn: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + pool_mode: + type: string + enum: + - transaction + - session + required: + - identifier + - database_type + - is_using_scram_auth + - db_user + - db_host + - db_port + - db_name + - connection_string + - default_pool_size + - max_client_conn + - pool_mode + UpdateSupavisorConfigBody: + type: object + properties: + default_pool_size: + type: integer + minimum: 0 + maximum: 3000 + nullable: true + pool_mode: + description: Dedicated pooler mode for the project + type: string + enum: + - transaction + - session + example: + default_pool_size: 25 + pool_mode: transaction + UpdateSupavisorConfigResponse: + type: object + properties: + default_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + pool_mode: + type: string + required: + - default_pool_size + - pool_mode + PostgresConfigResponse: + type: object + properties: + effective_cache_size: + type: string + logical_decoding_work_mem: + type: string + cron.log_statement: + type: boolean + log_autovacuum_min_duration: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + log_checkpoints: + type: boolean + log_connections: + type: boolean + log_disconnections: + type: boolean + log_duration: + type: boolean + log_lock_waits: + type: boolean + log_recovery_conflict_waits: + type: boolean + log_replication_commands: + type: boolean + log_startup_progress_interval: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + log_temp_files: + type: string + maintenance_work_mem: + type: string + track_activity_query_size: + type: string + max_connections: + type: integer + minimum: 1 + maximum: 262143 + max_locks_per_transaction: + type: integer + minimum: 10 + maximum: 2147483640 + max_logical_replication_workers: + type: integer + minimum: 0 + maximum: 262143 + max_parallel_maintenance_workers: + type: integer + minimum: 0 + maximum: 1024 + max_parallel_workers: + type: integer + minimum: 0 + maximum: 1024 + max_parallel_workers_per_gather: + type: integer + minimum: 0 + maximum: 1024 + max_replication_slots: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + max_slot_wal_keep_size: + type: string + max_standby_archive_delay: + type: string + max_standby_streaming_delay: + type: string + max_sync_workers_per_subscription: + type: integer + minimum: 0 + maximum: 262143 + max_wal_size: + type: string + max_wal_senders: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + max_worker_processes: + type: integer + minimum: 0 + maximum: 262143 + session_replication_role: + type: string + enum: + - origin + - replica + - local + shared_buffers: + type: string + statement_timeout: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + track_commit_timestamp: + type: boolean + wal_keep_size: + type: string + wal_sender_timeout: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + work_mem: + type: string + checkpoint_timeout: + type: string + description: 'Default unit: s' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + hot_standby_feedback: + type: boolean + UpdatePostgresConfigBody: + type: object + properties: + effective_cache_size: + type: string + logical_decoding_work_mem: + type: string + cron.log_statement: + type: boolean + log_autovacuum_min_duration: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + log_checkpoints: + type: boolean + log_connections: + type: boolean + log_disconnections: + type: boolean + log_duration: + type: boolean + log_lock_waits: + type: boolean + log_recovery_conflict_waits: + type: boolean + log_replication_commands: + type: boolean + log_startup_progress_interval: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + log_temp_files: + type: string + maintenance_work_mem: + type: string + track_activity_query_size: + type: string + max_connections: + type: integer + minimum: 1 + maximum: 262143 + max_locks_per_transaction: + type: integer + minimum: 10 + maximum: 2147483640 + max_logical_replication_workers: + type: integer + minimum: 0 + maximum: 262143 + max_parallel_maintenance_workers: + type: integer + minimum: 0 + maximum: 1024 + max_parallel_workers: + type: integer + minimum: 0 + maximum: 1024 + max_parallel_workers_per_gather: + type: integer + minimum: 0 + maximum: 1024 + max_replication_slots: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + max_slot_wal_keep_size: + type: string + max_standby_archive_delay: + type: string + max_standby_streaming_delay: + type: string + max_sync_workers_per_subscription: + type: integer + minimum: 0 + maximum: 262143 + max_wal_size: + type: string + max_wal_senders: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + max_worker_processes: + type: integer + minimum: 0 + maximum: 262143 + session_replication_role: + type: string + enum: + - origin + - replica + - local + shared_buffers: + type: string + statement_timeout: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + track_commit_timestamp: + type: boolean + wal_keep_size: + type: string + wal_sender_timeout: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + work_mem: + type: string + checkpoint_timeout: + type: string + description: 'Default unit: s' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + hot_standby_feedback: + type: boolean + restart_database: + type: boolean + example: + max_connections: 120 + shared_buffers: 256MB + work_mem: 4MB + statement_timeout: 60000ms + additionalProperties: false + RealtimeConfigResponse: + type: object + properties: + private_only: + type: boolean + description: Whether to only allow private channels + nullable: true + connection_pool: + type: integer + minimum: 1 + maximum: 100 + description: Sets connection pool size for Realtime Authorization + nullable: true + postgres_changes_pool: + type: integer + minimum: 1 + maximum: 100 + description: Sets connection pool size used to create Postgres Changes subscriptions + nullable: true + max_concurrent_users: + type: integer + minimum: 1 + maximum: 50000 + description: Sets maximum number of concurrent users rate limit + nullable: true + max_events_per_second: + type: integer + minimum: 1 + maximum: 50000 + description: Sets maximum number of events per second rate per channel limit + nullable: true + max_bytes_per_second: + type: integer + minimum: 1 + maximum: 10000000 + description: Sets maximum number of bytes per second rate per channel limit + nullable: true + max_channels_per_client: + type: integer + minimum: 1 + maximum: 10000 + description: Sets maximum number of channels per client rate limit + nullable: true + max_joins_per_second: + type: integer + minimum: 1 + maximum: 5000 + description: Sets maximum number of joins per second rate limit + nullable: true + max_presence_events_per_second: + type: integer + minimum: 1 + maximum: 5000 + description: Sets maximum number of presence events per second rate limit + nullable: true + max_payload_size_in_kb: + type: integer + minimum: 1 + maximum: 10000 + description: Sets maximum number of payload size in KB rate limit + nullable: true + suspend: + type: boolean + description: Disables the Realtime service for this project when true. Set to false to re-enable it. + nullable: true + presence_enabled: + type: boolean + description: Whether to enable presence + required: + - private_only + - connection_pool + - postgres_changes_pool + - max_concurrent_users + - max_events_per_second + - max_bytes_per_second + - max_channels_per_client + - max_joins_per_second + - max_presence_events_per_second + - max_payload_size_in_kb + - suspend + - presence_enabled + UpdateRealtimeConfigBody: + type: object + properties: + private_only: + type: boolean + description: Whether to only allow private channels + connection_pool: + type: integer + minimum: 1 + maximum: 100 + description: Sets connection pool size for Realtime Authorization + postgres_changes_pool: + type: integer + minimum: 1 + maximum: 100 + description: Sets connection pool size used to create Postgres Changes subscriptions + max_concurrent_users: + type: integer + minimum: 1 + maximum: 50000 + description: Sets maximum number of concurrent users rate limit + max_events_per_second: + type: integer + minimum: 1 + maximum: 50000 + description: Sets maximum number of events per second rate per channel limit + max_bytes_per_second: + type: integer + minimum: 1 + maximum: 10000000 + description: Sets maximum number of bytes per second rate per channel limit + max_channels_per_client: + type: integer + minimum: 1 + maximum: 10000 + description: Sets maximum number of channels per client rate limit + max_joins_per_second: + type: integer + minimum: 1 + maximum: 5000 + description: Sets maximum number of joins per second rate limit + max_presence_events_per_second: + type: integer + minimum: 1 + maximum: 5000 + description: Sets maximum number of presence events per second rate limit + max_payload_size_in_kb: + type: integer + minimum: 1 + maximum: 10000 + description: Sets maximum number of payload size in KB rate limit + suspend: + type: boolean + description: Disables the Realtime service for this project when true. Set to false to re-enable it. + presence_enabled: + type: boolean + description: Whether to enable presence + example: + private_only: false + max_concurrent_users: 1000 + max_channels_per_client: 100 + additionalProperties: false + CreateProviderBody: + type: object + properties: + type: + type: string + enum: + - saml + description: What type of provider will be created + metadata_xml: + type: string + metadata_url: + type: string + domains: + type: array + items: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - type + example: + type: saml + metadata_url: https://sso.acme.com/metadata.xml + domains: + - acme.com + attribute_mapping: + keys: + email: + name: email + first_name: + name: first_name + last_name: + name: last_name + CreateProviderResponse: + type: object + properties: + id: + type: string + saml: + type: object + properties: + entity_id: + type: string + metadata_url: + type: string + metadata_xml: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - entity_id + domains: + type: array + items: + type: object + properties: + domain: + type: string + created_at: + type: string + updated_at: + type: string + created_at: + type: string + updated_at: + type: string + required: + - id + ListProvidersResponse: + type: object + properties: + items: + type: array + items: + type: object + properties: + id: + type: string + saml: + type: object + properties: + entity_id: + type: string + metadata_url: + type: string + metadata_xml: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - entity_id + domains: + type: array + items: + type: object + properties: + domain: + type: string + created_at: + type: string + updated_at: + type: string + created_at: + type: string + updated_at: + type: string + required: + - id + required: + - items + GetProviderResponse: + type: object + properties: + id: + type: string + saml: + type: object + properties: + entity_id: + type: string + metadata_url: + type: string + metadata_xml: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - entity_id + domains: + type: array + items: + type: object + properties: + domain: + type: string + created_at: + type: string + updated_at: + type: string + created_at: + type: string + updated_at: + type: string + required: + - id + UpdateProviderBody: + type: object + properties: + metadata_xml: + type: string + metadata_url: + type: string + domains: + type: array + items: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + example: + metadata_url: https://sso.acme.com/metadata.xml + domains: + - acme.com + - contractors.acme.com + UpdateProviderResponse: + type: object + properties: + id: + type: string + saml: + type: object + properties: + entity_id: + type: string + metadata_url: + type: string + metadata_xml: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - entity_id + domains: + type: array + items: + type: object + properties: + domain: + type: string + created_at: + type: string + updated_at: + type: string + created_at: + type: string + updated_at: + type: string + required: + - id + DeleteProviderResponse: + type: object + properties: + id: + type: string + saml: + type: object + properties: + entity_id: + type: string + metadata_url: + type: string + metadata_xml: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - entity_id + domains: + type: array + items: + type: object + properties: + domain: + type: string + created_at: + type: string + updated_at: + type: string + created_at: + type: string + updated_at: + type: string + required: + - id + V1-list-project-tpa-integrationsResponse: + type: object + properties: + v1_list_project_tpa_integrations: + type: array + items: + $ref: '#/components/schemas/ThirdPartyAuth' + V1-get-pooler-configResponse: + type: object + properties: + v1_get_pooler_config: + type: array + items: + $ref: '#/components/schemas/SupavisorConfigResponse' + x-stackQL-resources: + pgsodium_configs: + id: supabase.config.pgsodium_configs + name: pgsodium_configs + title: Pgsodium Configs + methods: + get: + operation: + $ref: '#/paths/~1pgsodium/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1pgsodium/put' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/pgsodium_configs/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/pgsodium_configs/methods/update' + delete: [] + replace: [] + postgrest_configs: + id: supabase.config.postgrest_configs + name: postgrest_configs + title: Postgrest Configs + methods: + get: + operation: + $ref: '#/paths/~1postgrest/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1postgrest/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/postgrest_configs/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/postgrest_configs/methods/update' + delete: [] + replace: [] + ssl_enforcement_configs: + id: supabase.config.ssl_enforcement_configs + name: ssl_enforcement_configs + title: Ssl Enforcement Configs + methods: + get: + operation: + $ref: '#/paths/~1ssl-enforcement/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1ssl-enforcement/put' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/ssl_enforcement_configs/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/ssl_enforcement_configs/methods/update' + delete: [] + replace: [] + legacy_signing_keys: + id: supabase.config.legacy_signing_keys + name: legacy_signing_keys + title: Legacy Signing Keys + methods: + create: + operation: + $ref: '#/paths/~1config~1auth~1signing-keys~1legacy/post' + response: + mediaType: application/json + openAPIDocKey: '201' + get: + operation: + $ref: '#/paths/~1config~1auth~1signing-keys~1legacy/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/legacy_signing_keys/methods/get' + insert: + - $ref: '#/components/x-stackQL-resources/legacy_signing_keys/methods/create' + update: [] + delete: [] + replace: [] + auth_signing_keys: + id: supabase.config.auth_signing_keys + name: auth_signing_keys + title: Auth Signing Keys + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1config~1auth~1signing-keys/post' + response: + mediaType: application/json + openAPIDocKey: '201' + list: + operation: + $ref: '#/paths/~1config~1auth~1signing-keys/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.keys + get: + operation: + $ref: '#/paths/~1config~1auth~1signing-keys~1{id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1config~1auth~1signing-keys~1{id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1config~1auth~1signing-keys~1{id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/auth_signing_keys/methods/get' + - $ref: '#/components/x-stackQL-resources/auth_signing_keys/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/auth_signing_keys/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/auth_signing_keys/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/auth_signing_keys/methods/delete' + replace: [] + auth_configs: + id: supabase.config.auth_configs + name: auth_configs + title: Auth Configs + methods: + get: + operation: + $ref: '#/paths/~1config~1auth/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1config~1auth/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/auth_configs/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/auth_configs/methods/update' + delete: [] + replace: [] + third_party_auth_integrations: + id: supabase.config.third_party_auth_integrations + name: third_party_auth_integrations + title: Third Party Auth Integrations + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1config~1auth~1third-party-auth/post' + response: + mediaType: application/json + openAPIDocKey: '201' + list: + operation: + $ref: '#/paths/~1config~1auth~1third-party-auth/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_list_project_tpa_integrations + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-list-project-tpa-integrationsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_list_project_tpa_integrations\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + delete: + operation: + $ref: '#/paths/~1config~1auth~1third-party-auth~1{tpa_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + get: + operation: + $ref: '#/paths/~1config~1auth~1third-party-auth~1{tpa_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/third_party_auth_integrations/methods/get' + - $ref: '#/components/x-stackQL-resources/third_party_auth_integrations/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/third_party_auth_integrations/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/third_party_auth_integrations/methods/delete' + replace: [] + storage_configs: + id: supabase.config.storage_configs + name: storage_configs + title: Storage Configs + methods: + get: + operation: + $ref: '#/paths/~1config~1storage/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1config~1storage/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/storage_configs/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/storage_configs/methods/update' + delete: [] + replace: [] + pgbouncer_configs: + id: supabase.config.pgbouncer_configs + name: pgbouncer_configs + title: Pgbouncer Configs + methods: + get: + operation: + $ref: '#/paths/~1config~1database~1pgbouncer/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/pgbouncer_configs/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + pooler_configs: + id: supabase.config.pooler_configs + name: pooler_configs + title: Pooler Configs + methods: + list: + operation: + $ref: '#/paths/~1config~1database~1pooler/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_get_pooler_config + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-get-pooler-configResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_get_pooler_config\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1config~1database~1pooler/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/pooler_configs/methods/list' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/pooler_configs/methods/update' + delete: [] + replace: [] + postgres_configs: + id: supabase.config.postgres_configs + name: postgres_configs + title: Postgres Configs + methods: + get: + operation: + $ref: '#/paths/~1config~1database~1postgres/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1config~1database~1postgres/put' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/postgres_configs/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/postgres_configs/methods/update' + delete: [] + replace: [] + realtime_configs: + id: supabase.config.realtime_configs + name: realtime_configs + title: Realtime Configs + methods: + get: + operation: + $ref: '#/paths/~1config~1realtime/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1config~1realtime/patch' + response: + mediaType: application/json + openAPIDocKey: '204' + shutdown: + operation: + $ref: '#/paths/~1config~1realtime~1shutdown/post' + response: + mediaType: application/json + openAPIDocKey: '204' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/realtime_configs/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/realtime_configs/methods/update' + delete: [] + replace: [] + sso_providers: + id: supabase.config.sso_providers + name: sso_providers + title: Sso Providers + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1config~1auth~1sso~1providers/post' + response: + mediaType: application/json + openAPIDocKey: '201' + list: + operation: + $ref: '#/paths/~1config~1auth~1sso~1providers/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.items + get: + operation: + $ref: '#/paths/~1config~1auth~1sso~1providers~1{provider_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1config~1auth~1sso~1providers~1{provider_id}/put' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1config~1auth~1sso~1providers~1{provider_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/sso_providers/methods/get' + - $ref: '#/components/x-stackQL-resources/sso_providers/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/sso_providers/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/sso_providers/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/sso_providers/methods/delete' + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/database.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/database.yaml new file mode 100644 index 0000000..2235282 --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/database.yaml @@ -0,0 +1,2910 @@ +openapi: 3.0.0 +info: + title: database API + description: Database related endpoints + version: 1.0.0 +paths: + /v1/snippets: + get: + operationId: v1-list-all-snippets + parameters: + - name: project_ref + required: false + in: query + description: Project ref + schema: + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + example: abcdefghijklmnopqrst + type: string + - name: cursor + required: false + in: query + schema: + type: string + - name: limit + required: false + in: query + schema: + type: string + minimum: 1 + maximum: 100 + - name: sort_by + required: false + in: query + schema: + enum: + - name + - inserted_at + type: string + - name: sort_order + required: false + in: query + schema: + enum: + - asc + - desc + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SnippetList' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list user's SQL snippets + security: + - bearer: [] + summary: Lists SQL snippets for the logged in user + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - snippets_read + x-oauth-scope: database:read + servers: + - url: https://api.supabase.com + /v1/snippets/{id}: + get: + operationId: v1-get-a-snippet + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 44444444-4444-4444-8444-444444444444 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SnippetResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve SQL snippet + security: + - bearer: [] + summary: Gets a specific SQL snippet + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - snippets_read + x-oauth-scope: database:read + servers: + - url: https://api.supabase.com + /jit-access: + get: + operationId: v1-get-jit-access-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + state: + type: string + enum: + - enabled + - disabled + appliedSuccessfully: + type: boolean + unavailableReason: + type: string + enum: + - postgres_upgrade_required + - ssl_enforcement_required + - temporarily_unavailable + required: + - state + - unavailableReason + additionalProperties: false + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's temporary access configuration. + security: + - bearer: [] + summary: '[Beta] Get project''s temporary access configuration.' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - security + - control-plane + x-fga-permissions: + - - project_admin_read + x-oauth-scope: database:read + put: + operationId: v1-update-jit-access-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/JitAccessRequestRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + state: + type: string + enum: + - enabled + - disabled + appliedSuccessfully: + type: boolean + unavailableReason: + type: string + enum: + - postgres_upgrade_required + - ssl_enforcement_required + - temporarily_unavailable + required: + - state + - unavailableReason + additionalProperties: false + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's temporary access configuration. + security: + - bearer: [] + summary: '[Beta] Update project''s temporary access configuration.' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - security + - control-plane + x-fga-permissions: + - - project_admin_write + x-oauth-scope: database:write + /types/typescript: + get: + description: Returns the TypeScript types of your schema for use with supabase-js. + operationId: v1-generate-typescript-types + parameters: + - name: included_schemas + required: false + in: query + schema: + default: public + example: public,auth + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/TypescriptResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to generate TypeScript types + security: + - bearer: [] + summary: Generate TypeScript types + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - database_read + x-oauth-scope: database:read + /readonly: + get: + operationId: v1-get-readonly-mode-status + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ReadOnlyStatusResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project readonly mode status + security: + - bearer: [] + summary: Returns project's readonly mode status + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + - infra + - support-tooling + x-fga-permissions: + - - database_readonly_config_read + x-oauth-scope: database:read + /readonly/temporary-disable: + post: + operationId: v1-disable-readonly-mode-temporarily + parameters: [] + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to disable project's readonly mode + security: + - bearer: [] + summary: Disables project's readonly mode for the next 15 minutes + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - control-plane + - infra + - support-tooling + x-fga-permissions: + - - database_readonly_config_write + x-oauth-scope: database:write + /cli/login-role: + post: + operationId: v1-create-login-role + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateRoleBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CreateRoleResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to create login role + security: + - bearer: [] + summary: '[Beta] Create a login role for CLI with temporary password' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - database_write + x-oauth-scope: database:write + delete: + operationId: v1-delete-login-roles + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteRolesResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to delete login roles + security: + - bearer: [] + summary: '[Beta] Delete existing login roles used by CLI' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - database_write + x-oauth-scope: database:write + /database/migrations: + get: + operationId: v1-list-migration-history + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-migration-historyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list database migrations + security: + - bearer: [] + summary: List applied migration versions + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_read + x-oauth-scope: database:read + post: + operationId: v1-apply-a-migration + parameters: + - name: Idempotency-Key + required: false + in: header + description: A unique key to ensure the same migration is tracked only once. + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1CreateMigrationBody' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to apply database migration + security: + - bearer: [] + summary: Apply a database migration + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_write + x-oauth-scope: database:write + put: + operationId: v1-upsert-a-migration + parameters: + - name: Idempotency-Key + required: false + in: header + description: A unique key to ensure the same migration is tracked only once. + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpsertMigrationBody' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to upsert database migration + security: + - bearer: [] + summary: Upsert a database migration without applying + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_write + x-oauth-scope: database:write + delete: + operationId: v1-rollback-migrations + parameters: + - name: gte + required: true + in: query + description: Rollback migrations greater or equal to this version + schema: + pattern: ^\d+$ + example: '20250312000000' + type: string + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to rollback database migration + security: + - bearer: [] + summary: Rollback database migrations and remove them from history table + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_write + x-oauth-scope: database:write + /database/migrations/{version}: + get: + operationId: v1-get-a-migration + parameters: + - name: version + required: true + in: path + schema: + pattern: ^\d+$ + example: '20250312000000' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1GetMigrationResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get database migration + security: + - bearer: [] + summary: Fetch an existing entry from migration history + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_read + x-oauth-scope: database:read + patch: + operationId: v1-patch-a-migration + parameters: + - name: version + required: true + in: path + schema: + pattern: ^\d+$ + example: '20250312000000' + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1PatchMigrationBody' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to patch database migration + security: + - bearer: [] + summary: Patch an existing entry in migration history + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_write + x-oauth-scope: database:write + /database/query: + post: + operationId: v1-run-a-query + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1RunQueryBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1RunQueryResultRows' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to run sql query + security: + - bearer: [] + summary: '[Beta] Run sql query' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - database_read + - - database_write + x-oauth-scope: database:write + /database/query/read-only: + post: + description: All entity references must be schema qualified. + operationId: v1-read-only-query + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1ReadOnlyQueryBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1RunQueryResultRows' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to run read-only sql query + security: + - bearer: [] + summary: '[Beta] Run a sql query as supabase_read_only_user' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - database_read + x-oauth-scope: database:read + /database/webhooks/enable: + post: + operationId: v1-enable-database-webhook + parameters: [] + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to enable Database Webhooks on the project + security: + - bearer: [] + summary: '[Beta] Enables Database Webhooks on the project' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - database_webhooks_config_write + x-oauth-scope: database:write + /database/context: + get: + deprecated: true + description: This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable. + operationId: v1-get-database-metadata + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GetProjectDbMetadataResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets database metadata for the given project. + tags: + - Database + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - database_read + x-oauth-scope: projects:read + /database/password: + patch: + operationId: v1-update-database-password + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdatePasswordBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdatePasswordResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update database password + security: + - bearer: [] + summary: Updates the database password + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - database_config_write + x-oauth-scope: database:write + /database/jit: + get: + description: Mappings of roles a user can assume in the project database + operationId: v1-get-jit-access + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/JitAccessResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list database jit access + security: + - bearer: [] + summary: Get user-id to role mappings for JIT access + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_read + x-oauth-scope: database:read + post: + description: Authorizes the request to assume a role in the project database + operationId: v1-authorize-jit-access + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AuthorizeJitAccessBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/JitAuthorizeAccessResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to authorize database jit access + security: + - bearer: [] + summary: Authorize user-id to role mappings for JIT access + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_read + x-oauth-scope: database:read + put: + description: Modifies the roles that can be assumed and for how long + operationId: v1-update-jit-access + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateJitAccessBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/JitAccessResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update JIT access + security: + - bearer: [] + summary: Updates a user mapping for JIT access + tags: + - Database + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_write + /database/jit/list: + get: + description: Mappings of roles a user can assume in the project database + operationId: v1-list-jit-access + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/JitListAccessResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list database jit access + security: + - bearer: [] + summary: List all user-id to role mappings for JIT access + tags: + - Database + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_write + /database/jit/invite: + post: + description: Invites the external user and sets initial roles that can be assumed and for how long + operationId: v1-invite-external-jit-access + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/InviteExternalUserJitAccessBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/InviteExternalUserJitResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to invite external user + security: + - bearer: [] + summary: Invites an external user to a database for JIT access + tags: + - Database + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_write + /database/jit/invite/accept: + post: + description: Accepts the invitation to JIT database access + operationId: v1-accept-invite-external-jit-access + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AcceptInviteExternalUserJitAccessBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/JitAccessResponse' + '500': + description: Failed to accept invitation + security: + - bearer: [] + summary: Accepts invitation for JIT database access + tags: + - Database + x-endpoint-owners: + - security + /database/jit/invite/{invite_id}: + delete: + description: Revokes and deletes the invitation + operationId: v1-delete-invite-external-jit-access + parameters: + - name: invite_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 55555555-5555-4555-8555-555555555555 + type: string + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to revoke invite for external user + security: + - bearer: [] + summary: Deletes the invite for an external user to a database for JIT access + tags: + - Database + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_write + /database/jit/{user_id}: + delete: + description: Remove JIT mappings of a user, revoking all JIT database access + operationId: v1-delete-jit-access + parameters: + - name: user_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 55555555-5555-4555-8555-555555555555 + type: string + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to remove JIT access + security: + - bearer: [] + summary: Delete JIT access by user-id + tags: + - Database + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_write + /database/openapi: + get: + description: Returns the PostgREST OpenAPI specification for the project. This is the replacement for querying `/rest/v1/` directly with the anon key. + operationId: v1-get-database-openapi + parameters: + - name: schema + required: false + in: query + description: The database schema to generate the OpenAPI spec for + schema: + default: public + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + type: string + description: (opaque JSON object) + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to fetch PostgREST OpenAPI spec + security: + - bearer: [] + summary: Get PostgREST OpenAPI spec + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - database_read + x-oauth-scope: database:read + /database/backups: + get: + operationId: v1-list-all-backups + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1BackupsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get backups + security: + - bearer: [] + summary: Lists all backups + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_read + x-oauth-scope: database:read + /database/backups/restore-pitr: + post: + operationId: v1-restore-pitr-backup + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1RestorePitrBody' + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Restores a PITR backup for a database + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_write + x-oauth-scope: database:write + /database/backups/restore-point: + post: + operationId: v1-create-restore-point + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1RestorePointPostBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1RestorePointResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Initiates a creation of a restore point for a database + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_write + x-internal: true + x-oauth-scope: database:write + get: + operationId: v1-get-restore-point + parameters: + - name: name + required: false + in: query + schema: + maxLength: 20 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1RestorePointResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get requested restore points + security: + - bearer: [] + summary: Get restore points for project + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_read + x-internal: true + x-oauth-scope: database:read + /database/backups/restore: + post: + operationId: v1-restore-physical-backup + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1RestoreBackupBody' + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Restores a physical backup for a database + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_write + x-internal: true + x-oauth-scope: database:write + /database/backups/schedule: + get: + operationId: v1-get-backup-schedule + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1BackupScheduleResponse' + '401': + description: Unauthorized + '402': + description: This feature requires the Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '403': + description: Forbidden action + '404': + description: Project or backup schedule not found + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve backup schedule + security: + - bearer: [] + summary: Gets the backup schedule for a project + tags: + - Database + x-allowed-plans: + - Enterprise + x-badges: + - name: 'OAuth scope: database:read' + position: after + - name: Only available on Enterprise + position: before + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_read + x-oauth-scope: database:read + patch: + description: Sets the time at which the daily backup runs. The change takes effect on the next backup window that includes the new time. If the new time has already passed for today, the first backup at the new time will occur the following day. It can only be updated 3 times per 24 hours. + operationId: v1-update-backup-schedule + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdateBackupScheduleBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1BackupScheduleResponse' + '400': + description: Invalid schedule_for format + '401': + description: Unauthorized + '402': + description: This feature requires the Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '403': + description: Forbidden action + '404': + description: Project or backup schedule not found + '429': + description: Rate limit exceeded + '500': + description: Failed to update backup schedule + security: + - bearer: [] + summary: Updates the backup schedule time for a project + tags: + - Database + x-allowed-plans: + - Enterprise + x-badges: + - name: 'OAuth scope: database:write' + position: after + - name: Only available on Enterprise + position: before + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_write + x-oauth-scope: database:write + /database/backups/undo: + post: + operationId: v1-undo + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UndoBody' + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Initiates an undo to a given restore point + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_write + x-internal: true + x-oauth-scope: database:write +components: + schemas: + SnippetList: + type: object + properties: + data: + type: array + items: + type: object + properties: + id: + type: string + inserted_at: + type: string + updated_at: + type: string + type: + type: string + enum: + - sql + visibility: + type: string + enum: + - user + - project + - org + - public + name: + type: string + description: + type: string + nullable: true + project: + type: object + properties: + id: + type: number + name: + type: string + required: + - id + - name + owner: + type: object + properties: + id: + type: number + username: + type: string + required: + - id + - username + updated_by: + type: object + properties: + id: + type: number + username: + type: string + required: + - id + - username + favorite: + type: boolean + required: + - id + - inserted_at + - updated_at + - type + - visibility + - name + - description + - project + - owner + - updated_by + - favorite + cursor: + type: string + required: + - data + SnippetResponse: + type: object + properties: + id: + type: string + inserted_at: + type: string + updated_at: + type: string + type: + type: string + enum: + - sql + visibility: + type: string + enum: + - user + - project + - org + - public + name: + type: string + description: + type: string + nullable: true + project: + type: object + properties: + id: + type: number + name: + type: string + required: + - id + - name + owner: + type: object + properties: + id: + type: number + username: + type: string + required: + - id + - username + updated_by: + type: object + properties: + id: + type: number + username: + type: string + required: + - id + - username + favorite: + type: boolean + content: + type: object + properties: + favorite: + deprecated: true + description: 'Deprecated: Rely on root-level favorite property instead.' + type: boolean + schema_version: + type: string + sql: + type: string + required: + - schema_version + - sql + required: + - id + - inserted_at + - updated_at + - type + - visibility + - name + - description + - project + - owner + - updated_by + - favorite + - content + JitAccessRequestRequest: + type: object + properties: + state: + type: string + enum: + - enabled + - disabled + required: + - state + example: + state: enabled + TypescriptResponse: + type: object + properties: + types: + type: string + required: + - types + ReadOnlyStatusResponse: + type: object + properties: + enabled: + type: boolean + override_enabled: + type: boolean + override_active_until: + type: string + required: + - enabled + - override_enabled + - override_active_until + CreateRoleBody: + type: object + properties: + read_only: + type: boolean + required: + - read_only + example: + read_only: true + CreateRoleResponse: + type: object + properties: + role: + type: string + minLength: 1 + password: + type: string + minLength: 1 + ttl_seconds: + type: integer + minimum: 1 + maximum: 9007199254740991 + format: int64 + required: + - role + - password + - ttl_seconds + DeleteRolesResponse: + type: object + properties: + message: + type: string + enum: + - ok + required: + - message + V1ListMigrationsResponse: + type: array + items: + type: object + properties: + version: + type: string + minLength: 1 + name: + type: string + required: + - version + V1CreateMigrationBody: + type: object + properties: + query: + type: string + minLength: 1 + name: + type: string + rollback: + type: string + required: + - query + example: + query: create table public.widgets(id bigint primary key); + name: create_widgets_table + rollback: drop table if exists public.widgets; + V1UpsertMigrationBody: + type: object + properties: + query: + type: string + minLength: 1 + name: + type: string + rollback: + type: string + required: + - query + example: + query: create table public.widgets(id bigint primary key); + name: create_widgets_table + rollback: drop table if exists public.widgets; + V1GetMigrationResponse: + type: object + properties: + version: + type: string + minLength: 1 + name: + type: string + statements: + type: array + items: + type: string + rollback: + type: array + items: + type: string + created_by: + type: string + idempotency_key: + type: string + required: + - version + V1PatchMigrationBody: + type: object + properties: + name: + type: string + rollback: + type: string + example: + name: create_widgets_table + rollback: drop table if exists public.widgets; + V1RunQueryBody: + type: object + properties: + query: + type: string + minLength: 1 + parameters: + type: array + items: {} + read_only: + type: boolean + required: + - query + example: + query: select * from pg_stat_activity limit 1; + read_only: true + V1ReadOnlyQueryBody: + type: object + properties: + query: + type: string + minLength: 1 + parameters: + type: array + items: {} + required: + - query + example: + query: select * from pg_stat_activity limit 1; + GetProjectDbMetadataResponse: + type: object + properties: + databases: + type: array + items: + type: object + properties: + name: + type: string + schemas: + type: array + items: + type: object + properties: + name: + type: string + required: + - name + additionalProperties: {} + required: + - name + - schemas + additionalProperties: {} + required: + - databases + V1UpdatePasswordBody: + type: object + properties: + password: + type: string + minLength: 4 + required: + - password + example: + password: correct-horse-battery-staple + V1UpdatePasswordResponse: + type: object + properties: + message: + type: string + required: + - message + JitAccessResponse: + type: object + properties: + user_id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + user_roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - user_roles + AuthorizeJitAccessBody: + type: object + properties: + role: + type: string + minLength: 1 + rhost: + type: string + format: ipv4 + pattern: ^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$ + required: + - role + - rhost + example: + role: postgres + rhost: 203.0.113.10 + JitAuthorizeAccessResponse: + type: object + properties: + user_id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + user_role: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - user_id + - user_role + UpdateJitAccessBody: + type: object + properties: + user_id: + type: string + minLength: 1 + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - user_id + - roles + example: + user_id: 55555555-5555-4555-8555-555555555555 + roles: + - role: postgres + expires_at: 1740787200 + allowed_networks: + allowed_cidrs: + - cidr: 203.0.113.0/24 + branches_only: false + JitListAccessResponse: + type: object + properties: + items: + type: array + items: + anyOf: + - type: object + properties: + user_id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + primary_email: + type: string + nullable: true + invite_id: + nullable: true + expires_at: + nullable: true + user_roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - user_id + - primary_email + - invite_id + - expires_at + - user_roles + - type: object + properties: + user_id: + nullable: true + primary_email: + type: string + invite_id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + expires_at: + type: string + user_roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - user_id + - primary_email + - invite_id + - expires_at + - user_roles + required: + - items + InviteExternalUserJitAccessBody: + type: object + properties: + email: + type: string + minLength: 1 + format: email + pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ + roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - email + - roles + example: + email: external-user@somedomain.xyz + roles: + - role: postgres + expires_at: 1740787200 + allowed_networks: + allowed_cidrs: + - cidr: 203.0.113.0/24 + branches_only: false + InviteExternalUserJitResponse: + type: object + properties: + email: + type: string + format: email + pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ + invite_id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + user_roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - email + - invite_id + - user_roles + AcceptInviteExternalUserJitAccessBody: + type: object + properties: + email: + type: string + minLength: 1 + format: email + pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ + token: + type: string + minLength: 1 + required: + - email + - token + example: + email: external-user@somedomain.xyz + token: '' + V1BackupsResponse: + type: object + properties: + region: + type: string + walg_enabled: + type: boolean + pitr_enabled: + type: boolean + backups: + type: array + items: + type: object + properties: + id: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + is_physical_backup: + type: boolean + status: + type: string + enum: + - COMPLETED + - FAILED + - PENDING + - REMOVED + - ARCHIVED + - CANCELLED + inserted_at: + type: string + required: + - id + - is_physical_backup + - status + - inserted_at + physical_backup_data: + type: object + properties: + earliest_physical_backup_date_unix: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + latest_physical_backup_date_unix: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + required: + - region + - walg_enabled + - pitr_enabled + - backups + - physical_backup_data + V1RestorePitrBody: + type: object + properties: + recovery_time_target_unix: + type: integer + minimum: 0 + maximum: 9007199254740991 + format: int64 + required: + - recovery_time_target_unix + example: + recovery_time_target_unix: 1740787200 + V1RestorePointPostBody: + type: object + properties: + name: + type: string + maxLength: 20 + required: + - name + example: + name: before-upgrade + V1RestorePointResponse: + type: object + properties: + name: + type: string + status: + type: string + enum: + - AVAILABLE + - PENDING + - REMOVED + - FAILED + completed_on: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + nullable: true + required: + - name + - status + - completed_on + V1RestoreBackupBody: + type: object + properties: + id: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + required: + - id + example: + id: 12345 + V1BackupScheduleResponse: + type: object + properties: + schedule_for: + type: string + pattern: ^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?$ + description: 'Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.' + example: '04:00:00' + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$ + description: Timestamp of when the backup schedule was last updated. + example: '2026-05-04T14:40:44+00:00' + required: + - schedule_for + - updated_at + PlanGateErrorBody: + type: object + properties: + message: + type: string + description: Human-readable explanation of the plan gate + error: + description: Present on entitlement denials. Other errors with this status code (validation, billing state) carry only message. + type: object + properties: + code: + type: string + description: Machine-readable marker for plan-gated denials + enum: + - entitlement_required + feature: + type: string + description: Entitlement feature key that failed the check + upgrade_url: + description: Billing page URL for the organization, present when the org is resolvable + type: string + required: + - code + - feature + required: + - message + V1UpdateBackupScheduleBody: + type: object + properties: + schedule_for: + type: string + pattern: ^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?$ + description: 'Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.' + example: '04:00:00' + required: + - schedule_for + example: + schedule_for: '04:00:00' + V1UndoBody: + type: object + properties: + name: + type: string + maxLength: 20 + required: + - name + example: + name: before-upgrade + V1RunQueryResultRows: + type: object + description: Result of a SQL statement run against the project database. The API returns a bare JSON array of row objects whose keys depend on the statement; the provider presents it as one row whose rows column carries the array (address values with json_extract). + properties: + rows: + type: array + description: The result rows as returned by Postgres, one object per row, keyed by column name. + items: + type: object + additionalProperties: true + V1-list-migration-historyResponse: + type: object + properties: + v1_list_migration_history: + type: array + items: + type: object + properties: + version: + type: string + minLength: 1 + name: + type: string + required: + - version + x-stackQL-resources: + snippets: + id: supabase.database.snippets + name: snippets + title: Snippets + methods: + list: + operation: + $ref: '#/paths/~1v1~1snippets/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.data + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.cursor + location: body + get: + operation: + $ref: '#/paths/~1v1~1snippets~1{id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/snippets/methods/get' + - $ref: '#/components/x-stackQL-resources/snippets/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + jit_access_configs: + id: supabase.database.jit_access_configs + name: jit_access_configs + title: Jit Access Configs + methods: + get: + operation: + $ref: '#/paths/~1jit-access/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1jit-access/put' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/jit_access_configs/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/jit_access_configs/methods/update' + delete: [] + replace: [] + typescript_types: + id: supabase.database.typescript_types + name: typescript_types + title: Typescript Types + methods: + get: + operation: + $ref: '#/paths/~1types~1typescript/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/typescript_types/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + readonly_mode: + id: supabase.database.readonly_mode + name: readonly_mode + title: Readonly Mode + methods: + get: + operation: + $ref: '#/paths/~1readonly/get' + response: + mediaType: application/json + openAPIDocKey: '200' + temporary_disable: + operation: + $ref: '#/paths/~1readonly~1temporary-disable/post' + response: + mediaType: application/json + openAPIDocKey: '201' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/readonly_mode/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + cli_login_roles: + id: supabase.database.cli_login_roles + name: cli_login_roles + title: Cli Login Roles + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1cli~1login-role/post' + response: + mediaType: application/json + openAPIDocKey: '201' + delete: + operation: + $ref: '#/paths/~1cli~1login-role/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: [] + insert: + - $ref: '#/components/x-stackQL-resources/cli_login_roles/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/cli_login_roles/methods/delete' + replace: [] + migrations: + id: supabase.database.migrations + name: migrations + title: Migrations + methods: + list: + operation: + $ref: '#/paths/~1database~1migrations/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_list_migration_history + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-list-migration-historyResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_list_migration_history\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1migrations/post' + response: + mediaType: application/json + openAPIDocKey: '200' + upsert: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1migrations/put' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1database~1migrations/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + get: + operation: + $ref: '#/paths/~1database~1migrations~1{version}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1migrations~1{version}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/migrations/methods/get' + - $ref: '#/components/x-stackQL-resources/migrations/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/migrations/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/migrations/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/migrations/methods/delete' + replace: [] + queries: + id: supabase.database.queries + name: queries + title: Queries + methods: + run: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1query/post' + response: + mediaType: application/json + openAPIDocKey: '201' + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1RunQueryResultRows' + transform: + body: |- + {{- $wrapped := printf "{\"rows\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + run_read_only: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1query~1read-only/post' + response: + mediaType: application/json + openAPIDocKey: '201' + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1RunQueryResultRows' + transform: + body: |- + {{- $wrapped := printf "{\"rows\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + sqlVerbs: + select: [] + insert: + - $ref: '#/components/x-stackQL-resources/queries/methods/run' + update: [] + delete: [] + replace: [] + webhooks: + id: supabase.database.webhooks + name: webhooks + title: Webhooks + methods: + enable: + operation: + $ref: '#/paths/~1database~1webhooks~1enable/post' + response: + mediaType: application/json + openAPIDocKey: '201' + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] + databases: + id: supabase.database.databases + name: databases + title: Databases + methods: + list: + operation: + $ref: '#/paths/~1database~1context/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.databases + update_password: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1password/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/databases/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + jit_role_mappings: + id: supabase.database.jit_role_mappings + name: jit_role_mappings + title: Jit Role Mappings + methods: + get: + operation: + $ref: '#/paths/~1database~1jit/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/jit_role_mappings/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + jit_access: + id: supabase.database.jit_access + name: jit_access + title: Jit Access + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1jit/post' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1jit/put' + response: + mediaType: application/json + openAPIDocKey: '200' + list: + operation: + $ref: '#/paths/~1database~1jit~1list/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.items + delete: + operation: + $ref: '#/paths/~1database~1jit~1{user_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/jit_access/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/jit_access/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/jit_access/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/jit_access/methods/delete' + replace: [] + jit_invites: + id: supabase.database.jit_invites + name: jit_invites + title: Jit Invites + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1jit~1invite/post' + response: + mediaType: application/json + openAPIDocKey: '200' + accept: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1jit~1invite~1accept/post' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1database~1jit~1invite~1{invite_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: [] + insert: + - $ref: '#/components/x-stackQL-resources/jit_invites/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/jit_invites/methods/delete' + replace: [] + backups: + id: supabase.database.backups + name: backups + title: Backups + methods: + list: + operation: + $ref: '#/paths/~1database~1backups/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.backups + restore_pitr: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1backups~1restore-pitr/post' + response: + mediaType: application/json + openAPIDocKey: '201' + restore: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1backups~1restore/post' + response: + mediaType: application/json + openAPIDocKey: '201' + undo: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1backups~1undo/post' + response: + mediaType: application/json + openAPIDocKey: '201' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/backups/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + restore_points: + id: supabase.database.restore_points + name: restore_points + title: Restore Points + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1backups~1restore-point/post' + response: + mediaType: application/json + openAPIDocKey: '201' + get: + operation: + $ref: '#/paths/~1database~1backups~1restore-point/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/restore_points/methods/get' + insert: + - $ref: '#/components/x-stackQL-resources/restore_points/methods/create' + update: [] + delete: [] + replace: [] + backup_schedules: + id: supabase.database.backup_schedules + name: backup_schedules + title: Backup Schedules + methods: + get: + operation: + $ref: '#/paths/~1database~1backups~1schedule/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1database~1backups~1schedule/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/backup_schedules/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/backup_schedules/methods/update' + delete: [] + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/domains.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/domains.yaml new file mode 100644 index 0000000..489f62b --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/domains.yaml @@ -0,0 +1,637 @@ +openapi: 3.0.0 +info: + title: domains API + description: Domains related endpoints + version: 1.0.0 +paths: + /custom-hostname: + get: + operationId: v1-get-hostname-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCustomHostnameResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's custom hostname config + security: + - bearer: [] + summary: '[Beta] Gets project''s custom hostname config' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:read' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - custom_domain_read + x-oauth-scope: domains:read + delete: + operationId: v1-Delete hostname config + parameters: + - name: remove_addon + required: false + in: query + description: If true, also removes the custom domain add-on from the project subscription. + schema: + type: string + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to delete project custom hostname configuration + security: + - bearer: [] + summary: '[Beta] Deletes a project''s custom hostname configuration' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - custom_domain_write + x-oauth-scope: domains:write + /custom-hostname/initialize: + post: + operationId: v1-update-hostname-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCustomHostnameBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCustomHostnameResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project custom hostname configuration + security: + - bearer: [] + summary: '[Beta] Updates project''s custom hostname configuration' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - custom_domain_write + x-oauth-scope: domains:write + /custom-hostname/reverify: + post: + operationId: v1-verify-dns-config + parameters: [] + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCustomHostnameResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to verify project custom hostname configuration + security: + - bearer: [] + summary: '[Beta] Attempts to verify the DNS configuration for project''s custom hostname configuration' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - custom_domain_write + x-oauth-scope: domains:write + /custom-hostname/activate: + post: + operationId: v1-activate-custom-hostname + parameters: [] + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCustomHostnameResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to activate project custom hostname configuration + security: + - bearer: [] + summary: '[Beta] Activates a custom hostname for a project.' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - custom_domain_write + x-oauth-scope: domains:write + /vanity-subdomain: + get: + operationId: v1-get-vanity-subdomain-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/VanitySubdomainConfigResponse' + '400': + description: This feature requires the Pro, Team, or Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project vanity subdomain configuration + security: + - bearer: [] + summary: '[Beta] Gets current vanity subdomain config' + tags: + - Domains + x-allowed-plans: + - Pro + - Team + - Enterprise + x-badges: + - name: 'OAuth scope: domains:read' + position: after + - name: Only available on Pro, Team, Enterprise + position: before + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - vanity_subdomain_read + x-oauth-scope: domains:read + delete: + operationId: v1-deactivate-vanity-subdomain-config + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to delete project vanity subdomain configuration + security: + - bearer: [] + summary: '[Beta] Deletes a project''s vanity subdomain configuration' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - vanity_subdomain_write + x-oauth-scope: domains:write + /vanity-subdomain/check-availability: + post: + operationId: v1-check-vanity-subdomain-availability + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/VanitySubdomainBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SubdomainAvailabilityResponse' + '400': + description: This feature requires the Pro, Team, or Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to check project vanity subdomain configuration + security: + - bearer: [] + summary: '[Beta] Checks vanity subdomain availability' + tags: + - Domains + x-allowed-plans: + - Pro + - Team + - Enterprise + x-badges: + - name: 'OAuth scope: domains:write' + position: after + - name: Only available on Pro, Team, Enterprise + position: before + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - vanity_subdomain_write + x-oauth-scope: domains:write + /vanity-subdomain/activate: + post: + operationId: v1-activate-vanity-subdomain-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/VanitySubdomainBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ActivateVanitySubdomainResponse' + '400': + description: This feature requires the Pro, Team, or Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to activate project vanity subdomain configuration + security: + - bearer: [] + summary: '[Beta] Activates a vanity subdomain for a project.' + tags: + - Domains + x-allowed-plans: + - Pro + - Team + - Enterprise + x-badges: + - name: 'OAuth scope: domains:write' + position: after + - name: Only available on Pro, Team, Enterprise + position: before + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - vanity_subdomain_write + x-oauth-scope: domains:write +components: + schemas: + UpdateCustomHostnameResponse: + type: object + properties: + status: + type: string + enum: + - 1_not_started + - 2_initiated + - 3_challenge_verified + - 4_origin_setup_completed + - 5_services_reconfigured + custom_hostname: + type: string + data: + type: object + properties: + success: + type: boolean + errors: + type: array + items: + $ref: '#/components/schemas/UpdateCustomHostnameResponseJsonValue' + messages: + type: array + items: + $ref: '#/components/schemas/UpdateCustomHostnameResponseJsonValue' + result: + type: object + properties: + id: + type: string + hostname: + type: string + ssl: + type: object + properties: + status: + type: string + validation_records: + type: array + items: + type: object + properties: + txt_name: + type: string + txt_value: + type: string + required: + - txt_name + - txt_value + validation_errors: + type: array + items: + type: object + properties: + message: + type: string + required: + - message + required: + - status + - validation_records + ownership_verification: + type: object + properties: + type: + type: string + name: + type: string + value: + type: string + required: + - type + - name + - value + custom_origin_server: + type: string + verification_errors: + type: array + items: + type: string + status: + type: string + required: + - id + - hostname + - ssl + - ownership_verification + - custom_origin_server + - status + required: + - success + - errors + - messages + - result + required: + - status + - custom_hostname + - data + UpdateCustomHostnameBody: + type: object + properties: + custom_hostname: + type: string + minLength: 1 + maxLength: 253 + required: + - custom_hostname + example: + custom_hostname: docs.example.com + VanitySubdomainConfigResponse: + type: object + properties: + status: + type: string + enum: + - not-used + - custom-domain-used + - active + custom_domain: + type: string + minLength: 1 + required: + - status + PlanGateErrorBody: + type: object + properties: + message: + type: string + description: Human-readable explanation of the plan gate + error: + description: Present on entitlement denials. Other errors with this status code (validation, billing state) carry only message. + type: object + properties: + code: + type: string + description: Machine-readable marker for plan-gated denials + enum: + - entitlement_required + feature: + type: string + description: Entitlement feature key that failed the check + upgrade_url: + description: Billing page URL for the organization, present when the org is resolvable + type: string + required: + - code + - feature + required: + - message + VanitySubdomainBody: + type: object + properties: + vanity_subdomain: + type: string + maxLength: 63 + required: + - vanity_subdomain + example: + vanity_subdomain: acme-prod + SubdomainAvailabilityResponse: + type: object + properties: + available: + type: boolean + required: + - available + ActivateVanitySubdomainResponse: + type: object + properties: + custom_domain: + type: string + required: + - custom_domain + UpdateCustomHostnameResponseJsonValue: + description: Any JSON-serializable value + anyOf: + - type: string + - type: number + - type: boolean + nullable: true + type: array + items: + $ref: '#/components/schemas/UpdateCustomHostnameResponseJsonValue' + additionalProperties: + $ref: '#/components/schemas/UpdateCustomHostnameResponseJsonValue' + x-stackQL-resources: + custom_hostnames: + id: supabase.domains.custom_hostnames + name: custom_hostnames + title: Custom Hostnames + methods: + get: + operation: + $ref: '#/paths/~1custom-hostname/get' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1custom-hostname/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + initialize: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1custom-hostname~1initialize/post' + response: + mediaType: application/json + openAPIDocKey: '201' + reverify: + operation: + $ref: '#/paths/~1custom-hostname~1reverify/post' + response: + mediaType: application/json + openAPIDocKey: '201' + activate: + operation: + $ref: '#/paths/~1custom-hostname~1activate/post' + response: + mediaType: application/json + openAPIDocKey: '201' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/custom_hostnames/methods/get' + insert: [] + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/custom_hostnames/methods/delete' + replace: [] + vanity_subdomains: + id: supabase.domains.vanity_subdomains + name: vanity_subdomains + title: Vanity Subdomains + methods: + get: + operation: + $ref: '#/paths/~1vanity-subdomain/get' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1vanity-subdomain/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + check_availability: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1vanity-subdomain~1check-availability/post' + response: + mediaType: application/json + openAPIDocKey: '201' + activate: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1vanity-subdomain~1activate/post' + response: + mediaType: application/json + openAPIDocKey: '201' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/vanity_subdomains/methods/get' + insert: [] + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/vanity_subdomains/methods/delete' + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/functions.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/functions.yaml new file mode 100644 index 0000000..2d4cccb --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/functions.yaml @@ -0,0 +1,731 @@ +openapi: 3.0.0 +info: + title: functions API + description: supabase functions API + version: 1.0.0 +paths: + /functions: + get: + description: Returns all functions you've previously added to the specified project. + operationId: v1-list-all-functions + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-functionsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's functions + security: + - bearer: [] + summary: List all functions + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:read' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_read + x-oauth-scope: edge_functions:read + post: + deprecated: true + description: This endpoint is deprecated - use the deploy endpoint. Creates a function and adds it to the specified project. + operationId: v1-create-a-function + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1CreateFunctionBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/FunctionResponse' + '401': + description: Unauthorized + '402': + description: Maximum number of functions reached for Plan + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to create project's function + security: + - bearer: [] + summary: Create a function + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_write + x-oauth-scope: edge_functions:write + put: + description: 'Bulk update functions. It will create a new function or replace existing. The operation is idempotent. NOTE: You will need to manually bump the version.' + operationId: v1-bulk-update-functions + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BulkUpdateFunctionBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BulkUpdateFunctionResponse' + '401': + description: Unauthorized + '402': + description: Maximum number of functions reached for Plan + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update functions + security: + - bearer: [] + summary: Bulk update functions + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_write + x-oauth-scope: edge_functions:write + /functions/deploy: + post: + description: A new endpoint to deploy functions. It will create if function does not exist. + operationId: v1-deploy-a-function + parameters: + - name: slug + required: false + in: query + schema: + pattern: ^[A-Za-z][A-Za-z0-9_-]*$ + example: hello-world + type: string + - name: bundleOnly + required: false + in: query + schema: + example: false + type: string + requestBody: + required: true + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/FunctionDeployBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DeployFunctionResponse' + '401': + description: Unauthorized + '402': + description: Maximum number of functions reached for Plan + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to deploy function + security: + - bearer: [] + summary: Deploy a function + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_write + x-oauth-scope: edge_functions:write + /functions/{function_slug}: + get: + description: Retrieves a function with the specified slug and project. + operationId: v1-get-a-function + parameters: + - name: function_slug + required: true + in: path + description: Function slug + schema: + pattern: ^[A-Za-z0-9_-]+$ + example: hello-world + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/FunctionSlugResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve function with given slug + security: + - bearer: [] + summary: Retrieve a function + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:read' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_read + x-oauth-scope: edge_functions:read + patch: + description: Updates a function with the specified slug and project. + operationId: v1-update-a-function + parameters: + - name: function_slug + required: true + in: path + description: Function slug + schema: + pattern: ^[A-Za-z0-9_-]+$ + example: hello-world + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdateFunctionBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/FunctionResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update function with given slug + security: + - bearer: [] + summary: Update a function + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_write + x-oauth-scope: edge_functions:write + delete: + description: Deletes a function with the specified slug from the specified project. + operationId: v1-delete-a-function + parameters: + - name: function_slug + required: true + in: path + description: Function slug + schema: + pattern: ^[A-Za-z0-9_-]+$ + example: hello-world + type: string + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to delete function with given slug + security: + - bearer: [] + summary: Delete a function + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_write + x-oauth-scope: edge_functions:write + /functions/{function_slug}/body: + get: + description: Retrieves a function body for the specified slug and project. + operationId: v1-get-a-function-body + parameters: + - name: function_slug + required: true + in: path + description: Function slug + schema: + pattern: ^[A-Za-z0-9_-]+$ + example: hello-world + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/StreamableFile' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve function body with given slug + security: + - bearer: [] + summary: Retrieve a function body + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:read' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_read + x-oauth-scope: edge_functions:read +components: + schemas: + FunctionResponse: + type: object + properties: + id: + type: string + slug: + type: string + name: + type: string + status: + type: string + enum: + - ACTIVE + - REMOVED + - THROTTLED + version: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + created_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + updated_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + verify_jwt: + type: boolean + import_map: + type: boolean + entrypoint_path: + type: string + import_map_path: + type: string + ezbr_sha256: + type: string + required: + - id + - slug + - name + - status + - version + - created_at + - updated_at + V1CreateFunctionBody: + type: object + properties: + slug: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_-]*$ + name: + type: string + body: + type: string + verify_jwt: + type: boolean + required: + - slug + - name + - body + example: + slug: hello-world + name: Hello World + body: Deno.serve(() => new Response('Hello, world!')) + verify_jwt: true + BulkUpdateFunctionBody: + type: array + items: + type: object + properties: + id: + type: string + slug: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_-]*$ + name: + type: string + status: + type: string + enum: + - ACTIVE + - REMOVED + - THROTTLED + version: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + created_at: + type: integer + format: int64 + minimum: -9007199254740991 + maximum: 9007199254740991 + verify_jwt: + type: boolean + import_map: + type: boolean + entrypoint_path: + type: string + import_map_path: + type: string + ezbr_sha256: + type: string + required: + - id + - slug + - name + - status + - version + example: + - id: 3c078cce-ad70-4148-9f37-4da362789053 + slug: hello-world + name: Hello World + status: ACTIVE + version: 2 + verify_jwt: true + entrypoint_path: index.ts + BulkUpdateFunctionResponse: + type: object + properties: + functions: + type: array + items: + type: object + properties: + id: + type: string + slug: + type: string + name: + type: string + status: + type: string + enum: + - ACTIVE + - REMOVED + - THROTTLED + version: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + created_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + updated_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + verify_jwt: + type: boolean + import_map: + type: boolean + entrypoint_path: + type: string + import_map_path: + type: string + ezbr_sha256: + type: string + required: + - id + - slug + - name + - status + - version + - created_at + - updated_at + required: + - functions + FunctionDeployBody: + type: object + properties: + file: + type: array + items: + type: string + format: binary + metadata: + type: object + properties: + entrypoint_path: + type: string + import_map_path: + type: string + static_patterns: + type: array + items: + type: string + verify_jwt: + type: boolean + name: + type: string + required: + - entrypoint_path + required: + - file + - metadata + example: + file: + - ./supabase/functions/hello-world/index.ts + metadata: + entrypoint_path: index.ts + verify_jwt: true + name: Hello World + DeployFunctionResponse: + type: object + properties: + id: + type: string + slug: + type: string + name: + type: string + status: + type: string + enum: + - ACTIVE + - REMOVED + - THROTTLED + version: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + created_at: + type: integer + format: int64 + minimum: -9007199254740991 + maximum: 9007199254740991 + updated_at: + type: integer + format: int64 + minimum: -9007199254740991 + maximum: 9007199254740991 + verify_jwt: + type: boolean + import_map: + type: boolean + entrypoint_path: + type: string + import_map_path: + type: string + ezbr_sha256: + type: string + required: + - id + - slug + - name + - status + - version + FunctionSlugResponse: + type: object + properties: + id: + type: string + slug: + type: string + name: + type: string + status: + type: string + enum: + - ACTIVE + - REMOVED + - THROTTLED + version: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + created_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + updated_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + verify_jwt: + type: boolean + import_map: + type: boolean + entrypoint_path: + type: string + import_map_path: + type: string + ezbr_sha256: + type: string + required: + - id + - slug + - name + - status + - version + - created_at + - updated_at + V1UpdateFunctionBody: + type: object + properties: + name: + type: string + body: + type: string + verify_jwt: + type: boolean + example: + name: Hello World + body: Deno.serve(() => new Response('Hello again!')) + verify_jwt: true + StreamableFile: + type: object + properties: {} + V1-list-all-functionsResponse: + type: object + properties: + v1_list_all_functions: + type: array + items: + $ref: '#/components/schemas/FunctionResponse' + x-stackQL-resources: + edge_functions: + id: supabase.functions.edge_functions + name: edge_functions + title: Edge Functions + methods: + list: + operation: + $ref: '#/paths/~1functions/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_list_all_functions + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-list-all-functionsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_list_all_functions\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1functions/post' + response: + mediaType: application/json + openAPIDocKey: '201' + get: + operation: + $ref: '#/paths/~1functions~1{function_slug}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1functions~1{function_slug}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1functions~1{function_slug}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/edge_functions/methods/get' + - $ref: '#/components/x-stackQL-resources/edge_functions/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/edge_functions/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/edge_functions/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/edge_functions/methods/delete' + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/network.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/network.yaml new file mode 100644 index 0000000..afbf9d9 --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/network.yaml @@ -0,0 +1,519 @@ +openapi: 3.0.0 +info: + title: network API + description: supabase network API + version: 1.0.0 +paths: + /network-bans/retrieve: + post: + operationId: v1-list-all-network-bans + parameters: [] + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkBanResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's network bans + security: + - bearer: [] + summary: '[Beta] Gets project''s network bans' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - database_network_bans_read + x-oauth-scope: projects:read + /network-bans/retrieve/enriched: + post: + operationId: v1-list-all-network-bans-enriched + parameters: [] + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkBanResponseEnriched' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's enriched network bans + security: + - bearer: [] + summary: '[Beta] Gets project''s network bans with additional information about which databases they affect' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - database_network_bans_read + x-oauth-scope: projects:read + /network-bans: + delete: + operationId: v1-delete-network-bans + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RemoveNetworkBanRequest' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to remove network bans. + security: + - bearer: [] + summary: '[Beta] Remove network bans.' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - database_network_bans_write + x-oauth-scope: projects:write + /network-restrictions: + get: + operationId: v1-get-network-restrictions + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkRestrictionsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's network restrictions + security: + - bearer: [] + summary: '[Beta] Gets project''s network restrictions' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_network_restrictions_read + x-oauth-scope: projects:read + patch: + operationId: v1-patch-network-restrictions + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkRestrictionsPatchRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkRestrictionsV2Response' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project network restrictions + security: + - bearer: [] + summary: '[Alpha] Updates project''s network restrictions by adding or removing CIDRs' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_network_restrictions_write + x-oauth-scope: projects:write + /network-restrictions/apply: + post: + operationId: v1-update-network-restrictions + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkRestrictionsRequest' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkRestrictionsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project network restrictions + security: + - bearer: [] + summary: '[Beta] Updates project''s network restrictions' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_network_restrictions_write + x-oauth-scope: projects:write +components: + schemas: + NetworkBanResponse: + type: object + properties: + banned_ipv4_addresses: + type: array + items: + type: string + required: + - banned_ipv4_addresses + NetworkBanResponseEnriched: + type: object + properties: + banned_ipv4_addresses: + type: array + items: + type: object + properties: + banned_address: + type: string + identifier: + type: string + type: + type: string + required: + - banned_address + - identifier + - type + required: + - banned_ipv4_addresses + RemoveNetworkBanRequest: + type: object + properties: + ipv4_addresses: + type: array + items: + type: string + description: List of IP addresses to unban. + requester_ip: + default: false + description: Include requester's public IP in the list of addresses to unban. + type: boolean + identifier: + type: string + required: + - ipv4_addresses + example: + ipv4_addresses: + - 203.0.113.10 + requester_ip: false + NetworkRestrictionsResponse: + type: object + properties: + entitlement: + type: string + enum: + - disallowed + - allowed + config: + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: string + dbAllowedCidrsV6: + type: array + items: + type: string + example: + dbAllowedCidrs: + - 203.0.113.0/24 + dbAllowedCidrsV6: + - 2001:db8::/32 + description: At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`. + old_config: + description: Populated when a new config has been received, but not registered as successfully applied to a project. + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: string + dbAllowedCidrsV6: + type: array + items: + type: string + example: + dbAllowedCidrs: + - 203.0.113.0/24 + dbAllowedCidrsV6: + - 2001:db8::/32 + status: + type: string + enum: + - stored + - applied + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + applied_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + required: + - entitlement + - config + - status + NetworkRestrictionsPatchRequest: + type: object + properties: + add: + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: string + dbAllowedCidrsV6: + type: array + items: + type: string + remove: + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: string + dbAllowedCidrsV6: + type: array + items: + type: string + example: + add: + dbAllowedCidrs: + - 203.0.113.0/24 + remove: + dbAllowedCidrs: + - 198.51.100.0/24 + NetworkRestrictionsV2Response: + type: object + properties: + entitlement: + type: string + enum: + - disallowed + - allowed + config: + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: object + properties: + address: + type: string + type: + type: string + enum: + - v4 + - v6 + required: + - address + - type + description: At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`. + old_config: + description: Populated when a new config has been received, but not registered as successfully applied to a project. + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: object + properties: + address: + type: string + type: + type: string + enum: + - v4 + - v6 + required: + - address + - type + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + applied_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + status: + type: string + enum: + - stored + - applied + required: + - entitlement + - config + - status + NetworkRestrictionsRequest: + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: string + dbAllowedCidrsV6: + type: array + items: + type: string + example: + dbAllowedCidrs: + - 203.0.113.0/24 + dbAllowedCidrsV6: + - 2001:db8::/32 + x-stackQL-resources: + network_bans: + id: supabase.network.network_bans + name: network_bans + title: Network Bans + methods: + retrieve: + operation: + $ref: '#/paths/~1network-bans~1retrieve/post' + response: + mediaType: application/json + openAPIDocKey: '201' + list: + operation: + $ref: '#/paths/~1network-bans~1retrieve~1enriched/post' + response: + mediaType: application/json + openAPIDocKey: '201' + objectKey: $.banned_ipv4_addresses + delete: + operation: + $ref: '#/paths/~1network-bans/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + config: + requestBodyTranslate: + algorithm: naive + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/network_bans/methods/list' + insert: [] + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/network_bans/methods/delete' + replace: [] + network_restrictions: + id: supabase.network.network_restrictions + name: network_restrictions + title: Network Restrictions + methods: + get: + operation: + $ref: '#/paths/~1network-restrictions/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1network-restrictions/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + apply: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1network-restrictions~1apply/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/network_restrictions/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/network_restrictions/methods/update' + delete: [] + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/organizations.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/organizations.yaml new file mode 100644 index 0000000..27fb383 --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/organizations.yaml @@ -0,0 +1,736 @@ +openapi: 3.0.0 +info: + title: organizations API + description: Organizations related endpoints + version: 1.0.0 +paths: + /v1/organizations: + get: + description: Returns a list of organizations that you currently belong to. + operationId: v1-list-all-organizations + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-organizationsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Unexpected error listing organizations + security: + - bearer: [] + summary: List all organizations + tags: + - Organizations + x-badges: + - name: 'OAuth scope: organizations:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organizations_read + x-oauth-scope: organizations:read + post: + operationId: v1-create-an-organization + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateOrganizationV1' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponseV1' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Unexpected error creating an organization + security: + - bearer: [] + summary: Create an organization + tags: + - Organizations + x-endpoint-owners: + - control-plane + - billing + x-fga-permissions: + - - organizations_create + servers: + - url: https://api.supabase.com + /v1/organizations/{slug}/entitlements: + get: + description: Returns the entitlements available to the organization based on their plan and any overrides. + operationId: v1-get-organization-entitlements + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ListEntitlementsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get entitlements for an organization + tags: + - Organizations + x-badges: + - name: 'OAuth scope: organizations:read' + position: after + x-endpoint-owners: + - billing + x-fga-permissions: + - - organization_admin_read + x-oauth-scope: organizations:read + servers: + - url: https://api.supabase.com + /v1/organizations/{slug}/members: + get: + operationId: v1-list-organization-members + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-organization-membersResponse' + security: + - bearer: [] + summary: List members of an organization + tags: + - Organizations + x-badges: + - name: 'OAuth scope: organizations:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - members_read + x-oauth-scope: organizations:read + servers: + - url: https://api.supabase.com + /v1/organizations/{slug}: + get: + operationId: v1-get-an-organization + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1OrganizationSlugResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets information about the organization + tags: + - Organizations + x-badges: + - name: 'OAuth scope: organizations:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_admin_read + x-oauth-scope: organizations:read + servers: + - url: https://api.supabase.com + /v1/organizations/{slug}/project-claim/{token}: + get: + operationId: v1-get-organization-project-claim + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + - name: token + required: true + in: path + schema: + example: 0123456789abcdef0123456789abcdef01234567 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationProjectClaimResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets project details for the specified organization and claim token + tags: + - Organizations + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_admin_write + x-internal: true + post: + operationId: v1-claim-project-for-organization + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + - name: token + required: true + in: path + schema: + example: 0123456789abcdef0123456789abcdef01234567 + type: string + responses: + '204': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Claims project for the specified organization + tags: + - Organizations + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_admin_write + x-internal: true + servers: + - url: https://api.supabase.com +components: + schemas: + OrganizationResponseV1: + type: object + properties: + id: + type: string + description: 'Deprecated: Use `slug` instead.' + deprecated: true + slug: + type: string + pattern: ^[\w-]+$ + description: Organization slug + example: tsrqponmlkjihgfedcba + name: + type: string + required: + - id + - slug + - name + CreateOrganizationV1: + type: object + properties: + name: + type: string + maxLength: 256 + required: + - name + example: + name: Acme + additionalProperties: false + V1ListEntitlementsResponse: + type: object + properties: + entitlements: + type: array + items: + type: object + properties: + feature: + type: object + properties: + key: + type: string + enum: + - instances.compute_update_available_sizes + - instances.read_replicas + - instances.disk_modifications + - instances.high_availability + - instances.orioledb + - replication.etl + - storage.max_file_size + - storage.max_file_size.configurable + - storage.image_transformations + - storage.vector_buckets + - storage.iceberg_catalog + - storage.purge_cache + - security.audit_logs_days + - security.questionnaire + - security.soc2_report + - security.iso27001_certificate + - security.private_link + - security.enforce_mfa + - log.retention_days + - custom_domain + - vanity_subdomain + - ipv4 + - pitr.available_variants + - log_drains + - audit_log_drains + - branching_limit + - branching_persistent + - auth.mfa_phone + - auth.mfa_web_authn + - auth.mfa_enhanced_security + - auth.hooks + - auth.platform.sso + - auth.custom_jwt_template + - auth.saml_2 + - auth.user_sessions + - auth.leaked_password_protection + - auth.advanced_auth_settings + - auth.performance_settings + - auth.password_hibp + - auth.custom_oauth.max_providers + - backup.retention_days + - backup.restore_to_new_project + - backup.schedule + - function.max_count + - function.size_limit_mb + - realtime.max_concurrent_users + - realtime.max_events_per_second + - realtime.max_joins_per_second + - realtime.max_channels_per_client + - realtime.max_bytes_per_second + - realtime.max_presence_events_per_second + - realtime.max_payload_size_in_kb + - project_scoped_roles + - security.member_roles + - project_pausing + - project_cloning + - project_restore_after_expiry + - assistant.advance_model + - integrations.github_connections + - integrations.github_push_webhooks_limit + - dedicated_pooler + - observability.dashboard_advanced_metrics + - api.members.invitations + - api.members.roles + type: + type: string + enum: + - boolean + - numeric + - set + required: + - key + - type + hasAccess: + type: boolean + type: + type: string + enum: + - boolean + - numeric + - set + config: + anyOf: + - type: object + properties: + enabled: + type: boolean + required: + - enabled + - type: object + properties: + enabled: + type: boolean + value: + type: number + unlimited: + type: boolean + unit: + type: string + required: + - enabled + - value + - unlimited + - unit + - type: object + properties: + enabled: + type: boolean + set: + type: array + items: + type: string + required: + - enabled + - set + required: + - feature + - hasAccess + - type + - config + required: + - entitlements + V1OrganizationMemberResponse: + type: object + properties: + user_id: + type: string + user_name: + type: string + email: + type: string + role_name: + type: string + mfa_enabled: + type: boolean + avatar_url: + type: string + nullable: true + required: + - user_id + - user_name + - role_name + - mfa_enabled + - avatar_url + V1OrganizationSlugResponse: + type: object + properties: + id: + type: string + name: + type: string + plan: + type: string + enum: + - free + - pro + - team + - enterprise + - platform + opt_in_tags: + type: array + items: + enum: + - AI_SQL_GENERATOR_OPT_IN + - AI_DATA_GENERATOR_OPT_IN + - AI_LOG_GENERATOR_OPT_IN + allowed_release_channels: + type: array + items: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + required: + - id + - name + - opt_in_tags + - allowed_release_channels + OrganizationProjectClaimResponse: + type: object + properties: + project: + type: object + properties: + ref: + type: string + name: + type: string + required: + - ref + - name + preview: + type: object + properties: + valid: + type: boolean + warnings: + type: array + items: + type: object + properties: + key: + type: string + message: + type: string + required: + - key + - message + errors: + type: array + items: + type: object + properties: + key: + type: string + message: + type: string + required: + - key + - message + info: + type: array + items: + type: object + properties: + key: + type: string + message: + type: string + required: + - key + - message + members_exceeding_free_project_limit: + type: array + items: + type: object + properties: + name: + type: string + limit: + type: number + required: + - name + - limit + source_subscription_plan: + type: string + enum: + - free + - pro + - team + - enterprise + - platform + target_subscription_plan: + type: string + enum: + - free + - pro + - team + - enterprise + - platform + - null + nullable: true + required: + - valid + - warnings + - errors + - info + - members_exceeding_free_project_limit + - source_subscription_plan + - target_subscription_plan + expires_at: + type: string + created_at: + type: string + created_by: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + required: + - project + - preview + - expires_at + - created_at + - created_by + V1-list-all-organizationsResponse: + type: object + properties: + v1_list_all_organizations: + type: array + items: + $ref: '#/components/schemas/OrganizationResponseV1' + V1-list-organization-membersResponse: + type: object + properties: + v1_list_organization_members: + type: array + items: + $ref: '#/components/schemas/V1OrganizationMemberResponse' + x-stackQL-resources: + organizations: + id: supabase.organizations.organizations + name: organizations + title: Organizations + methods: + list: + operation: + $ref: '#/paths/~1v1~1organizations/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_list_all_organizations + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-list-all-organizationsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_list_all_organizations\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1organizations/post' + response: + mediaType: application/json + openAPIDocKey: '201' + get: + operation: + $ref: '#/paths/~1v1~1organizations~1{slug}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/organizations/methods/get' + - $ref: '#/components/x-stackQL-resources/organizations/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/organizations/methods/create' + update: [] + delete: [] + replace: [] + entitlements: + id: supabase.organizations.entitlements + name: entitlements + title: Entitlements + methods: + get: + operation: + $ref: '#/paths/~1v1~1organizations~1{slug}~1entitlements/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/entitlements/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + members: + id: supabase.organizations.members + name: members + title: Members + methods: + list: + operation: + $ref: '#/paths/~1v1~1organizations~1{slug}~1members/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_list_organization_members + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-list-organization-membersResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_list_organization_members\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/members/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + project_claims: + id: supabase.organizations.project_claims + name: project_claims + title: Project Claims + methods: + get: + operation: + $ref: '#/paths/~1v1~1organizations~1{slug}~1project-claim~1{token}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + claim: + operation: + $ref: '#/paths/~1v1~1organizations~1{slug}~1project-claim~1{token}/post' + response: + mediaType: application/json + openAPIDocKey: '204' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/project_claims/methods/get' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/profile.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/profile.yaml new file mode 100644 index 0000000..97b9ecf --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/profile.yaml @@ -0,0 +1,66 @@ +openapi: 3.0.0 +info: + title: profile API + description: supabase profile API + version: 1.0.0 +paths: + /v1/profile: + get: + operationId: v1-get-profile + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProfileResponse' + security: + - bearer: [] + summary: Gets the user's profile + tags: + - Profile + x-endpoint-owners: + - control-plane + servers: + - url: https://api.supabase.com +components: + schemas: + V1ProfileResponse: + type: object + properties: + gotrue_id: + type: string + primary_email: + type: string + username: + type: string + required: + - gotrue_id + - primary_email + - username + x-stackQL-resources: + profiles: + id: supabase.profile.profiles + name: profiles + title: Profiles + methods: + get: + operation: + $ref: '#/paths/~1v1~1profile/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/profiles/methods/get' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/projects.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/projects.yaml new file mode 100644 index 0000000..469ff40 --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/projects.yaml @@ -0,0 +1,2572 @@ +openapi: 3.0.0 +info: + title: projects API + description: Projects related endpoints + version: 1.0.0 +paths: + /v1/projects: + get: + description: Returns a list of all projects you've previously created. + operationId: v1-list-all-projects + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-projectsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: List all projects + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - projects_read + x-oauth-scope: projects:read + post: + operationId: v1-create-a-project + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1CreateProjectBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Create a project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - organization_projects_create + x-oauth-scope: projects:write + servers: + - url: https://api.supabase.com + /v1/projects/available-regions: + get: + operationId: v1-get-available-regions + parameters: + - name: organization_slug + required: true + in: query + description: Slug of your organization + schema: + example: tsrqponmlkjihgfedcba + type: string + - name: continent + required: false + in: query + description: 'Continent code to determine regional recommendations: NA (North America), SA (South America), EU (Europe), AF (Africa), AS (Asia), OC (Oceania), AN (Antarctica)' + schema: + example: NA + type: string + enum: + - NA + - SA + - EU + - AF + - AS + - OC + - AN + - name: desired_instance_size + required: false + in: query + description: Desired instance size. Omit this field to always default to the smallest possible size. + schema: + type: string + enum: + - nano + - micro + - small + - medium + - large + - xlarge + - 2xlarge + - 4xlarge + - 8xlarge + - 12xlarge + - 16xlarge + - 24xlarge + - 24xlarge_optimized_memory + - 24xlarge_optimized_cpu + - 24xlarge_high_memory + - 48xlarge + - 48xlarge_optimized_memory + - 48xlarge_optimized_cpu + - 48xlarge_high_memory + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/RegionsInfo' + security: + - bearer: [] + summary: '[Beta] Gets the list of available regions that can be used for a new project' + tags: + - Projects + x-badges: + - name: 'OAuth scope: organizations:read' + position: after + x-endpoint-owners: + - infra + x-oauth-scope: organizations:read + servers: + - url: https://api.supabase.com + /v1/projects/{ref}: + get: + operationId: v1-get-project + parameters: + - name: ref + required: true + in: path + description: Project ref + schema: + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + example: abcdefghijklmnopqrst + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectWithDatabaseResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project + security: + - bearer: [] + summary: Gets a specific project that belongs to the authenticated user + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - project_admin_read + x-oauth-scope: projects:read + delete: + operationId: v1-delete-a-project + parameters: + - name: ref + required: true + in: path + description: Project ref + schema: + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + example: abcdefghijklmnopqrst + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectRefResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Deletes the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + - dev-workflows + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + patch: + operationId: v1-update-a-project + parameters: + - name: ref + required: true + in: path + description: Project ref + schema: + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + example: abcdefghijklmnopqrst + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdateProjectBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectRefResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project + security: + - bearer: [] + summary: Updates the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + servers: + - url: https://api.supabase.com + /upgrade: + post: + operationId: v1-upgrade-postgres-version + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpgradeDatabaseBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectUpgradeInitiateResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to initiate project upgrade + security: + - bearer: [] + summary: '[Beta] Upgrades the project''s Postgres version' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_write + - database_write + x-oauth-scope: projects:write + /upgrade/eligibility: + get: + operationId: v1-get-postgres-upgrade-eligibility + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectUpgradeEligibilityResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to determine project upgrade eligibility + security: + - bearer: [] + summary: '[Beta] Returns the project''s eligibility for upgrades' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_read + - database_read + x-oauth-scope: projects:read + /upgrade/status: + get: + operationId: v1-get-postgres-upgrade-status + parameters: + - name: tracking_id + required: false + in: query + schema: + example: 9f4d3a20-6b2e-4a7e-8c91-1d5f3e7a2b4c + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseUpgradeStatusResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project upgrade status + security: + - bearer: [] + summary: '[Beta] Gets the latest status of the project''s upgrade' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_read + - database_read + x-oauth-scope: projects:read + /read-replicas/setup: + post: + operationId: v1-setup-a-read-replica + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SetUpReadReplicaBody' + responses: + '204': + description: '' + '401': + description: Unauthorized + '402': + description: This feature requires the Pro, Team, or Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to set up read replica + security: + - bearer: [] + summary: '[Beta] Set up a read replica' + tags: + - Database + x-allowed-plans: + - Pro + - Team + - Enterprise + x-badges: + - name: Only available on Pro, Team, Enterprise + position: before + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_read_replicas_write + /read-replicas/remove: + post: + operationId: v1-remove-a-read-replica + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RemoveReadReplicaBody' + responses: + '204': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to remove read replica + security: + - bearer: [] + summary: '[Beta] Remove a read replica' + tags: + - Database + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_read_replicas_write + /health: + get: + operationId: v1-get-services-health + parameters: + - name: services + required: true + in: query + description: Comma-separated list of enums or array of enums. + schema: + example: + - auth,db + - auth + anyOf: + - type: string + description: |- + Comma-separated list of enums: + + - `auth` + - `db` + - `db_postgres_user` + - `pooler` + - `realtime` + - `rest` + - `storage` + - `pg_bouncer` + example: + - auth,db + - auth + - type: array + items: + type: string + enum: + - auth + - db + - db_postgres_user + - pooler + - realtime + - rest + - storage + - pg_bouncer + description: Array of enums. + example: + - '{field}=auth&{field}=db' + - '{field}=auth' + - name: timeout_ms + required: false + in: query + schema: + minimum: 0 + maximum: 10000 + example: 2000 + type: integer + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-get-services-healthResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's service health status + security: + - bearer: [] + summary: Gets project's service health status + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_read + x-oauth-scope: projects:read + /pause: + post: + operationId: v1-pause-a-project + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Pauses the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + /restart: + post: + operationId: v1-restart-a-project + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Restarts the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + /restore: + get: + operationId: v1-list-available-restore-versions + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GetProjectAvailableRestoreVersionsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Lists available restore versions for the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_read + x-oauth-scope: projects:read + post: + operationId: v1-restore-a-project + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Restores the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + /restore/cancel: + post: + operationId: v1-cancel-a-project-restoration + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Cancels the given project restoration + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + /claim-token: + get: + operationId: v1-get-project-claim-token + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectClaimTokenResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets project claim token + tags: + - Projects + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - project_admin_read + x-internal: true + post: + operationId: v1-create-project-claim-token + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CreateProjectClaimTokenResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Creates project claim token + tags: + - Projects + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_admin_write + - project_admin_write + x-internal: true + delete: + operationId: v1-delete-project-claim-token + parameters: [] + responses: + '204': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Revokes project claim token + tags: + - Projects + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_admin_write + - project_admin_write + x-internal: true + /config/disk: + get: + operationId: v1-get-database-disk + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DiskResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get database disk attributes + security: + - bearer: [] + summary: Get database disk attributes + tags: + - Projects + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_disk_config_read + post: + operationId: v1-modify-database-disk + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/DiskRequestBody' + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to modify database disk + security: + - bearer: [] + summary: Modify database disk + tags: + - Projects + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_disk_config_write + /config/disk/util: + get: + operationId: v1-get-disk-utilization + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DiskUtilMetricsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get disk utilization + security: + - bearer: [] + summary: Get disk utilization + tags: + - Projects + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_disk_config_read + /config/disk/autoscale: + get: + operationId: v1-get-project-disk-autoscale-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DiskAutoscaleConfig' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project disk autoscale config + security: + - bearer: [] + summary: Gets project disk autoscale config + tags: + - Projects + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_disk_config_read + /v1/organizations/{slug}/projects: + get: + description: |- + Returns a paginated list of projects for the specified organization. + + This endpoint uses offset-based pagination. Use the `offset` parameter to skip a number of projects and the `limit` parameter to control the number of projects returned per page. + operationId: v1-get-all-projects-for-organization + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + - name: offset + required: false + in: query + description: Number of projects to skip + schema: + minimum: 0 + maximum: 9007199254740991 + default: 0 + example: 0 + type: integer + - name: limit + required: false + in: query + description: Number of projects to return per page + schema: + minimum: 1 + maximum: 100 + default: 100 + example: 20 + type: integer + - name: search + required: false + in: query + description: Search projects by name + schema: + example: acme + type: string + - name: sort + required: false + in: query + description: Sort order for projects + schema: + default: name_asc + example: created_desc + type: string + enum: + - name_asc + - name_desc + - created_asc + - created_desc + - name: statuses + required: false + in: query + description: |- + A comma-separated list of project statuses to filter by. + + The following values are supported: `ACTIVE_HEALTHY`, `INACTIVE`. + schema: + example: ACTIVE_HEALTHY,INACTIVE + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationProjectsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve projects + security: + - bearer: [] + summary: Gets all projects for the given organization + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_projects_read + x-oauth-scope: projects:read + servers: + - url: https://api.supabase.com +components: + schemas: + V1ProjectWithDatabaseResponse: + type: object + properties: + id: + type: string + deprecated: true + description: 'Deprecated: Use `ref` instead.' + ref: + type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + organization_id: + type: string + description: 'Deprecated: Use `organization_slug` instead.' + deprecated: true + organization_slug: + type: string + pattern: ^[\w-]+$ + description: Organization slug + example: tsrqponmlkjihgfedcba + name: + type: string + description: Name of your project + region: + type: string + description: Region of your project + created_at: + type: string + description: Creation timestamp + status: + type: string + enum: + - INACTIVE + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - UNKNOWN + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UPGRADING + - PAUSING + - RESTORE_FAILED + - RESTARTING + - PAUSE_FAILED + - RESIZING + database: + type: object + properties: + host: + type: string + description: Database host + version: + type: string + description: Database version + postgres_engine: + type: string + description: Database engine + release_channel: + type: string + description: Release channel + required: + - host + - version + - postgres_engine + - release_channel + required: + - id + - ref + - organization_id + - organization_slug + - name + - region + - created_at + - status + - database + V1CreateProjectBody: + type: object + properties: + db_pass: + type: string + description: Database password + name: + type: string + maxLength: 256 + description: Name of your project + organization_id: + deprecated: true + description: 'Deprecated: Use `organization_slug` instead.' + type: string + organization_slug: + type: string + pattern: ^[\w-]+$ + description: Organization slug + example: tsrqponmlkjihgfedcba + plan: + deprecated: true + description: Subscription Plan is now set on organization level and is ignored in this request + type: string + enum: + - free + - pro + region: + description: Region you want your server to reside in. Use region_selection instead. + deprecated: true + enum: + - us-east-1 + - us-east-2 + - us-west-1 + - us-west-2 + - ap-east-1 + - ap-southeast-1 + - ap-northeast-1 + - ap-northeast-2 + - ap-southeast-2 + - eu-west-1 + - eu-west-2 + - eu-west-3 + - eu-north-1 + - eu-central-1 + - eu-central-2 + - ca-central-1 + - ap-south-1 + - sa-east-1 + type: string + region_selection: + description: Region selection. Only one of region or region_selection can be specified. + type: object + properties: + type: + type: string + enum: + - specific + code: + type: string + description: Specific region code. The codes supported are not a stable API, and should be retrieved from the /available-regions endpoint. + enum: + - us-east-1 + - us-east-2 + - us-west-1 + - us-west-2 + - ap-east-1 + - ap-southeast-1 + - ap-northeast-1 + - ap-northeast-2 + - ap-southeast-2 + - eu-west-1 + - eu-west-2 + - eu-west-3 + - eu-north-1 + - eu-central-1 + - eu-central-2 + - ca-central-1 + - ap-south-1 + - sa-east-1 + required: + - type + - code + kps_enabled: + deprecated: true + description: This field is deprecated and is ignored in this request + type: boolean + desired_instance_size: + description: Desired instance size. Omit this field to always default to the smallest possible size. + type: string + enum: + - nano + - micro + - small + - medium + - large + - xlarge + - 2xlarge + - 4xlarge + - 8xlarge + - 12xlarge + - 16xlarge + - 24xlarge + - 24xlarge_optimized_memory + - 24xlarge_optimized_cpu + - 24xlarge_high_memory + - 48xlarge + - 48xlarge_optimized_memory + - 48xlarge_optimized_cpu + - 48xlarge_high_memory + template_url: + description: Template URL used to create the project from the CLI. + type: string + format: uri + release_channel: + deprecated: true + nullable: true + postgres_engine: + deprecated: true + nullable: true + high_availability: + description: '[Experimental] Whether to enable high availability for the project.' + type: boolean + required: + - db_pass + - name + - organization_slug + example: + db_pass: correct-horse-battery-staple + name: acme-prod + organization_slug: tsrqponmlkjihgfedcba + region: us-east-1 + additionalProperties: false + V1ProjectResponse: + type: object + properties: + id: + type: string + deprecated: true + description: 'Deprecated: Use `ref` instead.' + ref: + type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + organization_id: + type: string + description: 'Deprecated: Use `organization_slug` instead.' + deprecated: true + organization_slug: + type: string + pattern: ^[\w-]+$ + description: Organization slug + example: tsrqponmlkjihgfedcba + name: + type: string + description: Name of your project + region: + type: string + description: Region of your project + created_at: + type: string + description: Creation timestamp + status: + type: string + enum: + - INACTIVE + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - UNKNOWN + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UPGRADING + - PAUSING + - RESTORE_FAILED + - RESTARTING + - PAUSE_FAILED + - RESIZING + required: + - id + - ref + - organization_id + - organization_slug + - name + - region + - created_at + - status + RegionsInfo: + type: object + properties: + recommendations: + type: object + properties: + smartGroup: + type: object + properties: + name: + type: string + code: + type: string + enum: + - americas + - emea + - apac + type: + type: string + enum: + - smartGroup + required: + - name + - code + - type + specific: + type: array + items: + type: object + properties: + name: + type: string + code: + type: string + enum: + - us-east-1 + - us-east-2 + - us-west-1 + - us-west-2 + - ap-southeast-1 + - ap-northeast-1 + - ap-northeast-2 + - ap-east-1 + - ap-southeast-2 + - eu-west-1 + - eu-west-2 + - eu-west-3 + - eu-north-1 + - eu-central-1 + - eu-central-2 + - ca-central-1 + - ap-south-1 + - sa-east-1 + type: + type: string + enum: + - specific + provider: + type: string + enum: + - AWS + - AWS_K8S + - AWS_NIMBUS + status: + type: string + enum: + - capacity + - other + required: + - name + - code + - type + - provider + required: + - smartGroup + - specific + all: + type: object + properties: + smartGroup: + type: array + items: + type: object + properties: + name: + type: string + code: + type: string + enum: + - americas + - emea + - apac + type: + type: string + enum: + - smartGroup + required: + - name + - code + - type + specific: + type: array + items: + type: object + properties: + name: + type: string + code: + type: string + enum: + - us-east-1 + - us-east-2 + - us-west-1 + - us-west-2 + - ap-southeast-1 + - ap-northeast-1 + - ap-northeast-2 + - ap-east-1 + - ap-southeast-2 + - eu-west-1 + - eu-west-2 + - eu-west-3 + - eu-north-1 + - eu-central-1 + - eu-central-2 + - ca-central-1 + - ap-south-1 + - sa-east-1 + type: + type: string + enum: + - specific + provider: + type: string + enum: + - AWS + - AWS_K8S + - AWS_NIMBUS + status: + type: string + enum: + - capacity + - other + required: + - name + - code + - type + - provider + required: + - smartGroup + - specific + required: + - recommendations + - all + V1ProjectRefResponse: + type: object + properties: + id: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + ref: + type: string + name: + type: string + required: + - id + - ref + - name + V1UpdateProjectBody: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 256 + required: + - name + example: + name: Acme Platform + UpgradeDatabaseBody: + type: object + properties: + target_version: + type: string + release_channel: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + required: + - target_version + example: + target_version: '17' + release_channel: ga + ProjectUpgradeInitiateResponse: + type: object + properties: + tracking_id: + type: string + required: + - tracking_id + ProjectUpgradeEligibilityResponse: + type: object + properties: + eligible: + type: boolean + current_app_version: + type: string + current_app_version_release_channel: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + latest_app_version: + type: string + target_upgrade_versions: + type: array + items: + type: object + properties: + postgres_version: + type: string + enum: + - '13' + - '14' + - '15' + - '17' + - 17-oriole + release_channel: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + app_version: + type: string + required: + - postgres_version + - release_channel + - app_version + duration_estimate_hours: + type: number + legacy_auth_custom_roles: + type: array + items: + type: string + objects_to_be_dropped: + type: array + items: + type: string + deprecated: true + description: Use validation_errors instead. + unsupported_extensions: + type: array + items: + type: string + deprecated: true + description: Use validation_errors instead. + user_defined_objects_in_internal_schemas: + type: array + items: + type: string + deprecated: true + description: Use validation_errors instead. + validation_errors: + type: array + items: + anyOf: + - type: object + properties: + type: + type: string + enum: + - objects_depending_on_pg_cron + dependents: + type: array + items: + type: string + required: + - type + - dependents + - type: object + properties: + type: + type: string + enum: + - indexes_referencing_ll_to_earth + schema_name: + type: string + table_name: + type: string + index_name: + type: string + required: + - type + - schema_name + - table_name + - index_name + - type: object + properties: + type: + type: string + enum: + - function_using_obsolete_lang + schema_name: + type: string + function_name: + type: string + lang_name: + type: string + required: + - type + - schema_name + - function_name + - lang_name + - type: object + properties: + type: + type: string + enum: + - unsupported_extension + extension_name: + type: string + required: + - type + - extension_name + - type: object + properties: + type: + type: string + enum: + - unsupported_fdw_handler + fdw_name: + type: string + fdw_handler_name: + type: string + required: + - type + - fdw_name + - fdw_handler_name + - type: object + properties: + type: + type: string + enum: + - unlogged_table_with_persistent_sequence + schema_name: + type: string + table_name: + type: string + sequence_name: + type: string + required: + - type + - schema_name + - table_name + - sequence_name + - type: object + properties: + type: + type: string + enum: + - user_defined_objects_in_internal_schemas + obj_type: + anyOf: + - type: string + enum: + - table + - type: string + enum: + - function + schema_name: + type: string + obj_name: + type: string + required: + - type + - obj_type + - schema_name + - obj_name + - type: object + properties: + type: + type: string + enum: + - active_replication_slot + slot_name: + type: string + required: + - type + - slot_name + - type: object + properties: + type: + type: string + enum: + - x86_architecture + required: + - type + - type: object + properties: + type: + type: string + enum: + - project_hibernating + required: + - type + warnings: + type: array + items: + oneOf: + - type: object + properties: + type: + type: string + enum: + - pg_graphql_introspection_change + required: + - type + - type: object + properties: + type: + type: string + enum: + - ltree_reindex_required + required: + - type + - type: object + properties: + type: + type: string + enum: + - operator_estimator_gate + required: + - type + required: + - eligible + - current_app_version + - current_app_version_release_channel + - latest_app_version + - target_upgrade_versions + - duration_estimate_hours + - legacy_auth_custom_roles + - objects_to_be_dropped + - unsupported_extensions + - user_defined_objects_in_internal_schemas + - validation_errors + - warnings + DatabaseUpgradeStatusResponse: + type: object + properties: + databaseUpgradeStatus: + type: object + properties: + initiated_at: + type: string + latest_status_at: + type: string + target_version: + type: number + error: + type: string + enum: + - 1_upgraded_instance_launch_failed + - 2_volume_detachchment_from_upgraded_instance_failed + - 3_volume_attachment_to_original_instance_failed + - 4_data_upgrade_initiation_failed + - 5_data_upgrade_completion_failed + - 6_volume_detachchment_from_original_instance_failed + - 7_volume_attachment_to_upgraded_instance_failed + - 8_upgrade_completion_failed + - 9_post_physical_backup_failed + progress: + type: string + enum: + - 0_requested + - 1_started + - 2_launched_upgraded_instance + - 3_detached_volume_from_upgraded_instance + - 4_attached_volume_to_original_instance + - 5_initiated_data_upgrade + - 6_completed_data_upgrade + - 7_detached_volume_from_original_instance + - 8_attached_volume_to_upgraded_instance + - 9_completed_upgrade + - 10_completed_post_physical_backup + status: + type: number + required: + - initiated_at + - latest_status_at + - target_version + - status + nullable: true + required: + - databaseUpgradeStatus + SetUpReadReplicaBody: + type: object + properties: + read_replica_region: + type: string + enum: + - us-east-1 + - us-east-2 + - us-west-1 + - us-west-2 + - ap-east-1 + - ap-southeast-1 + - ap-northeast-1 + - ap-northeast-2 + - ap-southeast-2 + - eu-west-1 + - eu-west-2 + - eu-west-3 + - eu-north-1 + - eu-central-1 + - eu-central-2 + - ca-central-1 + - ap-south-1 + - sa-east-1 + description: Region you want your read replica to reside in + required: + - read_replica_region + example: + read_replica_region: us-west-1 + PlanGateErrorBody: + type: object + properties: + message: + type: string + description: Human-readable explanation of the plan gate + error: + description: Present on entitlement denials. Other errors with this status code (validation, billing state) carry only message. + type: object + properties: + code: + type: string + description: Machine-readable marker for plan-gated denials + enum: + - entitlement_required + feature: + type: string + description: Entitlement feature key that failed the check + upgrade_url: + description: Billing page URL for the organization, present when the org is resolvable + type: string + required: + - code + - feature + required: + - message + RemoveReadReplicaBody: + type: object + properties: + database_identifier: + type: string + required: + - database_identifier + example: + database_identifier: abcdefghijklmnopqrst-rr-us-west-1-abcde + V1ServiceHealthResponse: + type: object + properties: + name: + type: string + enum: + - auth + - db + - db_postgres_user + - pooler + - realtime + - rest + - storage + - pg_bouncer + healthy: + type: boolean + deprecated: true + description: Deprecated. Use `status` instead. + status: + type: string + enum: + - COMING_UP + - ACTIVE_HEALTHY + - UNHEALTHY + info: + type: object + properties: + name: + type: string + enum: + - GoTrue + version: + type: string + description: + type: string + healthy: + type: boolean + deprecated: true + description: Deprecated. Use `status` instead. + db_connected: + type: boolean + replication_connected: + type: boolean + connected_cluster: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + db_schema: + type: string + required: + - name + - version + - description + - healthy + - db_connected + - replication_connected + - connected_cluster + - db_schema + error: + type: string + required: + - name + - healthy + - status + GetProjectAvailableRestoreVersionsResponse: + type: object + properties: + available_versions: + type: array + items: + type: object + properties: + version: + type: string + release_channel: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + postgres_engine: + type: string + enum: + - '13' + - '14' + - '15' + - '17' + - 17-oriole + required: + - version + - release_channel + - postgres_engine + required: + - available_versions + ProjectClaimTokenResponse: + type: object + properties: + token_alias: + type: string + expires_at: + type: string + created_at: + type: string + created_by: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + required: + - token_alias + - expires_at + - created_at + - created_by + CreateProjectClaimTokenResponse: + type: object + properties: + token: + type: string + token_alias: + type: string + expires_at: + type: string + created_at: + type: string + created_by: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + required: + - token + - token_alias + - expires_at + - created_at + - created_by + DiskResponse: + type: object + properties: + attributes: + type: object + properties: + iops: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + size_gb: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + throughput_mibps: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + type: + type: string + enum: + - gp3 + required: + - iops + - size_gb + - type + last_modified_at: + type: string + required: + - attributes + DiskRequestBody: + type: object + properties: + attributes: + type: object + properties: + iops: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + size_gb: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + throughput_mibps: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + type: + type: string + enum: + - gp3 + required: + - iops + - size_gb + - type + required: + - attributes + example: + attributes: + type: gp3 + size_gb: 100 + iops: 3000 + throughput_mibps: 125 + DiskUtilMetricsResponse: + type: object + properties: + timestamp: + type: string + metrics: + type: object + properties: + fs_size_bytes: + type: number + fs_avail_bytes: + type: number + fs_used_bytes: + type: number + required: + - fs_size_bytes + - fs_avail_bytes + - fs_used_bytes + required: + - timestamp + - metrics + DiskAutoscaleConfig: + type: object + properties: + growth_percent: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + description: Growth percentage for disk autoscaling + nullable: true + minimum: 0 + min_increment_gb: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + description: Minimum increment size for disk autoscaling in GB + nullable: true + minimum: 0 + max_size_gb: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + description: Maximum limit the disk size will grow to in GB + nullable: true + minimum: 0 + required: + - growth_percent + - min_increment_gb + - max_size_gb + OrganizationProjectsResponse: + type: object + properties: + projects: + type: array + items: + type: object + properties: + ref: + type: string + name: + type: string + cloud_provider: + type: string + region: + type: string + is_branch: + type: boolean + status: + type: string + enum: + - INACTIVE + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - UNKNOWN + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UPGRADING + - PAUSING + - RESTORE_FAILED + - RESTARTING + - PAUSE_FAILED + - RESIZING + inserted_at: + type: string + databases: + type: array + items: + type: object + properties: + infra_compute_size: + type: string + enum: + - pico + - nano + - micro + - small + - medium + - large + - xlarge + - 2xlarge + - 4xlarge + - 8xlarge + - 12xlarge + - 16xlarge + - 24xlarge + - 24xlarge_optimized_memory + - 24xlarge_optimized_cpu + - 24xlarge_high_memory + - 48xlarge + - 48xlarge_optimized_memory + - 48xlarge_optimized_cpu + - 48xlarge_high_memory + region: + type: string + status: + type: string + enum: + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UNKNOWN + - INIT_READ_REPLICA + - INIT_READ_REPLICA_FAILED + - RESTARTING + - RESIZING + cloud_provider: + type: string + identifier: + type: string + type: + type: string + enum: + - PRIMARY + - READ_REPLICA + disk_volume_size_gb: + type: number + disk_type: + type: string + enum: + - gp3 + - io2 + disk_throughput_mbps: + type: number + disk_last_modified_at: + type: string + required: + - region + - status + - cloud_provider + - identifier + - type + required: + - ref + - name + - cloud_provider + - region + - is_branch + - status + - inserted_at + - databases + pagination: + type: object + properties: + count: + type: number + description: Total number of projects. Use this to calculate the total number of pages. + limit: + type: number + description: Maximum number of projects per page + offset: + type: number + description: Number of projects skipped in this response + required: + - count + - limit + - offset + required: + - projects + - pagination + V1-list-all-projectsResponse: + type: object + properties: + v1_list_all_projects: + type: array + items: + $ref: '#/components/schemas/V1ProjectWithDatabaseResponse' + V1-get-services-healthResponse: + type: object + properties: + v1_get_services_health: + type: array + items: + $ref: '#/components/schemas/V1ServiceHealthResponse' + x-stackQL-resources: + projects: + id: supabase.projects.projects + name: projects + title: Projects + methods: + list: + operation: + $ref: '#/paths/~1v1~1projects/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_list_all_projects + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-list-all-projectsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_list_all_projects\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects/post' + response: + mediaType: application/json + openAPIDocKey: '201' + get: + operation: + $ref: '#/paths/~1v1~1projects~1{ref}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1v1~1projects~1{ref}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{ref}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + upgrade: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1upgrade/post' + response: + mediaType: application/json + openAPIDocKey: '201' + pause: + operation: + $ref: '#/paths/~1pause/post' + response: + mediaType: application/json + openAPIDocKey: '200' + restart: + operation: + $ref: '#/paths/~1restart/post' + response: + mediaType: application/json + openAPIDocKey: '200' + restore: + operation: + $ref: '#/paths/~1restore/post' + response: + mediaType: application/json + openAPIDocKey: '200' + cancel_restore: + operation: + $ref: '#/paths/~1restore~1cancel/post' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/projects/methods/get' + - $ref: '#/components/x-stackQL-resources/projects/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/projects/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/projects/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/projects/methods/delete' + replace: [] + available_regions: + id: supabase.projects.available_regions + name: available_regions + title: Available Regions + methods: + get: + operation: + $ref: '#/paths/~1v1~1projects~1available-regions/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/available_regions/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + upgrade_eligibility: + id: supabase.projects.upgrade_eligibility + name: upgrade_eligibility + title: Upgrade Eligibility + methods: + get: + operation: + $ref: '#/paths/~1upgrade~1eligibility/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/upgrade_eligibility/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + upgrade_status: + id: supabase.projects.upgrade_status + name: upgrade_status + title: Upgrade Status + methods: + get: + operation: + $ref: '#/paths/~1upgrade~1status/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/upgrade_status/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + read_replicas: + id: supabase.projects.read_replicas + name: read_replicas + title: Read Replicas + methods: + setup: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1read-replicas~1setup/post' + response: + mediaType: application/json + openAPIDocKey: '204' + remove: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1read-replicas~1remove/post' + response: + mediaType: application/json + openAPIDocKey: '204' + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] + service_health: + id: supabase.projects.service_health + name: service_health + title: Service Health + methods: + list: + operation: + $ref: '#/paths/~1health/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_get_services_health + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-get-services-healthResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_get_services_health\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/service_health/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + restore_versions: + id: supabase.projects.restore_versions + name: restore_versions + title: Restore Versions + methods: + list: + operation: + $ref: '#/paths/~1restore/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.available_versions + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/restore_versions/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + claim_tokens: + id: supabase.projects.claim_tokens + name: claim_tokens + title: Claim Tokens + methods: + get: + operation: + $ref: '#/paths/~1claim-token/get' + response: + mediaType: application/json + openAPIDocKey: '200' + create: + operation: + $ref: '#/paths/~1claim-token/post' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1claim-token/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/claim_tokens/methods/get' + insert: + - $ref: '#/components/x-stackQL-resources/claim_tokens/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/claim_tokens/methods/delete' + replace: [] + disk_configs: + id: supabase.projects.disk_configs + name: disk_configs + title: Disk Configs + methods: + get: + operation: + $ref: '#/paths/~1config~1disk/get' + response: + mediaType: application/json + openAPIDocKey: '200' + modify: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1config~1disk/post' + response: + mediaType: application/json + openAPIDocKey: '201' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/disk_configs/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + disk_utilization: + id: supabase.projects.disk_utilization + name: disk_utilization + title: Disk Utilization + methods: + get: + operation: + $ref: '#/paths/~1config~1disk~1util/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/disk_utilization/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + disk_autoscale_configs: + id: supabase.projects.disk_autoscale_configs + name: disk_autoscale_configs + title: Disk Autoscale Configs + methods: + get: + operation: + $ref: '#/paths/~1config~1disk~1autoscale/get' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/disk_autoscale_configs/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + organization_projects: + id: supabase.projects.organization_projects + name: organization_projects + title: Organization Projects + methods: + list: + operation: + $ref: '#/paths/~1v1~1organizations~1{slug}~1projects/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.projects + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/organization_projects/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/secrets.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/secrets.yaml new file mode 100644 index 0000000..55d5f57 --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/secrets.yaml @@ -0,0 +1,756 @@ +openapi: 3.0.0 +info: + title: secrets API + description: Secrets related endpoints + version: 1.0.0 +paths: + /api-keys: + get: + operationId: v1-get-project-api-keys + parameters: + - name: reveal + required: false + in: query + description: |- + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-get-project-api-keysResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get project api keys + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_read + x-oauth-scope: secrets:read + post: + operationId: v1-create-project-api-key + parameters: + - name: reveal + required: false + in: query + description: |- + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateApiKeyBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ApiKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Creates a new API key for the project + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_write + x-oauth-scope: secrets:write + /api-keys/legacy: + get: + operationId: v1-get-project-legacy-api-keys + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/LegacyApiKeysResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Check whether JWT based legacy (anon, service_role) API keys are enabled. This API endpoint will be removed in the future, check for HTTP 404 Not Found. + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_read + x-oauth-scope: secrets:read + put: + operationId: v1-update-project-legacy-api-keys + parameters: + - name: enabled + required: true + in: query + description: |- + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/LegacyApiKeysResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Disable or re-enable JWT based legacy (anon, service_role) API keys. This API endpoint will be removed in the future, check for HTTP 404 Not Found. + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_write + x-oauth-scope: secrets:write + /api-keys/{id}: + patch: + operationId: v1-update-project-api-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 22222222-2222-4222-8222-222222222222 + type: string + - name: reveal + required: false + in: query + description: |- + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateApiKeyBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ApiKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Updates an API key for the project + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_write + x-oauth-scope: secrets:write + get: + operationId: v1-get-project-api-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 22222222-2222-4222-8222-222222222222 + type: string + - name: reveal + required: false + in: query + description: |- + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ApiKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get API key + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_read + x-oauth-scope: secrets:read + delete: + operationId: v1-delete-project-api-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 22222222-2222-4222-8222-222222222222 + type: string + - name: reveal + required: false + in: query + description: Boolean string, true or false + schema: + example: true + type: string + - name: was_compromised + required: false + in: query + description: Boolean string, true or false + schema: + example: false + type: string + - name: reason + required: false + in: query + schema: + example: rotating_key + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ApiKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Deletes an API key for the project + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_write + x-oauth-scope: secrets:write + /secrets: + get: + description: Returns all secrets you've previously added to the specified project. + operationId: v1-list-all-secrets + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-secretsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's secrets + security: + - bearer: [] + summary: List all secrets + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_secrets_read + x-oauth-scope: secrets:read + post: + description: Creates multiple secrets and adds them to the specified project. + operationId: v1-bulk-create-secrets + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + maxLength: 256 + pattern: ^(?!SUPABASE_).* + description: Secret name must not start with the SUPABASE_ prefix. + value: + type: string + maxLength: 24576 + required: + - name + - value + description: One secret. The wire body is an array; the provider wraps this object into it (one secret per INSERT). + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to create project's secrets + security: + - bearer: [] + summary: Bulk create secrets + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_secrets_write + x-oauth-scope: secrets:write + delete: + description: Deletes all secrets with the given names from the specified project + operationId: v1-bulk-delete-secrets + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + description: The secret to delete. The wire body is an array of names; the provider wraps this object into it (one secret per DELETE). + properties: + name: + type: string + description: Secret name + required: + - name + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to delete secrets with given names + security: + - bearer: [] + summary: Bulk delete secrets + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_secrets_write + x-oauth-scope: secrets:write +components: + schemas: + ApiKeyResponse: + type: object + properties: + api_key: + type: string + nullable: true + id: + type: string + nullable: true + type: + type: string + enum: + - legacy + - publishable + - secret + - null + nullable: true + prefix: + type: string + nullable: true + name: + type: string + description: + type: string + nullable: true + hash: + type: string + nullable: true + secret_jwt_template: + type: object + additionalProperties: {} + nullable: true + inserted_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + nullable: true + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + nullable: true + required: + - name + CreateApiKeyBody: + type: object + properties: + type: + type: string + enum: + - publishable + - secret + name: + type: string + minLength: 4 + maxLength: 64 + pattern: ^[a-z_][a-z0-9_]+$ + description: + type: string + nullable: true + secret_jwt_template: + type: object + additionalProperties: {} + nullable: true + required: + - type + - name + example: + type: secret + name: ci_secret_key + description: CI deploy key + LegacyApiKeysResponse: + type: object + properties: + enabled: + type: boolean + required: + - enabled + UpdateApiKeyBody: + type: object + properties: + name: + type: string + minLength: 4 + maxLength: 64 + pattern: ^[a-z_][a-z0-9_]+$ + description: + type: string + nullable: true + secret_jwt_template: + type: object + additionalProperties: {} + nullable: true + example: + name: ci_secret_key_rotated + description: Rotated after March release + SecretResponse: + type: object + properties: + name: + type: string + value: + type: string + updated_at: + type: string + required: + - name + - value + CreateSecretBody: + maxItems: 100 + type: array + items: + type: object + properties: + name: + type: string + maxLength: 256 + pattern: ^(?!SUPABASE_).* + description: Secret name must not start with the SUPABASE_ prefix. + value: + type: string + maxLength: 24576 + required: + - name + - value + example: + - name: OPENAI_API_KEY + value: sk-example-secret + - name: STRIPE_WEBHOOK_SECRET + value: whsec_example + DeleteSecretsBody: + type: array + items: + type: string + example: + - OPENAI_API_KEY + V1-get-project-api-keysResponse: + type: object + properties: + v1_get_project_api_keys: + type: array + items: + $ref: '#/components/schemas/ApiKeyResponse' + V1-list-all-secretsResponse: + type: object + properties: + v1_list_all_secrets: + type: array + items: + $ref: '#/components/schemas/SecretResponse' + x-stackQL-resources: + api_keys: + id: supabase.secrets.api_keys + name: api_keys + title: Api Keys + methods: + list: + operation: + $ref: '#/paths/~1api-keys/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_get_project_api_keys + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-get-project-api-keysResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_get_project_api_keys\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1api-keys/post' + response: + mediaType: application/json + openAPIDocKey: '201' + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1api-keys~1{id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + get: + operation: + $ref: '#/paths/~1api-keys~1{id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + delete: + operation: + $ref: '#/paths/~1api-keys~1{id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/api_keys/methods/get' + - $ref: '#/components/x-stackQL-resources/api_keys/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/api_keys/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/api_keys/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/api_keys/methods/delete' + replace: [] + legacy_api_keys: + id: supabase.secrets.legacy_api_keys + name: legacy_api_keys + title: Legacy Api Keys + methods: + get: + operation: + $ref: '#/paths/~1api-keys~1legacy/get' + response: + mediaType: application/json + openAPIDocKey: '200' + update: + operation: + $ref: '#/paths/~1api-keys~1legacy/put' + response: + mediaType: application/json + openAPIDocKey: '200' + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/legacy_api_keys/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/legacy_api_keys/methods/update' + delete: [] + replace: [] + secrets: + id: supabase.secrets.secrets + name: secrets + title: Secrets + methods: + list: + operation: + $ref: '#/paths/~1secrets/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_list_all_secrets + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-list-all-secretsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_list_all_secrets\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1secrets/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + transform: + type: golang_template_text_v0.3.0 + body: '[{{ . }}]' + delete: + operation: + $ref: '#/paths/~1secrets/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + transform: + type: golang_template_json_v0.3.0 + body: '[{{ toJson .name }}]' + config: + requestBodyTranslate: + algorithm: naive + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/secrets/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/secrets/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/secrets/methods/delete' + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/openapi/src/supabase/v00.00.00000/services/storage.yaml b/provider-dev/openapi/src/supabase/v00.00.00000/services/storage.yaml new file mode 100644 index 0000000..25b2f09 --- /dev/null +++ b/provider-dev/openapi/src/supabase/v00.00.00000/services/storage.yaml @@ -0,0 +1,103 @@ +openapi: 3.0.0 +info: + title: storage API + description: Visit [https://supabase.github.io/storage/](https://supabase.github.io/storage/) for complete documentation. + version: 1.0.0 +paths: + /storage/buckets: + get: + operationId: v1-list-all-buckets + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-bucketsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get list of buckets + security: + - bearer: [] + summary: Lists all buckets + tags: + - Storage + x-badges: + - name: 'OAuth scope: storage:read' + position: after + x-endpoint-owners: + - storage + x-fga-permissions: + - - storage_read + x-oauth-scope: storage:read +components: + schemas: + V1StorageBucketResponse: + type: object + properties: + id: + type: string + name: + type: string + owner: + type: string + created_at: + type: string + updated_at: + type: string + public: + type: boolean + required: + - id + - name + - owner + - created_at + - updated_at + - public + V1-list-all-bucketsResponse: + type: object + properties: + v1_list_all_buckets: + type: array + items: + $ref: '#/components/schemas/V1StorageBucketResponse' + x-stackQL-resources: + buckets: + id: supabase.storage.buckets + name: buckets + title: Buckets + methods: + list: + operation: + $ref: '#/paths/~1storage~1buckets/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.v1_list_all_buckets + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/V1-list-all-bucketsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"v1_list_all_buckets\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/buckets/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/scripts/build_inventory.mjs b/provider-dev/scripts/build_inventory.mjs new file mode 100644 index 0000000..baaeb5a --- /dev/null +++ b/provider-dev/scripts/build_inventory.mjs @@ -0,0 +1,132 @@ +#!/usr/bin/env node + +// Builds the endpoint inventory (provider-dev/config/endpoint_inventory.csv) +// from the pinned Supabase Management API spec: one row per operation with +// the ref/slug scoping, pagination-style query parameters (recorded to +// confirm the mostly-bounded expectation per endpoint, not to configure +// traversal), request body presence and kind (multipart/eszip/form/bare-array +// flagged), the update verb's semantics presumption (per the keycloak +// warning, unverified until the toggle-and-restore probe), the vendor's +// [Beta]/[Alpha] label, the deprecated flag, the response shape with its +// top-level array keys (the object key for list reads is a per-resource +// mapping decision), the proposed service (from the path rules in +// provider-dev/config/service_names.json), a draft resource and StackQL +// verb, and a skip reason where the operation is not mapped. +// +// The proposed resource/verb columns are groundwork drafts - +// map_operations.mjs produces the authoritative mapping. Fails without +// writing if any path lacks a service rule. +// +// Usage: npm run build-inventory + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import pluralize from 'pluralize'; +import { + INVENTORY_VERBS, pathParams, scopeOf, makeResolver, makeServiceResolver, + classifyResponseShape, classifyBeta, classifyRequestBody, paginationParams, + updateSemantics, skipReason, deriveResource, deriveVerb +} from './lib/spec_helpers.mjs'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..'); +const specPath = path.join(repoRoot, 'provider-dev', 'downloaded', 'supabase-v1.json'); +const outPath = path.join(repoRoot, 'provider-dev', 'config', 'endpoint_inventory.csv'); + +const spec = JSON.parse(fs.readFileSync(specPath, 'utf8')); +const resolve = makeResolver(spec); +const resolveService = makeServiceResolver(); + +const rows = []; +const errors = []; +const stats = { byService: {}, byVerb: {}, byShape: {}, byBeta: {}, byDisposition: {}, byScope: {}, byUpdateVerb: {} }; +const paginationFindings = []; +const bump = (obj, key) => { obj[key] = (obj[key] || 0) + 1; }; + +for (const [pathKey, pathItem] of Object.entries(spec.paths || {})) { + for (const verb of INVENTORY_VERBS) { + const op = pathItem[verb]; + if (!op) continue; + + const service = resolveService(pathKey); + if (!service) { + errors.push(`no service rule matches ${verb.toUpperCase()} ${pathKey}`); + continue; + } + const { shape, arrayKeys, mediaTypes } = classifyResponseShape(op, resolve); + const skip = skipReason(pathKey, op, resolve, verb); + const beta = classifyBeta(op); + const body = classifyRequestBody(op, resolve); + const pageParams = paginationParams(op, pathItem, resolve); + + if (pageParams.length > 0) { + paginationFindings.push(`${verb.toUpperCase()} ${pathKey}: ${pageParams.join(', ')}`); + } + + rows.push({ + method: verb, + path: pathKey, + operation_id: op.operationId, + tag: (op.tags || []).join(';'), + scope: scopeOf(pathKey), + path_params: pathParams(pathKey).join(';'), + pagination_params: pageParams.join(';'), + has_request_body: body.has, + body_kinds: body.kinds.join(';'), + body_bare_array: body.bareArray ? 'y' : '', + update_semantics: updateSemantics(verb), + beta, + deprecated: op.deprecated ? 'y' : '', + response_shape: shape, + response_array_keys: arrayKeys.join(';'), + response_media_types: mediaTypes.filter((m) => !m.includes('json')).join(';'), + proposed_service: service, + proposed_resource: skip ? '' : deriveResource(pathKey, verb, service, pluralize), + proposed_verb: skip ? '' : deriveVerb(verb, pathKey), + skip_reason: skip + }); + + bump(stats.byShape, shape); + bump(stats.byBeta, beta || 'ga'); + bump(stats.byScope, scopeOf(pathKey)); + bump(stats.byDisposition, skip ? `skipped: ${skip}` : 'mapped'); + if (verb === 'patch' || verb === 'put') bump(stats.byUpdateVerb, verb); + if (!skip) { + bump(stats.byService, service); + bump(stats.byVerb, deriveVerb(verb, pathKey)); + } + } +} + +if (errors.length > 0) { + console.error(`FAILED with ${errors.length} error(s), nothing written:`); + for (const e of errors) console.error(` ${e}`); + process.exit(1); +} + +const columns = Object.keys(rows[0]); +const csvField = (v) => (/[",\n\r]/.test(v) ? `"${String(v).replace(/"/g, '""')}"` : String(v)); +const csv = [columns.join(',')] + .concat(rows.map((r) => columns.map((c) => csvField(r[c] ?? '')).join(','))) + .join('\n') + '\n'; +fs.writeFileSync(outPath, csv); + +console.log(`Endpoint inventory written to ${outPath} (${rows.length} operations)\n`); +const printStats = (title, obj) => { + console.log(title); + for (const [k, v] of Object.entries(obj).sort((a, b) => b[1] - a[1])) console.log(` ${String(v).padStart(4)} ${k}`); +}; +printStats('By disposition:', stats.byDisposition); +printStats('\nMapped operations by proposed service:', stats.byService); +printStats('\nMapped operations by proposed StackQL verb:', stats.byVerb); +printStats('\nBy response shape:', stats.byShape); +printStats('\nBy beta label:', stats.byBeta); +printStats('\nBy scope:', stats.byScope); +printStats('\nUpdate operations by verb (semantics unverified until probed):', stats.byUpdateVerb); + +console.log('\nPagination check (query parameters that look like paging):'); +if (paginationFindings.length === 0) { + console.log(' none - every list endpoint returns the complete collection'); +} else { + for (const f of paginationFindings) console.log(` ${f}`); +} diff --git a/provider-dev/scripts/lib/spec_helpers.mjs b/provider-dev/scripts/lib/spec_helpers.mjs new file mode 100644 index 0000000..38a9be2 --- /dev/null +++ b/provider-dev/scripts/lib/spec_helpers.mjs @@ -0,0 +1,322 @@ +// Shared helpers for the Supabase Management API spec scripts +// (build_inventory.mjs, map_operations.mjs, bin/split.mjs): service +// resolution, response shape classification, beta/deprecated detection, +// skip rules, and naming utilities. Single-sourced so the inventory and the +// authoritative mapping can never disagree on classification. + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +// Verbs that map to StackQL methods. HEAD (the action-run count endpoint) +// appears in the inventory only, reason-coded, via INVENTORY_VERBS. +export const HTTP_VERBS = ['get', 'post', 'put', 'patch', 'delete']; +export const INVENTORY_VERBS = ['get', 'post', 'put', 'patch', 'delete', 'head']; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..'); +const serviceNamesPath = path.join(repoRoot, 'provider-dev', 'config', 'service_names.json'); + +export function camelToSnake(s) { + return String(s).replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/[-. ]/g, '_').toLowerCase(); +} + +export function pathParams(pathKey) { + return (pathKey.match(/\{[^}]+\}/g) || []).map((s) => s.slice(1, -1)); +} + +// Scoping parameter for the row-address pattern taught in the docs: +// projects are addressed by {ref}, organization resources by {slug}; +// account-scoped paths (the PAT's own surface) have neither. +export function scopeOf(pathKey) { + const params = pathParams(pathKey); + if (params.includes('ref')) return 'ref'; + if (params.includes('slug')) return 'slug'; + if (params.includes('branch_id_or_ref')) return 'branch'; + return 'account'; +} + +// Resolves local $refs against the containing spec document +export function makeResolver(spec) { + return function resolve(schema, depth = 0) { + if (!schema || depth > 10) return schema; + if (schema.$ref) { + const parts = schema.$ref.replace(/^#\//, '').split('/'); + let node = spec; + for (const p of parts) node = node?.[p]; + return resolve(node, depth + 1); + } + return schema; + }; +} + +// Service resolution from the ordered path rules in service_names.json. +// Every operation path must match a rule; a miss is an error the caller +// must surface (fail without writing). +export function makeServiceResolver() { + const config = JSON.parse(fs.readFileSync(serviceNamesPath, 'utf8')); + const rules = config.rules.map((r) => ({ re: new RegExp(r.pathRegex), service: r.service })); + return function resolveService(pathKey) { + for (const rule of rules) { + if (rule.re.test(pathKey)) return rule.service; + } + return null; + }; +} + +// Services whose rules carry "excluded": true are classified (so the +// inventory records their operations, reason-coded) but never emitted as +// service specs - every operation in them is skip-coded and an empty service +// would fail the meta-route walk. +export function excludedServices() { + const config = JSON.parse(fs.readFileSync(serviceNamesPath, 'utf8')); + return new Set(config.rules.filter((r) => r.excluded).map((r) => r.service)); +} + +export function success2xx(op) { + const codes = Object.keys(op.responses || {}).filter((c) => /^2/.test(c)).sort(); + for (const code of codes) { + const content = op.responses[code].content || {}; + const jsonType = Object.keys(content).find((m) => m.includes('json')); + if (jsonType && content[jsonType].schema) return { code, schema: content[jsonType].schema, mediaTypes: Object.keys(content) }; + if (Object.keys(content).length > 0) return { code, schema: null, mediaTypes: Object.keys(content) }; + } + return { code: codes[0] || null, schema: null, mediaTypes: [] }; +} + +// Response shapes for the Supabase Management API. Unlike the uniform +// $.result envelope of clickhouse, this NestJS-generated spec is +// heterogeneous, so the shape taxonomy is descriptive and the object key for +// list reads is a per-resource mapping decision (hetzner precedent): +// bare-array - top-level array (list reads; normalize wraps these) +// object - typed object (single reads, config singletons, and +// entity-with-array-fields responses; arrayKeys records +// the top-level array-typed properties so envelope-style +// collection reads are visible in the inventory) +// scalar - top-level string/number +// untyped-json - JSON declared with an empty schema (no projectable +// columns; the newrelic blob posture applies if mapped) +// non-json - non-JSON content types +// none - no 2xx content (writes, lifecycle actions, and the +// database query endpoint, whose 201 declares no body) +export function classifyResponseShape(op, resolve) { + const { schema, mediaTypes } = success2xx(op); + if (!schema) { + if (mediaTypes.length > 0) return { shape: 'non-json', arrayKeys: [], mediaTypes }; + return { shape: 'none', arrayKeys: [], mediaTypes }; + } + const s = resolve(schema); + if (!s || Object.keys(s).length === 0) return { shape: 'untyped-json', arrayKeys: [], mediaTypes }; + if (s.type === 'array') return { shape: 'bare-array', arrayKeys: [], mediaTypes }; + if (s.type === 'string' || s.type === 'number' || s.type === 'integer' || s.type === 'boolean') { + return { shape: 'scalar', arrayKeys: [], mediaTypes }; + } + const props = s.properties || {}; + if (Object.keys(props).length === 0) return { shape: 'untyped-json', arrayKeys: [], mediaTypes }; + const arrayKeys = Object.entries(props) + .filter(([, p]) => resolve(p)?.type === 'array') + .map(([k]) => k); + return { shape: 'object', arrayKeys, mediaTypes }; +} + +// The vendor labels pre-GA operations with a [Beta] / [Alpha] summary +// prefix; both are carried through to the docs per the clickhouse +// convention (the label is the first line of the generated method doc). +export function classifyBeta(op) { + const summary = op.summary || ''; + if (/^\[beta\]/i.test(summary)) return 'beta'; + if (/^\[alpha\]/i.test(summary)) return 'alpha'; + return ''; +} + +// Request body classification: json / form / multipart / eszip, and whether +// the body is a bare array (the secrets bulk delete takes a raw string +// array, which --naive-req-body-translate cannot lower to named params - +// recorded so the finding is never silently lost). +export function classifyRequestBody(op, resolve) { + if (!op.requestBody) return { has: 'n', kinds: [], bareArray: false }; + const rb = resolve(op.requestBody); + const content = rb?.content || {}; + const kinds = Object.keys(content); + const jsonType = kinds.find((m) => m.includes('json')); + let bareArray = false; + if (jsonType) { + const s = resolve(content[jsonType].schema); + if (s?.type === 'array') bareArray = true; + } + return { has: 'y', kinds, bareArray }; +} + +// Pagination-style query parameters present on the operation. Most Supabase +// Management API collections are bounded and complete; anything reported +// here is a per-endpoint confirmation to record (snippets and the +// organization projects list paginate; everything else does not). +const PAGINATION_PARAM_NAMES = ['limit', 'offset', 'page', 'pageSize', 'page_size', 'cursor', 'nextPageToken', 'maxResults', 'startAt']; +export function paginationParams(op, pathItem, resolve) { + const params = [...(pathItem?.parameters || []), ...(op.parameters || [])] + .map((p) => resolve(p)) + .filter((p) => p && p.in === 'query') + .map((p) => p.name); + return params.filter((n) => PAGINATION_PARAM_NAMES.includes(n)); +} + +// Update semantics flags per the keycloak warning: the verb records the +// vendor's choice, the presumption is labelled until the toggle-and-restore +// probe against the standing dev project confirms it per resource. +export function updateSemantics(verb) { + if (verb === 'patch') return 'patch-partial-presumed'; + if (verb === 'put') return 'put-replace-unverified'; + return ''; +} + +// --------------------------------------------------------------------------- +// Resource and verb derivation, shared by build_inventory.mjs (draft columns) +// and map_operations.mjs (authoritative mapping) +// --------------------------------------------------------------------------- + +// PATCH/PUT on these trailing static segments is a state/credential command +// on the parent resource (EXEC), not an entity update +export const ACTION_SEGMENTS = new Set(['password', 'status']); + +// POST on these trailing static segments is an action on the parent +// resource (EXEC), not a create. The database query endpoints are drafted +// here provisionally; the flagship mapping decision (snowflake framework, +// EXEC vs INSERT ... RETURNING) is recorded in NOTES.md and applied in +// map_operations.mjs once evidence against the standing project lands. +export const POST_EXEC_SEGMENTS = new Set([ + 'pause', 'restart', 'restore', 'cancel', 'push', 'merge', 'reset', + 'activate', 'initialize', 'reverify', 'apply', 'shutdown', 'enable', + 'undo', 'setup', 'remove', 'temporary-disable', 'check-availability', + 'accept', 'restore-pitr', 'query', 'read-only', 'upgrade' +]); + +// Strips /v1/, then iteratively strips scoping pairs (a static segment +// followed by a path parameter) while more segments follow: +// projects/{ref}/database/backups -> database/backups. The last stripped +// parent is kept so action segments can resolve to it. +export function scopedSegments(pathKey) { + let segs = pathKey.replace(/^\/v1\//, '').split('/').filter(Boolean); + let parent = null; + while (segs.length > 2 && !segs[0].startsWith('{') && segs[1].startsWith('{')) { + parent = segs[0]; + segs = segs.slice(2); + } + return { segs, parent }; +} + +export function deriveResource(pathKey, verb, service, pluralizeFn) { + const { segs, parent: scopedParent } = scopedSegments(pathKey); + // a rebased project-scoped path (/pause, /restore, ...) has no visible + // scoping pair; its parent is the project the server template addresses + const parent = scopedParent || (!pathKey.startsWith('/v1/') ? 'projects' : null); + let statics = segs.filter((s) => !s.startsWith('{')); + const last = statics[statics.length - 1]; + // an action segment names a method on the scoping parent, not a resource + if (verb !== 'get' && ACTION_SEGMENTS.has(last)) { + statics = statics.slice(0, -1); + if (statics.length === 0 && parent) statics = [parent]; + } + if (verb === 'post' && POST_EXEC_SEGMENTS.has(last)) { + statics = statics.slice(0, -1); + if (statics.length === 0 && parent) statics = [parent]; + } + if (statics.length === 0 && parent) statics = [parent]; + // drop a leading segment that just restates the service name + if (statics.length > 1 && camelToSnake(statics[0]) === service) statics = statics.slice(1); + const snake = statics.map(camelToSnake); + const lastSnake = snake[snake.length - 1]; + return [...snake.slice(0, -1), pluralizeFn(lastSnake)].join('_'); +} + +export function deriveVerb(verb, pathKey) { + const { segs } = scopedSegments(pathKey); + const statics = segs.filter((s) => !s.startsWith('{')); + const last = statics[statics.length - 1]; + if (verb === 'get') return 'select'; + if (verb === 'delete') return 'delete'; + if (verb === 'patch' || verb === 'put') return ACTION_SEGMENTS.has(last) ? 'exec' : 'update'; + // post + if (POST_EXEC_SEGMENTS.has(last) || ACTION_SEGMENTS.has(last)) return 'exec'; + return 'insert'; +} + +// Skip rules for operations that stay visible in the CSV artifacts but are +// not mapped to StackQL methods. +// multipart_eszip_deploy - the function bundle deploy takes +// multipart/form-data (eszip); standing binary exclusion, the Supabase +// CLI is the deploy path +// oauth_user_agent_flow - the /v1/oauth surface is the OAuth-app +// (on-behalf-of-user) flow: browser redirects and a form-urlencoded +// token exchange, not the PAT surface this provider maps +// untyped_function_body - the function body read declares an empty JSON +// object; no projectable columns (source retrieval is a CLI concern) +// head_count_endpoint - HEAD has no StackQL verb; the action-run count +// is derivable from the list read +// non_json_text_response - the branch diff, action-run log and Prometheus +// metrics reads return text (standing non-JSON exclusion) +// bare_array_bulk_body - the edge function bulk update (PUT /functions) +// takes a bare array of function objects; there is no per-statement +// surface for it (the single-function PATCH is the update path), unlike +// the secrets bulk endpoints whose one-item bodies are wrapped by a +// request transform +// untyped_json_response - the project's PostgREST OpenAPI document read +// (database/openapi) declares an empty JSON schema; it would project no +// columns and its value in SQL is marginal (NOTES.md finding 10) +export function skipReason(pathKey, op, resolve, verb) { + if (verb === 'head') return 'head_count_endpoint'; + if (/\/functions\/deploy$/.test(pathKey)) return 'multipart_eszip_deploy'; + if (verb === 'put' && /\/functions$/.test(pathKey)) return 'bare_array_bulk_body'; + if (verb === 'get' && /\/database\/openapi$/.test(pathKey)) return 'untyped_json_response'; + if (/^\/v1\/oauth\//.test(pathKey)) return 'oauth_user_agent_flow'; + if (/\/functions\/\{[^}]+\}\/body$/.test(pathKey)) return 'untyped_function_body'; + const { schema, mediaTypes } = success2xx(op); + if (!schema && mediaTypes.length > 0 && !mediaTypes.some((m) => m.includes('json'))) return 'non_json_text_response'; + return ''; +} + +// --------------------------------------------------------------------------- +// Project-scoped server rebase (bin/split.mjs, post_process.mjs) +// --------------------------------------------------------------------------- + +// 141 of the 170 operations live under /v1/projects/{ref}/... . The split +// rebases those paths onto the project-scoped server template in +// provider-dev/config/servers.json (https://api.supabase.com/v1/projects/{ref}, +// the {ref} server variable carrying x-stackQL-envVar: SUPABASE_PROJECT_ID so +// stackql resolves it from the environment - the clickhouse organization +// precedent, stackql/stackql#707). Every other path (the projects root and +// create, available regions, the organization surface, branch-by-id, snippets, +// profile, oauth, and /v1/projects/{ref} itself) keeps its full path and is +// pinned back to the bare API base by a path-level servers override injected +// after generation by post_process.mjs (normalize strips path-level servers). +export const REF_PREFIX = '/v1/projects/{ref}'; +export const API_BASE_URL = 'https://api.supabase.com'; + +export function isRefScoped(pathKey) { + return pathKey.startsWith(REF_PREFIX + '/'); +} + +// Rewrites a split service document in place: sets the project-scoped +// servers, strips the ref prefix from every project-scoped path and drops the +// ref path parameter (it is the server variable now). Returns the counts. +export function rebaseRefScopedPaths(doc, servers) { + const newPaths = {}; + let rebased = 0, kept = 0; + for (const [pathKey, pathItem] of Object.entries(doc.paths || {})) { + if (!isRefScoped(pathKey)) { + newPaths[pathKey] = pathItem; + kept++; + continue; + } + const shortPath = pathKey.slice(REF_PREFIX.length); + if (shortPath in newPaths) throw new Error(`rebase collision: ${pathKey} -> ${shortPath}`); + const dropRef = (params) => (params || []).filter((p) => !(p && p.in === 'path' && p.name === 'ref')); + if (pathItem.parameters) pathItem.parameters = dropRef(pathItem.parameters); + for (const verb of HTTP_VERBS) { + if (pathItem[verb]?.parameters) pathItem[verb].parameters = dropRef(pathItem[verb].parameters); + } + newPaths[shortPath] = pathItem; + rebased++; + } + doc.paths = newPaths; + doc.servers = JSON.parse(JSON.stringify(servers)); + return { rebased, kept }; +} diff --git a/provider-dev/scripts/map_operations.mjs b/provider-dev/scripts/map_operations.mjs new file mode 100644 index 0000000..a4dbc9a --- /dev/null +++ b/provider-dev/scripts/map_operations.mjs @@ -0,0 +1,404 @@ +#!/usr/bin/env node + +// Populates stackql_resource_name, stackql_method_name, stackql_verb and +// stackql_object_key in provider-dev/config/all_services.csv from the split +// service specs in provider-dev/source. Deterministic and re-runnable on +// spec refreshes; review the CSV diff after running. Manual mapping decisions +// are applied as rules here, never as hand-edits to the CSV. +// +// Mapping conventions (see CLAUDE.md): +// GET collection -> SELECT .list (bare arrays +// are wrapped by normalize; the wrap +// key is confirmed on the first +// normalize run and set here - blank +// until then; envelope reads carry +// their key, e.g. $.keys, $.items) +// GET single / config singleton -> SELECT .get +// POST create -> INSERT .create +// PATCH/PUT edit -> UPDATE .update (UPDATE vs +// REPLACE labelled per resource once +// the toggle-and-restore probe runs - +// keycloak warning: default UPDATE, +// REPLACE only on proven +// full-replacement semantics) +// DELETE -> DELETE .delete +// POST lifecycle actions -> EXEC . +// (pause, restart, restore, upgrade, setup/remove replicas, ...) +// POST .../database/query -> provisional EXEC draft; the flagship +// mapping (snowflake SubmitStatement framework, EXEC vs INSERT ... +// RETURNING) is decided on live projection evidence and recorded in +// NOTES.md before the database service is generated +// multipart deploy, oauth flow, -> skipped (skip_this_resource, +// untyped function body, HEAD reason-coded in +// endpoint_inventory.csv) +// +// Resource names come from the shared derivation in lib/spec_helpers.mjs +// (scoping pairs stripped, last segment pluralized); RESOURCE_RULES applies +// explicit overrides where the mechanical name is wrong. +// +// Validates before writing: every CSV row mapped or skipped with a reason, +// every spec operation present in the CSV, (resource, method) unique per +// service, and unique required-parameter signatures per (resource, sqlVerb). +// Fails without writing on violations. +// +// Usage: npm run map-operations [-- --out other.csv] + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import yaml from 'js-yaml'; +import pluralize from 'pluralize'; +import { + HTTP_VERBS, camelToSnake, pathParams, makeResolver, + classifyResponseShape, skipReason, scopedSegments, + ACTION_SEGMENTS, POST_EXEC_SEGMENTS, deriveResource +} from './lib/spec_helpers.mjs'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..'); +const sourceDir = path.join(repoRoot, 'provider-dev', 'source'); +const csvPath = path.join(repoRoot, 'provider-dev', 'config', 'all_services.csv'); + +// Explicit resource-name overrides, matched on (service, verb-optional, +// normalized path with params collapsed to {}). First match wins; add rules +// here as services come online - never edit the CSV. Pilot services +// (projects, config, secrets) are covered; the remaining services get their +// rules when they are split. +const RESOURCE_RULES = [ + // --- config: singleton config surfaces read poorly when derived + // mechanically (config/auth -> "auths"); the *_configs convention is the + // CLAUDE.md posture-surface naming + { service: 'config', re: /\/config\/auth$/, resource: 'auth_configs' }, + { service: 'config', re: /\/config\/auth\/signing-keys\/legacy$/, resource: 'legacy_signing_keys' }, + { service: 'config', re: /\/config\/auth\/third-party-auth(\/\{\})?$/, resource: 'third_party_auth_integrations' }, + { service: 'config', re: /\/config\/auth\/sso\/providers(\/\{\})?$/, resource: 'sso_providers' }, + { service: 'config', re: /\/config\/database\/postgres$/, resource: 'postgres_configs' }, + { service: 'config', re: /\/config\/database\/pooler$/, resource: 'pooler_configs' }, + { service: 'config', re: /\/config\/database\/pgbouncer$/, resource: 'pgbouncer_configs' }, + { service: 'config', re: /\/config\/realtime(\/shutdown)?$/, resource: 'realtime_configs' }, + { service: 'config', re: /\/config\/storage$/, resource: 'storage_configs' }, + { service: 'config', re: /\/postgrest$/, resource: 'postgrest_configs' }, + { service: 'config', re: /\/ssl-enforcement$/, resource: 'ssl_enforcement_configs' }, + { service: 'config', re: /\/pgsodium$/, resource: 'pgsodium_configs' }, + // --- projects + { service: 'projects', re: /\/health$/, resource: 'service_health' }, + { service: 'projects', verb: 'get', re: /\/restore$/, resource: 'restore_versions' }, + { service: 'projects', re: /\/restore\/cancel$/, resource: 'projects' }, + { service: 'projects', re: /\/upgrade\/eligibility$/, resource: 'upgrade_eligibility' }, + { service: 'projects', re: /\/upgrade\/status$/, resource: 'upgrade_status' }, + { service: 'projects', re: /\/config\/disk$/, resource: 'disk_configs' }, + { service: 'projects', re: /\/config\/disk\/util$/, resource: 'disk_utilization' }, + { service: 'projects', re: /\/config\/disk\/autoscale$/, resource: 'disk_autoscale_configs' }, + { service: 'projects', re: /^\/v1\/organizations\/\{\}\/projects$/, resource: 'organization_projects' }, + // --- secrets + { service: 'secrets', re: /\/api-keys\/legacy$/, resource: 'legacy_api_keys' }, + // --- branches: the branch-by-id read returns the branch's database + // connection details (BranchDetailResponse), a different shape from the + // project-scoped list/get (BranchResponse); it gets its own resource so + // each resource projects one shape. The vendor's operationId is + // v1-get-a-branch-config. + { service: 'branches', verb: 'get', re: /^\/v1\/branches\/\{\}$/, resource: 'branch_configs' }, + { service: 'branches', re: /\/actions(\/|$)/, resource: 'action_runs' }, + // --- database + { service: 'database', re: /\/database\/query(\/read-only)?$/, resource: 'queries' }, + { service: 'database', re: /\/database\/password$/, resource: 'databases' }, + { service: 'database', re: /\/database\/context$/, resource: 'databases' }, + { service: 'database', re: /\/database\/backups\/restore-point$/, resource: 'restore_points' }, + { service: 'database', re: /\/database\/backups\/schedule$/, resource: 'backup_schedules' }, + { service: 'database', verb: 'get', re: /\/database\/jit$/, resource: 'jit_role_mappings' }, + { service: 'database', re: /\/database\/jit(\/list|\/\{\})?$/, resource: 'jit_access' }, + { service: 'database', re: /\/database\/jit\/invite/, resource: 'jit_invites' }, + { service: 'database', re: /\/jit-access$/, resource: 'jit_access_configs' }, + { service: 'database', re: /\/readonly(\/temporary-disable)?$/, resource: 'readonly_mode' }, + { service: 'database', re: /\/types\/typescript$/, resource: 'typescript_types' }, + { service: 'database', re: /\/database\/webhooks\/enable$/, resource: 'webhooks' }, + // --- functions: the CLAUDE.md naming (supabase.functions.edge_functions) + { service: 'functions', re: /\/functions(\/|$)/, resource: 'edge_functions' }, + // --- network: both POST-backed ban reads are the network_bans resource + { service: 'network', re: /\/network-bans(\/|$)/, resource: 'network_bans' }, + // --- analytics: one resource per endpoint, named for what it returns + { service: 'analytics', re: /\/endpoints\/logs\.all$/, resource: 'all_logs' }, + { service: 'analytics', re: /\/endpoints\/logs$/, resource: 'logs' }, + { service: 'analytics', re: /\/endpoints\/usage\.api-counts$/, resource: 'api_counts' }, + { service: 'analytics', re: /\/endpoints\/usage\.api-requests-count$/, resource: 'api_request_counts' }, + { service: 'analytics', re: /\/endpoints\/functions\.combined-stats$/, resource: 'function_stats' }, + // --- advisors: the lint rows are the resource + { service: 'advisors', re: /\/advisors\/performance$/, resource: 'performance_lints' }, + { service: 'advisors', re: /\/advisors\/security$/, resource: 'security_lints' }, + // --- organizations + { service: 'organizations', re: /\/project-claim\/\{\}$/, resource: 'project_claims' } +]; + +// Method-name / verb / objectKey overrides for cases the generic rules +// cannot express, matched on (verb, normalized path). First match wins. +const METHOD_RULES = [ + // envelope list reads carry their array key + { verb: 'get', re: /\/config\/auth\/signing-keys$/, method: 'list', sqlVerb: 'select', objectKey: '$.keys' }, + { verb: 'get', re: /\/config\/auth\/sso\/providers$/, method: 'list', sqlVerb: 'select', objectKey: '$.items' }, + { verb: 'get', re: /\/restore$/, method: 'list', sqlVerb: 'select', objectKey: '$.available_versions' }, + { verb: 'get', re: /^\/v1\/organizations\/\{\}\/projects$/, method: 'list', sqlVerb: 'select', objectKey: '$.projects' }, + // the realtime shutdown command is an action on the config parent + { verb: 'post', re: /\/config\/realtime\/shutdown$/, method: 'shutdown', sqlVerb: 'exec', objectKey: '' }, + // POST config/disk modifies the disk (grow/change), not a create + { verb: 'post', re: /\/config\/disk$/, method: 'modify', sqlVerb: 'exec', objectKey: '' }, + // restore/cancel is a projects lifecycle command; the mechanical name + // would collide with a restores resource + { verb: 'post', re: /\/restore\/cancel$/, method: 'cancel_restore', sqlVerb: 'exec', objectKey: '' }, + // --- branches: DELETE /projects/{ref}/branches disables preview branching + // for the project (an action, not a row delete); the branch-by-id DELETE is + // the row delete + { verb: 'delete', re: /^\/branches$/, method: 'disable_branching', sqlVerb: 'exec', objectKey: '' }, + // --- database + // snippets list is a {data, cursor} envelope (cursor pagination is + // configured in post_process) + { verb: 'get', re: /^\/v1\/snippets$/, method: 'list', sqlVerb: 'select', objectKey: '$.data' }, + // migrations: PUT is an upsert (apply-or-record), distinct from the PATCH + // edit of a recorded version + { verb: 'put', re: /\/database\/migrations$/, method: 'upsert', sqlVerb: 'exec', objectKey: '' }, + // the flagship: POST database/query maps as INSERT (queries.run) so that + // INSERT ... RETURNING flows the result rows (snowflake SubmitStatement + // framework, projection evidence in NOTES.md finding 1); the read-only + // sibling is EXEC-only - the main method takes read_only in its body + { verb: 'post', re: /\/database\/query$/, method: 'run', sqlVerb: 'insert', objectKey: '' }, + { verb: 'post', re: /\/database\/query\/read-only$/, method: 'run_read_only', sqlVerb: 'exec', objectKey: '' }, + // database metadata (deprecated) is the databases list + { verb: 'get', re: /\/database\/context$/, method: 'list', sqlVerb: 'select', objectKey: '$.databases' }, + // backups: the envelope's backups array is the row source + { verb: 'get', re: /\/database\/backups$/, method: 'list', sqlVerb: 'select', objectKey: '$.backups' }, + // JIT access: the list envelope + { verb: 'get', re: /\/database\/jit\/list$/, method: 'list', sqlVerb: 'select', objectKey: '$.items' }, + // --- functions: PUT /functions is a bulk update taking a bare array body + { verb: 'put', re: /^\/functions$/, method: 'bulk_update', sqlVerb: 'exec', objectKey: '' }, + // --- network bans: the enriched POST read is the list (object rows); the + // plain POST read (string rows) stays available as EXEC + { verb: 'post', re: /\/network-bans\/retrieve\/enriched$/, method: 'list', sqlVerb: 'select', objectKey: '$.banned_ipv4_addresses' }, + { verb: 'post', re: /\/network-bans\/retrieve$/, method: 'retrieve', sqlVerb: 'exec', objectKey: '' }, + // --- advisors: the lints array is the row source + { verb: 'get', re: /\/advisors\/(performance|security)$/, method: 'list', sqlVerb: 'select', objectKey: '$.lints' }, + // --- billing: the project's applied add-ons are the rows + { verb: 'get', re: /\/billing\/addons$/, method: 'list', sqlVerb: 'select', objectKey: '$.selected_addons' }, + // --- organizations: claiming a project is an action on the claim + { verb: 'post', re: /\/project-claim\/\{\}$/, method: 'claim', sqlVerb: 'exec', objectKey: '' } +]; + +function normalizePath(pathKey) { + return pathKey.replace(/\{[^}]+\}/g, '{}'); +} + +// --------------------------------------------------------------------------- +// Index every operation in the split service specs +// --------------------------------------------------------------------------- + +const ops = new Map(); // `${filename}::${path}::${verb}` -> { op, pathItem, resolve } +const specFiles = fs.readdirSync(sourceDir).filter((f) => f.endsWith('.yaml')).sort(); +if (specFiles.length === 0) { + console.error(`Error: no service specs in ${sourceDir} - run npm run split first`); + process.exit(1); +} +for (const filename of specFiles) { + const spec = yaml.load(fs.readFileSync(path.join(sourceDir, filename), 'utf8')); + const resolve = makeResolver(spec); + for (const [pathKey, pathItem] of Object.entries(spec.paths || {})) { + for (const verb of HTTP_VERBS) { + if (!pathItem[verb]) continue; + ops.set(`${filename}::${pathKey}::${verb}`, { op: pathItem[verb], pathItem, resolve }); + } + } +} + +// --------------------------------------------------------------------------- +// Mapping +// --------------------------------------------------------------------------- + +function resourceFor(service, pathKey, verb) { + const norm = normalizePath(pathKey); + for (const rule of RESOURCE_RULES) { + if (rule.service && rule.service !== service) continue; + if (rule.verb && rule.verb !== verb) continue; + if (rule.re.test(norm)) return rule.resource; + } + return deriveResource(pathKey, verb, service, pluralize); +} + +function mapOperation(filename, pathKey, verb) { + const entry = ops.get(`${filename}::${pathKey}::${verb}`); + if (!entry) return { error: `operation not found in ${sourceDir}` }; + const { op, resolve } = entry; + const service = filename.replace(/\.yaml$/, ''); + + const skip = skipReason(pathKey, op, resolve, verb); + if (skip) return { resource: 'skip_this_resource', method: '', sqlVerb: '', objectKey: '', skip }; + + const norm = normalizePath(pathKey); + const methodRule = METHOD_RULES.find((r) => r.verb === verb && r.re.test(norm)); + const resource = resourceFor(service, pathKey, verb); + if (methodRule) { + return { resource, method: methodRule.method, sqlVerb: methodRule.sqlVerb, objectKey: methodRule.objectKey || '' }; + } + + const { segs } = scopedSegments(pathKey); + const statics = segs.filter((s) => !s.startsWith('{')); + const lastStatic = statics[statics.length - 1]; + const lastSegIsParam = /\}$/.test(pathKey); + const { shape } = classifyResponseShape(op, resolve); + + if (verb === 'get') { + // bare-array lists: normalize wraps these; the wrap key is confirmed on + // the first normalize run and set via METHOD_RULES then (left blank in + // the phase 1 groundwork mapping) + if (shape === 'bare-array') return { resource, method: 'list', sqlVerb: 'select', objectKey: '' }; + return { resource, method: 'get', sqlVerb: 'select', objectKey: '' }; + } + if (verb === 'delete') { + return { resource, method: 'delete', sqlVerb: 'delete', objectKey: '' }; + } + if (verb === 'patch' || verb === 'put') { + if (ACTION_SEGMENTS.has(lastStatic)) { + return { resource, method: `update_${camelToSnake(lastStatic)}`, sqlVerb: 'exec', objectKey: '' }; + } + return { resource, method: 'update', sqlVerb: 'update', objectKey: '' }; + } + // post + if (POST_EXEC_SEGMENTS.has(lastStatic)) { + return { resource, method: camelToSnake(lastStatic), sqlVerb: 'exec', objectKey: '' }; + } + return { resource, method: 'create', sqlVerb: 'insert', objectKey: '' }; +} + +// --------------------------------------------------------------------------- +// CSV read/transform/write (RFC 4180, preserves column order) +// --------------------------------------------------------------------------- + +function parseCsv(text) { + const rows = []; + let row = [], field = '', inQuotes = false; + for (let i = 0; i < text.length; i++) { + const c = text[i]; + if (inQuotes) { + if (c === '"') { + if (text[i + 1] === '"') { field += '"'; i++; } else { inQuotes = false; } + } else { field += c; } + } else if (c === '"') { + inQuotes = true; + } else if (c === ',') { + row.push(field); field = ''; + } else if (c === '\n' || c === '\r') { + if (c === '\r' && text[i + 1] === '\n') i++; + row.push(field); field = ''; + if (row.length > 1 || row[0] !== '') rows.push(row); + row = []; + } else { field += c; } + } + if (field !== '' || row.length > 0) { row.push(field); rows.push(row); } + return rows; +} + +function csvField(v) { + return /[",\n\r]/.test(v) ? `"${v.replace(/"/g, '""')}"` : v; +} + +const rows = parseCsv(fs.readFileSync(csvPath, 'utf8')); +const header = rows[0]; +const col = Object.fromEntries(header.map((h, i) => [h, i])); +for (const required of ['filename', 'path', 'verb', 'operationId', 'stackql_resource_name', 'stackql_method_name', 'stackql_verb', 'stackql_object_key']) { + if (!(required in col)) { + console.error(`Missing expected CSV column: ${required}`); + process.exit(1); + } +} + +const errors = []; +const seenKeys = new Set(); +const stats = { select: 0, insert: 0, update: 0, delete: 0, exec: 0, skipped: 0 }; +const skipsByReason = {}; + +for (const row of rows.slice(1)) { + const filename = row[col.filename], pathKey = row[col.path], verb = row[col.verb]; + seenKeys.add(`${filename}::${pathKey}::${verb}`); + const m = mapOperation(filename, pathKey, verb); + if (m.error) { + errors.push(`${filename} ${verb} ${pathKey}: ${m.error}`); + continue; + } + row[col.stackql_resource_name] = m.resource; + if (m.resource === 'skip_this_resource') { + stats.skipped++; + skipsByReason[m.skip] = (skipsByReason[m.skip] || 0) + 1; + row[col.stackql_method_name] = ''; + row[col.stackql_verb] = ''; + row[col.stackql_object_key] = ''; + continue; + } + row[col.stackql_method_name] = m.method; + row[col.stackql_verb] = m.sqlVerb; + row[col.stackql_object_key] = m.objectKey; + stats[m.sqlVerb]++; +} + +// every spec operation must have a CSV row (else generate-provider misses it) +for (const key of ops.keys()) { + if (!seenKeys.has(key)) errors.push(`in spec but not in CSV: ${key}`); +} + +// --------------------------------------------------------------------------- +// Consistency checks +// --------------------------------------------------------------------------- + +const methodSeen = new Map(); +const sigSeen = new Map(); +for (const row of rows.slice(1)) { + const resource = row[col.stackql_resource_name]; + if (!resource || resource === 'skip_this_resource') continue; + const service = row[col.filename].replace(/\.yaml$/, ''); + const methodKey = `${service}.${resource}.${row[col.stackql_method_name]}`; + if (methodSeen.has(methodKey)) { + errors.push(`duplicate method ${methodKey} (${methodSeen.get(methodKey)} and ${row[col.path]}:${row[col.verb]})`); + } + methodSeen.set(methodKey, `${row[col.path]}:${row[col.verb]}`); + + const sqlVerb = row[col.stackql_verb]; + if (sqlVerb === 'exec') continue; + // signature = required inputs: path params plus required query params + const entry = ops.get(`${row[col.filename]}::${row[col.path]}::${row[col.verb]}`); + const requiredQuery = [...(entry?.pathItem?.parameters || []), ...(entry?.op.parameters || [])] + .map((p) => entry.resolve(p)) + .filter((p) => p && p.in === 'query' && p.required) + .map((p) => p.name); + const sig = [...pathParams(row[col.path]), ...requiredQuery].sort().join(','); + const sigKey = `${service}.${resource}.${sqlVerb}::${sig}`; + if (sigSeen.has(sigKey)) { + errors.push(`signature clash on ${service}.${resource} ${sqlVerb} [${sig}] (${sigSeen.get(sigKey)} and ${row[col.stackql_method_name]})`); + } + sigSeen.set(sigKey, row[col.stackql_method_name]); +} + +if (process.argv.includes('--report')) { + // diagnostic listing of the derived mapping per operation (no write) + for (const row of rows.slice(1)) { + console.log(`${row[col.filename].replace(/.yaml$/, '').padEnd(14)} ${row[col.verb].padEnd(6)} ${row[col.path].padEnd(62)} -> ${row[col.stackql_resource_name]}.${row[col.stackql_method_name]} [${row[col.stackql_verb]}] ${row[col.stackql_object_key]}`); + } +} +if (errors.length > 0) { + console.error(`FAILED with ${errors.length} error(s), nothing written:`); + for (const e of errors) console.error(` ${e}`); + process.exit(1); +} + +const outArgIdx = process.argv.indexOf('--out'); +const outPath = outArgIdx !== -1 ? path.resolve(process.argv[outArgIdx + 1]) : csvPath; +const out = rows.map((r) => r.map(csvField).join(',')).join('\n') + '\n'; +fs.writeFileSync(outPath, out); + +// summary +const resourcesByService = new Map(); +for (const row of rows.slice(1)) { + const resource = row[col.stackql_resource_name]; + if (!resource || resource === 'skip_this_resource') continue; + const service = row[col.filename].replace(/\.yaml$/, ''); + if (!resourcesByService.has(service)) resourcesByService.set(service, new Set()); + resourcesByService.get(service).add(resource); +} +console.log(`Mapped: select ${stats.select}, insert ${stats.insert}, update ${stats.update}, delete ${stats.delete}, exec ${stats.exec}; skipped ${stats.skipped}${stats.skipped ? ` (${Object.entries(skipsByReason).map(([k, v]) => `${k}: ${v}`).join(', ')})` : ''}`); +console.log('Resources per service:'); +for (const [service, resources] of [...resourcesByService.entries()].sort()) { + console.log(` ${service}: ${[...resources].sort().join(', ')}`); +} diff --git a/provider-dev/scripts/post_process.mjs b/provider-dev/scripts/post_process.mjs new file mode 100644 index 0000000..f7a3445 --- /dev/null +++ b/provider-dev/scripts/post_process.mjs @@ -0,0 +1,187 @@ +#!/usr/bin/env node + +// Post-generation fixes for things the generator cannot express. Idempotent; +// re-run after every generate. Validates and fails without writing. +// +// 1. Root-path server override. Every service is generated on the +// project-scoped server template (https://api.supabase.com/v1/projects/{ref}, +// ref via x-stackQL-envVar SUPABASE_PROJECT_ID). The 27 paths that are not +// project-scoped (the projects root and create, available regions, the +// organization surface, branch-by-id, snippets, profile, oauth, and +// /v1/projects/{ref} itself) keep their full /v1/... key and get a +// path-level `servers` override back to https://api.supabase.com. any-sdk +// resolves servers operation -> path item -> document, so the override +// wins for these operations only. It is applied here because normalize +// strips path-level servers from provider-dev/source. +// +// 2. Snippets cursor pagination. GET /v1/snippets is the only token-paginated +// collection (cursor query parameter, `cursor` companion in the response +// envelope); a method-level pagination config lets stackql follow it. +// +// 3. snake_case surface. The wire is snake_case almost everywhere; three +// request bodies carry camelCase attributes (network-restrictions/apply: +// dbAllowedCidrs / dbAllowedCidrsV6; ssl-enforcement PUT: requestedConfig; +// storage config PATCH: fileSizeLimit). `request.nativeCasing: camel` on +// those three methods lets the snake_case SQL keys resolve against them, +// paired with `snake_case_aliases: true` on the provider config (Makefile +// PROVIDER_CONFIG) which presents the handful of camelCase response +// properties (currentConfig, appliedSuccessfully, connectionString, ...) +// as snake_case columns. The oci/clickhouse precedent. +// +// 4. The query endpoint result binding. POST /database/query returns a bare +// JSON array of row objects with query-dependent keys. pre_normalize +// typed the 201 as V1RunQueryResultRows ({rows: [...]}); the wrap +// transform attached here (the same trio the generator emits for +// bare-array lists: overrideMediaType + schema_override + transform) +// turns the array into that envelope, so `INSERT ... RETURNING rows` +// yields one row whose `rows` column carries the result set (NOTES.md +// finding 1, the newrelic blob posture). Applied to the read-only sibling +// as well. +// +// 5. POST-backed reads. The generator applies stackql_object_key to GET +// operations only; the network bans list is a POST read +// ({banned_ipv4_addresses: [...]}) and gets its objectKey here. +// +// 6. Secrets bulk bodies. pre_normalize rewrote the bare-array request +// bodies of POST/DELETE /secrets to their single-item object form; the +// request transforms attached here wrap the marshalled object back into +// the array the wire expects: `[{"name": ..., "value": ...}]` for the +// create and `["name"]` for the delete (NOTES.md finding 8). +// +// 7. DELETE with a body. The generator emits requestBodyTranslate: naive +// for POST/PUT/PATCH only, so a DELETE body would surface as +// data__; the two DELETEs that carry bodies (secrets, network +// bans) get the naive translation here so their attributes are plain +// WHERE keys. +// +// Usage: node provider-dev/scripts/post_process.mjs + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import yaml from 'js-yaml'; +import { API_BASE_URL } from './lib/spec_helpers.mjs'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..'); +const servicesDir = path.join(repoRoot, 'provider-dev', 'openapi', 'src', 'supabase', 'v00.00.00000', 'services'); +const QUERY_RESULT_SCHEMA_NAME = 'V1RunQueryResultRows'; + +// methods whose request bodies carry camelCase attributes +const CAMEL_BODY_METHODS = [ + ['network.yaml', 'network_restrictions', 'apply'], + ['config.yaml', 'ssl_enforcement_configs', 'update'], + ['config.yaml', 'storage_configs', 'update'] +]; + +if (!fs.existsSync(servicesDir)) { + console.error(`Error: ${servicesDir} not found - run the generate step first`); + process.exit(1); +} + +const errors = []; +const docs = new Map(); +const counts = { rootPathsPinned: 0, refPaths: 0, nativeCasing: 0 }; + +for (const f of fs.readdirSync(servicesDir).filter((x) => x.endsWith('.yaml')).sort()) { + const doc = yaml.load(fs.readFileSync(path.join(servicesDir, f), 'utf8')); + docs.set(f, doc); + + // 1. root paths pinned to the API base; every other path must be rebased + const srv = doc.servers?.[0]; + if (!srv?.variables?.ref?.['x-stackQL-envVar']) errors.push(`${f}: top-level server lacks the ref x-stackQL-envVar variable`); + for (const [p, item] of Object.entries(doc.paths || {})) { + if (p.startsWith('/v1/')) { + item.servers = [{ url: API_BASE_URL }]; + counts.rootPathsPinned++; + } else if (p.includes('{ref}')) { + errors.push(`${f}: path ${p} still carries {ref} but was not kept as a root path`); + } else { + counts.refPaths++; + } + } + const resources = doc.components?.['x-stackQL-resources'] || {}; + if (Object.keys(resources).length === 0 && f !== 'oauth.yaml') errors.push(`${f}: no x-stackQL-resources`); +} + +const method = (f, resource, name) => { + const m = docs.get(f)?.components?.['x-stackQL-resources']?.[resource]?.methods?.[name]; + if (!m) errors.push(`${f}: expected method ${resource}.${name} is missing`); + return m; +}; + +// 2. snippets cursor pagination +const snippetsList = method('database.yaml', 'snippets', 'list'); +if (snippetsList) { + const op = docs.get('database.yaml').paths?.['/v1/snippets']?.get; + if (!(op?.parameters || []).some((p) => p.name === 'cursor')) errors.push('database.yaml: GET /v1/snippets lost its cursor parameter'); + snippetsList.config = { + ...(snippetsList.config || {}), + pagination: { + requestToken: { key: 'cursor', location: 'query' }, + responseToken: { key: '$.cursor', location: 'body' } + } + }; +} + +// 3. nativeCasing: camel on the camelCase-body methods +for (const [f, resource, name] of CAMEL_BODY_METHODS) { + const m = method(f, resource, name); + if (!m) continue; + m.request = { ...(m.request || {}), nativeCasing: 'camel' }; + counts.nativeCasing++; +} + +// 4. query result binding +const dbDoc = docs.get('database.yaml'); +if (dbDoc && !dbDoc.components?.schemas?.[QUERY_RESULT_SCHEMA_NAME]) errors.push(`database.yaml: components.schemas.${QUERY_RESULT_SCHEMA_NAME} is missing (pre_normalize injects it)`); +for (const name of ['run', 'run_read_only']) { + const m = method('database.yaml', 'queries', name); + if (!m) continue; + if (m.response?.openAPIDocKey !== '201') errors.push(`database.yaml: queries.${name} does not bind the 201 response`); + m.response = { + ...m.response, + mediaType: 'application/json', + openAPIDocKey: '201', + overrideMediaType: 'application/json', + schema_override: { $ref: `#/components/schemas/${QUERY_RESULT_SCHEMA_NAME}` }, + transform: { + body: '{{- $wrapped := printf "{\\"rows\\":%s}" . -}}\n{{- $wrapped -}}', + type: 'golang_template_text_v0.3.0' + } + }; +} + +// 5. POST-backed reads: objectKey +const bansList = method('network.yaml', 'network_bans', 'list'); +if (bansList) bansList.response = { ...bansList.response, objectKey: '$.banned_ipv4_addresses' }; + +// 6. secrets bulk bodies: wrap the single-item object back into the array +const secretsCreate = method('secrets.yaml', 'secrets', 'create'); +if (secretsCreate) { + const op = docs.get('secrets.yaml').paths?.['/secrets']?.post; + const schema = op?.requestBody?.content?.['application/json']?.schema; + if (schema?.type === 'array' || !schema?.properties?.name) errors.push('secrets.yaml: POST /secrets body is not the single-item object pre_normalize writes'); + secretsCreate.request = { ...(secretsCreate.request || {}), transform: { type: 'golang_template_text_v0.3.0', body: '[{{ . }}]' } }; +} +const secretsDelete = method('secrets.yaml', 'secrets', 'delete'); +if (secretsDelete) { + secretsDelete.request = { ...(secretsDelete.request || {}), transform: { type: 'golang_template_json_v0.3.0', body: '[{{ toJson .name }}]' } }; +} + +// 7. DELETE with a body: naive request-body translation +let naiveDeletes = 0; +for (const [f, resource, name] of [['secrets.yaml', 'secrets', 'delete'], ['network.yaml', 'network_bans', 'delete']]) { + const m = method(f, resource, name); + if (!m) continue; + m.config = { ...(m.config || {}), requestBodyTranslate: { algorithm: 'naive' } }; + naiveDeletes++; +} + +if (errors.length > 0) { + console.error(`FAILED with ${errors.length} error(s), nothing written:`); + for (const e of errors) console.error(` ${e}`); + process.exit(1); +} +for (const [f, d] of docs) fs.writeFileSync(path.join(servicesDir, f), yaml.dump(d, { lineWidth: -1, noRefs: true })); +console.log(`post_process: pinned ${counts.rootPathsPinned} root path item(s) to ${API_BASE_URL} across ${docs.size} services (${counts.refPaths} project-scoped paths on the server template)`); +console.log(`post_process: snippets cursor pagination; request.nativeCasing: camel on ${counts.nativeCasing} methods; query result binding on queries.run / run_read_only; objectKey on network_bans.list; secrets bulk-body request transforms; naive body translation on ${naiveDeletes} DELETE methods`); diff --git a/provider-dev/scripts/pre_normalize.mjs b/provider-dev/scripts/pre_normalize.mjs new file mode 100644 index 0000000..113c606 --- /dev/null +++ b/provider-dev/scripts/pre_normalize.mjs @@ -0,0 +1,188 @@ +#!/usr/bin/env node + +// Supabase-specific spec adjustments applied to provider-dev/source before +// the generic provider-utils normalize pass. Deterministic and idempotent; +// validates and fails without writing on any unexpected shape. +// +// 1. Edge function create/update: the JSON operations (POST /functions, +// PATCH /functions/{function_slug}) declare two request media types, +// application/vnd.denoland.eszip first and application/json second. +// any-sdk binds the request body to the first declared media type, so the +// eszip entry is removed and the JSON body (name, slug, verify_jwt, body, +// ...) is the one the provider drives. Bundle deploys are the multipart +// endpoint, skipped per the standing binary exclusion (the CLI is the +// deploy path). +// +// 2. The two database query endpoints (POST /database/query and +// /database/query/read-only) declare a 201 with no content. The wire body +// is a bare JSON array of row objects with query-dependent keys (the +// vendor's reference examples; confirmed against the mock in the +// integration suite). A typed 201 is injected here so the generator emits +// a normal response binding; post_process.mjs then attaches the wrap +// transform that presents the array as one row with a `rows` JSON column +// (NOTES.md finding 1). +// +// 3. Edge function create: POST /functions declares the function attributes +// twice - as deprecated query parameters (slug, name, verify_jwt, +// import_map, entrypoint_path, import_map_path, ezbr_sha256) and as the +// JSON body. any-sdk binds an INSERT column to the query parameter first, +// so the body arrived with only `body` set and the API rejected it. The +// query duplicates are removed; the body is canonical. +// +// 4. Secrets bulk endpoints: POST /secrets takes a bare array of {name, +// value} and DELETE /secrets a bare array of names. Naive request-body +// translation lowers top-level object properties to columns and cannot +// address a bare array, so each body is rewritten to its single-item +// object form (one secret per statement - the Terraform resource's +// granularity too); post_process.mjs attaches the request transform that +// wraps the marshalled object back into the array the wire expects +// (NOTES.md finding 8). +// +// 5. Pooler config: SupavisorConfigResponse carries both connection_string +// and its camelCase duplicate connectionString. With snake_case_aliases +// both present as `connection_string`, which collides in the row +// projection (a DDL error at query time); the camelCase duplicate is +// dropped. +// +// Usage: node provider-dev/scripts/pre_normalize.mjs [--dry-run] + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import yaml from 'js-yaml'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..'); +const sourceDir = path.join(repoRoot, 'provider-dev', 'source'); +const dryRun = process.argv.includes('--dry-run'); + +export const QUERY_RESULT_SCHEMA_NAME = 'V1RunQueryResultRows'; +export const QUERY_PATHS = ['/database/query', '/database/query/read-only']; +const ESZIP = 'application/vnd.denoland.eszip'; + +const files = fs.readdirSync(sourceDir).filter((f) => f.endsWith('.yaml')).sort(); +if (files.length === 0) { + console.error(`Error: no service specs in ${sourceDir} - run npm run split first`); + process.exit(1); +} + +const errors = []; +const stats = { eszip_request_variant_removed: 0, query_response_schema_injected: 0, function_create_query_duplicates_removed: 0, secrets_bulk_body_rewritten: 0, pooler_camel_duplicate_removed: 0 }; +const pending = []; + +// resolves a local $ref within the service document +const deref = (doc, node) => (node && node.$ref ? node.$ref.replace(/^#\//, '').split('/').reduce((a, k) => a?.[k], doc) : node); + +for (const f of files) { + const fp = path.join(sourceDir, f); + const doc = yaml.load(fs.readFileSync(fp, 'utf8')); + let touched = false; + + if (f === 'functions.yaml') { + for (const [pathKey, item] of Object.entries(doc.paths || {})) { + for (const verb of ['post', 'patch']) { + const content = item[verb]?.requestBody?.content; + if (!content || !(ESZIP in content)) continue; + if (!content['application/json']) { + errors.push(`${f}: ${verb.toUpperCase()} ${pathKey} declares ${ESZIP} without an application/json variant`); + continue; + } + delete content[ESZIP]; + stats.eszip_request_variant_removed++; + touched = true; + } + } + if (stats.eszip_request_variant_removed === 0) errors.push(`${f}: expected the eszip request variant on the JSON function create/update, found none`); + // 3. drop the deprecated query duplicates of the create/update body + // attributes (POST /functions and PATCH /functions/{function_slug}) + const LEGACY_QUERY = new Set(['slug', 'name', 'verify_jwt', 'import_map', 'entrypoint_path', 'import_map_path', 'ezbr_sha256']); + for (const [pathKey, verb] of [['/functions', 'post'], ['/functions/{function_slug}', 'patch']]) { + const op = doc.paths?.[pathKey]?.[verb]; + if (!op) { errors.push(`${f}: expected ${verb.toUpperCase()} ${pathKey}`); continue; } + const before = (op.parameters || []).length; + op.parameters = (op.parameters || []).filter((p) => !(p.in === 'query' && LEGACY_QUERY.has(p.name))); + stats.function_create_query_duplicates_removed += before - op.parameters.length; + if (before === op.parameters.length) errors.push(`${f}: expected deprecated query duplicates on ${verb.toUpperCase()} ${pathKey}, found none`); + touched = true; + } + } + + if (f === 'secrets.yaml') { + // 4. secrets bulk bodies -> single-item object bodies (post_process wraps) + const post = doc.paths?.['/secrets']?.post; + const del = doc.paths?.['/secrets']?.delete; + if (!post || !del) errors.push(`${f}: expected POST and DELETE /secrets`); + else { + const postSchema = deref(doc, post.requestBody?.content?.['application/json']?.schema); + if (postSchema?.type !== 'array') errors.push(`${f}: POST /secrets body is no longer a bare array - revisit the secrets binding`); + else { + post.requestBody.content['application/json'].schema = { ...deref(doc, postSchema.items), description: 'One secret. The wire body is an array; the provider wraps this object into it (one secret per INSERT).' }; + stats.secrets_bulk_body_rewritten++; + } + const delSchema = deref(doc, del.requestBody?.content?.['application/json']?.schema); + if (delSchema?.type !== 'array') errors.push(`${f}: DELETE /secrets body is no longer a bare array - revisit the secrets binding`); + else { + del.requestBody.content['application/json'].schema = { + type: 'object', + description: 'The secret to delete. The wire body is an array of names; the provider wraps this object into it (one secret per DELETE).', + properties: { name: { type: 'string', description: 'Secret name' } }, + required: ['name'] + }; + stats.secrets_bulk_body_rewritten++; + } + touched = true; + } + } + + if (f === 'config.yaml') { + // 5. drop the camelCase duplicate of connection_string on the pooler config + const pooler = doc.components?.schemas?.SupavisorConfigResponse; + if (!pooler?.properties?.connection_string) errors.push(`${f}: SupavisorConfigResponse.connection_string not found`); + else if (pooler.properties.connectionString) { + delete pooler.properties.connectionString; + pooler.required = (pooler.required || []).filter((r) => r !== 'connectionString'); + stats.pooler_camel_duplicate_removed++; + touched = true; + } + } + + if (f === 'database.yaml') { + for (const p of QUERY_PATHS) { + const op = doc.paths?.[p]?.post; + if (!op) { errors.push(`${f}: expected POST ${p}`); continue; } + const r201 = op.responses?.['201']; + if (!r201) { errors.push(`${f}: POST ${p} has no 201 response`); continue; } + if (r201.content && !r201.content['application/json']?.schema?.$ref?.endsWith(QUERY_RESULT_SCHEMA_NAME)) { + errors.push(`${f}: POST ${p} 201 already declares content of an unexpected shape`); + continue; + } + r201.content = { 'application/json': { schema: { $ref: `#/components/schemas/${QUERY_RESULT_SCHEMA_NAME}` } } }; + stats.query_response_schema_injected++; + touched = true; + } + doc.components = doc.components || {}; + doc.components.schemas = doc.components.schemas || {}; + doc.components.schemas[QUERY_RESULT_SCHEMA_NAME] = { + type: 'object', + description: 'Result of a SQL statement run against the project database. The API returns a bare JSON array of row objects whose keys depend on the statement; the provider presents it as one row whose rows column carries the array (address values with json_extract).', + properties: { + rows: { + type: 'array', + description: 'The result rows as returned by Postgres, one object per row, keyed by column name.', + items: { type: 'object', additionalProperties: true } + } + } + }; + } + + pending.push({ fp, doc, touched }); +} + +if (errors.length > 0) { + console.error(`FAILED with ${errors.length} error(s), nothing written:`); + for (const e of errors) console.error(` ${e}`); + process.exit(1); +} +if (!dryRun) { + for (const { fp, doc, touched } of pending) if (touched) fs.writeFileSync(fp, yaml.dump(doc, { lineWidth: -1, noRefs: true })); +} +console.log(`pre_normalize: ${Object.entries(stats).map(([k, v]) => `${k}: ${v}`).join(', ')}${dryRun ? ' (dry run)' : ''}`); diff --git a/provider-dev/scripts/record_spec_pin.mjs b/provider-dev/scripts/record_spec_pin.mjs new file mode 100644 index 0000000..7297442 --- /dev/null +++ b/provider-dev/scripts/record_spec_pin.mjs @@ -0,0 +1,183 @@ +#!/usr/bin/env node + +// Helper for bin/fetch-spec.sh: validates the freshly downloaded Supabase +// Management API spec with @apidevtools/swagger-parser, verifies it against +// provider-dev/config/spec_pin.json, and moves it into place. +// +// - Validation failure: fail without writing anything. +// - No pin recorded: record it (first fetch). +// - Pin matches: refresh the fetched date only. +// - Pin mismatch: fail without writing anything, unless UPDATE=true, in +// which case the new hash is recorded (a reviewed spec refresh). +// +// The written snapshot passes through a deterministic redaction step for +// vendor example values that pattern-match real credentials (none found in +// the current spec - the REDACTIONS list is empty but the mechanism stays, +// per the clickhouse precedent where Slack webhook examples tripped GitHub +// push protection). The pin records the raw upstream sha256 (drift is always +// compared against upstream) plus the sanitized sha256 of the file on disk +// and the redaction count. +// +// Reports the spec's stated version, path count and operation count on every +// run. Inputs via environment: UPDATE, TMP_DIR, DOWNLOAD_DIR, PIN_FILE, +// SPEC_URL, SPEC_FILE. + +import crypto from 'crypto'; +import fs from 'fs'; +import path from 'path'; +import SwaggerParser from '@apidevtools/swagger-parser'; + +const update = process.env.UPDATE === 'true'; +const tmpDir = process.env.TMP_DIR; +const downloadDir = process.env.DOWNLOAD_DIR; +const pinFile = process.env.PIN_FILE; +const specUrl = process.env.SPEC_URL; +const specFile = process.env.SPEC_FILE; + +if (!tmpDir || !downloadDir || !pinFile || !specUrl || !specFile) { + console.error('record_spec_pin.mjs: missing TMP_DIR / DOWNLOAD_DIR / PIN_FILE / SPEC_URL / SPEC_FILE'); + process.exit(1); +} + +const tmpPath = path.join(tmpDir, specFile); +const content = fs.readFileSync(tmpPath); +const spec = JSON.parse(content.toString('utf8')); + +// Deterministic fixes for the NestJS generator's OpenAPI 3.0 violations +// (hetzner precedent: fix deterministically before validating, record the +// counts in the pin). Four defect classes seen so far; a class that is +// absent from a given snapshot simply counts 0 in the pin: +// type_null_to_nullable - `"type": "null"` is JSON Schema 2020-12, not +// OpenAPI 3.0; rewritten to `nullable: true` with no type (the always- +// null discriminant properties in the JIT access oneOf variants, and the +// deprecated always-null create-project body fields) +// hide_definitions_removed - `hideDefinitions` is a @nestjs/swagger +// artifact key, not an OpenAPI schema keyword +// property_names_removed - `propertyNames` is a JSON Schema 2019-09 +// keyword that OpenAPI 3.0 does not allow (the api-keys +// `secret_jwt_template` free-form object, 2026-08 refresh); dropped - +// the constraint (string keys) is implied by JSON anyway +// exclusive_bound_lowered - numeric `exclusiveMinimum` / `exclusiveMaximum` +// (JSON Schema 2020-12 form) rewritten to the OpenAPI 3.0 form, +// `minimum`/`maximum` plus the boolean flag (DiskAutoscaleConfig, +// 2026-08 refresh; the clickhouse pre_normalize precedent) +// schema_dialect_key_removed - a literal `$schema` key naming the +// 2020-12 dialect inside a response schema (the jit-access oneOf, +// 2026-08 refresh); not an OpenAPI 3.0 keyword, dropped +// const_to_enum - `const: x` (2019-09) rewritten to `enum: [x]`, the +// 3.0 equivalent (the jit-access "unavailable" discriminant) +const fixes = { type_null_to_nullable: 0, hide_definitions_removed: 0, property_names_removed: 0, exclusive_bound_lowered: 0, schema_dialect_key_removed: 0, const_to_enum: 0 }; +function applyFixes(node) { + if (Array.isArray(node)) { node.forEach(applyFixes); return; } + if (node && typeof node === 'object') { + if (node.type === 'null') { + delete node.type; + node.nullable = true; + fixes.type_null_to_nullable++; + } + if ('hideDefinitions' in node) { + delete node.hideDefinitions; + fixes.hide_definitions_removed++; + } + if ('propertyNames' in node) { + delete node.propertyNames; + fixes.property_names_removed++; + } + if (typeof node.$schema === 'string') { + delete node.$schema; + fixes.schema_dialect_key_removed++; + } + if ('const' in node) { + node.enum = [node.const]; + delete node.const; + fixes.const_to_enum++; + } + for (const [excl, bound] of [['exclusiveMinimum', 'minimum'], ['exclusiveMaximum', 'maximum']]) { + if (typeof node[excl] === 'number') { + node[bound] = node[excl]; + node[excl] = true; + fixes.exclusive_bound_lowered++; + } + } + for (const v of Object.values(node)) applyFixes(v); + } +} +applyFixes(spec); +for (const [name, count] of Object.entries(fixes)) { + if (count > 0) console.log(` fix ${name}: ${count} occurrence(s)`); +} + +// Validate before anything else touches disk +try { + await SwaggerParser.validate(structuredClone(spec)); + console.log('Spec validated OK (@apidevtools/swagger-parser)'); +} catch (err) { + console.error(`Spec validation FAILED, nothing written: ${err.message}`); + process.exit(1); +} + +const pathKeys = Object.keys(spec.paths || {}); +const httpVerbs = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options']; +let opCount = 0; +for (const p of pathKeys) { + for (const v of httpVerbs) { + if (spec.paths[p][v]) opCount++; + } +} +console.log(`Spec: ${spec.info?.title} - openapi ${spec.openapi}, stated version ${spec.info?.version}, ${pathKeys.length} paths, ${opCount} operations`); + +// The pin's sha256 is of the raw upstream bytes - drift is always compared +// against upstream; the written snapshot carries the deterministic fixes +const sha256 = crypto.createHash('sha256').update(content).digest('hex'); + +// Deterministic redaction of credential-shaped example values (none needed +// for the current Supabase spec; add rules here if a refresh introduces any) +const REDACTIONS = []; +let sanitized = JSON.stringify(spec); +const redactionCounts = {}; +for (const r of REDACTIONS) { + const matches = sanitized.match(r.re); + if (matches) { + redactionCounts[r.name] = matches.length; + sanitized = sanitized.replace(r.re, r.replacement); + } +} +const sanitizedSha256 = crypto.createHash('sha256').update(sanitized).digest('hex'); + +let pin = { specs: {} }; +if (fs.existsSync(pinFile)) { + pin = JSON.parse(fs.readFileSync(pinFile, 'utf8')); +} +const existing = pin.specs[specFile.replace(/\.json$/, '')]; + +if (existing && existing.sha256 !== sha256 && !update) { + console.error( + `Spec pin verification FAILED, nothing written: upstream content changed ` + + `(pinned ${existing.sha256.slice(0, 12)}..., fetched ${sha256.slice(0, 12)}...). ` + + `Re-run with --update to accept the refresh.` + ); + process.exit(1); +} + +const status = !existing ? 'pinned' : existing.sha256 === sha256 ? 'unchanged' : 'updated'; +fs.writeFileSync(path.join(downloadDir, specFile), sanitized); +pin.specs[specFile.replace(/\.json$/, '')] = { + url: specUrl, + filename: specFile, + spec_version: spec.info?.version, + openapi: spec.openapi, + paths: pathKeys.length, + operations: opCount, + sha256, + sanitized_sha256: sanitizedSha256, + fixes, + redactions: redactionCounts, + bytes: content.length, + fetched: new Date().toISOString().slice(0, 10) +}; +fs.mkdirSync(path.dirname(pinFile), { recursive: true }); +fs.writeFileSync(pinFile, JSON.stringify(pin, null, 2) + '\n'); +console.log(` ${specFile}: ${status} (upstream sha256 ${sha256.slice(0, 12)}..., ${content.length} bytes)`); +for (const [name, count] of Object.entries(redactionCounts)) { + console.log(` redacted ${count} ${name} value(s) in the written snapshot (sanitized sha256 ${sanitizedSha256.slice(0, 12)}...)`); +} diff --git a/provider-dev/source/.gitkeep b/provider-dev/source/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/provider-dev/source/advisors.yaml b/provider-dev/source/advisors.yaml new file mode 100644 index 0000000..40e04a8 --- /dev/null +++ b/provider-dev/source/advisors.yaml @@ -0,0 +1,210 @@ +openapi: 3.0.0 +info: + title: advisors API + description: Advisors related endpoints + version: 1.0.0 +paths: + /advisors/performance: + get: + deprecated: true + description: This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable. + operationId: v1-get-performance-advisors + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectAdvisorsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets project performance advisors. + tags: + - Advisors + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - advisors_read + x-oauth-scope: database:read + /advisors/security: + get: + deprecated: true + description: This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable. + operationId: v1-get-security-advisors + parameters: + - name: lint_type + required: false + in: query + schema: + example: sql + type: string + enum: + - sql + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectAdvisorsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets project security advisors. + tags: + - Advisors + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - advisors_read + x-oauth-scope: database:read +components: + schemas: + V1ProjectAdvisorsResponse: + type: object + properties: + lints: + type: array + items: + type: object + properties: + name: + enum: + - unindexed_foreign_keys + - auth_users_exposed + - auth_rls_initplan + - no_primary_key + - unused_index + - multiple_permissive_policies + - policy_exists_rls_disabled + - rls_enabled_no_policy + - duplicate_index + - security_definer_view + - function_search_path_mutable + - rls_disabled_in_public + - extension_in_public + - rls_references_user_metadata + - materialized_view_in_api + - foreign_table_in_api + - unsupported_reg_types + - auth_otp_long_expiry + - auth_otp_short_length + - ssl_not_enforced + - log_connections_not_enabled + - network_restrictions_not_set + - password_requirements_min_length + - pitr_not_enabled + - auth_leaked_password_protection + - auth_insufficient_mfa_options + - auth_password_policy_missing + - leaked_service_key + - no_backup_admin + - vulnerable_postgres_version + - db_not_reachable + - db_connection_failing + - db_connection_limit_reached + - instance_telemetry_lost + - instance_db_down + - instance_alert_firing + - log_service_error_rate_high + - project_not_active + - advisor_check_unavailable + type: string + title: + type: string + level: + type: string + enum: + - ERROR + - WARN + - INFO + facing: + type: string + enum: + - EXTERNAL + categories: + type: array + items: + type: string + enum: + - PERFORMANCE + - SECURITY + - HEALTH + x-ignore-array-items-must-be-objects: true + description: + type: string + detail: + type: string + remediation: + type: string + metadata: + type: object + properties: + schema: + type: string + name: + type: string + entity: + type: string + type: + enum: + - table + - view + - materialized view + - foreign table + - auth + - function + - extension + - compliance + - health + type: string + fkey_name: + type: string + fkey_columns: + x-ignore-array-items-must-be-objects: true + type: array + items: + type: number + cache_key: + type: string + observed_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + required: + - name + - title + - level + - facing + - categories + - description + - detail + - remediation + - cache_key + additionalProperties: {} + required: + - lints +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/analytics.yaml b/provider-dev/source/analytics.yaml new file mode 100644 index 0000000..5e31649 --- /dev/null +++ b/provider-dev/source/analytics.yaml @@ -0,0 +1,446 @@ +openapi: 3.0.0 +info: + title: analytics API + description: Analytics related endpoints + version: 1.0.0 +paths: + /analytics/endpoints/logs.all: + get: + deprecated: true + description: | + Executes a SQL query on the project's logs. + + Either the `iso_timestamp_start` and `iso_timestamp_end` parameters must be provided. + If both are not provided, only the last 1 minute of logs will be queried. + The timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown. + + Note: Unless the `sql` parameter is provided, only edge_logs will be queried. See the [log query docs](https://supabase.com/docs/guides/monitoring-and-debugging/logs#logs-explorer) for all available sources. + operationId: v1-get-project-logs-all + parameters: + - name: sql + required: false + in: query + description: Custom SQL query to execute on the logs. See [querying logs](https://supabase.com/docs/guides/monitoring-and-debugging/logs#querying-with-the-logs-explorer) for more details. + schema: + example: select event_message from edge_logs limit 10 + type: string + - name: iso_timestamp_start + required: false + in: query + schema: + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + example: '2025-03-01T00:00:00Z' + type: string + - name: iso_timestamp_end + required: false + in: query + schema: + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + example: '2025-03-01T23:59:59Z' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyticsResponse' + '401': + description: Unauthorized + '402': + description: Usage exceeded. Enable additional usage to continue querying + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets project's logs + tags: + - Analytics + x-badges: + - name: 'OAuth scope: analytics:read' + position: after + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_logs_read + x-oauth-scope: analytics:read + /analytics/endpoints/logs: + get: + deprecated: false + description: | + Executes an SQL or LQL query on the project's unified logs stream. + + Either the `iso_timestamp_start` and `iso_timestamp_end` parameters must be provided. + If both are not provided, only the last 1 minute of logs will be queried. + The timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown. + + Filter by the `source` column to specify specific log sources, such as edge_logs, postgres_logs, etc. + + Note: SQL must be written in **ClickHouse SQL dialect**. + operationId: v1-get-project-logs + parameters: + - name: sql + required: false + in: query + description: Custom SQL query to execute on the logs. See [querying logs](https://supabase.com/docs/guides/monitoring-and-debugging/logs#querying-with-the-logs-explorer) for more details. + schema: + example: select event_message from edge_logs limit 10 + type: string + - name: iso_timestamp_start + required: false + in: query + schema: + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + example: '2025-03-01T00:00:00Z' + type: string + - name: iso_timestamp_end + required: false + in: query + schema: + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + example: '2025-03-01T23:59:59Z' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyticsResponse' + '401': + description: Unauthorized + '402': + description: Usage exceeded. Enable additional usage to continue querying + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets all project's logs in a single log stream + tags: + - Analytics + x-badges: + - name: 'OAuth scope: analytics:read' + position: after + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_logs_read + x-oauth-scope: analytics:read + /analytics/endpoints/usage.api-counts: + get: + operationId: v1-get-project-usage-api-count + parameters: + - name: interval + required: false + in: query + schema: + example: 1day + type: string + enum: + - 15min + - 30min + - 1hr + - 3hr + - 1day + - 3day + - 7day + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1GetUsageApiCountResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project's usage api counts + security: + - bearer: [] + summary: Gets project's usage api counts + tags: + - Analytics + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_usage_read + /analytics/endpoints/usage.api-requests-count: + get: + operationId: v1-get-project-usage-request-count + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1GetUsageApiRequestsCountResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project's usage api requests count + security: + - bearer: [] + summary: Gets project's usage api requests count + tags: + - Analytics + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_usage_read + /analytics/endpoints/functions.combined-stats: + get: + operationId: v1-get-project-function-combined-stats + parameters: + - name: interval + required: true + in: query + schema: + example: 1hr + type: string + enum: + - 15min + - 1hr + - 3hr + - 1day + - name: function_id + required: true + in: query + schema: + example: 3c078cce-ad70-4148-9f37-4da362789053 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AnalyticsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project's function combined statistics + security: + - bearer: [] + summary: Gets a project's function combined statistics + tags: + - Analytics + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_usage_read + /analytics/endpoints/metrics: + get: + description: Prometheus scrape endpoint. Returns metrics of a customer project in the Prometheus open exposition format. + operationId: v1-scrape-project-metrics + parameters: [] + responses: + '200': + description: Prometheus / OpenMetrics text exposition + content: + text/plain: + schema: + type: string + application/openmetrics-text: + schema: + type: string + '400': + description: Project must be active and healthy, or metrics are not available for this project + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to fetch project's metrics + security: + - bearer: [] + summary: Scrape a project's metrics + tags: + - Analytics + x-badges: + - name: 'OAuth scope: analytics:read' + position: after + x-endpoint-owners: + - observability + x-fga-permissions: + - - analytics_logs_read + x-oauth-scope: analytics:read +components: + schemas: + AnalyticsResponse: + type: object + properties: + result: + type: array + items: {} + error: + type: string + properties: + code: + type: number + errors: + type: array + items: + type: object + properties: + domain: + type: string + location: + type: string + locationType: + type: string + message: + type: string + reason: + type: string + required: + - domain + - location + - locationType + - message + - reason + message: + type: string + status: + type: string + required: + - code + - errors + - message + - status + V1GetUsageApiCountResponse: + type: object + properties: + result: + type: array + items: + type: object + properties: + timestamp: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|))$ + total_auth_requests: + type: number + total_realtime_requests: + type: number + total_rest_requests: + type: number + total_storage_requests: + type: number + required: + - timestamp + - total_auth_requests + - total_realtime_requests + - total_rest_requests + - total_storage_requests + error: + type: string + properties: + code: + type: number + errors: + type: array + items: + type: object + properties: + domain: + type: string + location: + type: string + locationType: + type: string + message: + type: string + reason: + type: string + required: + - domain + - location + - locationType + - message + - reason + message: + type: string + status: + type: string + required: + - code + - errors + - message + - status + V1GetUsageApiRequestsCountResponse: + type: object + properties: + result: + type: array + items: + type: object + properties: + count: + type: number + required: + - count + error: + type: string + properties: + code: + type: number + errors: + type: array + items: + type: object + properties: + domain: + type: string + location: + type: string + locationType: + type: string + message: + type: string + reason: + type: string + required: + - domain + - location + - locationType + - message + - reason + message: + type: string + status: + type: string + required: + - code + - errors + - message + - status +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/billing.yaml b/provider-dev/source/billing.yaml new file mode 100644 index 0000000..90ef685 --- /dev/null +++ b/provider-dev/source/billing.yaml @@ -0,0 +1,393 @@ +openapi: 3.0.0 +info: + title: billing API + description: Billing related endpoints + version: 1.0.0 +paths: + /billing/addons: + get: + description: Returns the billing addons that are currently applied, including the active compute instance size, and lists every addon option that can be provisioned with pricing metadata. + operationId: v1-list-project-addons + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListProjectAddonsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list project addons + security: + - bearer: [] + summary: List billing addons and compute instance selections + tags: + - Billing + x-endpoint-owners: + - billing + x-fga-permissions: + - - infra_add_ons_read + patch: + description: Selects an addon variant, for example scaling the project’s compute instance up or down, and applies it to the project. + operationId: v1-apply-project-addon + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ApplyProjectAddonBody' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to apply project addon + security: + - bearer: [] + summary: Apply or update billing addons, including compute instance size + tags: + - Billing + x-endpoint-owners: + - billing + x-fga-permissions: + - - infra_add_ons_write + /billing/addons/{addon_variant}: + delete: + description: Disables the selected addon variant, including rolling the compute instance back to its previous size. + operationId: v1-remove-project-addon + parameters: + - name: addon_variant + required: true + in: path + schema: + example: pitr_7 + anyOf: + - type: string + enum: + - ci_micro + - ci_small + - ci_medium + - ci_large + - ci_xlarge + - ci_2xlarge + - ci_4xlarge + - ci_8xlarge + - ci_12xlarge + - ci_16xlarge + - ci_24xlarge + - ci_24xlarge_optimized_cpu + - ci_24xlarge_optimized_memory + - ci_24xlarge_high_memory + - ci_48xlarge + - ci_48xlarge_optimized_cpu + - ci_48xlarge_optimized_memory + - ci_48xlarge_high_memory + - type: string + enum: + - cd_default + - type: string + enum: + - pitr_7 + - pitr_14 + - pitr_28 + - type: string + enum: + - ipv4_default + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to remove project addon + security: + - bearer: [] + summary: Remove billing addons or revert compute instance sizing + tags: + - Billing + x-endpoint-owners: + - billing + x-fga-permissions: + - - infra_add_ons_write +components: + schemas: + ListProjectAddonsResponse: + type: object + properties: + selected_addons: + type: array + items: + type: object + properties: + type: + type: string + enum: + - custom_domain + - compute_instance + - pitr + - ipv4 + - auth_mfa_phone + - auth_mfa_web_authn + - log_drain + - etl_pipeline + variant: + type: object + properties: + id: + anyOf: + - type: string + enum: + - ci_micro + - ci_small + - ci_medium + - ci_large + - ci_xlarge + - ci_2xlarge + - ci_4xlarge + - ci_8xlarge + - ci_12xlarge + - ci_16xlarge + - ci_24xlarge + - ci_24xlarge_optimized_cpu + - ci_24xlarge_optimized_memory + - ci_24xlarge_high_memory + - ci_48xlarge + - ci_48xlarge_optimized_cpu + - ci_48xlarge_optimized_memory + - ci_48xlarge_high_memory + - type: string + enum: + - cd_default + - type: string + enum: + - pitr_7 + - pitr_14 + - pitr_28 + - type: string + enum: + - ipv4_default + - type: string + enum: + - auth_mfa_phone_default + - type: string + enum: + - auth_mfa_web_authn_default + - type: string + enum: + - log_drain_default + - type: string + enum: + - etl_pipeline_default + name: + type: string + price: + type: object + properties: + description: + type: string + type: + type: string + enum: + - fixed + - usage + interval: + type: string + enum: + - monthly + - hourly + amount: + type: number + required: + - description + - type + - interval + - amount + meta: + $ref: '#/components/schemas/ListProjectAddonsResponseJsonValue' + required: + - id + - name + - price + required: + - type + - variant + available_addons: + type: array + items: + type: object + properties: + type: + type: string + enum: + - custom_domain + - compute_instance + - pitr + - ipv4 + - auth_mfa_phone + - auth_mfa_web_authn + - log_drain + - etl_pipeline + name: + type: string + variants: + type: array + items: + type: object + properties: + id: + anyOf: + - type: string + enum: + - ci_micro + - ci_small + - ci_medium + - ci_large + - ci_xlarge + - ci_2xlarge + - ci_4xlarge + - ci_8xlarge + - ci_12xlarge + - ci_16xlarge + - ci_24xlarge + - ci_24xlarge_optimized_cpu + - ci_24xlarge_optimized_memory + - ci_24xlarge_high_memory + - ci_48xlarge + - ci_48xlarge_optimized_cpu + - ci_48xlarge_optimized_memory + - ci_48xlarge_high_memory + - type: string + enum: + - cd_default + - type: string + enum: + - pitr_7 + - pitr_14 + - pitr_28 + - type: string + enum: + - ipv4_default + - type: string + enum: + - auth_mfa_phone_default + - type: string + enum: + - auth_mfa_web_authn_default + - type: string + enum: + - log_drain_default + - type: string + enum: + - etl_pipeline_default + name: + type: string + price: + type: object + properties: + description: + type: string + type: + type: string + enum: + - fixed + - usage + interval: + type: string + enum: + - monthly + - hourly + amount: + type: number + required: + - description + - type + - interval + - amount + meta: + $ref: '#/components/schemas/ListProjectAddonsResponseJsonValue' + required: + - id + - name + - price + required: + - type + - name + - variants + required: + - selected_addons + - available_addons + ApplyProjectAddonBody: + type: object + properties: + addon_variant: + type: string + enum: + - ci_micro + - ci_small + - ci_medium + - ci_large + - ci_xlarge + - ci_2xlarge + - ci_4xlarge + - ci_8xlarge + - ci_12xlarge + - ci_16xlarge + - ci_24xlarge + - ci_24xlarge_optimized_cpu + - ci_24xlarge_optimized_memory + - ci_24xlarge_high_memory + - ci_48xlarge + - ci_48xlarge_optimized_cpu + - ci_48xlarge_optimized_memory + - ci_48xlarge_high_memory + addon_type: + type: string + enum: + - custom_domain + - compute_instance + - pitr + - ipv4 + - auth_mfa_phone + - auth_mfa_web_authn + - log_drain + - etl_pipeline + required: + - addon_variant + - addon_type + example: + addon_variant: pitr_7 + addon_type: pitr + ListProjectAddonsResponseJsonValue: + description: Any JSON-serializable value + anyOf: + - type: string + - type: number + - type: boolean + nullable: true + type: array + items: + $ref: '#/components/schemas/ListProjectAddonsResponseJsonValue' + additionalProperties: + $ref: '#/components/schemas/ListProjectAddonsResponseJsonValue' +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/branches.yaml b/provider-dev/source/branches.yaml new file mode 100644 index 0000000..b82fa68 --- /dev/null +++ b/provider-dev/source/branches.yaml @@ -0,0 +1,1337 @@ +openapi: 3.0.0 +info: + title: branches API + description: supabase branches API + version: 1.0.0 +paths: + /v1/branches/{branch_id_or_ref}: + get: + description: Fetches configurations of the specified database branch + operationId: v1-get-a-branch-config + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchDetailResponse' + '500': + description: Failed to retrieve database branch + security: + - bearer: [] + summary: Get database branch config + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_read + - - branching_production_read + x-oauth-scope: environment:read + patch: + description: Updates the configuration of the specified database branch + operationId: v1-update-a-branch-config + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateBranchBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchResponse' + '500': + description: Failed to update database branch + security: + - bearer: [] + summary: Update database branch config + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + delete: + description: Deletes the specified database branch. By default, deletes immediately. Use force=false to schedule deletion with 1-hour grace period (only when soft deletion is enabled). + operationId: v1-delete-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + - name: force + required: false + in: query + description: If set to false, schedule deletion with 1-hour grace period (only when soft deletion is enabled). + schema: + example: false + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchDeleteResponse' + '500': + description: Failed to delete database branch + security: + - bearer: [] + summary: Delete a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_delete + - - branching_production_delete + x-oauth-scope: environment:write + /v1/branches/{branch_id_or_ref}/push: + post: + description: Pushes the specified database branch + operationId: v1-push-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BranchActionBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchUpdateResponse' + '500': + description: Failed to push database branch + security: + - bearer: [] + summary: Pushes a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + /v1/branches/{branch_id_or_ref}/merge: + post: + description: Merges the specified database branch + operationId: v1-merge-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BranchActionBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchUpdateResponse' + '500': + description: Failed to merge database branch + security: + - bearer: [] + summary: Merges a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + /v1/branches/{branch_id_or_ref}/reset: + post: + description: Resets the specified database branch + operationId: v1-reset-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BranchActionBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchUpdateResponse' + '500': + description: Failed to reset database branch + security: + - bearer: [] + summary: Resets a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + /v1/branches/{branch_id_or_ref}/restore: + post: + description: Cancels scheduled deletion and restores the branch to active state + operationId: v1-restore-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchRestoreResponse' + '500': + description: Failed to restore database branch + security: + - bearer: [] + summary: Restore a scheduled branch deletion + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + /v1/branches/{branch_id_or_ref}/diff: + get: + description: Diffs the specified database branch + operationId: v1-diff-a-branch + parameters: + - name: branch_id_or_ref + required: true + in: path + description: Branch ref or deprecated branch ID + schema: + example: abcdefghijklmnopqrst + anyOf: + - type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + - type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + deprecated: true + - name: included_schemas + required: false + in: query + schema: + example: public,auth + type: string + - name: pgdelta + required: false + in: query + description: |- + Use pg-delta instead of Migra for diffing when true. + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + responses: + '200': + content: + text/plain: + schema: + type: string + description: '' + '500': + description: Failed to diff database branch + security: + - bearer: [] + summary: '[Beta] Diffs a database branch' + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_write + - - branching_production_write + x-oauth-scope: environment:write + /actions: + head: + description: Returns the total number of action runs of the specified project. + operationId: v1-count-action-runs + parameters: + - name: ref + required: true + in: path + description: Project ref + schema: + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + example: abcdefghijklmnopqrst + type: string + responses: + '200': + headers: + X-Total-Count: + schema: + type: integer + format: int64 + minimum: 0 + description: total count value + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to count action runs + security: + - bearer: [] + summary: Count the number of action runs + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-fga-permissions: + - - action_runs_read + x-oauth-scope: environment:read + get: + description: Returns a paginated list of action runs of the specified project. + operationId: v1-list-action-runs + parameters: + - name: offset + required: false + in: query + schema: + minimum: 0 + example: 0 + type: number + - name: limit + required: false + in: query + schema: + minimum: 10 + example: 20 + type: number + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-action-runsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list action runs + security: + - bearer: [] + summary: List all action runs + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - action_runs_read + x-oauth-scope: environment:read + x-stackql-bare-array-wrap: + wrapperKey: v1_list_action_runs + wrapperName: V1-list-action-runsResponse + mediaType: application/json + scalar: false + /actions/{run_id}: + get: + description: Returns the current status of the specified action run. + operationId: v1-get-action-run + parameters: + - name: run_id + required: true + in: path + description: Action Run ID + schema: + example: run_01hq3q9m7y5q7e4a7x2c8m1p4n + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ActionRunResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get action run status + security: + - bearer: [] + summary: Get the status of an action run + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - action_runs_read + x-oauth-scope: environment:read + /actions/{run_id}/status: + patch: + description: Updates the status of an ongoing action run. + operationId: v1-update-action-run-status + parameters: + - name: run_id + required: true + in: path + description: Action Run ID + schema: + example: run_01hq3q9m7y5q7e4a7x2c8m1p4n + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateRunStatusBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateRunStatusResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update action run status + security: + - bearer: [] + summary: Update the status of an action run + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - action_runs_write + x-oauth-scope: environment:write + /actions/{run_id}/logs: + get: + description: Returns the logs from the specified action run. + operationId: v1-get-action-run-logs + parameters: + - name: run_id + required: true + in: path + description: Action Run ID + schema: + example: run_01hq3q9m7y5q7e4a7x2c8m1p4n + type: string + responses: + '200': + content: + text/plain: + schema: + type: string + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get action run logs + security: + - bearer: [] + summary: Get the logs of an action run + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - action_runs_read + x-oauth-scope: environment:read + /branches: + get: + description: Returns all database branches of the specified project. + operationId: v1-list-all-branches + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-branchesResponse' + '500': + description: Failed to retrieve database branches + security: + - bearer: [] + summary: List all database branches + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_read + - - branching_production_read + x-oauth-scope: environment:read + x-stackql-bare-array-wrap: + wrapperKey: v1_list_all_branches + wrapperName: V1-list-all-branchesResponse + mediaType: application/json + scalar: false + post: + description: Creates a database branch from the specified project. + operationId: v1-create-a-branch + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateBranchBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchResponse' + '500': + description: Failed to create database branch + security: + - bearer: [] + summary: Create a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_create + - - branching_production_create + x-oauth-scope: environment:write + delete: + description: Disables preview branching for the specified project + operationId: v1-disable-preview-branching + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to disable preview branching + security: + - bearer: [] + summary: Disables preview branching + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_production_delete + x-oauth-scope: environment:write + /branches/{name}: + get: + description: Fetches the specified database branch by its name. + operationId: v1-get-a-branch + parameters: + - name: name + required: true + in: path + schema: + example: preview-login-page + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BranchResponse' + '500': + description: Failed to fetch database branch + security: + - bearer: [] + summary: Get a database branch + tags: + - Environments + x-badges: + - name: 'OAuth scope: environment:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - branching_development_read + - - branching_production_read + x-oauth-scope: environment:read +components: + schemas: + BranchDetailResponse: + type: object + properties: + ref: + type: string + postgres_version: + type: string + postgres_engine: + type: string + release_channel: + type: string + status: + type: string + enum: + - INACTIVE + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - UNKNOWN + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UPGRADING + - PAUSING + - RESTORE_FAILED + - RESTARTING + - PAUSE_FAILED + - RESIZING + db_host: + type: string + db_port: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + db_user: + type: string + db_pass: + type: string + jwt_secret: + type: string + required: + - ref + - postgres_version + - postgres_engine + - release_channel + - status + - db_host + - db_port + UpdateBranchBody: + type: object + properties: + branch_name: + type: string + git_branch: + type: string + reset_on_push: + description: This field is deprecated and will be ignored. Use v1-reset-a-branch endpoint directly instead. + deprecated: true + type: boolean + persistent: + type: boolean + status: + type: string + enum: + - CREATING_PROJECT + - RUNNING_MIGRATIONS + - MIGRATIONS_PASSED + - MIGRATIONS_FAILED + - FUNCTIONS_DEPLOYED + - FUNCTIONS_FAILED + request_review: + type: boolean + notify_url: + type: string + format: uri + description: HTTP endpoint to receive branch status updates. + example: + branch_name: preview-login-page + git_branch: feature/login-page + persistent: true + request_review: true + notify_url: https://example.com/webhooks/branches + BranchResponse: + type: object + properties: + id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + name: + type: string + project_ref: + type: string + parent_project_ref: + type: string + is_default: + type: boolean + git_branch: + type: string + pr_number: + type: integer + format: int32 + minimum: -9007199254740991 + maximum: 9007199254740991 + latest_check_run_id: + description: This field is deprecated and will not be populated. + deprecated: true + type: number + persistent: + type: boolean + status: + type: string + enum: + - CREATING_PROJECT + - RUNNING_MIGRATIONS + - MIGRATIONS_PASSED + - MIGRATIONS_FAILED + - FUNCTIONS_DEPLOYED + - FUNCTIONS_FAILED + description: This field is deprecated. List action runs to get branch status instead. + deprecated: true + created_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + review_requested_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + with_data: + type: boolean + notify_url: + type: string + format: uri + deletion_scheduled_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + preview_project_status: + type: string + enum: + - INACTIVE + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - UNKNOWN + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UPGRADING + - PAUSING + - RESTORE_FAILED + - RESTARTING + - PAUSE_FAILED + - RESIZING + required: + - id + - name + - project_ref + - parent_project_ref + - is_default + - persistent + - status + - created_at + - updated_at + - with_data + BranchDeleteResponse: + type: object + properties: + message: + type: string + enum: + - ok + required: + - message + BranchActionBody: + type: object + properties: + migration_version: + type: string + example: + migration_version: '20250312000000' + BranchUpdateResponse: + type: object + properties: + workflow_run_id: + type: string + message: + type: string + enum: + - ok + required: + - workflow_run_id + - message + BranchRestoreResponse: + type: object + properties: + message: + type: string + enum: + - Branch restoration initiated + required: + - message + ListActionRunResponse: + type: array + items: + type: object + properties: + id: + type: string + branch_id: + type: string + run_steps: + type: array + items: + type: object + properties: + name: + type: string + enum: + - clone + - pull + - health + - configure + - migrate + - seed + - deploy + status: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + created_at: + type: string + updated_at: + type: string + required: + - name + - status + - created_at + - updated_at + git_config: + nullable: true + workdir: + type: string + nullable: true + check_run_id: + type: number + nullable: true + created_at: + type: string + updated_at: + type: string + required: + - id + - branch_id + - run_steps + - workdir + - check_run_id + - created_at + - updated_at + ActionRunResponse: + type: object + properties: + id: + type: string + branch_id: + type: string + run_steps: + type: array + items: + type: object + properties: + name: + type: string + enum: + - clone + - pull + - health + - configure + - migrate + - seed + - deploy + status: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + created_at: + type: string + updated_at: + type: string + required: + - name + - status + - created_at + - updated_at + git_config: + nullable: true + workdir: + type: string + nullable: true + check_run_id: + type: number + nullable: true + created_at: + type: string + updated_at: + type: string + required: + - id + - branch_id + - run_steps + - workdir + - check_run_id + - created_at + - updated_at + UpdateRunStatusBody: + type: object + properties: + clone: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + pull: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + health: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + configure: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + migrate: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + seed: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + deploy: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + example: + clone: RUNNING + configure: RUNNING + migrate: RUNNING + deploy: CREATED + UpdateRunStatusResponse: + type: object + properties: + message: + type: string + enum: + - ok + required: + - message + CreateBranchBody: + type: object + properties: + branch_name: + type: string + minLength: 1 + git_branch: + type: string + is_default: + type: boolean + persistent: + type: boolean + region: + type: string + desired_instance_size: + type: string + enum: + - pico + - nano + - micro + - small + - medium + - large + - xlarge + - 2xlarge + - 4xlarge + - 8xlarge + - 12xlarge + - 16xlarge + - 24xlarge + - 24xlarge_optimized_memory + - 24xlarge_optimized_cpu + - 24xlarge_high_memory + - 48xlarge + - 48xlarge_optimized_memory + - 48xlarge_optimized_cpu + - 48xlarge_high_memory + release_channel: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + description: Release channel. If not provided, GA will be used. + postgres_engine: + type: string + enum: + - '15' + - '17' + - 17-oriole + description: Postgres engine version. If not provided, the latest version will be used. + secrets: + type: object + additionalProperties: + type: string + with_data: + type: boolean + notify_url: + type: string + format: uri + description: HTTP endpoint to receive branch status updates. + required: + - branch_name + example: + branch_name: preview-login-page + git_branch: feature/login-page + persistent: true + with_data: false + notify_url: https://example.com/webhooks/branches + V1-list-action-runsResponse: + type: object + properties: + v1_list_action_runs: + type: array + items: + type: object + properties: + id: + type: string + branch_id: + type: string + run_steps: + type: array + items: + type: object + properties: + name: + type: string + enum: + - clone + - pull + - health + - configure + - migrate + - seed + - deploy + status: + type: string + enum: + - CREATED + - DEAD + - EXITED + - PAUSED + - REMOVING + - RESTARTING + - RUNNING + created_at: + type: string + updated_at: + type: string + required: + - name + - status + - created_at + - updated_at + git_config: + nullable: true + workdir: + type: string + nullable: true + check_run_id: + type: number + nullable: true + created_at: + type: string + updated_at: + type: string + required: + - id + - branch_id + - run_steps + - workdir + - check_run_id + - created_at + - updated_at + V1-list-all-branchesResponse: + type: object + properties: + v1_list_all_branches: + type: array + items: + $ref: '#/components/schemas/BranchResponse' +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/config.yaml b/provider-dev/source/config.yaml new file mode 100644 index 0000000..e15e9a3 --- /dev/null +++ b/provider-dev/source/config.yaml @@ -0,0 +1,4492 @@ +openapi: 3.0.0 +info: + title: config API + description: supabase config API + version: 1.0.0 +paths: + /pgsodium: + get: + operationId: v1-get-pgsodium-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PgsodiumConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's pgsodium config + security: + - bearer: [] + summary: '[Beta] Gets project''s pgsodium config' + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - project_admin_write + x-oauth-scope: secrets:read + put: + operationId: v1-update-pgsodium-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdatePgsodiumConfigBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PgsodiumConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's pgsodium config + security: + - bearer: [] + summary: '[Beta] Updates project''s pgsodium config. Updating the root_key can cause all data encrypted with the older key to become inaccessible.' + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - project_admin_write + x-oauth-scope: secrets:write + /postgrest: + get: + operationId: v1-get-postgrest-service-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PostgrestConfigWithJWTSecretResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's postgrest config + security: + - bearer: [] + summary: Gets project's postgrest config + tags: + - Rest + x-badges: + - name: 'OAuth scope: rest:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - data_api_config_read + x-oauth-scope: rest:read + patch: + operationId: v1-update-postgrest-service-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdatePostgrestConfigBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1PostgrestConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's postgrest config + security: + - bearer: [] + summary: Updates project's postgrest config + tags: + - Rest + x-badges: + - name: 'OAuth scope: rest:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - data_api_config_write + x-oauth-scope: rest:write + /ssl-enforcement: + get: + operationId: v1-get-ssl-enforcement-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SslEnforcementResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's SSL enforcement config + security: + - bearer: [] + summary: '[Beta] Get project''s SSL enforcement configuration.' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_ssl_config_read + x-oauth-scope: database:read + put: + operationId: v1-update-ssl-enforcement-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SslEnforcementRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SslEnforcementResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's SSL enforcement configuration. + security: + - bearer: [] + summary: '[Beta] Update project''s SSL enforcement configuration.' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_ssl_config_write + x-oauth-scope: database:write + /config/auth/signing-keys/legacy: + post: + operationId: v1-create-legacy-signing-key + parameters: [] + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Set up the project's existing JWT secret as an in_use JWT signing key. This endpoint will be removed in the future always check for HTTP 404 Not Found. + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_write + x-oauth-scope: secrets:write + get: + operationId: v1-get-legacy-signing-key + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get the signing key information for the JWT secret imported as signing key for this project. This endpoint will be removed in the future, check for HTTP 404 Not Found. + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_read + x-oauth-scope: secrets:read + /config/auth/signing-keys: + post: + operationId: v1-create-project-signing-key + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateSigningKeyBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Create a new signing key for the project in standby status + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_write + x-oauth-scope: secrets:write + get: + operationId: v1-get-project-signing-keys + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeysResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: List all signing keys for the project + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_read + x-oauth-scope: secrets:read + /config/auth/signing-keys/{id}: + get: + operationId: v1-get-project-signing-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 33333333-3333-4333-8333-333333333333 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get information about a signing key + tags: + - Auth + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_read + delete: + operationId: v1-remove-project-signing-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 33333333-3333-4333-8333-333333333333 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Remove a signing key from a project. Only possible if the key has been in revoked status for a while. + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_write + x-oauth-scope: secrets:write + patch: + operationId: v1-update-project-signing-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 33333333-3333-4333-8333-333333333333 + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateSigningKeyBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SigningKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Update a signing key, mainly its status + tags: + - Auth + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_signing_keys_write + x-oauth-scope: secrets:write + /config/auth: + get: + operationId: v1-get-auth-service-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AuthConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's auth config + security: + - bearer: [] + summary: Gets project's auth config + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_read + x-oauth-scope: auth:read + patch: + operationId: v1-update-auth-service-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateAuthConfigBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AuthConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's auth config + security: + - bearer: [] + summary: Updates a project's auth config + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + - project_admin_write + x-oauth-scope: auth:write + /config/auth/third-party-auth: + post: + operationId: v1-create-project-tpa-integration + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateThirdPartyAuthBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ThirdPartyAuth' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Creates a new third-party auth integration + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + x-oauth-scope: auth:write + get: + operationId: v1-list-project-tpa-integrations + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-project-tpa-integrationsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Lists all third-party auth integrations + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_read + x-oauth-scope: auth:read + x-stackql-bare-array-wrap: + wrapperKey: v1_list_project_tpa_integrations + wrapperName: V1-list-project-tpa-integrationsResponse + mediaType: application/json + scalar: false + /config/auth/third-party-auth/{tpa_id}: + delete: + operationId: v1-delete-project-tpa-integration + parameters: + - name: tpa_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 88888888-8888-4888-8888-888888888888 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ThirdPartyAuth' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Removes a third-party auth integration + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + x-oauth-scope: auth:write + get: + operationId: v1-get-project-tpa-integration + parameters: + - name: tpa_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 88888888-8888-4888-8888-888888888888 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ThirdPartyAuth' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get a third-party integration + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_read + x-oauth-scope: auth:read + /config/storage: + get: + operationId: v1-get-storage-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/StorageConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's storage config + security: + - bearer: [] + summary: Gets project's storage config + tags: + - Storage + x-endpoint-owners: + - storage + x-fga-permissions: + - - storage_config_read + patch: + operationId: v1-update-storage-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateStorageConfigBody' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's storage config + security: + - bearer: [] + summary: Updates project's storage config + tags: + - Storage + x-endpoint-owners: + - storage + x-fga-permissions: + - - storage_config_write + /config/database/pgbouncer: + get: + operationId: v1-get-project-pgbouncer-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1PgbouncerConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's pgbouncer config + summary: Get project's pgbouncer config + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_read + x-oauth-scope: database:read + /config/database/pooler: + get: + operationId: v1-get-pooler-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-get-pooler-configResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's supavisor config + security: + - bearer: [] + summary: Gets project's supavisor config + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_pooling_config_read + x-oauth-scope: database:read + x-stackql-bare-array-wrap: + wrapperKey: v1_get_pooler_config + wrapperName: V1-get-pooler-configResponse + mediaType: application/json + scalar: false + patch: + operationId: v1-update-pooler-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateSupavisorConfigBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateSupavisorConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's supavisor config + security: + - bearer: [] + summary: Updates project's supavisor config + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_pooling_config_write + x-oauth-scope: database:write + /config/database/postgres: + get: + operationId: v1-get-postgres-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PostgresConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's Postgres config + security: + - bearer: [] + summary: Gets project's Postgres config + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_config_read + x-oauth-scope: database:read + put: + operationId: v1-update-postgres-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdatePostgresConfigBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PostgresConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's Postgres config + security: + - bearer: [] + summary: Updates project's Postgres config + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_config_write + x-oauth-scope: database:write + /config/realtime: + get: + operationId: v1-get-realtime-config + parameters: [] + responses: + '200': + description: Gets project's realtime configuration + content: + application/json: + schema: + $ref: '#/components/schemas/RealtimeConfigResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets realtime configuration + tags: + - Realtime + x-endpoint-owners: + - realtime + x-fga-permissions: + - - realtime_config_read + patch: + operationId: v1-update-realtime-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateRealtimeConfigBody' + responses: + '204': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Updates realtime configuration + tags: + - Realtime + x-endpoint-owners: + - realtime + x-fga-permissions: + - - realtime_config_write + /config/realtime/shutdown: + post: + operationId: v1-shutdown-realtime + parameters: [] + responses: + '204': + description: Realtime connections shutdown successfully + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: Tenant not found + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Shutdowns realtime connections for a project + tags: + - Realtime + x-endpoint-owners: + - realtime + x-fga-permissions: + - - realtime_config_write + /config/auth/sso/providers: + post: + operationId: v1-create-a-sso-provider + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateProviderBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CreateProviderResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: SAML 2.0 support is not enabled for this project + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Creates a new SSO provider + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + x-oauth-scope: auth:write + get: + operationId: v1-list-all-sso-provider + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListProvidersResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: SAML 2.0 support is not enabled for this project + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Lists all SSO providers + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_read + x-oauth-scope: auth:read + /config/auth/sso/providers/{provider_id}: + get: + operationId: v1-get-a-sso-provider + parameters: + - name: provider_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 77777777-7777-4777-8777-777777777777 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GetProviderResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: Either SAML 2.0 was not enabled for this project, or the provider does not exist + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets a SSO provider by its UUID + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:read' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_read + x-oauth-scope: auth:read + put: + operationId: v1-update-a-sso-provider + parameters: + - name: provider_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 77777777-7777-4777-8777-777777777777 + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateProviderBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateProviderResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: Either SAML 2.0 was not enabled for this project, or the provider does not exist + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Updates a SSO provider by its UUID + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + x-oauth-scope: auth:write + delete: + operationId: v1-delete-a-sso-provider + parameters: + - name: provider_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 77777777-7777-4777-8777-777777777777 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteProviderResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '404': + description: Either SAML 2.0 was not enabled for this project, or the provider does not exist + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Removes a SSO provider by its UUID + tags: + - Auth + x-badges: + - name: 'OAuth scope: auth:write' + position: after + x-endpoint-owners: + - auth + x-fga-permissions: + - - auth_config_write + x-oauth-scope: auth:write +components: + schemas: + PgsodiumConfigResponse: + type: object + properties: + root_key: + type: string + description: 'The pgsodium root key: 32 bytes, hex-encoded (64 characters).' + required: + - root_key + example: + root_key: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef + UpdatePgsodiumConfigBody: + type: object + properties: + root_key: + type: string + description: 'The pgsodium root key: 32 bytes, hex-encoded (64 characters).' + required: + - root_key + example: + root_key: 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef + PostgrestConfigWithJWTSecretResponse: + type: object + properties: + db_schema: + type: string + max_rows: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + db_extra_search_path: + type: string + db_pool: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + description: If `null`, the value is automatically configured based on compute size. + nullable: true + db_pool_acquisition_timeout: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + description: If `null`, the value is automatically configured to 10. + nullable: true + jwt_secret: + type: string + required: + - db_schema + - max_rows + - db_extra_search_path + - db_pool + - db_pool_acquisition_timeout + V1UpdatePostgrestConfigBody: + type: object + properties: + db_extra_search_path: + type: string + db_schema: + type: string + max_rows: + type: integer + minimum: 0 + maximum: 1000000 + db_pool: + type: integer + minimum: 0 + maximum: 1000 + db_pool_acquisition_timeout: + type: integer + minimum: 0 + maximum: 60 + example: + db_schema: public,storage + db_pool: 20 + max_rows: 1000 + V1PostgrestConfigResponse: + type: object + properties: + db_schema: + type: string + max_rows: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + db_extra_search_path: + type: string + db_pool: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + description: If `null`, the value is automatically configured based on compute size. + nullable: true + db_pool_acquisition_timeout: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + description: If `null`, the value is automatically configured to 10. + nullable: true + required: + - db_schema + - max_rows + - db_extra_search_path + - db_pool + - db_pool_acquisition_timeout + SslEnforcementResponse: + type: object + properties: + currentConfig: + type: object + properties: + database: + type: boolean + required: + - database + appliedSuccessfully: + type: boolean + required: + - currentConfig + - appliedSuccessfully + SslEnforcementRequest: + type: object + properties: + requestedConfig: + type: object + properties: + database: + type: boolean + required: + - database + required: + - requestedConfig + example: + requestedConfig: + database: true + SigningKeyResponse: + type: object + properties: + id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + algorithm: + type: string + enum: + - EdDSA + - ES256 + - RS256 + - HS256 + status: + type: string + enum: + - in_use + - previously_used + - revoked + - standby + public_jwk: + nullable: true + created_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + required: + - id + - algorithm + - status + - public_jwk + - created_at + - updated_at + additionalProperties: false + CreateSigningKeyBody: + type: object + properties: + algorithm: + type: string + enum: + - EdDSA + - ES256 + - RS256 + - HS256 + status: + type: string + enum: + - in_use + - standby + private_jwk: + type: object + properties: + kid: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + use: + type: string + enum: + - sig + key_ops: + minItems: 2 + maxItems: 2 + type: array + items: + type: string + enum: + - sign + - verify + ext: + type: boolean + enum: + - true + kty: + type: string + enum: + - RSA + alg: + type: string + enum: + - RS256 + 'n': + type: string + e: + type: string + enum: + - AQAB + d: + type: string + p: + type: string + q: + type: string + dp: + type: string + dq: + type: string + qi: + type: string + crv: + type: string + enum: + - P-256 + x: + type: string + 'y': + type: string + k: + type: string + minLength: 16 + required: + - kty + - 'n' + - e + - d + - p + - q + - dp + - dq + - qi + - crv + - x + - 'y' + - k + additionalProperties: false + required: + - algorithm + example: + algorithm: RS256 + status: standby + additionalProperties: false + SigningKeysResponse: + type: object + properties: + keys: + type: array + items: + type: object + properties: + id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + algorithm: + type: string + enum: + - EdDSA + - ES256 + - RS256 + - HS256 + status: + type: string + enum: + - in_use + - previously_used + - revoked + - standby + public_jwk: + nullable: true + created_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + required: + - id + - algorithm + - status + - public_jwk + - created_at + - updated_at + additionalProperties: false + required: + - keys + additionalProperties: false + UpdateSigningKeyBody: + type: object + properties: + status: + type: string + enum: + - in_use + - previously_used + - revoked + - standby + required: + - status + example: + status: standby + additionalProperties: false + AuthConfigResponse: + type: object + properties: + api_max_request_duration: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + db_max_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + db_max_pool_size_unit: + type: string + enum: + - connections + - percent + - null + nullable: true + disable_signup: + type: boolean + nullable: true + external_anonymous_users_enabled: + type: boolean + nullable: true + external_apple_additional_client_ids: + type: string + nullable: true + external_apple_client_id: + type: string + nullable: true + external_apple_email_optional: + type: boolean + nullable: true + external_apple_enabled: + type: boolean + nullable: true + external_apple_secret: + type: string + nullable: true + external_azure_client_id: + type: string + nullable: true + external_azure_email_optional: + type: boolean + nullable: true + external_azure_enabled: + type: boolean + nullable: true + external_azure_secret: + type: string + nullable: true + external_azure_url: + type: string + nullable: true + external_bitbucket_client_id: + type: string + nullable: true + external_bitbucket_email_optional: + type: boolean + nullable: true + external_bitbucket_enabled: + type: boolean + nullable: true + external_bitbucket_secret: + type: string + nullable: true + external_discord_client_id: + type: string + nullable: true + external_discord_email_optional: + type: boolean + nullable: true + external_discord_enabled: + type: boolean + nullable: true + external_discord_secret: + type: string + nullable: true + external_email_enabled: + type: boolean + nullable: true + external_facebook_client_id: + type: string + nullable: true + external_facebook_email_optional: + type: boolean + nullable: true + external_facebook_enabled: + type: boolean + nullable: true + external_facebook_secret: + type: string + nullable: true + external_figma_client_id: + type: string + nullable: true + external_figma_email_optional: + type: boolean + nullable: true + external_figma_enabled: + type: boolean + nullable: true + external_figma_secret: + type: string + nullable: true + external_github_client_id: + type: string + nullable: true + external_github_email_optional: + type: boolean + nullable: true + external_github_enabled: + type: boolean + nullable: true + external_github_secret: + type: string + nullable: true + external_gitlab_client_id: + type: string + nullable: true + external_gitlab_email_optional: + type: boolean + nullable: true + external_gitlab_enabled: + type: boolean + nullable: true + external_gitlab_secret: + type: string + nullable: true + external_gitlab_url: + type: string + nullable: true + external_google_additional_client_ids: + type: string + nullable: true + external_google_client_id: + type: string + nullable: true + external_google_email_optional: + type: boolean + nullable: true + external_google_enabled: + type: boolean + nullable: true + external_google_secret: + type: string + nullable: true + external_google_skip_nonce_check: + type: boolean + nullable: true + external_kakao_client_id: + type: string + nullable: true + external_kakao_email_optional: + type: boolean + nullable: true + external_kakao_enabled: + type: boolean + nullable: true + external_kakao_secret: + type: string + nullable: true + external_keycloak_client_id: + type: string + nullable: true + external_keycloak_email_optional: + type: boolean + nullable: true + external_keycloak_enabled: + type: boolean + nullable: true + external_keycloak_secret: + type: string + nullable: true + external_keycloak_url: + type: string + nullable: true + external_linkedin_oidc_client_id: + type: string + nullable: true + external_linkedin_oidc_email_optional: + type: boolean + nullable: true + external_linkedin_oidc_enabled: + type: boolean + nullable: true + external_linkedin_oidc_secret: + type: string + nullable: true + external_slack_oidc_client_id: + type: string + nullable: true + external_slack_oidc_email_optional: + type: boolean + nullable: true + external_slack_oidc_enabled: + type: boolean + nullable: true + external_slack_oidc_secret: + type: string + nullable: true + external_notion_client_id: + type: string + nullable: true + external_notion_email_optional: + type: boolean + nullable: true + external_notion_enabled: + type: boolean + nullable: true + external_notion_secret: + type: string + nullable: true + external_phone_enabled: + type: boolean + nullable: true + external_slack_client_id: + type: string + nullable: true + external_slack_email_optional: + type: boolean + nullable: true + external_slack_enabled: + type: boolean + nullable: true + external_slack_secret: + type: string + nullable: true + external_spotify_client_id: + type: string + nullable: true + external_spotify_email_optional: + type: boolean + nullable: true + external_spotify_enabled: + type: boolean + nullable: true + external_spotify_secret: + type: string + nullable: true + external_twitch_client_id: + type: string + nullable: true + external_twitch_email_optional: + type: boolean + nullable: true + external_twitch_enabled: + type: boolean + nullable: true + external_twitch_secret: + type: string + nullable: true + external_twitter_client_id: + type: string + nullable: true + external_twitter_email_optional: + type: boolean + nullable: true + external_twitter_enabled: + type: boolean + nullable: true + external_twitter_secret: + type: string + nullable: true + external_x_client_id: + type: string + nullable: true + external_x_email_optional: + type: boolean + nullable: true + external_x_enabled: + type: boolean + nullable: true + external_x_secret: + type: string + nullable: true + external_workos_client_id: + type: string + nullable: true + external_workos_enabled: + type: boolean + nullable: true + external_workos_secret: + type: string + nullable: true + external_workos_url: + type: string + nullable: true + external_web3_solana_enabled: + type: boolean + nullable: true + external_web3_ethereum_enabled: + type: boolean + nullable: true + external_zoom_client_id: + type: string + nullable: true + external_zoom_email_optional: + type: boolean + nullable: true + external_zoom_enabled: + type: boolean + nullable: true + external_zoom_secret: + type: string + nullable: true + hook_custom_access_token_enabled: + type: boolean + nullable: true + hook_custom_access_token_uri: + type: string + nullable: true + hook_custom_access_token_secrets: + type: string + nullable: true + hook_mfa_verification_attempt_enabled: + type: boolean + nullable: true + hook_mfa_verification_attempt_uri: + type: string + nullable: true + hook_mfa_verification_attempt_secrets: + type: string + nullable: true + hook_password_verification_attempt_enabled: + type: boolean + nullable: true + hook_password_verification_attempt_uri: + type: string + nullable: true + hook_password_verification_attempt_secrets: + type: string + nullable: true + hook_send_sms_enabled: + type: boolean + nullable: true + hook_send_sms_uri: + type: string + nullable: true + hook_send_sms_secrets: + type: string + nullable: true + hook_send_email_enabled: + type: boolean + nullable: true + hook_send_email_uri: + type: string + nullable: true + hook_send_email_secrets: + type: string + nullable: true + hook_before_user_created_enabled: + type: boolean + nullable: true + hook_before_user_created_uri: + type: string + nullable: true + hook_before_user_created_secrets: + type: string + nullable: true + hook_after_user_created_enabled: + type: boolean + nullable: true + hook_after_user_created_uri: + type: string + nullable: true + hook_after_user_created_secrets: + type: string + nullable: true + jwt_exp: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + mailer_allow_unverified_email_sign_ins: + type: boolean + nullable: true + mailer_autoconfirm: + type: boolean + nullable: true + mailer_otp_exp: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + mailer_otp_length: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + mailer_secure_email_change_enabled: + type: boolean + nullable: true + mailer_subjects_confirmation: + type: string + nullable: true + mailer_subjects_email_change: + type: string + nullable: true + mailer_subjects_invite: + type: string + nullable: true + mailer_subjects_magic_link: + type: string + nullable: true + mailer_subjects_reauthentication: + type: string + nullable: true + mailer_subjects_recovery: + type: string + nullable: true + mailer_subjects_password_changed_notification: + type: string + nullable: true + mailer_subjects_email_changed_notification: + type: string + nullable: true + mailer_subjects_phone_changed_notification: + type: string + nullable: true + mailer_subjects_mfa_factor_enrolled_notification: + type: string + nullable: true + mailer_subjects_mfa_factor_unenrolled_notification: + type: string + nullable: true + mailer_subjects_identity_linked_notification: + type: string + nullable: true + mailer_subjects_identity_unlinked_notification: + type: string + nullable: true + mailer_templates_confirmation_content: + type: string + nullable: true + mailer_templates_email_change_content: + type: string + nullable: true + mailer_templates_invite_content: + type: string + nullable: true + mailer_templates_magic_link_content: + type: string + nullable: true + mailer_templates_reauthentication_content: + type: string + nullable: true + mailer_templates_recovery_content: + type: string + nullable: true + mailer_templates_password_changed_notification_content: + type: string + nullable: true + mailer_templates_email_changed_notification_content: + type: string + nullable: true + mailer_templates_phone_changed_notification_content: + type: string + nullable: true + mailer_templates_mfa_factor_enrolled_notification_content: + type: string + nullable: true + mailer_templates_mfa_factor_unenrolled_notification_content: + type: string + nullable: true + mailer_templates_identity_linked_notification_content: + type: string + nullable: true + mailer_templates_identity_unlinked_notification_content: + type: string + nullable: true + mailer_notifications_password_changed_enabled: + type: boolean + nullable: true + mailer_notifications_email_changed_enabled: + type: boolean + nullable: true + mailer_notifications_phone_changed_enabled: + type: boolean + nullable: true + mailer_notifications_mfa_factor_enrolled_enabled: + type: boolean + nullable: true + mailer_notifications_mfa_factor_unenrolled_enabled: + type: boolean + nullable: true + mailer_notifications_identity_linked_enabled: + type: boolean + nullable: true + mailer_notifications_identity_unlinked_enabled: + type: boolean + nullable: true + mfa_max_enrolled_factors: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + mfa_totp_enroll_enabled: + type: boolean + nullable: true + mfa_totp_verify_enabled: + type: boolean + nullable: true + mfa_phone_enroll_enabled: + type: boolean + nullable: true + mfa_phone_verify_enabled: + type: boolean + nullable: true + mfa_web_authn_enroll_enabled: + type: boolean + nullable: true + mfa_web_authn_verify_enabled: + type: boolean + nullable: true + passkey_enabled: + type: boolean + webauthn_rp_display_name: + type: string + nullable: true + webauthn_rp_id: + type: string + nullable: true + webauthn_rp_origins: + type: string + nullable: true + mfa_phone_otp_length: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + mfa_phone_template: + type: string + nullable: true + mfa_phone_max_frequency: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + nimbus_oauth_client_id: + type: string + nullable: true + nimbus_oauth_email_optional: + type: boolean + nullable: true + nimbus_oauth_client_secret: + type: string + nullable: true + password_hibp_enabled: + type: boolean + nullable: true + password_min_length: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + password_required_characters: + type: string + enum: + - abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789 + - abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789 + - abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\:"|<>?,./`~ + - '' + - null + nullable: true + rate_limit_anonymous_users: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_email_sent: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_sms_sent: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_token_refresh: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_verify: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_otp: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + rate_limit_web3: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + refresh_token_rotation_enabled: + type: boolean + nullable: true + saml_enabled: + type: boolean + nullable: true + saml_external_url: + type: string + nullable: true + saml_allow_encrypted_assertions: + type: boolean + nullable: true + security_sb_forwarded_for_enabled: + type: boolean + nullable: true + security_captcha_enabled: + type: boolean + nullable: true + security_captcha_provider: + type: string + enum: + - turnstile + - hcaptcha + - null + nullable: true + security_captcha_secret: + type: string + nullable: true + security_manual_linking_enabled: + type: boolean + nullable: true + security_refresh_token_reuse_interval: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + security_update_password_require_reauthentication: + type: boolean + nullable: true + sessions_inactivity_timeout: + type: number + nullable: true + sessions_single_per_user: + type: boolean + nullable: true + sessions_tags: + type: string + nullable: true + sessions_timebox: + type: number + nullable: true + site_url: + type: string + nullable: true + sms_autoconfirm: + type: boolean + nullable: true + sms_max_frequency: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + sms_messagebird_access_key: + type: string + nullable: true + sms_messagebird_originator: + type: string + nullable: true + sms_otp_exp: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + sms_otp_length: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + sms_provider: + type: string + enum: + - messagebird + - textlocal + - twilio + - twilio_verify + - vonage + - null + nullable: true + sms_template: + type: string + nullable: true + sms_test_otp: + type: string + nullable: true + sms_test_otp_valid_until: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$ + nullable: true + sms_textlocal_api_key: + type: string + nullable: true + sms_textlocal_sender: + type: string + nullable: true + sms_twilio_account_sid: + type: string + nullable: true + sms_twilio_auth_token: + type: string + nullable: true + sms_twilio_content_sid: + type: string + nullable: true + sms_twilio_message_service_sid: + type: string + nullable: true + sms_twilio_verify_account_sid: + type: string + nullable: true + sms_twilio_verify_auth_token: + type: string + nullable: true + sms_twilio_verify_message_service_sid: + type: string + nullable: true + sms_vonage_api_key: + type: string + nullable: true + sms_vonage_api_secret: + type: string + nullable: true + sms_vonage_from: + type: string + nullable: true + smtp_admin_email: + type: string + format: email + pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ + nullable: true + smtp_host: + type: string + nullable: true + smtp_max_frequency: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + smtp_pass: + type: string + nullable: true + smtp_port: + type: string + nullable: true + smtp_sender_name: + type: string + nullable: true + smtp_user: + type: string + nullable: true + uri_allow_list: + type: string + nullable: true + oauth_server_enabled: + type: boolean + oauth_server_allow_dynamic_registration: + type: boolean + oauth_server_authorization_path: + type: string + nullable: true + custom_oauth_enabled: + type: boolean + custom_oauth_max_providers: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + required: + - api_max_request_duration + - db_max_pool_size + - db_max_pool_size_unit + - disable_signup + - external_anonymous_users_enabled + - external_apple_additional_client_ids + - external_apple_client_id + - external_apple_email_optional + - external_apple_enabled + - external_apple_secret + - external_azure_client_id + - external_azure_email_optional + - external_azure_enabled + - external_azure_secret + - external_azure_url + - external_bitbucket_client_id + - external_bitbucket_email_optional + - external_bitbucket_enabled + - external_bitbucket_secret + - external_discord_client_id + - external_discord_email_optional + - external_discord_enabled + - external_discord_secret + - external_email_enabled + - external_facebook_client_id + - external_facebook_email_optional + - external_facebook_enabled + - external_facebook_secret + - external_figma_client_id + - external_figma_email_optional + - external_figma_enabled + - external_figma_secret + - external_github_client_id + - external_github_email_optional + - external_github_enabled + - external_github_secret + - external_gitlab_client_id + - external_gitlab_email_optional + - external_gitlab_enabled + - external_gitlab_secret + - external_gitlab_url + - external_google_additional_client_ids + - external_google_client_id + - external_google_email_optional + - external_google_enabled + - external_google_secret + - external_google_skip_nonce_check + - external_kakao_client_id + - external_kakao_email_optional + - external_kakao_enabled + - external_kakao_secret + - external_keycloak_client_id + - external_keycloak_email_optional + - external_keycloak_enabled + - external_keycloak_secret + - external_keycloak_url + - external_linkedin_oidc_client_id + - external_linkedin_oidc_email_optional + - external_linkedin_oidc_enabled + - external_linkedin_oidc_secret + - external_slack_oidc_client_id + - external_slack_oidc_email_optional + - external_slack_oidc_enabled + - external_slack_oidc_secret + - external_notion_client_id + - external_notion_email_optional + - external_notion_enabled + - external_notion_secret + - external_phone_enabled + - external_slack_client_id + - external_slack_email_optional + - external_slack_enabled + - external_slack_secret + - external_spotify_client_id + - external_spotify_email_optional + - external_spotify_enabled + - external_spotify_secret + - external_twitch_client_id + - external_twitch_email_optional + - external_twitch_enabled + - external_twitch_secret + - external_twitter_client_id + - external_twitter_email_optional + - external_twitter_enabled + - external_twitter_secret + - external_x_client_id + - external_x_email_optional + - external_x_enabled + - external_x_secret + - external_workos_client_id + - external_workos_enabled + - external_workos_secret + - external_workos_url + - external_web3_solana_enabled + - external_web3_ethereum_enabled + - external_zoom_client_id + - external_zoom_email_optional + - external_zoom_enabled + - external_zoom_secret + - hook_custom_access_token_enabled + - hook_custom_access_token_uri + - hook_custom_access_token_secrets + - hook_mfa_verification_attempt_enabled + - hook_mfa_verification_attempt_uri + - hook_mfa_verification_attempt_secrets + - hook_password_verification_attempt_enabled + - hook_password_verification_attempt_uri + - hook_password_verification_attempt_secrets + - hook_send_sms_enabled + - hook_send_sms_uri + - hook_send_sms_secrets + - hook_send_email_enabled + - hook_send_email_uri + - hook_send_email_secrets + - hook_before_user_created_enabled + - hook_before_user_created_uri + - hook_before_user_created_secrets + - hook_after_user_created_enabled + - hook_after_user_created_uri + - hook_after_user_created_secrets + - jwt_exp + - mailer_allow_unverified_email_sign_ins + - mailer_autoconfirm + - mailer_otp_exp + - mailer_otp_length + - mailer_secure_email_change_enabled + - mailer_subjects_confirmation + - mailer_subjects_email_change + - mailer_subjects_invite + - mailer_subjects_magic_link + - mailer_subjects_reauthentication + - mailer_subjects_recovery + - mailer_subjects_password_changed_notification + - mailer_subjects_email_changed_notification + - mailer_subjects_phone_changed_notification + - mailer_subjects_mfa_factor_enrolled_notification + - mailer_subjects_mfa_factor_unenrolled_notification + - mailer_subjects_identity_linked_notification + - mailer_subjects_identity_unlinked_notification + - mailer_templates_confirmation_content + - mailer_templates_email_change_content + - mailer_templates_invite_content + - mailer_templates_magic_link_content + - mailer_templates_reauthentication_content + - mailer_templates_recovery_content + - mailer_templates_password_changed_notification_content + - mailer_templates_email_changed_notification_content + - mailer_templates_phone_changed_notification_content + - mailer_templates_mfa_factor_enrolled_notification_content + - mailer_templates_mfa_factor_unenrolled_notification_content + - mailer_templates_identity_linked_notification_content + - mailer_templates_identity_unlinked_notification_content + - mailer_notifications_password_changed_enabled + - mailer_notifications_email_changed_enabled + - mailer_notifications_phone_changed_enabled + - mailer_notifications_mfa_factor_enrolled_enabled + - mailer_notifications_mfa_factor_unenrolled_enabled + - mailer_notifications_identity_linked_enabled + - mailer_notifications_identity_unlinked_enabled + - mfa_max_enrolled_factors + - mfa_totp_enroll_enabled + - mfa_totp_verify_enabled + - mfa_phone_enroll_enabled + - mfa_phone_verify_enabled + - mfa_web_authn_enroll_enabled + - mfa_web_authn_verify_enabled + - passkey_enabled + - webauthn_rp_display_name + - webauthn_rp_id + - webauthn_rp_origins + - mfa_phone_otp_length + - mfa_phone_template + - mfa_phone_max_frequency + - nimbus_oauth_client_id + - nimbus_oauth_email_optional + - nimbus_oauth_client_secret + - password_hibp_enabled + - password_min_length + - password_required_characters + - rate_limit_anonymous_users + - rate_limit_email_sent + - rate_limit_sms_sent + - rate_limit_token_refresh + - rate_limit_verify + - rate_limit_otp + - rate_limit_web3 + - refresh_token_rotation_enabled + - saml_enabled + - saml_external_url + - saml_allow_encrypted_assertions + - security_sb_forwarded_for_enabled + - security_captcha_enabled + - security_captcha_provider + - security_captcha_secret + - security_manual_linking_enabled + - security_refresh_token_reuse_interval + - security_update_password_require_reauthentication + - sessions_inactivity_timeout + - sessions_single_per_user + - sessions_tags + - sessions_timebox + - site_url + - sms_autoconfirm + - sms_max_frequency + - sms_messagebird_access_key + - sms_messagebird_originator + - sms_otp_exp + - sms_otp_length + - sms_provider + - sms_template + - sms_test_otp + - sms_test_otp_valid_until + - sms_textlocal_api_key + - sms_textlocal_sender + - sms_twilio_account_sid + - sms_twilio_auth_token + - sms_twilio_content_sid + - sms_twilio_message_service_sid + - sms_twilio_verify_account_sid + - sms_twilio_verify_auth_token + - sms_twilio_verify_message_service_sid + - sms_vonage_api_key + - sms_vonage_api_secret + - sms_vonage_from + - smtp_admin_email + - smtp_host + - smtp_max_frequency + - smtp_pass + - smtp_port + - smtp_sender_name + - smtp_user + - uri_allow_list + - oauth_server_enabled + - oauth_server_allow_dynamic_registration + - oauth_server_authorization_path + - custom_oauth_enabled + - custom_oauth_max_providers + UpdateAuthConfigBody: + type: object + properties: + site_url: + type: string + pattern: ^[^,]+$ + nullable: true + disable_signup: + type: boolean + nullable: true + jwt_exp: + type: integer + minimum: 0 + maximum: 604800 + nullable: true + smtp_admin_email: + type: string + format: email + pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ + nullable: true + smtp_host: + type: string + nullable: true + smtp_port: + type: string + nullable: true + smtp_user: + type: string + nullable: true + smtp_pass: + type: string + nullable: true + smtp_max_frequency: + type: integer + minimum: 0 + maximum: 32767 + nullable: true + smtp_sender_name: + type: string + nullable: true + mailer_allow_unverified_email_sign_ins: + type: boolean + nullable: true + mailer_autoconfirm: + type: boolean + nullable: true + mailer_subjects_invite: + type: string + nullable: true + mailer_subjects_confirmation: + type: string + nullable: true + mailer_subjects_recovery: + type: string + nullable: true + mailer_subjects_email_change: + type: string + nullable: true + mailer_subjects_magic_link: + type: string + nullable: true + mailer_subjects_reauthentication: + type: string + nullable: true + mailer_subjects_password_changed_notification: + type: string + nullable: true + mailer_subjects_email_changed_notification: + type: string + nullable: true + mailer_subjects_phone_changed_notification: + type: string + nullable: true + mailer_subjects_mfa_factor_enrolled_notification: + type: string + nullable: true + mailer_subjects_mfa_factor_unenrolled_notification: + type: string + nullable: true + mailer_subjects_identity_linked_notification: + type: string + nullable: true + mailer_subjects_identity_unlinked_notification: + type: string + nullable: true + mailer_templates_invite_content: + type: string + nullable: true + mailer_templates_confirmation_content: + type: string + nullable: true + mailer_templates_recovery_content: + type: string + nullable: true + mailer_templates_email_change_content: + type: string + nullable: true + mailer_templates_magic_link_content: + type: string + nullable: true + mailer_templates_reauthentication_content: + type: string + nullable: true + mailer_templates_password_changed_notification_content: + type: string + nullable: true + mailer_templates_email_changed_notification_content: + type: string + nullable: true + mailer_templates_phone_changed_notification_content: + type: string + nullable: true + mailer_templates_mfa_factor_enrolled_notification_content: + type: string + nullable: true + mailer_templates_mfa_factor_unenrolled_notification_content: + type: string + nullable: true + mailer_templates_identity_linked_notification_content: + type: string + nullable: true + mailer_templates_identity_unlinked_notification_content: + type: string + nullable: true + mailer_notifications_password_changed_enabled: + type: boolean + nullable: true + mailer_notifications_email_changed_enabled: + type: boolean + nullable: true + mailer_notifications_phone_changed_enabled: + type: boolean + nullable: true + mailer_notifications_mfa_factor_enrolled_enabled: + type: boolean + nullable: true + mailer_notifications_mfa_factor_unenrolled_enabled: + type: boolean + nullable: true + mailer_notifications_identity_linked_enabled: + type: boolean + nullable: true + mailer_notifications_identity_unlinked_enabled: + type: boolean + nullable: true + mfa_max_enrolled_factors: + type: integer + minimum: 0 + maximum: 2147483647 + nullable: true + uri_allow_list: + type: string + nullable: true + external_anonymous_users_enabled: + type: boolean + nullable: true + external_email_enabled: + type: boolean + nullable: true + external_phone_enabled: + type: boolean + nullable: true + saml_enabled: + type: boolean + nullable: true + saml_external_url: + type: string + pattern: ^[^,]+$ + nullable: true + security_sb_forwarded_for_enabled: + type: boolean + nullable: true + security_captcha_enabled: + type: boolean + nullable: true + security_captcha_provider: + type: string + enum: + - turnstile + - hcaptcha + - null + nullable: true + security_captcha_secret: + type: string + nullable: true + sessions_timebox: + type: number + minimum: 0 + nullable: true + sessions_inactivity_timeout: + type: number + minimum: 0 + nullable: true + sessions_single_per_user: + type: boolean + nullable: true + sessions_tags: + type: string + pattern: ^\s*([a-zA-Z0-9_-]+(\s*,+\s*)?)*\s*$ + nullable: true + rate_limit_anonymous_users: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_email_sent: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_sms_sent: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_verify: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_token_refresh: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_otp: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + rate_limit_web3: + type: integer + minimum: 1 + maximum: 2147483647 + nullable: true + mailer_secure_email_change_enabled: + type: boolean + nullable: true + refresh_token_rotation_enabled: + type: boolean + nullable: true + password_hibp_enabled: + type: boolean + nullable: true + password_min_length: + type: integer + minimum: 6 + maximum: 32767 + nullable: true + password_required_characters: + type: string + enum: + - abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789 + - abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789 + - abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\:"|<>?,./`~ + - '' + - null + nullable: true + security_manual_linking_enabled: + type: boolean + nullable: true + security_update_password_require_reauthentication: + type: boolean + nullable: true + security_refresh_token_reuse_interval: + type: integer + minimum: 0 + maximum: 2147483647 + nullable: true + mailer_otp_exp: + type: integer + minimum: 0 + maximum: 2147483647 + mailer_otp_length: + type: integer + minimum: 6 + maximum: 10 + nullable: true + sms_autoconfirm: + type: boolean + nullable: true + sms_max_frequency: + type: integer + minimum: 0 + maximum: 32767 + nullable: true + sms_otp_exp: + type: integer + minimum: 0 + maximum: 2147483647 + nullable: true + sms_otp_length: + type: integer + minimum: 0 + maximum: 32767 + sms_provider: + type: string + enum: + - messagebird + - textlocal + - twilio + - twilio_verify + - vonage + - null + nullable: true + sms_messagebird_access_key: + type: string + nullable: true + sms_messagebird_originator: + type: string + nullable: true + sms_test_otp: + type: string + pattern: ^([0-9]{1,15}=[0-9]+,?)*$ + nullable: true + sms_test_otp_valid_until: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$ + nullable: true + sms_textlocal_api_key: + type: string + nullable: true + sms_textlocal_sender: + type: string + nullable: true + sms_twilio_account_sid: + type: string + nullable: true + sms_twilio_auth_token: + type: string + nullable: true + sms_twilio_content_sid: + type: string + nullable: true + sms_twilio_message_service_sid: + type: string + nullable: true + sms_twilio_verify_account_sid: + type: string + nullable: true + sms_twilio_verify_auth_token: + type: string + nullable: true + sms_twilio_verify_message_service_sid: + type: string + nullable: true + sms_vonage_api_key: + type: string + nullable: true + sms_vonage_api_secret: + type: string + nullable: true + sms_vonage_from: + type: string + nullable: true + sms_template: + type: string + nullable: true + hook_mfa_verification_attempt_enabled: + type: boolean + nullable: true + hook_mfa_verification_attempt_uri: + type: string + nullable: true + hook_mfa_verification_attempt_secrets: + type: string + nullable: true + hook_password_verification_attempt_enabled: + type: boolean + nullable: true + hook_password_verification_attempt_uri: + type: string + nullable: true + hook_password_verification_attempt_secrets: + type: string + nullable: true + hook_custom_access_token_enabled: + type: boolean + nullable: true + hook_custom_access_token_uri: + type: string + nullable: true + hook_custom_access_token_secrets: + type: string + nullable: true + hook_send_sms_enabled: + type: boolean + nullable: true + hook_send_sms_uri: + type: string + nullable: true + hook_send_sms_secrets: + type: string + nullable: true + hook_send_email_enabled: + type: boolean + nullable: true + hook_send_email_uri: + type: string + nullable: true + hook_send_email_secrets: + type: string + nullable: true + hook_before_user_created_enabled: + type: boolean + nullable: true + hook_before_user_created_uri: + type: string + nullable: true + hook_before_user_created_secrets: + type: string + nullable: true + hook_after_user_created_enabled: + type: boolean + nullable: true + hook_after_user_created_uri: + type: string + nullable: true + hook_after_user_created_secrets: + type: string + nullable: true + external_apple_enabled: + type: boolean + nullable: true + external_apple_client_id: + type: string + nullable: true + external_apple_email_optional: + type: boolean + nullable: true + external_apple_secret: + type: string + nullable: true + external_apple_additional_client_ids: + type: string + nullable: true + external_azure_enabled: + type: boolean + nullable: true + external_azure_client_id: + type: string + nullable: true + external_azure_email_optional: + type: boolean + nullable: true + external_azure_secret: + type: string + nullable: true + external_azure_url: + type: string + nullable: true + external_bitbucket_enabled: + type: boolean + nullable: true + external_bitbucket_client_id: + type: string + nullable: true + external_bitbucket_email_optional: + type: boolean + nullable: true + external_bitbucket_secret: + type: string + nullable: true + external_discord_enabled: + type: boolean + nullable: true + external_discord_client_id: + type: string + nullable: true + external_discord_email_optional: + type: boolean + nullable: true + external_discord_secret: + type: string + nullable: true + external_facebook_enabled: + type: boolean + nullable: true + external_facebook_client_id: + type: string + nullable: true + external_facebook_email_optional: + type: boolean + nullable: true + external_facebook_secret: + type: string + nullable: true + external_figma_enabled: + type: boolean + nullable: true + external_figma_client_id: + type: string + nullable: true + external_figma_email_optional: + type: boolean + nullable: true + external_figma_secret: + type: string + nullable: true + external_github_enabled: + type: boolean + nullable: true + external_github_client_id: + type: string + nullable: true + external_github_email_optional: + type: boolean + nullable: true + external_github_secret: + type: string + nullable: true + external_gitlab_enabled: + type: boolean + nullable: true + external_gitlab_client_id: + type: string + nullable: true + external_gitlab_email_optional: + type: boolean + nullable: true + external_gitlab_secret: + type: string + nullable: true + external_gitlab_url: + type: string + nullable: true + external_google_enabled: + type: boolean + nullable: true + external_google_client_id: + type: string + nullable: true + external_google_email_optional: + type: boolean + nullable: true + external_google_secret: + type: string + nullable: true + external_google_additional_client_ids: + type: string + nullable: true + external_google_skip_nonce_check: + type: boolean + nullable: true + external_kakao_enabled: + type: boolean + nullable: true + external_kakao_client_id: + type: string + nullable: true + external_kakao_email_optional: + type: boolean + nullable: true + external_kakao_secret: + type: string + nullable: true + external_keycloak_enabled: + type: boolean + nullable: true + external_keycloak_client_id: + type: string + nullable: true + external_keycloak_email_optional: + type: boolean + nullable: true + external_keycloak_secret: + type: string + nullable: true + external_keycloak_url: + type: string + nullable: true + external_linkedin_oidc_enabled: + type: boolean + nullable: true + external_linkedin_oidc_client_id: + type: string + nullable: true + external_linkedin_oidc_email_optional: + type: boolean + nullable: true + external_linkedin_oidc_secret: + type: string + nullable: true + external_slack_oidc_enabled: + type: boolean + nullable: true + external_slack_oidc_client_id: + type: string + nullable: true + external_slack_oidc_email_optional: + type: boolean + nullable: true + external_slack_oidc_secret: + type: string + nullable: true + external_notion_enabled: + type: boolean + nullable: true + external_notion_client_id: + type: string + nullable: true + external_notion_email_optional: + type: boolean + nullable: true + external_notion_secret: + type: string + nullable: true + external_slack_enabled: + type: boolean + nullable: true + external_slack_client_id: + type: string + nullable: true + external_slack_email_optional: + type: boolean + nullable: true + external_slack_secret: + type: string + nullable: true + external_spotify_enabled: + type: boolean + nullable: true + external_spotify_client_id: + type: string + nullable: true + external_spotify_email_optional: + type: boolean + nullable: true + external_spotify_secret: + type: string + nullable: true + external_twitch_enabled: + type: boolean + nullable: true + external_twitch_client_id: + type: string + nullable: true + external_twitch_email_optional: + type: boolean + nullable: true + external_twitch_secret: + type: string + nullable: true + external_twitter_enabled: + type: boolean + nullable: true + external_twitter_client_id: + type: string + nullable: true + external_twitter_email_optional: + type: boolean + nullable: true + external_twitter_secret: + type: string + nullable: true + external_x_enabled: + type: boolean + nullable: true + external_x_client_id: + type: string + nullable: true + external_x_email_optional: + type: boolean + nullable: true + external_x_secret: + type: string + nullable: true + external_workos_enabled: + type: boolean + nullable: true + external_workos_client_id: + type: string + nullable: true + external_workos_secret: + type: string + nullable: true + external_workos_url: + type: string + nullable: true + external_web3_solana_enabled: + type: boolean + nullable: true + external_web3_ethereum_enabled: + type: boolean + nullable: true + external_zoom_enabled: + type: boolean + nullable: true + external_zoom_client_id: + type: string + nullable: true + external_zoom_email_optional: + type: boolean + nullable: true + external_zoom_secret: + type: string + nullable: true + db_max_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + db_max_pool_size_unit: + type: string + enum: + - connections + - percent + - null + nullable: true + api_max_request_duration: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + mfa_totp_enroll_enabled: + type: boolean + nullable: true + mfa_totp_verify_enabled: + type: boolean + nullable: true + mfa_web_authn_enroll_enabled: + type: boolean + nullable: true + mfa_web_authn_verify_enabled: + type: boolean + nullable: true + passkey_enabled: + type: boolean + webauthn_rp_display_name: + type: string + nullable: true + webauthn_rp_id: + type: string + nullable: true + webauthn_rp_origins: + type: string + nullable: true + mfa_phone_enroll_enabled: + type: boolean + nullable: true + mfa_phone_verify_enabled: + type: boolean + nullable: true + mfa_phone_max_frequency: + type: integer + minimum: 0 + maximum: 32767 + nullable: true + mfa_phone_otp_length: + type: integer + minimum: 0 + maximum: 32767 + nullable: true + mfa_phone_template: + type: string + nullable: true + nimbus_oauth_client_id: + type: string + nullable: true + nimbus_oauth_client_secret: + type: string + nullable: true + oauth_server_enabled: + type: boolean + nullable: true + oauth_server_allow_dynamic_registration: + type: boolean + nullable: true + oauth_server_authorization_path: + type: string + nullable: true + custom_oauth_enabled: + type: boolean + example: + site_url: https://app.example.com + disable_signup: false + jwt_exp: 3600 + CreateThirdPartyAuthBody: + type: object + properties: + oidc_issuer_url: + type: string + jwks_url: + type: string + custom_jwks: {} + example: + oidc_issuer_url: https://login.acme.com + jwks_url: https://login.acme.com/.well-known/jwks.json + ThirdPartyAuth: + type: object + properties: + id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + type: + type: string + oidc_issuer_url: + type: string + nullable: true + jwks_url: + type: string + nullable: true + custom_jwks: + nullable: true + resolved_jwks: + nullable: true + inserted_at: + type: string + updated_at: + type: string + resolved_at: + type: string + nullable: true + required: + - id + - type + - inserted_at + - updated_at + StorageConfigResponse: + type: object + properties: + fileSizeLimit: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + features: + type: object + properties: + imageTransformation: + type: object + properties: + enabled: + type: boolean + required: + - enabled + s3Protocol: + type: object + properties: + enabled: + type: boolean + required: + - enabled + purgeCache: + type: object + properties: + enabled: + type: boolean + required: + - enabled + icebergCatalog: + type: object + properties: + enabled: + type: boolean + maxNamespaces: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxTables: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxCatalogs: + type: integer + minimum: 0 + maximum: 9007199254740991 + required: + - enabled + - maxNamespaces + - maxTables + - maxCatalogs + vectorBuckets: + type: object + properties: + enabled: + type: boolean + maxBuckets: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxIndexes: + type: integer + minimum: 0 + maximum: 9007199254740991 + required: + - enabled + - maxBuckets + - maxIndexes + required: + - imageTransformation + - s3Protocol + - purgeCache + - icebergCatalog + - vectorBuckets + capabilities: + type: object + properties: + list_v2: + type: boolean + iceberg_catalog: + type: boolean + required: + - list_v2 + - iceberg_catalog + external: + type: object + properties: + upstreamTarget: + type: string + enum: + - main + - canary + required: + - upstreamTarget + migrationVersion: + type: string + databasePoolMode: + type: string + required: + - fileSizeLimit + - features + - capabilities + - external + - migrationVersion + - databasePoolMode + UpdateStorageConfigBody: + type: object + properties: + fileSizeLimit: + type: integer + format: int64 + minimum: 0 + maximum: 536870912000 + features: + type: object + properties: + imageTransformation: + type: object + properties: + enabled: + type: boolean + required: + - enabled + s3Protocol: + type: object + properties: + enabled: + type: boolean + required: + - enabled + purgeCache: + type: object + properties: + enabled: + type: boolean + required: + - enabled + icebergCatalog: + type: object + properties: + enabled: + type: boolean + maxNamespaces: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxTables: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxCatalogs: + type: integer + minimum: 0 + maximum: 9007199254740991 + required: + - enabled + - maxNamespaces + - maxTables + - maxCatalogs + vectorBuckets: + type: object + properties: + enabled: + type: boolean + maxBuckets: + type: integer + minimum: 0 + maximum: 9007199254740991 + maxIndexes: + type: integer + minimum: 0 + maximum: 9007199254740991 + required: + - enabled + - maxBuckets + - maxIndexes + external: + type: object + properties: + upstreamTarget: + type: string + enum: + - main + - canary + required: + - upstreamTarget + example: + fileSizeLimit: 10485760 + features: + imageTransformation: + enabled: true + additionalProperties: false + V1PgbouncerConfigResponse: + type: object + properties: + default_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + ignore_startup_parameters: + type: string + max_client_conn: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + pool_mode: + type: string + enum: + - transaction + - session + - statement + connection_string: + type: string + server_idle_timeout: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + server_lifetime: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + query_wait_timeout: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + reserve_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + SupavisorConfigResponse: + type: object + properties: + identifier: + type: string + database_type: + type: string + enum: + - PRIMARY + - READ_REPLICA + is_using_scram_auth: + type: boolean + db_user: + type: string + db_host: + type: string + db_port: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + db_name: + type: string + connection_string: + type: string + default_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + max_client_conn: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + pool_mode: + type: string + enum: + - transaction + - session + required: + - identifier + - database_type + - is_using_scram_auth + - db_user + - db_host + - db_port + - db_name + - connection_string + - default_pool_size + - max_client_conn + - pool_mode + UpdateSupavisorConfigBody: + type: object + properties: + default_pool_size: + type: integer + minimum: 0 + maximum: 3000 + nullable: true + pool_mode: + description: Dedicated pooler mode for the project + type: string + enum: + - transaction + - session + example: + default_pool_size: 25 + pool_mode: transaction + UpdateSupavisorConfigResponse: + type: object + properties: + default_pool_size: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + nullable: true + pool_mode: + type: string + required: + - default_pool_size + - pool_mode + PostgresConfigResponse: + type: object + properties: + effective_cache_size: + type: string + logical_decoding_work_mem: + type: string + cron.log_statement: + type: boolean + log_autovacuum_min_duration: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + log_checkpoints: + type: boolean + log_connections: + type: boolean + log_disconnections: + type: boolean + log_duration: + type: boolean + log_lock_waits: + type: boolean + log_recovery_conflict_waits: + type: boolean + log_replication_commands: + type: boolean + log_startup_progress_interval: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + log_temp_files: + type: string + maintenance_work_mem: + type: string + track_activity_query_size: + type: string + max_connections: + type: integer + minimum: 1 + maximum: 262143 + max_locks_per_transaction: + type: integer + minimum: 10 + maximum: 2147483640 + max_logical_replication_workers: + type: integer + minimum: 0 + maximum: 262143 + max_parallel_maintenance_workers: + type: integer + minimum: 0 + maximum: 1024 + max_parallel_workers: + type: integer + minimum: 0 + maximum: 1024 + max_parallel_workers_per_gather: + type: integer + minimum: 0 + maximum: 1024 + max_replication_slots: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + max_slot_wal_keep_size: + type: string + max_standby_archive_delay: + type: string + max_standby_streaming_delay: + type: string + max_sync_workers_per_subscription: + type: integer + minimum: 0 + maximum: 262143 + max_wal_size: + type: string + max_wal_senders: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + max_worker_processes: + type: integer + minimum: 0 + maximum: 262143 + session_replication_role: + type: string + enum: + - origin + - replica + - local + shared_buffers: + type: string + statement_timeout: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + track_commit_timestamp: + type: boolean + wal_keep_size: + type: string + wal_sender_timeout: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + work_mem: + type: string + checkpoint_timeout: + type: string + description: 'Default unit: s' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + hot_standby_feedback: + type: boolean + UpdatePostgresConfigBody: + type: object + properties: + effective_cache_size: + type: string + logical_decoding_work_mem: + type: string + cron.log_statement: + type: boolean + log_autovacuum_min_duration: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + log_checkpoints: + type: boolean + log_connections: + type: boolean + log_disconnections: + type: boolean + log_duration: + type: boolean + log_lock_waits: + type: boolean + log_recovery_conflict_waits: + type: boolean + log_replication_commands: + type: boolean + log_startup_progress_interval: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + log_temp_files: + type: string + maintenance_work_mem: + type: string + track_activity_query_size: + type: string + max_connections: + type: integer + minimum: 1 + maximum: 262143 + max_locks_per_transaction: + type: integer + minimum: 10 + maximum: 2147483640 + max_logical_replication_workers: + type: integer + minimum: 0 + maximum: 262143 + max_parallel_maintenance_workers: + type: integer + minimum: 0 + maximum: 1024 + max_parallel_workers: + type: integer + minimum: 0 + maximum: 1024 + max_parallel_workers_per_gather: + type: integer + minimum: 0 + maximum: 1024 + max_replication_slots: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + max_slot_wal_keep_size: + type: string + max_standby_archive_delay: + type: string + max_standby_streaming_delay: + type: string + max_sync_workers_per_subscription: + type: integer + minimum: 0 + maximum: 262143 + max_wal_size: + type: string + max_wal_senders: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + max_worker_processes: + type: integer + minimum: 0 + maximum: 262143 + session_replication_role: + type: string + enum: + - origin + - replica + - local + shared_buffers: + type: string + statement_timeout: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + track_commit_timestamp: + type: boolean + wal_keep_size: + type: string + wal_sender_timeout: + type: string + description: 'Default unit: ms' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + work_mem: + type: string + checkpoint_timeout: + type: string + description: 'Default unit: s' + pattern: ^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$ + hot_standby_feedback: + type: boolean + restart_database: + type: boolean + example: + max_connections: 120 + shared_buffers: 256MB + work_mem: 4MB + statement_timeout: 60000ms + additionalProperties: false + RealtimeConfigResponse: + type: object + properties: + private_only: + type: boolean + description: Whether to only allow private channels + nullable: true + connection_pool: + type: integer + minimum: 1 + maximum: 100 + description: Sets connection pool size for Realtime Authorization + nullable: true + postgres_changes_pool: + type: integer + minimum: 1 + maximum: 100 + description: Sets connection pool size used to create Postgres Changes subscriptions + nullable: true + max_concurrent_users: + type: integer + minimum: 1 + maximum: 50000 + description: Sets maximum number of concurrent users rate limit + nullable: true + max_events_per_second: + type: integer + minimum: 1 + maximum: 50000 + description: Sets maximum number of events per second rate per channel limit + nullable: true + max_bytes_per_second: + type: integer + minimum: 1 + maximum: 10000000 + description: Sets maximum number of bytes per second rate per channel limit + nullable: true + max_channels_per_client: + type: integer + minimum: 1 + maximum: 10000 + description: Sets maximum number of channels per client rate limit + nullable: true + max_joins_per_second: + type: integer + minimum: 1 + maximum: 5000 + description: Sets maximum number of joins per second rate limit + nullable: true + max_presence_events_per_second: + type: integer + minimum: 1 + maximum: 5000 + description: Sets maximum number of presence events per second rate limit + nullable: true + max_payload_size_in_kb: + type: integer + minimum: 1 + maximum: 10000 + description: Sets maximum number of payload size in KB rate limit + nullable: true + suspend: + type: boolean + description: Disables the Realtime service for this project when true. Set to false to re-enable it. + nullable: true + presence_enabled: + type: boolean + description: Whether to enable presence + required: + - private_only + - connection_pool + - postgres_changes_pool + - max_concurrent_users + - max_events_per_second + - max_bytes_per_second + - max_channels_per_client + - max_joins_per_second + - max_presence_events_per_second + - max_payload_size_in_kb + - suspend + - presence_enabled + UpdateRealtimeConfigBody: + type: object + properties: + private_only: + type: boolean + description: Whether to only allow private channels + connection_pool: + type: integer + minimum: 1 + maximum: 100 + description: Sets connection pool size for Realtime Authorization + postgres_changes_pool: + type: integer + minimum: 1 + maximum: 100 + description: Sets connection pool size used to create Postgres Changes subscriptions + max_concurrent_users: + type: integer + minimum: 1 + maximum: 50000 + description: Sets maximum number of concurrent users rate limit + max_events_per_second: + type: integer + minimum: 1 + maximum: 50000 + description: Sets maximum number of events per second rate per channel limit + max_bytes_per_second: + type: integer + minimum: 1 + maximum: 10000000 + description: Sets maximum number of bytes per second rate per channel limit + max_channels_per_client: + type: integer + minimum: 1 + maximum: 10000 + description: Sets maximum number of channels per client rate limit + max_joins_per_second: + type: integer + minimum: 1 + maximum: 5000 + description: Sets maximum number of joins per second rate limit + max_presence_events_per_second: + type: integer + minimum: 1 + maximum: 5000 + description: Sets maximum number of presence events per second rate limit + max_payload_size_in_kb: + type: integer + minimum: 1 + maximum: 10000 + description: Sets maximum number of payload size in KB rate limit + suspend: + type: boolean + description: Disables the Realtime service for this project when true. Set to false to re-enable it. + presence_enabled: + type: boolean + description: Whether to enable presence + example: + private_only: false + max_concurrent_users: 1000 + max_channels_per_client: 100 + additionalProperties: false + CreateProviderBody: + type: object + properties: + type: + type: string + enum: + - saml + description: What type of provider will be created + metadata_xml: + type: string + metadata_url: + type: string + domains: + type: array + items: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - type + example: + type: saml + metadata_url: https://sso.acme.com/metadata.xml + domains: + - acme.com + attribute_mapping: + keys: + email: + name: email + first_name: + name: first_name + last_name: + name: last_name + CreateProviderResponse: + type: object + properties: + id: + type: string + saml: + type: object + properties: + entity_id: + type: string + metadata_url: + type: string + metadata_xml: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - entity_id + domains: + type: array + items: + type: object + properties: + domain: + type: string + created_at: + type: string + updated_at: + type: string + created_at: + type: string + updated_at: + type: string + required: + - id + ListProvidersResponse: + type: object + properties: + items: + type: array + items: + type: object + properties: + id: + type: string + saml: + type: object + properties: + entity_id: + type: string + metadata_url: + type: string + metadata_xml: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - entity_id + domains: + type: array + items: + type: object + properties: + domain: + type: string + created_at: + type: string + updated_at: + type: string + created_at: + type: string + updated_at: + type: string + required: + - id + required: + - items + GetProviderResponse: + type: object + properties: + id: + type: string + saml: + type: object + properties: + entity_id: + type: string + metadata_url: + type: string + metadata_xml: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - entity_id + domains: + type: array + items: + type: object + properties: + domain: + type: string + created_at: + type: string + updated_at: + type: string + created_at: + type: string + updated_at: + type: string + required: + - id + UpdateProviderBody: + type: object + properties: + metadata_xml: + type: string + metadata_url: + type: string + domains: + type: array + items: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + example: + metadata_url: https://sso.acme.com/metadata.xml + domains: + - acme.com + - contractors.acme.com + UpdateProviderResponse: + type: object + properties: + id: + type: string + saml: + type: object + properties: + entity_id: + type: string + metadata_url: + type: string + metadata_xml: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - entity_id + domains: + type: array + items: + type: object + properties: + domain: + type: string + created_at: + type: string + updated_at: + type: string + created_at: + type: string + updated_at: + type: string + required: + - id + DeleteProviderResponse: + type: object + properties: + id: + type: string + saml: + type: object + properties: + entity_id: + type: string + metadata_url: + type: string + metadata_xml: + type: string + attribute_mapping: + type: object + properties: + keys: + type: object + additionalProperties: + type: object + properties: + name: + type: string + names: + type: array + items: + type: string + default: + anyOf: + - type: object + properties: {} + - type: number + - type: string + - type: boolean + array: + type: boolean + required: + - keys + name_id_format: + type: string + enum: + - urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + - urn:oasis:names:tc:SAML:2.0:nameid-format:transient + - urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + - urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + required: + - entity_id + domains: + type: array + items: + type: object + properties: + domain: + type: string + created_at: + type: string + updated_at: + type: string + created_at: + type: string + updated_at: + type: string + required: + - id + V1-list-project-tpa-integrationsResponse: + type: object + properties: + v1_list_project_tpa_integrations: + type: array + items: + $ref: '#/components/schemas/ThirdPartyAuth' + V1-get-pooler-configResponse: + type: object + properties: + v1_get_pooler_config: + type: array + items: + $ref: '#/components/schemas/SupavisorConfigResponse' +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/database.yaml b/provider-dev/source/database.yaml new file mode 100644 index 0000000..1fef330 --- /dev/null +++ b/provider-dev/source/database.yaml @@ -0,0 +1,2414 @@ +openapi: 3.0.0 +info: + title: database API + description: Database related endpoints + version: 1.0.0 +paths: + /v1/snippets: + get: + operationId: v1-list-all-snippets + parameters: + - name: project_ref + required: false + in: query + description: Project ref + schema: + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + example: abcdefghijklmnopqrst + type: string + - name: cursor + required: false + in: query + schema: + type: string + - name: limit + required: false + in: query + schema: + type: string + minimum: 1 + maximum: 100 + - name: sort_by + required: false + in: query + schema: + enum: + - name + - inserted_at + type: string + - name: sort_order + required: false + in: query + schema: + enum: + - asc + - desc + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SnippetList' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list user's SQL snippets + security: + - bearer: [] + summary: Lists SQL snippets for the logged in user + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - snippets_read + x-oauth-scope: database:read + /v1/snippets/{id}: + get: + operationId: v1-get-a-snippet + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 44444444-4444-4444-8444-444444444444 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SnippetResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve SQL snippet + security: + - bearer: [] + summary: Gets a specific SQL snippet + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - snippets_read + x-oauth-scope: database:read + /jit-access: + get: + operationId: v1-get-jit-access-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + state: + type: string + enum: + - enabled + - disabled + appliedSuccessfully: + type: boolean + unavailableReason: + type: string + enum: + - postgres_upgrade_required + - ssl_enforcement_required + - temporarily_unavailable + required: + - state + - unavailableReason + additionalProperties: false + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's temporary access configuration. + security: + - bearer: [] + summary: '[Beta] Get project''s temporary access configuration.' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - security + - control-plane + x-fga-permissions: + - - project_admin_read + x-oauth-scope: database:read + put: + operationId: v1-update-jit-access-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/JitAccessRequestRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + state: + type: string + enum: + - enabled + - disabled + appliedSuccessfully: + type: boolean + unavailableReason: + type: string + enum: + - postgres_upgrade_required + - ssl_enforcement_required + - temporarily_unavailable + required: + - state + - unavailableReason + additionalProperties: false + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project's temporary access configuration. + security: + - bearer: [] + summary: '[Beta] Update project''s temporary access configuration.' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - security + - control-plane + x-fga-permissions: + - - project_admin_write + x-oauth-scope: database:write + /types/typescript: + get: + description: Returns the TypeScript types of your schema for use with supabase-js. + operationId: v1-generate-typescript-types + parameters: + - name: included_schemas + required: false + in: query + schema: + default: public + example: public,auth + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/TypescriptResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to generate TypeScript types + security: + - bearer: [] + summary: Generate TypeScript types + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - database_read + x-oauth-scope: database:read + /readonly: + get: + operationId: v1-get-readonly-mode-status + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ReadOnlyStatusResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project readonly mode status + security: + - bearer: [] + summary: Returns project's readonly mode status + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + - infra + - support-tooling + x-fga-permissions: + - - database_readonly_config_read + x-oauth-scope: database:read + /readonly/temporary-disable: + post: + operationId: v1-disable-readonly-mode-temporarily + parameters: [] + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to disable project's readonly mode + security: + - bearer: [] + summary: Disables project's readonly mode for the next 15 minutes + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - control-plane + - infra + - support-tooling + x-fga-permissions: + - - database_readonly_config_write + x-oauth-scope: database:write + /cli/login-role: + post: + operationId: v1-create-login-role + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateRoleBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CreateRoleResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to create login role + security: + - bearer: [] + summary: '[Beta] Create a login role for CLI with temporary password' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - database_write + x-oauth-scope: database:write + delete: + operationId: v1-delete-login-roles + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteRolesResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to delete login roles + security: + - bearer: [] + summary: '[Beta] Delete existing login roles used by CLI' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - dev-workflows + x-fga-permissions: + - - database_write + x-oauth-scope: database:write + /database/migrations: + get: + operationId: v1-list-migration-history + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-migration-historyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list database migrations + security: + - bearer: [] + summary: List applied migration versions + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_read + x-oauth-scope: database:read + x-stackql-bare-array-wrap: + wrapperKey: v1_list_migration_history + wrapperName: V1-list-migration-historyResponse + mediaType: application/json + scalar: false + post: + operationId: v1-apply-a-migration + parameters: + - name: Idempotency-Key + required: false + in: header + description: A unique key to ensure the same migration is tracked only once. + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1CreateMigrationBody' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to apply database migration + security: + - bearer: [] + summary: Apply a database migration + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_write + x-oauth-scope: database:write + put: + operationId: v1-upsert-a-migration + parameters: + - name: Idempotency-Key + required: false + in: header + description: A unique key to ensure the same migration is tracked only once. + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpsertMigrationBody' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to upsert database migration + security: + - bearer: [] + summary: Upsert a database migration without applying + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_write + x-oauth-scope: database:write + delete: + operationId: v1-rollback-migrations + parameters: + - name: gte + required: true + in: query + description: Rollback migrations greater or equal to this version + schema: + pattern: ^\d+$ + example: '20250312000000' + type: string + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to rollback database migration + security: + - bearer: [] + summary: Rollback database migrations and remove them from history table + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_write + x-oauth-scope: database:write + /database/migrations/{version}: + get: + operationId: v1-get-a-migration + parameters: + - name: version + required: true + in: path + schema: + pattern: ^\d+$ + example: '20250312000000' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1GetMigrationResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get database migration + security: + - bearer: [] + summary: Fetch an existing entry from migration history + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_read + x-oauth-scope: database:read + patch: + operationId: v1-patch-a-migration + parameters: + - name: version + required: true + in: path + schema: + pattern: ^\d+$ + example: '20250312000000' + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1PatchMigrationBody' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to patch database migration + security: + - bearer: [] + summary: Patch an existing entry in migration history + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - database_migrations_write + x-oauth-scope: database:write + /database/query: + post: + operationId: v1-run-a-query + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1RunQueryBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1RunQueryResultRows' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to run sql query + security: + - bearer: [] + summary: '[Beta] Run sql query' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - database_read + - - database_write + x-oauth-scope: database:write + /database/query/read-only: + post: + description: All entity references must be schema qualified. + operationId: v1-read-only-query + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1ReadOnlyQueryBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1RunQueryResultRows' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to run read-only sql query + security: + - bearer: [] + summary: '[Beta] Run a sql query as supabase_read_only_user' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - database_read + x-oauth-scope: database:read + /database/webhooks/enable: + post: + operationId: v1-enable-database-webhook + parameters: [] + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to enable Database Webhooks on the project + security: + - bearer: [] + summary: '[Beta] Enables Database Webhooks on the project' + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - database_webhooks_config_write + x-oauth-scope: database:write + /database/context: + get: + deprecated: true + description: This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable. + operationId: v1-get-database-metadata + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GetProjectDbMetadataResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets database metadata for the given project. + tags: + - Database + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - database_read + x-oauth-scope: projects:read + /database/password: + patch: + operationId: v1-update-database-password + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdatePasswordBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdatePasswordResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update database password + security: + - bearer: [] + summary: Updates the database password + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - database_config_write + x-oauth-scope: database:write + /database/jit: + get: + description: Mappings of roles a user can assume in the project database + operationId: v1-get-jit-access + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/JitAccessResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list database jit access + security: + - bearer: [] + summary: Get user-id to role mappings for JIT access + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_read + x-oauth-scope: database:read + post: + description: Authorizes the request to assume a role in the project database + operationId: v1-authorize-jit-access + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AuthorizeJitAccessBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/JitAuthorizeAccessResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to authorize database jit access + security: + - bearer: [] + summary: Authorize user-id to role mappings for JIT access + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_read + x-oauth-scope: database:read + put: + description: Modifies the roles that can be assumed and for how long + operationId: v1-update-jit-access + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateJitAccessBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/JitAccessResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update JIT access + security: + - bearer: [] + summary: Updates a user mapping for JIT access + tags: + - Database + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_write + /database/jit/list: + get: + description: Mappings of roles a user can assume in the project database + operationId: v1-list-jit-access + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/JitListAccessResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to list database jit access + security: + - bearer: [] + summary: List all user-id to role mappings for JIT access + tags: + - Database + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_write + /database/jit/invite: + post: + description: Invites the external user and sets initial roles that can be assumed and for how long + operationId: v1-invite-external-jit-access + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/InviteExternalUserJitAccessBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/InviteExternalUserJitResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to invite external user + security: + - bearer: [] + summary: Invites an external user to a database for JIT access + tags: + - Database + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_write + /database/jit/invite/accept: + post: + description: Accepts the invitation to JIT database access + operationId: v1-accept-invite-external-jit-access + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AcceptInviteExternalUserJitAccessBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/JitAccessResponse' + '500': + description: Failed to accept invitation + security: + - bearer: [] + summary: Accepts invitation for JIT database access + tags: + - Database + x-endpoint-owners: + - security + /database/jit/invite/{invite_id}: + delete: + description: Revokes and deletes the invitation + operationId: v1-delete-invite-external-jit-access + parameters: + - name: invite_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 55555555-5555-4555-8555-555555555555 + type: string + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to revoke invite for external user + security: + - bearer: [] + summary: Deletes the invite for an external user to a database for JIT access + tags: + - Database + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_write + /database/jit/{user_id}: + delete: + description: Remove JIT mappings of a user, revoking all JIT database access + operationId: v1-delete-jit-access + parameters: + - name: user_id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 55555555-5555-4555-8555-555555555555 + type: string + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to remove JIT access + security: + - bearer: [] + summary: Delete JIT access by user-id + tags: + - Database + x-endpoint-owners: + - security + x-fga-permissions: + - - database_jit_write + /database/openapi: + get: + description: Returns the PostgREST OpenAPI specification for the project. This is the replacement for querying `/rest/v1/` directly with the anon key. + operationId: v1-get-database-openapi + parameters: + - name: schema + required: false + in: query + description: The database schema to generate the OpenAPI spec for + schema: + default: public + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + type: string + description: (opaque JSON object) + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to fetch PostgREST OpenAPI spec + security: + - bearer: [] + summary: Get PostgREST OpenAPI spec + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - database_read + x-oauth-scope: database:read + /database/backups: + get: + operationId: v1-list-all-backups + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1BackupsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get backups + security: + - bearer: [] + summary: Lists all backups + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_read + x-oauth-scope: database:read + /database/backups/restore-pitr: + post: + operationId: v1-restore-pitr-backup + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1RestorePitrBody' + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Restores a PITR backup for a database + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_write + x-oauth-scope: database:write + /database/backups/restore-point: + post: + operationId: v1-create-restore-point + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1RestorePointPostBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1RestorePointResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Initiates a creation of a restore point for a database + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_write + x-internal: true + x-oauth-scope: database:write + get: + operationId: v1-get-restore-point + parameters: + - name: name + required: false + in: query + schema: + maxLength: 20 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1RestorePointResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get requested restore points + security: + - bearer: [] + summary: Get restore points for project + tags: + - Database + x-badges: + - name: 'OAuth scope: database:read' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_read + x-internal: true + x-oauth-scope: database:read + /database/backups/restore: + post: + operationId: v1-restore-physical-backup + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1RestoreBackupBody' + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Restores a physical backup for a database + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_write + x-internal: true + x-oauth-scope: database:write + /database/backups/schedule: + get: + operationId: v1-get-backup-schedule + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1BackupScheduleResponse' + '401': + description: Unauthorized + '402': + description: This feature requires the Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '403': + description: Forbidden action + '404': + description: Project or backup schedule not found + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve backup schedule + security: + - bearer: [] + summary: Gets the backup schedule for a project + tags: + - Database + x-allowed-plans: + - Enterprise + x-badges: + - name: 'OAuth scope: database:read' + position: after + - name: Only available on Enterprise + position: before + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_read + x-oauth-scope: database:read + patch: + description: Sets the time at which the daily backup runs. The change takes effect on the next backup window that includes the new time. If the new time has already passed for today, the first backup at the new time will occur the following day. It can only be updated 3 times per 24 hours. + operationId: v1-update-backup-schedule + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdateBackupScheduleBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1BackupScheduleResponse' + '400': + description: Invalid schedule_for format + '401': + description: Unauthorized + '402': + description: This feature requires the Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '403': + description: Forbidden action + '404': + description: Project or backup schedule not found + '429': + description: Rate limit exceeded + '500': + description: Failed to update backup schedule + security: + - bearer: [] + summary: Updates the backup schedule time for a project + tags: + - Database + x-allowed-plans: + - Enterprise + x-badges: + - name: 'OAuth scope: database:write' + position: after + - name: Only available on Enterprise + position: before + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_write + x-oauth-scope: database:write + /database/backups/undo: + post: + operationId: v1-undo + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UndoBody' + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Initiates an undo to a given restore point + tags: + - Database + x-badges: + - name: 'OAuth scope: database:write' + position: after + x-endpoint-owners: + - infra + x-fga-permissions: + - - backups_write + x-internal: true + x-oauth-scope: database:write +components: + schemas: + SnippetList: + type: object + properties: + data: + type: array + items: + type: object + properties: + id: + type: string + inserted_at: + type: string + updated_at: + type: string + type: + type: string + enum: + - sql + visibility: + type: string + enum: + - user + - project + - org + - public + name: + type: string + description: + type: string + nullable: true + project: + type: object + properties: + id: + type: number + name: + type: string + required: + - id + - name + owner: + type: object + properties: + id: + type: number + username: + type: string + required: + - id + - username + updated_by: + type: object + properties: + id: + type: number + username: + type: string + required: + - id + - username + favorite: + type: boolean + required: + - id + - inserted_at + - updated_at + - type + - visibility + - name + - description + - project + - owner + - updated_by + - favorite + cursor: + type: string + required: + - data + SnippetResponse: + type: object + properties: + id: + type: string + inserted_at: + type: string + updated_at: + type: string + type: + type: string + enum: + - sql + visibility: + type: string + enum: + - user + - project + - org + - public + name: + type: string + description: + type: string + nullable: true + project: + type: object + properties: + id: + type: number + name: + type: string + required: + - id + - name + owner: + type: object + properties: + id: + type: number + username: + type: string + required: + - id + - username + updated_by: + type: object + properties: + id: + type: number + username: + type: string + required: + - id + - username + favorite: + type: boolean + content: + type: object + properties: + favorite: + deprecated: true + description: 'Deprecated: Rely on root-level favorite property instead.' + type: boolean + schema_version: + type: string + sql: + type: string + required: + - schema_version + - sql + required: + - id + - inserted_at + - updated_at + - type + - visibility + - name + - description + - project + - owner + - updated_by + - favorite + - content + JitAccessRequestRequest: + type: object + properties: + state: + type: string + enum: + - enabled + - disabled + required: + - state + example: + state: enabled + TypescriptResponse: + type: object + properties: + types: + type: string + required: + - types + ReadOnlyStatusResponse: + type: object + properties: + enabled: + type: boolean + override_enabled: + type: boolean + override_active_until: + type: string + required: + - enabled + - override_enabled + - override_active_until + CreateRoleBody: + type: object + properties: + read_only: + type: boolean + required: + - read_only + example: + read_only: true + CreateRoleResponse: + type: object + properties: + role: + type: string + minLength: 1 + password: + type: string + minLength: 1 + ttl_seconds: + type: integer + minimum: 1 + maximum: 9007199254740991 + format: int64 + required: + - role + - password + - ttl_seconds + DeleteRolesResponse: + type: object + properties: + message: + type: string + enum: + - ok + required: + - message + V1ListMigrationsResponse: + type: array + items: + type: object + properties: + version: + type: string + minLength: 1 + name: + type: string + required: + - version + V1CreateMigrationBody: + type: object + properties: + query: + type: string + minLength: 1 + name: + type: string + rollback: + type: string + required: + - query + example: + query: create table public.widgets(id bigint primary key); + name: create_widgets_table + rollback: drop table if exists public.widgets; + V1UpsertMigrationBody: + type: object + properties: + query: + type: string + minLength: 1 + name: + type: string + rollback: + type: string + required: + - query + example: + query: create table public.widgets(id bigint primary key); + name: create_widgets_table + rollback: drop table if exists public.widgets; + V1GetMigrationResponse: + type: object + properties: + version: + type: string + minLength: 1 + name: + type: string + statements: + type: array + items: + type: string + rollback: + type: array + items: + type: string + created_by: + type: string + idempotency_key: + type: string + required: + - version + V1PatchMigrationBody: + type: object + properties: + name: + type: string + rollback: + type: string + example: + name: create_widgets_table + rollback: drop table if exists public.widgets; + V1RunQueryBody: + type: object + properties: + query: + type: string + minLength: 1 + parameters: + type: array + items: {} + read_only: + type: boolean + required: + - query + example: + query: select * from pg_stat_activity limit 1; + read_only: true + V1ReadOnlyQueryBody: + type: object + properties: + query: + type: string + minLength: 1 + parameters: + type: array + items: {} + required: + - query + example: + query: select * from pg_stat_activity limit 1; + GetProjectDbMetadataResponse: + type: object + properties: + databases: + type: array + items: + type: object + properties: + name: + type: string + schemas: + type: array + items: + type: object + properties: + name: + type: string + required: + - name + additionalProperties: {} + required: + - name + - schemas + additionalProperties: {} + required: + - databases + V1UpdatePasswordBody: + type: object + properties: + password: + type: string + minLength: 4 + required: + - password + example: + password: correct-horse-battery-staple + V1UpdatePasswordResponse: + type: object + properties: + message: + type: string + required: + - message + JitAccessResponse: + type: object + properties: + user_id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + user_roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - user_roles + AuthorizeJitAccessBody: + type: object + properties: + role: + type: string + minLength: 1 + rhost: + type: string + format: ipv4 + pattern: ^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$ + required: + - role + - rhost + example: + role: postgres + rhost: 203.0.113.10 + JitAuthorizeAccessResponse: + type: object + properties: + user_id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + user_role: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - user_id + - user_role + UpdateJitAccessBody: + type: object + properties: + user_id: + type: string + minLength: 1 + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - user_id + - roles + example: + user_id: 55555555-5555-4555-8555-555555555555 + roles: + - role: postgres + expires_at: 1740787200 + allowed_networks: + allowed_cidrs: + - cidr: 203.0.113.0/24 + branches_only: false + JitListAccessResponse: + type: object + properties: + items: + type: array + items: + anyOf: + - type: object + properties: + user_id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + primary_email: + type: string + nullable: true + invite_id: + nullable: true + expires_at: + nullable: true + user_roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - user_id + - primary_email + - invite_id + - expires_at + - user_roles + - type: object + properties: + user_id: + nullable: true + primary_email: + type: string + invite_id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + expires_at: + type: string + user_roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - user_id + - primary_email + - invite_id + - expires_at + - user_roles + required: + - items + InviteExternalUserJitAccessBody: + type: object + properties: + email: + type: string + minLength: 1 + format: email + pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ + roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - email + - roles + example: + email: external-user@somedomain.xyz + roles: + - role: postgres + expires_at: 1740787200 + allowed_networks: + allowed_cidrs: + - cidr: 203.0.113.0/24 + branches_only: false + InviteExternalUserJitResponse: + type: object + properties: + email: + type: string + format: email + pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ + invite_id: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + user_roles: + type: array + items: + type: object + properties: + role: + type: string + minLength: 1 + expires_at: + type: number + allowed_networks: + type: object + properties: + allowed_cidrs: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv4 + pattern: ^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$ + required: + - cidr + allowed_cidrs_v6: + type: array + items: + type: object + properties: + cidr: + type: string + format: cidrv6 + pattern: ^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$ + required: + - cidr + branches_only: + type: boolean + required: + - role + required: + - email + - invite_id + - user_roles + AcceptInviteExternalUserJitAccessBody: + type: object + properties: + email: + type: string + minLength: 1 + format: email + pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$ + token: + type: string + minLength: 1 + required: + - email + - token + example: + email: external-user@somedomain.xyz + token: '' + V1BackupsResponse: + type: object + properties: + region: + type: string + walg_enabled: + type: boolean + pitr_enabled: + type: boolean + backups: + type: array + items: + type: object + properties: + id: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + is_physical_backup: + type: boolean + status: + type: string + enum: + - COMPLETED + - FAILED + - PENDING + - REMOVED + - ARCHIVED + - CANCELLED + inserted_at: + type: string + required: + - id + - is_physical_backup + - status + - inserted_at + physical_backup_data: + type: object + properties: + earliest_physical_backup_date_unix: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + latest_physical_backup_date_unix: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + required: + - region + - walg_enabled + - pitr_enabled + - backups + - physical_backup_data + V1RestorePitrBody: + type: object + properties: + recovery_time_target_unix: + type: integer + minimum: 0 + maximum: 9007199254740991 + format: int64 + required: + - recovery_time_target_unix + example: + recovery_time_target_unix: 1740787200 + V1RestorePointPostBody: + type: object + properties: + name: + type: string + maxLength: 20 + required: + - name + example: + name: before-upgrade + V1RestorePointResponse: + type: object + properties: + name: + type: string + status: + type: string + enum: + - AVAILABLE + - PENDING + - REMOVED + - FAILED + completed_on: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + nullable: true + required: + - name + - status + - completed_on + V1RestoreBackupBody: + type: object + properties: + id: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + required: + - id + example: + id: 12345 + V1BackupScheduleResponse: + type: object + properties: + schedule_for: + type: string + pattern: ^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?$ + description: 'Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.' + example: '04:00:00' + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$ + description: Timestamp of when the backup schedule was last updated. + example: '2026-05-04T14:40:44+00:00' + required: + - schedule_for + - updated_at + PlanGateErrorBody: + type: object + properties: + message: + type: string + description: Human-readable explanation of the plan gate + error: + description: Present on entitlement denials. Other errors with this status code (validation, billing state) carry only message. + type: object + properties: + code: + type: string + description: Machine-readable marker for plan-gated denials + enum: + - entitlement_required + feature: + type: string + description: Entitlement feature key that failed the check + upgrade_url: + description: Billing page URL for the organization, present when the org is resolvable + type: string + required: + - code + - feature + required: + - message + V1UpdateBackupScheduleBody: + type: object + properties: + schedule_for: + type: string + pattern: ^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?$ + description: 'Time of day to schedule daily backups, in UTC. Format: HH:MM:SS.' + example: '04:00:00' + required: + - schedule_for + example: + schedule_for: '04:00:00' + V1UndoBody: + type: object + properties: + name: + type: string + maxLength: 20 + required: + - name + example: + name: before-upgrade + V1RunQueryResultRows: + type: object + description: Result of a SQL statement run against the project database. The API returns a bare JSON array of row objects whose keys depend on the statement; the provider presents it as one row whose rows column carries the array (address values with json_extract). + properties: + rows: + type: array + description: The result rows as returned by Postgres, one object per row, keyed by column name. + items: + type: object + additionalProperties: true + V1-list-migration-historyResponse: + type: object + properties: + v1_list_migration_history: + type: array + items: + type: object + properties: + version: + type: string + minLength: 1 + name: + type: string + required: + - version +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/domains.yaml b/provider-dev/source/domains.yaml new file mode 100644 index 0000000..b43559b --- /dev/null +++ b/provider-dev/source/domains.yaml @@ -0,0 +1,547 @@ +openapi: 3.0.0 +info: + title: domains API + description: Domains related endpoints + version: 1.0.0 +paths: + /custom-hostname: + get: + operationId: v1-get-hostname-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCustomHostnameResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's custom hostname config + security: + - bearer: [] + summary: '[Beta] Gets project''s custom hostname config' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:read' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - custom_domain_read + x-oauth-scope: domains:read + delete: + operationId: v1-Delete hostname config + parameters: + - name: remove_addon + required: false + in: query + description: If true, also removes the custom domain add-on from the project subscription. + schema: + type: string + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to delete project custom hostname configuration + security: + - bearer: [] + summary: '[Beta] Deletes a project''s custom hostname configuration' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - custom_domain_write + x-oauth-scope: domains:write + /custom-hostname/initialize: + post: + operationId: v1-update-hostname-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCustomHostnameBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCustomHostnameResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project custom hostname configuration + security: + - bearer: [] + summary: '[Beta] Updates project''s custom hostname configuration' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - custom_domain_write + x-oauth-scope: domains:write + /custom-hostname/reverify: + post: + operationId: v1-verify-dns-config + parameters: [] + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCustomHostnameResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to verify project custom hostname configuration + security: + - bearer: [] + summary: '[Beta] Attempts to verify the DNS configuration for project''s custom hostname configuration' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - custom_domain_write + x-oauth-scope: domains:write + /custom-hostname/activate: + post: + operationId: v1-activate-custom-hostname + parameters: [] + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCustomHostnameResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to activate project custom hostname configuration + security: + - bearer: [] + summary: '[Beta] Activates a custom hostname for a project.' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - custom_domain_write + x-oauth-scope: domains:write + /vanity-subdomain: + get: + operationId: v1-get-vanity-subdomain-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/VanitySubdomainConfigResponse' + '400': + description: This feature requires the Pro, Team, or Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project vanity subdomain configuration + security: + - bearer: [] + summary: '[Beta] Gets current vanity subdomain config' + tags: + - Domains + x-allowed-plans: + - Pro + - Team + - Enterprise + x-badges: + - name: 'OAuth scope: domains:read' + position: after + - name: Only available on Pro, Team, Enterprise + position: before + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - vanity_subdomain_read + x-oauth-scope: domains:read + delete: + operationId: v1-deactivate-vanity-subdomain-config + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to delete project vanity subdomain configuration + security: + - bearer: [] + summary: '[Beta] Deletes a project''s vanity subdomain configuration' + tags: + - Domains + x-badges: + - name: 'OAuth scope: domains:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - vanity_subdomain_write + x-oauth-scope: domains:write + /vanity-subdomain/check-availability: + post: + operationId: v1-check-vanity-subdomain-availability + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/VanitySubdomainBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SubdomainAvailabilityResponse' + '400': + description: This feature requires the Pro, Team, or Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to check project vanity subdomain configuration + security: + - bearer: [] + summary: '[Beta] Checks vanity subdomain availability' + tags: + - Domains + x-allowed-plans: + - Pro + - Team + - Enterprise + x-badges: + - name: 'OAuth scope: domains:write' + position: after + - name: Only available on Pro, Team, Enterprise + position: before + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - vanity_subdomain_write + x-oauth-scope: domains:write + /vanity-subdomain/activate: + post: + operationId: v1-activate-vanity-subdomain-config + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/VanitySubdomainBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ActivateVanitySubdomainResponse' + '400': + description: This feature requires the Pro, Team, or Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to activate project vanity subdomain configuration + security: + - bearer: [] + summary: '[Beta] Activates a vanity subdomain for a project.' + tags: + - Domains + x-allowed-plans: + - Pro + - Team + - Enterprise + x-badges: + - name: 'OAuth scope: domains:write' + position: after + - name: Only available on Pro, Team, Enterprise + position: before + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - vanity_subdomain_write + x-oauth-scope: domains:write +components: + schemas: + UpdateCustomHostnameResponse: + type: object + properties: + status: + type: string + enum: + - 1_not_started + - 2_initiated + - 3_challenge_verified + - 4_origin_setup_completed + - 5_services_reconfigured + custom_hostname: + type: string + data: + type: object + properties: + success: + type: boolean + errors: + type: array + items: + $ref: '#/components/schemas/UpdateCustomHostnameResponseJsonValue' + messages: + type: array + items: + $ref: '#/components/schemas/UpdateCustomHostnameResponseJsonValue' + result: + type: object + properties: + id: + type: string + hostname: + type: string + ssl: + type: object + properties: + status: + type: string + validation_records: + type: array + items: + type: object + properties: + txt_name: + type: string + txt_value: + type: string + required: + - txt_name + - txt_value + validation_errors: + type: array + items: + type: object + properties: + message: + type: string + required: + - message + required: + - status + - validation_records + ownership_verification: + type: object + properties: + type: + type: string + name: + type: string + value: + type: string + required: + - type + - name + - value + custom_origin_server: + type: string + verification_errors: + type: array + items: + type: string + status: + type: string + required: + - id + - hostname + - ssl + - ownership_verification + - custom_origin_server + - status + required: + - success + - errors + - messages + - result + required: + - status + - custom_hostname + - data + UpdateCustomHostnameBody: + type: object + properties: + custom_hostname: + type: string + minLength: 1 + maxLength: 253 + required: + - custom_hostname + example: + custom_hostname: docs.example.com + VanitySubdomainConfigResponse: + type: object + properties: + status: + type: string + enum: + - not-used + - custom-domain-used + - active + custom_domain: + type: string + minLength: 1 + required: + - status + PlanGateErrorBody: + type: object + properties: + message: + type: string + description: Human-readable explanation of the plan gate + error: + description: Present on entitlement denials. Other errors with this status code (validation, billing state) carry only message. + type: object + properties: + code: + type: string + description: Machine-readable marker for plan-gated denials + enum: + - entitlement_required + feature: + type: string + description: Entitlement feature key that failed the check + upgrade_url: + description: Billing page URL for the organization, present when the org is resolvable + type: string + required: + - code + - feature + required: + - message + VanitySubdomainBody: + type: object + properties: + vanity_subdomain: + type: string + maxLength: 63 + required: + - vanity_subdomain + example: + vanity_subdomain: acme-prod + SubdomainAvailabilityResponse: + type: object + properties: + available: + type: boolean + required: + - available + ActivateVanitySubdomainResponse: + type: object + properties: + custom_domain: + type: string + required: + - custom_domain + UpdateCustomHostnameResponseJsonValue: + description: Any JSON-serializable value + anyOf: + - type: string + - type: number + - type: boolean + nullable: true + type: array + items: + $ref: '#/components/schemas/UpdateCustomHostnameResponseJsonValue' + additionalProperties: + $ref: '#/components/schemas/UpdateCustomHostnameResponseJsonValue' +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/functions.yaml b/provider-dev/source/functions.yaml new file mode 100644 index 0000000..1dc9a2a --- /dev/null +++ b/provider-dev/source/functions.yaml @@ -0,0 +1,674 @@ +openapi: 3.0.0 +info: + title: functions API + description: supabase functions API + version: 1.0.0 +paths: + /functions: + get: + description: Returns all functions you've previously added to the specified project. + operationId: v1-list-all-functions + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-functionsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's functions + security: + - bearer: [] + summary: List all functions + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:read' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_read + x-oauth-scope: edge_functions:read + x-stackql-bare-array-wrap: + wrapperKey: v1_list_all_functions + wrapperName: V1-list-all-functionsResponse + mediaType: application/json + scalar: false + post: + deprecated: true + description: This endpoint is deprecated - use the deploy endpoint. Creates a function and adds it to the specified project. + operationId: v1-create-a-function + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1CreateFunctionBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/FunctionResponse' + '401': + description: Unauthorized + '402': + description: Maximum number of functions reached for Plan + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to create project's function + security: + - bearer: [] + summary: Create a function + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_write + x-oauth-scope: edge_functions:write + put: + description: 'Bulk update functions. It will create a new function or replace existing. The operation is idempotent. NOTE: You will need to manually bump the version.' + operationId: v1-bulk-update-functions + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BulkUpdateFunctionBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/BulkUpdateFunctionResponse' + '401': + description: Unauthorized + '402': + description: Maximum number of functions reached for Plan + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update functions + security: + - bearer: [] + summary: Bulk update functions + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_write + x-oauth-scope: edge_functions:write + /functions/deploy: + post: + description: A new endpoint to deploy functions. It will create if function does not exist. + operationId: v1-deploy-a-function + parameters: + - name: slug + required: false + in: query + schema: + pattern: ^[A-Za-z][A-Za-z0-9_-]*$ + example: hello-world + type: string + - name: bundleOnly + required: false + in: query + schema: + example: false + type: string + requestBody: + required: true + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/FunctionDeployBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DeployFunctionResponse' + '401': + description: Unauthorized + '402': + description: Maximum number of functions reached for Plan + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to deploy function + security: + - bearer: [] + summary: Deploy a function + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_write + x-oauth-scope: edge_functions:write + /functions/{function_slug}: + get: + description: Retrieves a function with the specified slug and project. + operationId: v1-get-a-function + parameters: + - name: function_slug + required: true + in: path + description: Function slug + schema: + pattern: ^[A-Za-z0-9_-]+$ + example: hello-world + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/FunctionSlugResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve function with given slug + security: + - bearer: [] + summary: Retrieve a function + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:read' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_read + x-oauth-scope: edge_functions:read + patch: + description: Updates a function with the specified slug and project. + operationId: v1-update-a-function + parameters: + - name: function_slug + required: true + in: path + description: Function slug + schema: + pattern: ^[A-Za-z0-9_-]+$ + example: hello-world + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdateFunctionBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/FunctionResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update function with given slug + security: + - bearer: [] + summary: Update a function + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_write + x-oauth-scope: edge_functions:write + delete: + description: Deletes a function with the specified slug from the specified project. + operationId: v1-delete-a-function + parameters: + - name: function_slug + required: true + in: path + description: Function slug + schema: + pattern: ^[A-Za-z0-9_-]+$ + example: hello-world + type: string + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to delete function with given slug + security: + - bearer: [] + summary: Delete a function + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_write + x-oauth-scope: edge_functions:write + /functions/{function_slug}/body: + get: + description: Retrieves a function body for the specified slug and project. + operationId: v1-get-a-function-body + parameters: + - name: function_slug + required: true + in: path + description: Function slug + schema: + pattern: ^[A-Za-z0-9_-]+$ + example: hello-world + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/StreamableFile' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve function body with given slug + security: + - bearer: [] + summary: Retrieve a function body + tags: + - Edge Functions + x-badges: + - name: 'OAuth scope: edge_functions:read' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_read + x-oauth-scope: edge_functions:read +components: + schemas: + FunctionResponse: + type: object + properties: + id: + type: string + slug: + type: string + name: + type: string + status: + type: string + enum: + - ACTIVE + - REMOVED + - THROTTLED + version: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + created_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + updated_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + verify_jwt: + type: boolean + import_map: + type: boolean + entrypoint_path: + type: string + import_map_path: + type: string + ezbr_sha256: + type: string + required: + - id + - slug + - name + - status + - version + - created_at + - updated_at + V1CreateFunctionBody: + type: object + properties: + slug: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_-]*$ + name: + type: string + body: + type: string + verify_jwt: + type: boolean + required: + - slug + - name + - body + example: + slug: hello-world + name: Hello World + body: Deno.serve(() => new Response('Hello, world!')) + verify_jwt: true + BulkUpdateFunctionBody: + type: array + items: + type: object + properties: + id: + type: string + slug: + type: string + pattern: ^[A-Za-z][A-Za-z0-9_-]*$ + name: + type: string + status: + type: string + enum: + - ACTIVE + - REMOVED + - THROTTLED + version: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + created_at: + type: integer + format: int64 + minimum: -9007199254740991 + maximum: 9007199254740991 + verify_jwt: + type: boolean + import_map: + type: boolean + entrypoint_path: + type: string + import_map_path: + type: string + ezbr_sha256: + type: string + required: + - id + - slug + - name + - status + - version + example: + - id: 3c078cce-ad70-4148-9f37-4da362789053 + slug: hello-world + name: Hello World + status: ACTIVE + version: 2 + verify_jwt: true + entrypoint_path: index.ts + BulkUpdateFunctionResponse: + type: object + properties: + functions: + type: array + items: + type: object + properties: + id: + type: string + slug: + type: string + name: + type: string + status: + type: string + enum: + - ACTIVE + - REMOVED + - THROTTLED + version: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + created_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + updated_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + verify_jwt: + type: boolean + import_map: + type: boolean + entrypoint_path: + type: string + import_map_path: + type: string + ezbr_sha256: + type: string + required: + - id + - slug + - name + - status + - version + - created_at + - updated_at + required: + - functions + FunctionDeployBody: + type: object + properties: + file: + type: array + items: + type: string + format: binary + metadata: + type: object + properties: + entrypoint_path: + type: string + import_map_path: + type: string + static_patterns: + type: array + items: + type: string + verify_jwt: + type: boolean + name: + type: string + required: + - entrypoint_path + required: + - file + - metadata + example: + file: + - ./supabase/functions/hello-world/index.ts + metadata: + entrypoint_path: index.ts + verify_jwt: true + name: Hello World + DeployFunctionResponse: + type: object + properties: + id: + type: string + slug: + type: string + name: + type: string + status: + type: string + enum: + - ACTIVE + - REMOVED + - THROTTLED + version: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + created_at: + type: integer + format: int64 + minimum: -9007199254740991 + maximum: 9007199254740991 + updated_at: + type: integer + format: int64 + minimum: -9007199254740991 + maximum: 9007199254740991 + verify_jwt: + type: boolean + import_map: + type: boolean + entrypoint_path: + type: string + import_map_path: + type: string + ezbr_sha256: + type: string + required: + - id + - slug + - name + - status + - version + FunctionSlugResponse: + type: object + properties: + id: + type: string + slug: + type: string + name: + type: string + status: + type: string + enum: + - ACTIVE + - REMOVED + - THROTTLED + version: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + created_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + updated_at: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + format: int64 + verify_jwt: + type: boolean + import_map: + type: boolean + entrypoint_path: + type: string + import_map_path: + type: string + ezbr_sha256: + type: string + required: + - id + - slug + - name + - status + - version + - created_at + - updated_at + V1UpdateFunctionBody: + type: object + properties: + name: + type: string + body: + type: string + verify_jwt: + type: boolean + example: + name: Hello World + body: Deno.serve(() => new Response('Hello again!')) + verify_jwt: true + StreamableFile: + type: object + properties: {} + V1-list-all-functionsResponse: + type: object + properties: + v1_list_all_functions: + type: array + items: + $ref: '#/components/schemas/FunctionResponse' +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/network.yaml b/provider-dev/source/network.yaml new file mode 100644 index 0000000..9dd7748 --- /dev/null +++ b/provider-dev/source/network.yaml @@ -0,0 +1,444 @@ +openapi: 3.0.0 +info: + title: network API + description: supabase network API + version: 1.0.0 +paths: + /network-bans/retrieve: + post: + operationId: v1-list-all-network-bans + parameters: [] + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkBanResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's network bans + security: + - bearer: [] + summary: '[Beta] Gets project''s network bans' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - database_network_bans_read + x-oauth-scope: projects:read + /network-bans/retrieve/enriched: + post: + operationId: v1-list-all-network-bans-enriched + parameters: [] + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkBanResponseEnriched' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's enriched network bans + security: + - bearer: [] + summary: '[Beta] Gets project''s network bans with additional information about which databases they affect' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - database_network_bans_read + x-oauth-scope: projects:read + /network-bans: + delete: + operationId: v1-delete-network-bans + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RemoveNetworkBanRequest' + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to remove network bans. + security: + - bearer: [] + summary: '[Beta] Remove network bans.' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - database_network_bans_write + x-oauth-scope: projects:write + /network-restrictions: + get: + operationId: v1-get-network-restrictions + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkRestrictionsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's network restrictions + security: + - bearer: [] + summary: '[Beta] Gets project''s network restrictions' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_network_restrictions_read + x-oauth-scope: projects:read + patch: + operationId: v1-patch-network-restrictions + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkRestrictionsPatchRequest' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkRestrictionsV2Response' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project network restrictions + security: + - bearer: [] + summary: '[Alpha] Updates project''s network restrictions by adding or removing CIDRs' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_network_restrictions_write + x-oauth-scope: projects:write + /network-restrictions/apply: + post: + operationId: v1-update-network-restrictions + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkRestrictionsRequest' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/NetworkRestrictionsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project network restrictions + security: + - bearer: [] + summary: '[Beta] Updates project''s network restrictions' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - database_network_restrictions_write + x-oauth-scope: projects:write +components: + schemas: + NetworkBanResponse: + type: object + properties: + banned_ipv4_addresses: + type: array + items: + type: string + required: + - banned_ipv4_addresses + NetworkBanResponseEnriched: + type: object + properties: + banned_ipv4_addresses: + type: array + items: + type: object + properties: + banned_address: + type: string + identifier: + type: string + type: + type: string + required: + - banned_address + - identifier + - type + required: + - banned_ipv4_addresses + RemoveNetworkBanRequest: + type: object + properties: + ipv4_addresses: + type: array + items: + type: string + description: List of IP addresses to unban. + requester_ip: + default: false + description: Include requester's public IP in the list of addresses to unban. + type: boolean + identifier: + type: string + required: + - ipv4_addresses + example: + ipv4_addresses: + - 203.0.113.10 + requester_ip: false + NetworkRestrictionsResponse: + type: object + properties: + entitlement: + type: string + enum: + - disallowed + - allowed + config: + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: string + dbAllowedCidrsV6: + type: array + items: + type: string + example: + dbAllowedCidrs: + - 203.0.113.0/24 + dbAllowedCidrsV6: + - 2001:db8::/32 + description: At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`. + old_config: + description: Populated when a new config has been received, but not registered as successfully applied to a project. + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: string + dbAllowedCidrsV6: + type: array + items: + type: string + example: + dbAllowedCidrs: + - 203.0.113.0/24 + dbAllowedCidrsV6: + - 2001:db8::/32 + status: + type: string + enum: + - stored + - applied + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + applied_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + required: + - entitlement + - config + - status + NetworkRestrictionsPatchRequest: + type: object + properties: + add: + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: string + dbAllowedCidrsV6: + type: array + items: + type: string + remove: + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: string + dbAllowedCidrsV6: + type: array + items: + type: string + example: + add: + dbAllowedCidrs: + - 203.0.113.0/24 + remove: + dbAllowedCidrs: + - 198.51.100.0/24 + NetworkRestrictionsV2Response: + type: object + properties: + entitlement: + type: string + enum: + - disallowed + - allowed + config: + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: object + properties: + address: + type: string + type: + type: string + enum: + - v4 + - v6 + required: + - address + - type + description: At any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`. + old_config: + description: Populated when a new config has been received, but not registered as successfully applied to a project. + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: object + properties: + address: + type: string + type: + type: string + enum: + - v4 + - v6 + required: + - address + - type + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + applied_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + status: + type: string + enum: + - stored + - applied + required: + - entitlement + - config + - status + NetworkRestrictionsRequest: + type: object + properties: + dbAllowedCidrs: + type: array + items: + type: string + dbAllowedCidrsV6: + type: array + items: + type: string + example: + dbAllowedCidrs: + - 203.0.113.0/24 + dbAllowedCidrsV6: + - 2001:db8::/32 +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/organizations.yaml b/provider-dev/source/organizations.yaml new file mode 100644 index 0000000..5e829dc --- /dev/null +++ b/provider-dev/source/organizations.yaml @@ -0,0 +1,622 @@ +openapi: 3.0.0 +info: + title: organizations API + description: Organizations related endpoints + version: 1.0.0 +paths: + /v1/organizations: + get: + description: Returns a list of organizations that you currently belong to. + operationId: v1-list-all-organizations + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-organizationsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Unexpected error listing organizations + security: + - bearer: [] + summary: List all organizations + tags: + - Organizations + x-badges: + - name: 'OAuth scope: organizations:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organizations_read + x-oauth-scope: organizations:read + x-stackql-bare-array-wrap: + wrapperKey: v1_list_all_organizations + wrapperName: V1-list-all-organizationsResponse + mediaType: application/json + scalar: false + post: + operationId: v1-create-an-organization + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateOrganizationV1' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponseV1' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Unexpected error creating an organization + security: + - bearer: [] + summary: Create an organization + tags: + - Organizations + x-endpoint-owners: + - control-plane + - billing + x-fga-permissions: + - - organizations_create + /v1/organizations/{slug}/entitlements: + get: + description: Returns the entitlements available to the organization based on their plan and any overrides. + operationId: v1-get-organization-entitlements + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ListEntitlementsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get entitlements for an organization + tags: + - Organizations + x-badges: + - name: 'OAuth scope: organizations:read' + position: after + x-endpoint-owners: + - billing + x-fga-permissions: + - - organization_admin_read + x-oauth-scope: organizations:read + /v1/organizations/{slug}/members: + get: + operationId: v1-list-organization-members + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-organization-membersResponse' + security: + - bearer: [] + summary: List members of an organization + tags: + - Organizations + x-badges: + - name: 'OAuth scope: organizations:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - members_read + x-oauth-scope: organizations:read + x-stackql-bare-array-wrap: + wrapperKey: v1_list_organization_members + wrapperName: V1-list-organization-membersResponse + mediaType: application/json + scalar: false + /v1/organizations/{slug}: + get: + operationId: v1-get-an-organization + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1OrganizationSlugResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets information about the organization + tags: + - Organizations + x-badges: + - name: 'OAuth scope: organizations:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_admin_read + x-oauth-scope: organizations:read + /v1/organizations/{slug}/project-claim/{token}: + get: + operationId: v1-get-organization-project-claim + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + - name: token + required: true + in: path + schema: + example: 0123456789abcdef0123456789abcdef01234567 + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationProjectClaimResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets project details for the specified organization and claim token + tags: + - Organizations + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_admin_write + x-internal: true + post: + operationId: v1-claim-project-for-organization + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + - name: token + required: true + in: path + schema: + example: 0123456789abcdef0123456789abcdef01234567 + type: string + responses: + '204': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Claims project for the specified organization + tags: + - Organizations + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_admin_write + x-internal: true +components: + schemas: + OrganizationResponseV1: + type: object + properties: + id: + type: string + description: 'Deprecated: Use `slug` instead.' + deprecated: true + slug: + type: string + pattern: ^[\w-]+$ + description: Organization slug + example: tsrqponmlkjihgfedcba + name: + type: string + required: + - id + - slug + - name + CreateOrganizationV1: + type: object + properties: + name: + type: string + maxLength: 256 + required: + - name + example: + name: Acme + additionalProperties: false + V1ListEntitlementsResponse: + type: object + properties: + entitlements: + type: array + items: + type: object + properties: + feature: + type: object + properties: + key: + type: string + enum: + - instances.compute_update_available_sizes + - instances.read_replicas + - instances.disk_modifications + - instances.high_availability + - instances.orioledb + - replication.etl + - storage.max_file_size + - storage.max_file_size.configurable + - storage.image_transformations + - storage.vector_buckets + - storage.iceberg_catalog + - storage.purge_cache + - security.audit_logs_days + - security.questionnaire + - security.soc2_report + - security.iso27001_certificate + - security.private_link + - security.enforce_mfa + - log.retention_days + - custom_domain + - vanity_subdomain + - ipv4 + - pitr.available_variants + - log_drains + - audit_log_drains + - branching_limit + - branching_persistent + - auth.mfa_phone + - auth.mfa_web_authn + - auth.mfa_enhanced_security + - auth.hooks + - auth.platform.sso + - auth.custom_jwt_template + - auth.saml_2 + - auth.user_sessions + - auth.leaked_password_protection + - auth.advanced_auth_settings + - auth.performance_settings + - auth.password_hibp + - auth.custom_oauth.max_providers + - backup.retention_days + - backup.restore_to_new_project + - backup.schedule + - function.max_count + - function.size_limit_mb + - realtime.max_concurrent_users + - realtime.max_events_per_second + - realtime.max_joins_per_second + - realtime.max_channels_per_client + - realtime.max_bytes_per_second + - realtime.max_presence_events_per_second + - realtime.max_payload_size_in_kb + - project_scoped_roles + - security.member_roles + - project_pausing + - project_cloning + - project_restore_after_expiry + - assistant.advance_model + - integrations.github_connections + - integrations.github_push_webhooks_limit + - dedicated_pooler + - observability.dashboard_advanced_metrics + - api.members.invitations + - api.members.roles + type: + type: string + enum: + - boolean + - numeric + - set + required: + - key + - type + hasAccess: + type: boolean + type: + type: string + enum: + - boolean + - numeric + - set + config: + anyOf: + - type: object + properties: + enabled: + type: boolean + required: + - enabled + - type: object + properties: + enabled: + type: boolean + value: + type: number + unlimited: + type: boolean + unit: + type: string + required: + - enabled + - value + - unlimited + - unit + - type: object + properties: + enabled: + type: boolean + set: + type: array + items: + type: string + required: + - enabled + - set + required: + - feature + - hasAccess + - type + - config + required: + - entitlements + V1OrganizationMemberResponse: + type: object + properties: + user_id: + type: string + user_name: + type: string + email: + type: string + role_name: + type: string + mfa_enabled: + type: boolean + avatar_url: + type: string + nullable: true + required: + - user_id + - user_name + - role_name + - mfa_enabled + - avatar_url + V1OrganizationSlugResponse: + type: object + properties: + id: + type: string + name: + type: string + plan: + type: string + enum: + - free + - pro + - team + - enterprise + - platform + opt_in_tags: + type: array + items: + enum: + - AI_SQL_GENERATOR_OPT_IN + - AI_DATA_GENERATOR_OPT_IN + - AI_LOG_GENERATOR_OPT_IN + allowed_release_channels: + type: array + items: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + required: + - id + - name + - opt_in_tags + - allowed_release_channels + OrganizationProjectClaimResponse: + type: object + properties: + project: + type: object + properties: + ref: + type: string + name: + type: string + required: + - ref + - name + preview: + type: object + properties: + valid: + type: boolean + warnings: + type: array + items: + type: object + properties: + key: + type: string + message: + type: string + required: + - key + - message + errors: + type: array + items: + type: object + properties: + key: + type: string + message: + type: string + required: + - key + - message + info: + type: array + items: + type: object + properties: + key: + type: string + message: + type: string + required: + - key + - message + members_exceeding_free_project_limit: + type: array + items: + type: object + properties: + name: + type: string + limit: + type: number + required: + - name + - limit + source_subscription_plan: + type: string + enum: + - free + - pro + - team + - enterprise + - platform + target_subscription_plan: + type: string + enum: + - free + - pro + - team + - enterprise + - platform + - null + nullable: true + required: + - valid + - warnings + - errors + - info + - members_exceeding_free_project_limit + - source_subscription_plan + - target_subscription_plan + expires_at: + type: string + created_at: + type: string + created_by: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + required: + - project + - preview + - expires_at + - created_at + - created_by + V1-list-all-organizationsResponse: + type: object + properties: + v1_list_all_organizations: + type: array + items: + $ref: '#/components/schemas/OrganizationResponseV1' + V1-list-organization-membersResponse: + type: object + properties: + v1_list_organization_members: + type: array + items: + $ref: '#/components/schemas/V1OrganizationMemberResponse' +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/profile.yaml b/provider-dev/source/profile.yaml new file mode 100644 index 0000000..ade5b33 --- /dev/null +++ b/provider-dev/source/profile.yaml @@ -0,0 +1,45 @@ +openapi: 3.0.0 +info: + title: profile API + description: supabase profile API + version: 1.0.0 +paths: + /v1/profile: + get: + operationId: v1-get-profile + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProfileResponse' + security: + - bearer: [] + summary: Gets the user's profile + tags: + - Profile + x-endpoint-owners: + - control-plane +components: + schemas: + V1ProfileResponse: + type: object + properties: + gotrue_id: + type: string + primary_email: + type: string + username: + type: string + required: + - gotrue_id + - primary_email + - username +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/projects.yaml b/provider-dev/source/projects.yaml new file mode 100644 index 0000000..82e3cf4 --- /dev/null +++ b/provider-dev/source/projects.yaml @@ -0,0 +1,2236 @@ +openapi: 3.0.0 +info: + title: projects API + description: Projects related endpoints + version: 1.0.0 +paths: + /v1/projects: + get: + description: Returns a list of all projects you've previously created. + operationId: v1-list-all-projects + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-projectsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: List all projects + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - projects_read + x-oauth-scope: projects:read + x-stackql-bare-array-wrap: + wrapperKey: v1_list_all_projects + wrapperName: V1-list-all-projectsResponse + mediaType: application/json + scalar: false + post: + operationId: v1-create-a-project + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1CreateProjectBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Create a project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - organization_projects_create + x-oauth-scope: projects:write + /v1/projects/available-regions: + get: + operationId: v1-get-available-regions + parameters: + - name: organization_slug + required: true + in: query + description: Slug of your organization + schema: + example: tsrqponmlkjihgfedcba + type: string + - name: continent + required: false + in: query + description: 'Continent code to determine regional recommendations: NA (North America), SA (South America), EU (Europe), AF (Africa), AS (Asia), OC (Oceania), AN (Antarctica)' + schema: + example: NA + type: string + enum: + - NA + - SA + - EU + - AF + - AS + - OC + - AN + - name: desired_instance_size + required: false + in: query + description: Desired instance size. Omit this field to always default to the smallest possible size. + schema: + type: string + enum: + - nano + - micro + - small + - medium + - large + - xlarge + - 2xlarge + - 4xlarge + - 8xlarge + - 12xlarge + - 16xlarge + - 24xlarge + - 24xlarge_optimized_memory + - 24xlarge_optimized_cpu + - 24xlarge_high_memory + - 48xlarge + - 48xlarge_optimized_memory + - 48xlarge_optimized_cpu + - 48xlarge_high_memory + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/RegionsInfo' + security: + - bearer: [] + summary: '[Beta] Gets the list of available regions that can be used for a new project' + tags: + - Projects + x-badges: + - name: 'OAuth scope: organizations:read' + position: after + x-endpoint-owners: + - infra + x-oauth-scope: organizations:read + /v1/projects/{ref}: + get: + operationId: v1-get-project + parameters: + - name: ref + required: true + in: path + description: Project ref + schema: + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + example: abcdefghijklmnopqrst + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectWithDatabaseResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project + security: + - bearer: [] + summary: Gets a specific project that belongs to the authenticated user + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - project_admin_read + x-oauth-scope: projects:read + delete: + operationId: v1-delete-a-project + parameters: + - name: ref + required: true + in: path + description: Project ref + schema: + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + example: abcdefghijklmnopqrst + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectRefResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Deletes the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + - dev-workflows + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + patch: + operationId: v1-update-a-project + parameters: + - name: ref + required: true + in: path + description: Project ref + schema: + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + example: abcdefghijklmnopqrst + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/V1UpdateProjectBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1ProjectRefResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to update project + security: + - bearer: [] + summary: Updates the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + /upgrade: + post: + operationId: v1-upgrade-postgres-version + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpgradeDatabaseBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectUpgradeInitiateResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to initiate project upgrade + security: + - bearer: [] + summary: '[Beta] Upgrades the project''s Postgres version' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_write + - database_write + x-oauth-scope: projects:write + /upgrade/eligibility: + get: + operationId: v1-get-postgres-upgrade-eligibility + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectUpgradeEligibilityResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to determine project upgrade eligibility + security: + - bearer: [] + summary: '[Beta] Returns the project''s eligibility for upgrades' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_read + - database_read + x-oauth-scope: projects:read + /upgrade/status: + get: + operationId: v1-get-postgres-upgrade-status + parameters: + - name: tracking_id + required: false + in: query + schema: + example: 9f4d3a20-6b2e-4a7e-8c91-1d5f3e7a2b4c + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseUpgradeStatusResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project upgrade status + security: + - bearer: [] + summary: '[Beta] Gets the latest status of the project''s upgrade' + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_read + - database_read + x-oauth-scope: projects:read + /read-replicas/setup: + post: + operationId: v1-setup-a-read-replica + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SetUpReadReplicaBody' + responses: + '204': + description: '' + '401': + description: Unauthorized + '402': + description: This feature requires the Pro, Team, or Enterprise organization plan. + content: + application/json: + schema: + $ref: '#/components/schemas/PlanGateErrorBody' + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to set up read replica + security: + - bearer: [] + summary: '[Beta] Set up a read replica' + tags: + - Database + x-allowed-plans: + - Pro + - Team + - Enterprise + x-badges: + - name: Only available on Pro, Team, Enterprise + position: before + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_read_replicas_write + /read-replicas/remove: + post: + operationId: v1-remove-a-read-replica + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RemoveReadReplicaBody' + responses: + '204': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to remove read replica + security: + - bearer: [] + summary: '[Beta] Remove a read replica' + tags: + - Database + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_read_replicas_write + /health: + get: + operationId: v1-get-services-health + parameters: + - name: services + required: true + in: query + description: Comma-separated list of enums or array of enums. + schema: + example: + - auth,db + - auth + anyOf: + - type: string + description: |- + Comma-separated list of enums: + + - `auth` + - `db` + - `db_postgres_user` + - `pooler` + - `realtime` + - `rest` + - `storage` + - `pg_bouncer` + example: + - auth,db + - auth + - type: array + items: + type: string + enum: + - auth + - db + - db_postgres_user + - pooler + - realtime + - rest + - storage + - pg_bouncer + description: Array of enums. + example: + - '{field}=auth&{field}=db' + - '{field}=auth' + - name: timeout_ms + required: false + in: query + schema: + minimum: 0 + maximum: 10000 + example: 2000 + type: integer + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-get-services-healthResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's service health status + security: + - bearer: [] + summary: Gets project's service health status + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_read + x-oauth-scope: projects:read + x-stackql-bare-array-wrap: + wrapperKey: v1_get_services_health + wrapperName: V1-get-services-healthResponse + mediaType: application/json + scalar: false + /pause: + post: + operationId: v1-pause-a-project + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Pauses the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + /restart: + post: + operationId: v1-restart-a-project + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Restarts the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - infra + - control-plane + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + /restore: + get: + operationId: v1-list-available-restore-versions + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GetProjectAvailableRestoreVersionsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Lists available restore versions for the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_read + x-oauth-scope: projects:read + post: + operationId: v1-restore-a-project + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Restores the given project + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + /restore/cancel: + post: + operationId: v1-cancel-a-project-restoration + parameters: [] + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Cancels the given project restoration + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:write' + position: after + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - project_admin_write + x-oauth-scope: projects:write + /claim-token: + get: + operationId: v1-get-project-claim-token + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectClaimTokenResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Gets project claim token + tags: + - Projects + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - project_admin_read + x-internal: true + post: + operationId: v1-create-project-claim-token + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CreateProjectClaimTokenResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Creates project claim token + tags: + - Projects + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_admin_write + - project_admin_write + x-internal: true + delete: + operationId: v1-delete-project-claim-token + parameters: [] + responses: + '204': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Revokes project claim token + tags: + - Projects + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_admin_write + - project_admin_write + x-internal: true + /config/disk: + get: + operationId: v1-get-database-disk + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DiskResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get database disk attributes + security: + - bearer: [] + summary: Get database disk attributes + tags: + - Projects + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_disk_config_read + post: + operationId: v1-modify-database-disk + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/DiskRequestBody' + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to modify database disk + security: + - bearer: [] + summary: Modify database disk + tags: + - Projects + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_disk_config_write + /config/disk/util: + get: + operationId: v1-get-disk-utilization + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DiskUtilMetricsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get disk utilization + security: + - bearer: [] + summary: Get disk utilization + tags: + - Projects + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_disk_config_read + /config/disk/autoscale: + get: + operationId: v1-get-project-disk-autoscale-config + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/DiskAutoscaleConfig' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get project disk autoscale config + security: + - bearer: [] + summary: Gets project disk autoscale config + tags: + - Projects + x-endpoint-owners: + - control-plane + - infra + x-fga-permissions: + - - infra_disk_config_read + /v1/organizations/{slug}/projects: + get: + description: |- + Returns a paginated list of projects for the specified organization. + + This endpoint uses offset-based pagination. Use the `offset` parameter to skip a number of projects and the `limit` parameter to control the number of projects returned per page. + operationId: v1-get-all-projects-for-organization + parameters: + - name: slug + required: true + in: path + description: Organization slug + schema: + pattern: ^[\w-]+$ + example: tsrqponmlkjihgfedcba + type: string + - name: offset + required: false + in: query + description: Number of projects to skip + schema: + minimum: 0 + maximum: 9007199254740991 + default: 0 + example: 0 + type: integer + - name: limit + required: false + in: query + description: Number of projects to return per page + schema: + minimum: 1 + maximum: 100 + default: 100 + example: 20 + type: integer + - name: search + required: false + in: query + description: Search projects by name + schema: + example: acme + type: string + - name: sort + required: false + in: query + description: Sort order for projects + schema: + default: name_asc + example: created_desc + type: string + enum: + - name_asc + - name_desc + - created_asc + - created_desc + - name: statuses + required: false + in: query + description: |- + A comma-separated list of project statuses to filter by. + + The following values are supported: `ACTIVE_HEALTHY`, `INACTIVE`. + schema: + example: ACTIVE_HEALTHY,INACTIVE + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationProjectsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve projects + security: + - bearer: [] + summary: Gets all projects for the given organization + tags: + - Projects + x-badges: + - name: 'OAuth scope: projects:read' + position: after + x-endpoint-owners: + - control-plane + x-fga-permissions: + - - organization_projects_read + x-oauth-scope: projects:read +components: + schemas: + V1ProjectWithDatabaseResponse: + type: object + properties: + id: + type: string + deprecated: true + description: 'Deprecated: Use `ref` instead.' + ref: + type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + organization_id: + type: string + description: 'Deprecated: Use `organization_slug` instead.' + deprecated: true + organization_slug: + type: string + pattern: ^[\w-]+$ + description: Organization slug + example: tsrqponmlkjihgfedcba + name: + type: string + description: Name of your project + region: + type: string + description: Region of your project + created_at: + type: string + description: Creation timestamp + status: + type: string + enum: + - INACTIVE + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - UNKNOWN + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UPGRADING + - PAUSING + - RESTORE_FAILED + - RESTARTING + - PAUSE_FAILED + - RESIZING + database: + type: object + properties: + host: + type: string + description: Database host + version: + type: string + description: Database version + postgres_engine: + type: string + description: Database engine + release_channel: + type: string + description: Release channel + required: + - host + - version + - postgres_engine + - release_channel + required: + - id + - ref + - organization_id + - organization_slug + - name + - region + - created_at + - status + - database + V1CreateProjectBody: + type: object + properties: + db_pass: + type: string + description: Database password + name: + type: string + maxLength: 256 + description: Name of your project + organization_id: + deprecated: true + description: 'Deprecated: Use `organization_slug` instead.' + type: string + organization_slug: + type: string + pattern: ^[\w-]+$ + description: Organization slug + example: tsrqponmlkjihgfedcba + plan: + deprecated: true + description: Subscription Plan is now set on organization level and is ignored in this request + type: string + enum: + - free + - pro + region: + description: Region you want your server to reside in. Use region_selection instead. + deprecated: true + enum: + - us-east-1 + - us-east-2 + - us-west-1 + - us-west-2 + - ap-east-1 + - ap-southeast-1 + - ap-northeast-1 + - ap-northeast-2 + - ap-southeast-2 + - eu-west-1 + - eu-west-2 + - eu-west-3 + - eu-north-1 + - eu-central-1 + - eu-central-2 + - ca-central-1 + - ap-south-1 + - sa-east-1 + type: string + region_selection: + description: Region selection. Only one of region or region_selection can be specified. + type: object + properties: + type: + type: string + enum: + - specific + code: + type: string + description: Specific region code. The codes supported are not a stable API, and should be retrieved from the /available-regions endpoint. + enum: + - us-east-1 + - us-east-2 + - us-west-1 + - us-west-2 + - ap-east-1 + - ap-southeast-1 + - ap-northeast-1 + - ap-northeast-2 + - ap-southeast-2 + - eu-west-1 + - eu-west-2 + - eu-west-3 + - eu-north-1 + - eu-central-1 + - eu-central-2 + - ca-central-1 + - ap-south-1 + - sa-east-1 + required: + - type + - code + kps_enabled: + deprecated: true + description: This field is deprecated and is ignored in this request + type: boolean + desired_instance_size: + description: Desired instance size. Omit this field to always default to the smallest possible size. + type: string + enum: + - nano + - micro + - small + - medium + - large + - xlarge + - 2xlarge + - 4xlarge + - 8xlarge + - 12xlarge + - 16xlarge + - 24xlarge + - 24xlarge_optimized_memory + - 24xlarge_optimized_cpu + - 24xlarge_high_memory + - 48xlarge + - 48xlarge_optimized_memory + - 48xlarge_optimized_cpu + - 48xlarge_high_memory + template_url: + description: Template URL used to create the project from the CLI. + type: string + format: uri + release_channel: + deprecated: true + nullable: true + postgres_engine: + deprecated: true + nullable: true + high_availability: + description: '[Experimental] Whether to enable high availability for the project.' + type: boolean + required: + - db_pass + - name + - organization_slug + example: + db_pass: correct-horse-battery-staple + name: acme-prod + organization_slug: tsrqponmlkjihgfedcba + region: us-east-1 + additionalProperties: false + V1ProjectResponse: + type: object + properties: + id: + type: string + deprecated: true + description: 'Deprecated: Use `ref` instead.' + ref: + type: string + minLength: 20 + maxLength: 20 + pattern: ^[a-z]+$ + description: Project ref + example: abcdefghijklmnopqrst + organization_id: + type: string + description: 'Deprecated: Use `organization_slug` instead.' + deprecated: true + organization_slug: + type: string + pattern: ^[\w-]+$ + description: Organization slug + example: tsrqponmlkjihgfedcba + name: + type: string + description: Name of your project + region: + type: string + description: Region of your project + created_at: + type: string + description: Creation timestamp + status: + type: string + enum: + - INACTIVE + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - UNKNOWN + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UPGRADING + - PAUSING + - RESTORE_FAILED + - RESTARTING + - PAUSE_FAILED + - RESIZING + required: + - id + - ref + - organization_id + - organization_slug + - name + - region + - created_at + - status + RegionsInfo: + type: object + properties: + recommendations: + type: object + properties: + smartGroup: + type: object + properties: + name: + type: string + code: + type: string + enum: + - americas + - emea + - apac + type: + type: string + enum: + - smartGroup + required: + - name + - code + - type + specific: + type: array + items: + type: object + properties: + name: + type: string + code: + type: string + enum: + - us-east-1 + - us-east-2 + - us-west-1 + - us-west-2 + - ap-southeast-1 + - ap-northeast-1 + - ap-northeast-2 + - ap-east-1 + - ap-southeast-2 + - eu-west-1 + - eu-west-2 + - eu-west-3 + - eu-north-1 + - eu-central-1 + - eu-central-2 + - ca-central-1 + - ap-south-1 + - sa-east-1 + type: + type: string + enum: + - specific + provider: + type: string + enum: + - AWS + - AWS_K8S + - AWS_NIMBUS + status: + type: string + enum: + - capacity + - other + required: + - name + - code + - type + - provider + required: + - smartGroup + - specific + all: + type: object + properties: + smartGroup: + type: array + items: + type: object + properties: + name: + type: string + code: + type: string + enum: + - americas + - emea + - apac + type: + type: string + enum: + - smartGroup + required: + - name + - code + - type + specific: + type: array + items: + type: object + properties: + name: + type: string + code: + type: string + enum: + - us-east-1 + - us-east-2 + - us-west-1 + - us-west-2 + - ap-southeast-1 + - ap-northeast-1 + - ap-northeast-2 + - ap-east-1 + - ap-southeast-2 + - eu-west-1 + - eu-west-2 + - eu-west-3 + - eu-north-1 + - eu-central-1 + - eu-central-2 + - ca-central-1 + - ap-south-1 + - sa-east-1 + type: + type: string + enum: + - specific + provider: + type: string + enum: + - AWS + - AWS_K8S + - AWS_NIMBUS + status: + type: string + enum: + - capacity + - other + required: + - name + - code + - type + - provider + required: + - smartGroup + - specific + required: + - recommendations + - all + V1ProjectRefResponse: + type: object + properties: + id: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + ref: + type: string + name: + type: string + required: + - id + - ref + - name + V1UpdateProjectBody: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 256 + required: + - name + example: + name: Acme Platform + UpgradeDatabaseBody: + type: object + properties: + target_version: + type: string + release_channel: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + required: + - target_version + example: + target_version: '17' + release_channel: ga + ProjectUpgradeInitiateResponse: + type: object + properties: + tracking_id: + type: string + required: + - tracking_id + ProjectUpgradeEligibilityResponse: + type: object + properties: + eligible: + type: boolean + current_app_version: + type: string + current_app_version_release_channel: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + latest_app_version: + type: string + target_upgrade_versions: + type: array + items: + type: object + properties: + postgres_version: + type: string + enum: + - '13' + - '14' + - '15' + - '17' + - 17-oriole + release_channel: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + app_version: + type: string + required: + - postgres_version + - release_channel + - app_version + duration_estimate_hours: + type: number + legacy_auth_custom_roles: + type: array + items: + type: string + objects_to_be_dropped: + type: array + items: + type: string + deprecated: true + description: Use validation_errors instead. + unsupported_extensions: + type: array + items: + type: string + deprecated: true + description: Use validation_errors instead. + user_defined_objects_in_internal_schemas: + type: array + items: + type: string + deprecated: true + description: Use validation_errors instead. + validation_errors: + type: array + items: + anyOf: + - type: object + properties: + type: + type: string + enum: + - objects_depending_on_pg_cron + dependents: + type: array + items: + type: string + required: + - type + - dependents + - type: object + properties: + type: + type: string + enum: + - indexes_referencing_ll_to_earth + schema_name: + type: string + table_name: + type: string + index_name: + type: string + required: + - type + - schema_name + - table_name + - index_name + - type: object + properties: + type: + type: string + enum: + - function_using_obsolete_lang + schema_name: + type: string + function_name: + type: string + lang_name: + type: string + required: + - type + - schema_name + - function_name + - lang_name + - type: object + properties: + type: + type: string + enum: + - unsupported_extension + extension_name: + type: string + required: + - type + - extension_name + - type: object + properties: + type: + type: string + enum: + - unsupported_fdw_handler + fdw_name: + type: string + fdw_handler_name: + type: string + required: + - type + - fdw_name + - fdw_handler_name + - type: object + properties: + type: + type: string + enum: + - unlogged_table_with_persistent_sequence + schema_name: + type: string + table_name: + type: string + sequence_name: + type: string + required: + - type + - schema_name + - table_name + - sequence_name + - type: object + properties: + type: + type: string + enum: + - user_defined_objects_in_internal_schemas + obj_type: + anyOf: + - type: string + enum: + - table + - type: string + enum: + - function + schema_name: + type: string + obj_name: + type: string + required: + - type + - obj_type + - schema_name + - obj_name + - type: object + properties: + type: + type: string + enum: + - active_replication_slot + slot_name: + type: string + required: + - type + - slot_name + - type: object + properties: + type: + type: string + enum: + - x86_architecture + required: + - type + - type: object + properties: + type: + type: string + enum: + - project_hibernating + required: + - type + warnings: + type: array + items: + oneOf: + - type: object + properties: + type: + type: string + enum: + - pg_graphql_introspection_change + required: + - type + - type: object + properties: + type: + type: string + enum: + - ltree_reindex_required + required: + - type + - type: object + properties: + type: + type: string + enum: + - operator_estimator_gate + required: + - type + required: + - eligible + - current_app_version + - current_app_version_release_channel + - latest_app_version + - target_upgrade_versions + - duration_estimate_hours + - legacy_auth_custom_roles + - objects_to_be_dropped + - unsupported_extensions + - user_defined_objects_in_internal_schemas + - validation_errors + - warnings + DatabaseUpgradeStatusResponse: + type: object + properties: + databaseUpgradeStatus: + type: object + properties: + initiated_at: + type: string + latest_status_at: + type: string + target_version: + type: number + error: + type: string + enum: + - 1_upgraded_instance_launch_failed + - 2_volume_detachchment_from_upgraded_instance_failed + - 3_volume_attachment_to_original_instance_failed + - 4_data_upgrade_initiation_failed + - 5_data_upgrade_completion_failed + - 6_volume_detachchment_from_original_instance_failed + - 7_volume_attachment_to_upgraded_instance_failed + - 8_upgrade_completion_failed + - 9_post_physical_backup_failed + progress: + type: string + enum: + - 0_requested + - 1_started + - 2_launched_upgraded_instance + - 3_detached_volume_from_upgraded_instance + - 4_attached_volume_to_original_instance + - 5_initiated_data_upgrade + - 6_completed_data_upgrade + - 7_detached_volume_from_original_instance + - 8_attached_volume_to_upgraded_instance + - 9_completed_upgrade + - 10_completed_post_physical_backup + status: + type: number + required: + - initiated_at + - latest_status_at + - target_version + - status + nullable: true + required: + - databaseUpgradeStatus + SetUpReadReplicaBody: + type: object + properties: + read_replica_region: + type: string + enum: + - us-east-1 + - us-east-2 + - us-west-1 + - us-west-2 + - ap-east-1 + - ap-southeast-1 + - ap-northeast-1 + - ap-northeast-2 + - ap-southeast-2 + - eu-west-1 + - eu-west-2 + - eu-west-3 + - eu-north-1 + - eu-central-1 + - eu-central-2 + - ca-central-1 + - ap-south-1 + - sa-east-1 + description: Region you want your read replica to reside in + required: + - read_replica_region + example: + read_replica_region: us-west-1 + PlanGateErrorBody: + type: object + properties: + message: + type: string + description: Human-readable explanation of the plan gate + error: + description: Present on entitlement denials. Other errors with this status code (validation, billing state) carry only message. + type: object + properties: + code: + type: string + description: Machine-readable marker for plan-gated denials + enum: + - entitlement_required + feature: + type: string + description: Entitlement feature key that failed the check + upgrade_url: + description: Billing page URL for the organization, present when the org is resolvable + type: string + required: + - code + - feature + required: + - message + RemoveReadReplicaBody: + type: object + properties: + database_identifier: + type: string + required: + - database_identifier + example: + database_identifier: abcdefghijklmnopqrst-rr-us-west-1-abcde + V1ServiceHealthResponse: + type: object + properties: + name: + type: string + enum: + - auth + - db + - db_postgres_user + - pooler + - realtime + - rest + - storage + - pg_bouncer + healthy: + type: boolean + deprecated: true + description: Deprecated. Use `status` instead. + status: + type: string + enum: + - COMING_UP + - ACTIVE_HEALTHY + - UNHEALTHY + info: + type: object + properties: + name: + type: string + enum: + - GoTrue + version: + type: string + description: + type: string + healthy: + type: boolean + deprecated: true + description: Deprecated. Use `status` instead. + db_connected: + type: boolean + replication_connected: + type: boolean + connected_cluster: + type: integer + minimum: -9007199254740991 + maximum: 9007199254740991 + db_schema: + type: string + required: + - name + - version + - description + - healthy + - db_connected + - replication_connected + - connected_cluster + - db_schema + error: + type: string + required: + - name + - healthy + - status + GetProjectAvailableRestoreVersionsResponse: + type: object + properties: + available_versions: + type: array + items: + type: object + properties: + version: + type: string + release_channel: + type: string + enum: + - internal + - alpha + - beta + - ga + - withdrawn + - preview + postgres_engine: + type: string + enum: + - '13' + - '14' + - '15' + - '17' + - 17-oriole + required: + - version + - release_channel + - postgres_engine + required: + - available_versions + ProjectClaimTokenResponse: + type: object + properties: + token_alias: + type: string + expires_at: + type: string + created_at: + type: string + created_by: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + required: + - token_alias + - expires_at + - created_at + - created_by + CreateProjectClaimTokenResponse: + type: object + properties: + token: + type: string + token_alias: + type: string + expires_at: + type: string + created_at: + type: string + created_by: + type: string + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + required: + - token + - token_alias + - expires_at + - created_at + - created_by + DiskResponse: + type: object + properties: + attributes: + type: object + properties: + iops: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + size_gb: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + throughput_mibps: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + type: + type: string + enum: + - gp3 + required: + - iops + - size_gb + - type + last_modified_at: + type: string + required: + - attributes + DiskRequestBody: + type: object + properties: + attributes: + type: object + properties: + iops: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + size_gb: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + throughput_mibps: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + minimum: 0 + type: + type: string + enum: + - gp3 + required: + - iops + - size_gb + - type + required: + - attributes + example: + attributes: + type: gp3 + size_gb: 100 + iops: 3000 + throughput_mibps: 125 + DiskUtilMetricsResponse: + type: object + properties: + timestamp: + type: string + metrics: + type: object + properties: + fs_size_bytes: + type: number + fs_avail_bytes: + type: number + fs_used_bytes: + type: number + required: + - fs_size_bytes + - fs_avail_bytes + - fs_used_bytes + required: + - timestamp + - metrics + DiskAutoscaleConfig: + type: object + properties: + growth_percent: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + description: Growth percentage for disk autoscaling + nullable: true + minimum: 0 + min_increment_gb: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + description: Minimum increment size for disk autoscaling in GB + nullable: true + minimum: 0 + max_size_gb: + type: integer + exclusiveMinimum: true + maximum: 9007199254740991 + description: Maximum limit the disk size will grow to in GB + nullable: true + minimum: 0 + required: + - growth_percent + - min_increment_gb + - max_size_gb + OrganizationProjectsResponse: + type: object + properties: + projects: + type: array + items: + type: object + properties: + ref: + type: string + name: + type: string + cloud_provider: + type: string + region: + type: string + is_branch: + type: boolean + status: + type: string + enum: + - INACTIVE + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - UNKNOWN + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UPGRADING + - PAUSING + - RESTORE_FAILED + - RESTARTING + - PAUSE_FAILED + - RESIZING + inserted_at: + type: string + databases: + type: array + items: + type: object + properties: + infra_compute_size: + type: string + enum: + - pico + - nano + - micro + - small + - medium + - large + - xlarge + - 2xlarge + - 4xlarge + - 8xlarge + - 12xlarge + - 16xlarge + - 24xlarge + - 24xlarge_optimized_memory + - 24xlarge_optimized_cpu + - 24xlarge_high_memory + - 48xlarge + - 48xlarge_optimized_memory + - 48xlarge_optimized_cpu + - 48xlarge_high_memory + region: + type: string + status: + type: string + enum: + - ACTIVE_HEALTHY + - ACTIVE_UNHEALTHY + - COMING_UP + - GOING_DOWN + - INIT_FAILED + - REMOVED + - RESTORING + - UNKNOWN + - INIT_READ_REPLICA + - INIT_READ_REPLICA_FAILED + - RESTARTING + - RESIZING + cloud_provider: + type: string + identifier: + type: string + type: + type: string + enum: + - PRIMARY + - READ_REPLICA + disk_volume_size_gb: + type: number + disk_type: + type: string + enum: + - gp3 + - io2 + disk_throughput_mbps: + type: number + disk_last_modified_at: + type: string + required: + - region + - status + - cloud_provider + - identifier + - type + required: + - ref + - name + - cloud_provider + - region + - is_branch + - status + - inserted_at + - databases + pagination: + type: object + properties: + count: + type: number + description: Total number of projects. Use this to calculate the total number of pages. + limit: + type: number + description: Maximum number of projects per page + offset: + type: number + description: Number of projects skipped in this response + required: + - count + - limit + - offset + required: + - projects + - pagination + V1-list-all-projectsResponse: + type: object + properties: + v1_list_all_projects: + type: array + items: + $ref: '#/components/schemas/V1ProjectWithDatabaseResponse' + V1-get-services-healthResponse: + type: object + properties: + v1_get_services_health: + type: array + items: + $ref: '#/components/schemas/V1ServiceHealthResponse' +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/secrets.yaml b/provider-dev/source/secrets.yaml new file mode 100644 index 0000000..c739afe --- /dev/null +++ b/provider-dev/source/secrets.yaml @@ -0,0 +1,624 @@ +openapi: 3.0.0 +info: + title: secrets API + description: Secrets related endpoints + version: 1.0.0 +paths: + /api-keys: + get: + operationId: v1-get-project-api-keys + parameters: + - name: reveal + required: false + in: query + description: |- + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-get-project-api-keysResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get project api keys + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_read + x-oauth-scope: secrets:read + x-stackql-bare-array-wrap: + wrapperKey: v1_get_project_api_keys + wrapperName: V1-get-project-api-keysResponse + mediaType: application/json + scalar: false + post: + operationId: v1-create-project-api-key + parameters: + - name: reveal + required: false + in: query + description: |- + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateApiKeyBody' + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ApiKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Creates a new API key for the project + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_write + x-oauth-scope: secrets:write + /api-keys/legacy: + get: + operationId: v1-get-project-legacy-api-keys + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/LegacyApiKeysResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Check whether JWT based legacy (anon, service_role) API keys are enabled. This API endpoint will be removed in the future, check for HTTP 404 Not Found. + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_read + x-oauth-scope: secrets:read + put: + operationId: v1-update-project-legacy-api-keys + parameters: + - name: enabled + required: true + in: query + description: |- + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/LegacyApiKeysResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Disable or re-enable JWT based legacy (anon, service_role) API keys. This API endpoint will be removed in the future, check for HTTP 404 Not Found. + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_write + x-oauth-scope: secrets:write + /api-keys/{id}: + patch: + operationId: v1-update-project-api-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 22222222-2222-4222-8222-222222222222 + type: string + - name: reveal + required: false + in: query + description: |- + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateApiKeyBody' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ApiKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Updates an API key for the project + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_write + x-oauth-scope: secrets:write + get: + operationId: v1-get-project-api-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 22222222-2222-4222-8222-222222222222 + type: string + - name: reveal + required: false + in: query + description: |- + Boolean string. + + Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` + + Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled` + schema: + example: 'true' + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ApiKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Get API key + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_read + x-oauth-scope: secrets:read + delete: + operationId: v1-delete-project-api-key + parameters: + - name: id + required: true + in: path + schema: + format: uuid + pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ + example: 22222222-2222-4222-8222-222222222222 + type: string + - name: reveal + required: false + in: query + description: Boolean string, true or false + schema: + example: true + type: string + - name: was_compromised + required: false + in: query + description: Boolean string, true or false + schema: + example: false + type: string + - name: reason + required: false + in: query + schema: + example: rotating_key + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ApiKeyResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + security: + - bearer: [] + summary: Deletes an API key for the project + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - auth + - control-plane + x-fga-permissions: + - - api_gateway_keys_write + x-oauth-scope: secrets:write + /secrets: + get: + description: Returns all secrets you've previously added to the specified project. + operationId: v1-list-all-secrets + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-secretsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to retrieve project's secrets + security: + - bearer: [] + summary: List all secrets + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:read' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_secrets_read + x-oauth-scope: secrets:read + x-stackql-bare-array-wrap: + wrapperKey: v1_list_all_secrets + wrapperName: V1-list-all-secretsResponse + mediaType: application/json + scalar: false + post: + description: Creates multiple secrets and adds them to the specified project. + operationId: v1-bulk-create-secrets + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + name: + type: string + maxLength: 256 + pattern: ^(?!SUPABASE_).* + description: Secret name must not start with the SUPABASE_ prefix. + value: + type: string + maxLength: 24576 + required: + - name + - value + description: One secret. The wire body is an array; the provider wraps this object into it (one secret per INSERT). + responses: + '201': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to create project's secrets + security: + - bearer: [] + summary: Bulk create secrets + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_secrets_write + x-oauth-scope: secrets:write + delete: + description: Deletes all secrets with the given names from the specified project + operationId: v1-bulk-delete-secrets + parameters: [] + requestBody: + required: true + content: + application/json: + schema: + type: object + description: The secret to delete. The wire body is an array of names; the provider wraps this object into it (one secret per DELETE). + properties: + name: + type: string + description: Secret name + required: + - name + responses: + '200': + description: '' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to delete secrets with given names + security: + - bearer: [] + summary: Bulk delete secrets + tags: + - Secrets + x-badges: + - name: 'OAuth scope: secrets:write' + position: after + x-endpoint-owners: + - functions + x-fga-permissions: + - - edge_functions_secrets_write + x-oauth-scope: secrets:write +components: + schemas: + ApiKeyResponse: + type: object + properties: + api_key: + type: string + nullable: true + id: + type: string + nullable: true + type: + type: string + enum: + - legacy + - publishable + - secret + - null + nullable: true + prefix: + type: string + nullable: true + name: + type: string + description: + type: string + nullable: true + hash: + type: string + nullable: true + secret_jwt_template: + type: object + additionalProperties: {} + nullable: true + inserted_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + nullable: true + updated_at: + type: string + format: date-time + pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ + nullable: true + required: + - name + CreateApiKeyBody: + type: object + properties: + type: + type: string + enum: + - publishable + - secret + name: + type: string + minLength: 4 + maxLength: 64 + pattern: ^[a-z_][a-z0-9_]+$ + description: + type: string + nullable: true + secret_jwt_template: + type: object + additionalProperties: {} + nullable: true + required: + - type + - name + example: + type: secret + name: ci_secret_key + description: CI deploy key + LegacyApiKeysResponse: + type: object + properties: + enabled: + type: boolean + required: + - enabled + UpdateApiKeyBody: + type: object + properties: + name: + type: string + minLength: 4 + maxLength: 64 + pattern: ^[a-z_][a-z0-9_]+$ + description: + type: string + nullable: true + secret_jwt_template: + type: object + additionalProperties: {} + nullable: true + example: + name: ci_secret_key_rotated + description: Rotated after March release + SecretResponse: + type: object + properties: + name: + type: string + value: + type: string + updated_at: + type: string + required: + - name + - value + CreateSecretBody: + maxItems: 100 + type: array + items: + type: object + properties: + name: + type: string + maxLength: 256 + pattern: ^(?!SUPABASE_).* + description: Secret name must not start with the SUPABASE_ prefix. + value: + type: string + maxLength: 24576 + required: + - name + - value + example: + - name: OPENAI_API_KEY + value: sk-example-secret + - name: STRIPE_WEBHOOK_SECRET + value: whsec_example + DeleteSecretsBody: + type: array + items: + type: string + example: + - OPENAI_API_KEY + V1-get-project-api-keysResponse: + type: object + properties: + v1_get_project_api_keys: + type: array + items: + $ref: '#/components/schemas/ApiKeyResponse' + V1-list-all-secretsResponse: + type: object + properties: + v1_list_all_secrets: + type: array + items: + $ref: '#/components/schemas/SecretResponse' +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/provider-dev/source/storage.yaml b/provider-dev/source/storage.yaml new file mode 100644 index 0000000..5267f30 --- /dev/null +++ b/provider-dev/source/storage.yaml @@ -0,0 +1,80 @@ +openapi: 3.0.0 +info: + title: storage API + description: Visit [https://supabase.github.io/storage/](https://supabase.github.io/storage/) for complete documentation. + version: 1.0.0 +paths: + /storage/buckets: + get: + operationId: v1-list-all-buckets + parameters: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/V1-list-all-bucketsResponse' + '401': + description: Unauthorized + '403': + description: Forbidden action + '429': + description: Rate limit exceeded + '500': + description: Failed to get list of buckets + security: + - bearer: [] + summary: Lists all buckets + tags: + - Storage + x-badges: + - name: 'OAuth scope: storage:read' + position: after + x-endpoint-owners: + - storage + x-fga-permissions: + - - storage_read + x-oauth-scope: storage:read + x-stackql-bare-array-wrap: + wrapperKey: v1_list_all_buckets + wrapperName: V1-list-all-bucketsResponse + mediaType: application/json + scalar: false +components: + schemas: + V1StorageBucketResponse: + type: object + properties: + id: + type: string + name: + type: string + owner: + type: string + created_at: + type: string + updated_at: + type: string + public: + type: boolean + required: + - id + - name + - owner + - created_at + - updated_at + - public + V1-list-all-bucketsResponse: + type: object + properties: + v1_list_all_buckets: + type: array + items: + $ref: '#/components/schemas/V1StorageBucketResponse' +servers: + - url: https://api.supabase.com/v1/projects/{ref} + variables: + ref: + description: Supabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = ''. A WHERE value always takes precedence over the environment. + x-stackQL-envVar: SUPABASE_PROJECT_ID diff --git a/tests/fixtures/.gitkeep b/tests/fixtures/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/.gitkeep b/tests/integration/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/mock_supabase_server.mjs b/tests/integration/mock_supabase_server.mjs new file mode 100644 index 0000000..9f8feaa --- /dev/null +++ b/tests/integration/mock_supabase_server.mjs @@ -0,0 +1,391 @@ +#!/usr/bin/env node + +// Mock Supabase Management API for integration-testing the generated +// supabase provider without an account. Serves canned JSON in the wire +// shapes the real API declares in its OpenAPI document (snake_case +// throughout, a handful of camelCase properties on the storage config, SSL +// enforcement and network-restrictions surfaces): bare JSON arrays for the +// collection reads, typed objects for single reads and config singletons, +// {data, cursor} for the snippets page, {lints} / {backups} / +// {selected_addons} / {banned_ipv4_addresses} envelopes, an empty 201/200 +// for the write-only endpoints, and a bare array of row objects for the +// database query endpoint. Errors are the NestJS {message, statusCode} +// shape. Mutable in-memory stores make the secrets, edge function, API key +// and auth-config lifecycles round-trip realistically. +// +// Every request must carry `Authorization: Bearer ` or it is +// rejected 401 - this proves the provider's bearer wiring +// (SUPABASE_ACCESS_TOKEN). +// +// Two projects are served: REF_A (the one SUPABASE_PROJECT_ID resolves to in +// the tests) and REF_B (used to prove a WHERE ref value beats the +// environment). Any other ref is 404. +// +// The documented rate-limit headers are echoed so tests can see the +// contract shape (X-RateLimit-Limit / Remaining / Reset). +// +// Exports startMockServer() for the test runner; also runnable standalone: +// node tests/integration/mock_supabase_server.mjs [port] + +import http from 'http'; +import { URL } from 'url'; + +export const EXPECTED_TOKEN = 'sbp_mock0123456789abcdef0123456789abcdef01234567'; +export const ORG_SLUG = 'mock-org-slug'; +export const ORG_ID = 'e0f1a2b3-c4d5-4e6f-8a7b-8c9d0e1f2a3b'; +export const REF_A = 'abcdefghijklmnopqrst'; +export const REF_B = 'tsrqponmlkjihgfedcba'; +export const BRANCH_ID = '5f6e7d8c-9b0a-4f1e-8d2c-3b4a5c6d7e8f'; +export const FUNCTION_SLUG = 'hello-world'; +export const API_KEY_ID = 'a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d'; + +const RATE_HEADERS = { 'X-RateLimit-Limit': '120', 'X-RateLimit-Remaining': '119', 'X-RateLimit-Reset': '60' }; + +let idCounter = 0; +function newId(prefix) { + idCounter++; + return `${prefix}${String(idCounter).padStart(4, '0')}-0000-4000-8000-000000000000`.slice(0, 36); +} + +// --------------------------------------------------------------------------- +// Fixtures (shapes per the pinned OpenAPI document) +// --------------------------------------------------------------------------- + +function projectObj(ref, name, status, region = 'ap-southeast-2') { + return { + id: ref, ref, organization_id: ORG_ID, organization_slug: ORG_SLUG, name, region, + created_at: '2026-08-01T02:03:04.000Z', status, + database: { host: `db.${ref}.supabase.co`, version: '17.4.1.054', postgres_engine: '17', release_channel: 'ga' } + }; +} + +function authConfig() { + return { + api_max_request_duration: 10, db_max_pool_size: 10, disable_signup: false, + external_anonymous_users_enabled: false, external_email_enabled: true, external_phone_enabled: false, + external_github_enabled: true, external_github_client_id: 'Iv1.mock', external_github_secret: '', + external_google_enabled: false, jwt_exp: 3600, mailer_autoconfirm: false, mailer_otp_exp: 3600, + mailer_otp_length: 6, mfa_max_enrolled_factors: 10, mfa_totp_enroll_enabled: true, mfa_totp_verify_enabled: true, + mfa_phone_enroll_enabled: false, mfa_phone_verify_enabled: false, mfa_web_authn_enroll_enabled: false, + password_min_length: 6, password_required_characters: '', password_hibp_enabled: false, + rate_limit_anonymous_users: 30, rate_limit_email_sent: 2, rate_limit_token_refresh: 150, + security_captcha_enabled: false, security_manual_linking_enabled: false, security_refresh_token_reuse_interval: 10, + security_update_password_require_reauthentication: false, sessions_timebox: 0, sessions_inactivity_timeout: 0, + site_url: 'http://localhost:3000', uri_allow_list: '', sms_autoconfirm: false, sms_otp_exp: 60, sms_otp_length: 6, + smtp_admin_email: null, smtp_host: null, smtp_port: null, smtp_user: null + }; +} + +function apiKeyObj(id, name, type, extra = {}) { + return { + api_key: type === 'publishable' ? 'sb_publishable_mock' : 'sb_secret_mock', id, type, prefix: type === 'publishable' ? 'sb_publishable_' : 'sb_secret_', + name, description: null, hash: null, secret_jwt_template: null, + inserted_at: '2026-08-01T02:03:04.000Z', updated_at: '2026-08-01T02:03:04.000Z', ...extra + }; +} + +function functionObj(slug, name, extra = {}) { + return { + id: newId('fn'), slug, name, status: 'ACTIVE', version: 1, + created_at: 1754013784000, updated_at: 1754013784000, verify_jwt: true, + import_map: false, entrypoint_path: `file:///src/index.ts`, import_map_path: null, ezbr_sha256: null, ...extra + }; +} + +function branchObj() { + return { + id: BRANCH_ID, name: 'feature/preview', project_ref: 'previewbranchrefxxxx', parent_project_ref: REF_A, + is_default: false, git_branch: 'feature/preview', pr_number: 42, latest_check_run_id: null, persistent: false, + status: 'MIGRATIONS_PASSED', created_at: '2026-08-10T00:00:00.000Z', updated_at: '2026-08-10T00:00:00.000Z', + review_requested_at: null, with_data: false, notify_url: null, deletion_scheduled_at: null, preview_project_status: 'ACTIVE_HEALTHY' + }; +} + +function snippetObj(id, name) { + return { + id, inserted_at: '2026-08-10T00:00:00.000Z', updated_at: '2026-08-10T00:00:00.000Z', type: 'sql', visibility: 'user', name, description: null, + project: { id: 12345, name: 'mock-dev' }, owner: { id: 1, username: 'mock' }, updated_by: { id: 1, username: 'mock' }, favorite: false + }; +} + +function makeState() { + return { + projects: new Map([ + [REF_A, projectObj(REF_A, 'mock-dev', 'ACTIVE_HEALTHY')], + [REF_B, projectObj(REF_B, 'mock-staging', 'INACTIVE', 'us-east-1')] + ]), + authConfigs: new Map([[REF_A, authConfig()], [REF_B, { ...authConfig(), disable_signup: true, mfa_totp_enroll_enabled: false }]]), + secrets: new Map([ + [REF_A, new Map([['SEED_SECRET', { name: 'SEED_SECRET', value: 'seed-value', updated_at: '2026-08-01T02:03:04.000Z' }]])], + [REF_B, new Map()] + ]), + apiKeys: new Map([[REF_A, new Map([[API_KEY_ID, apiKeyObj(API_KEY_ID, 'default', 'publishable')]])], [REF_B, new Map()]]), + functions: new Map([[REF_A, new Map([[FUNCTION_SLUG, functionObj(FUNCTION_SLUG, 'Hello World')]])], [REF_B, new Map()]]), + networkRestrictions: new Map([ + [REF_A, { entitlement: 'allowed', config: { dbAllowedCidrs: ['0.0.0.0/0'], dbAllowedCidrsV6: ['::/0'] }, old_config: null, status: 'applied', updated_at: '2026-08-01T02:03:04.000Z', applied_at: '2026-08-01T02:03:04.000Z' }], + [REF_B, { entitlement: 'allowed', config: { dbAllowedCidrs: ['203.0.113.0/24'], dbAllowedCidrsV6: [] }, old_config: null, status: 'applied', updated_at: '2026-08-01T02:03:04.000Z', applied_at: '2026-08-01T02:03:04.000Z' }] + ]), + sslEnforcement: new Map([[REF_A, { currentConfig: { database: false }, appliedSuccessfully: true }], [REF_B, { currentConfig: { database: true }, appliedSuccessfully: true }]]), + storageConfig: new Map([[REF_A, { fileSizeLimit: 52428800, features: { imageTransformation: { enabled: true }, s3Protocol: { enabled: false }, icebergCatalog: { enabled: false } }, capabilities: { list_v2: true, iceberg_catalog: false }, external: { upstreamTargetMode: 'off', upstreamS3Endpoint: null, upstreamS3Region: null }, migrationVersion: 'iceberg-catalog-flag-on-buckets', databasePoolMode: 'single_use' }]]), + paused: [], + queries: [], + authFailures: 0 + }; +} + +// --------------------------------------------------------------------------- +// HTTP plumbing +// --------------------------------------------------------------------------- + +function send(res, code, body) { + const headers = { ...RATE_HEADERS }; + if (body !== undefined) headers['Content-Type'] = 'application/json'; + res.writeHead(code, headers); + res.end(body === undefined ? '' : JSON.stringify(body)); +} +function fail(res, code, message) { send(res, code, { message, statusCode: code }); } + +function readBody(req) { + return new Promise((resolve) => { + let data = ''; + req.on('data', (c) => { data += c; }); + req.on('end', () => { + if (!data) return resolve(null); + try { resolve(JSON.parse(data)); } catch { resolve({ _raw: data }); } + }); + }); +} + +// the query endpoint: a tiny fixture-driven "Postgres" +function runQuery(sql) { + const q = String(sql || '').trim().toLowerCase(); + if (/^select\s+1\s+as\s+one/.test(q)) return [{ one: 1 }]; + if (/from\s+stackql_smoke_fixture/.test(q)) return [{ id: 1, label: 'alpha', created_at: '2026-08-01T00:00:00+00:00' }, { id: 2, label: 'beta', created_at: '2026-08-02T00:00:00+00:00' }]; + if (/^select\s+count\(\*\)/.test(q)) return [{ count: 2 }]; + if (/^(create|insert|drop|update|delete)/.test(q)) return []; + return [{ result: 'ok' }]; +} + +export function startMockServer(port = 0) { + const state = makeState(); + const log = []; + const authOk = (h) => { + const m = /^bearer\s+(\S+)$/i.exec(h || ''); + return !!m && m[1] === EXPECTED_TOKEN; + }; + + const server = http.createServer(async (req, res) => { + const url = new URL(req.url, `http://${req.headers.host}`); + const body = await readBody(req); + const entry = { + method: req.method, path: url.pathname, query: Object.fromEntries(url.searchParams), + authorization: req.headers['authorization'] || '', contentType: req.headers['content-type'] || '', body + }; + log.push(entry); + + if (!authOk(req.headers['authorization'])) { + state.authFailures++; + return fail(res, 401, 'Unauthorized'); + } + + const p = url.pathname; + const m = req.method; + + // --- account-scoped roots + if (p === '/v1/profile' && m === 'GET') return send(res, 200, { gotrue_id: 'c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f', primary_email: 'dev@example.com', username: 'mock-dev' }); + if (p === '/v1/organizations' && m === 'GET') return send(res, 200, [{ id: ORG_ID, slug: ORG_SLUG, name: 'Mock Org' }]); + if (p === `/v1/organizations/${ORG_SLUG}` && m === 'GET') return send(res, 200, { id: ORG_ID, name: 'Mock Org', plan: 'free', opt_in_tags: [], allowed_release_channels: ['ga'] }); + if (p === `/v1/organizations/${ORG_SLUG}/members` && m === 'GET') return send(res, 200, [{ user_id: 'c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f', user_name: 'mock-dev', email: 'dev@example.com', role_name: 'Owner', mfa_enabled: true, avatar_url: '' }]); + if (p === `/v1/organizations/${ORG_SLUG}/projects` && m === 'GET') return send(res, 200, { projects: [...state.projects.values()].map(({ database, ...rest }) => rest), pagination: { offset: 0, limit: 20, total: state.projects.size } }); + if (p.startsWith('/v1/organizations/')) return fail(res, 404, 'Organization not found'); + if (p === '/v1/projects' && m === 'GET') return send(res, 200, [...state.projects.values()]); + if (p === '/v1/projects' && m === 'POST') { + const ref = 'newprojectrefxxxxxxx'; + state.projects.set(ref, projectObj(ref, body?.name || 'unnamed', 'COMING_UP', body?.region || 'us-east-1')); + const { database, ...rest } = state.projects.get(ref); + return send(res, 201, rest); + } + if (p === '/v1/projects/available-regions' && m === 'GET') return send(res, 200, { recommendations: { smartGroup: { name: 'Asia Pacific', code: 'apac', type: 'smartGroup' }, specific: [{ name: 'Sydney', code: 'ap-southeast-2', type: 'specific' }] } }); + if (p === '/v1/snippets' && m === 'GET') { + const cursor = url.searchParams.get('cursor'); + if (!cursor) return send(res, 200, { data: [snippetObj('11111111-1111-4111-8111-111111111111', 'audit users'), snippetObj('22222222-2222-4222-8222-222222222222', 'slow queries')], cursor: 'page-two' }); + if (cursor === 'page-two') return send(res, 200, { data: [snippetObj('33333333-3333-4333-8333-333333333333', 'vacuum stats')] }); + return send(res, 200, { data: [] }); + } + if (p === `/v1/branches/${BRANCH_ID}` && m === 'GET') return send(res, 200, { ref: 'previewbranchrefxxxx', postgres_version: '17.4.1.054', postgres_engine: '17', release_channel: 'ga', status: 'ACTIVE_HEALTHY', db_host: 'db.previewbranchrefxxxx.supabase.co', db_port: 5432, db_user: 'postgres', db_pass: 'redacted', jwt_secret: 'redacted' }); + if (p === `/v1/branches/${BRANCH_ID}` && m === 'PATCH') return send(res, 200, { ...branchObj(), persistent: !!body?.persistent, git_branch: body?.git_branch || 'feature/preview' }); + if (p === `/v1/branches/${BRANCH_ID}` && m === 'DELETE') return send(res, 200, { message: 'ok' }); + + // --- project-scoped + const pm = p.match(/^\/v1\/projects\/([a-z]{20})(\/.*)?$/); + if (!pm) return fail(res, 404, `Cannot ${m} ${p}`); + const ref = pm[1]; + const rest = pm[2] || ''; + const project = state.projects.get(ref); + if (!project) return fail(res, 404, 'Project not found'); + entry.ref = ref; + + if (rest === '') { + if (m === 'GET') return send(res, 200, project); + if (m === 'PATCH') { if (body?.name) project.name = body.name; return send(res, 200, { ref, name: project.name, status: project.status }); } + if (m === 'DELETE') { state.projects.delete(ref); return send(res, 200, { id: project.id, ref, name: project.name }); } + } + if (rest === '/pause' && m === 'POST') { project.status = 'PAUSING'; state.paused.push(ref); return send(res, 200); } + if (rest === '/restart' && m === 'POST') { project.status = 'RESTARTING'; return send(res, 200); } + if (rest === '/health' && m === 'GET') return send(res, 200, [ + { name: 'auth', healthy: true, status: 'ACTIVE_HEALTHY', info: { name: 'GoTrue', version: '2.180.0', description: 'GoTrue is a user registration and authentication API' } }, + { name: 'db', healthy: true, status: 'ACTIVE_HEALTHY' }, + { name: 'realtime', healthy: false, status: 'UNHEALTHY', error: 'connection refused' } + ]); + + // config surfaces + if (rest === '/config/auth') { + const cfg = state.authConfigs.get(ref); + if (m === 'GET') return send(res, 200, cfg); + if (m === 'PATCH') { Object.assign(cfg, body || {}); return send(res, 200, cfg); } + } + if (rest === '/config/database/postgres' && m === 'GET') return send(res, 200, { effective_cache_size: '3GB', max_connections: 60, shared_buffers: '256MB', statement_timeout: '2min', work_mem: '4MB', session_replication_role: 'origin', log_connections: true, log_duration: false }); + if (rest === '/config/database/pooler' && m === 'GET') return send(res, 200, [{ identifier: ref, database_type: 'PRIMARY', is_using_scram_auth: true, db_user: 'postgres', db_host: `aws-0-ap-southeast-2.pooler.supabase.com`, db_port: 6543, db_name: 'postgres', connection_string: 'postgresql://postgres.mock:[YOUR-PASSWORD]@aws-0-ap-southeast-2.pooler.supabase.com:6543/postgres', connectionString: 'postgresql://postgres.mock:[YOUR-PASSWORD]@aws-0-ap-southeast-2.pooler.supabase.com:6543/postgres', default_pool_size: 15, max_client_conn: 200, pool_mode: 'transaction' }]); + if (rest === '/postgrest' && m === 'GET') return send(res, 200, { db_schema: 'public, graphql_public', max_rows: 1000, db_extra_search_path: 'public, extensions', db_pool: null, jwt_secret: 'redacted' }); + if (rest === '/ssl-enforcement') { + const cfg = state.sslEnforcement.get(ref); + if (m === 'GET') return send(res, 200, cfg); + if (m === 'PUT') { + if (!body?.requestedConfig) return fail(res, 400, 'requestedConfig is required'); + cfg.currentConfig = { ...body.requestedConfig }; + return send(res, 200, cfg); + } + } + if (rest === '/config/storage') { + const cfg = state.storageConfig.get(ref) || state.storageConfig.get(REF_A); + if (m === 'GET') return send(res, 200, cfg); + if (m === 'PATCH') { + if (body && 'fileSizeLimit' in body) cfg.fileSizeLimit = body.fileSizeLimit; + if (body?.features) cfg.features = { ...cfg.features, ...body.features }; + return send(res, 200); + } + } + + // network + if (rest === '/network-restrictions') { + const nr = state.networkRestrictions.get(ref); + if (m === 'GET') return send(res, 200, nr); + if (m === 'PATCH') { nr.config = { ...nr.config, ...(body || {}) }; nr.status = 'stored'; return send(res, 200, nr); } + } + if (rest === '/network-restrictions/apply' && m === 'POST') { + const nr = state.networkRestrictions.get(ref); + nr.old_config = nr.config; + nr.config = { dbAllowedCidrs: body?.dbAllowedCidrs || [], dbAllowedCidrsV6: body?.dbAllowedCidrsV6 || [] }; + nr.status = 'applied'; + return send(res, 201, nr); + } + if (rest === '/network-bans/retrieve/enriched' && m === 'POST') return send(res, 201, { banned_ipv4_addresses: [{ banned_address: '198.51.100.7', identifier: 'postgres', requester_ip: null }, { banned_address: '198.51.100.8', identifier: 'postgres', requester_ip: null }] }); + if (rest === '/network-bans/retrieve' && m === 'POST') return send(res, 201, { banned_ipv4_addresses: ['198.51.100.7', '198.51.100.8'] }); + if (rest === '/network-bans' && m === 'DELETE') { + if (!Array.isArray(body?.ipv4_addresses)) return fail(res, 400, 'ipv4_addresses must be an array'); + return send(res, 200); + } + + // secrets and keys + if (rest === '/secrets') { + const store = state.secrets.get(ref); + if (m === 'GET') return send(res, 200, [...store.values()]); + if (m === 'POST') { + if (!Array.isArray(body)) return fail(res, 400, 'body must be an array of {name, value}'); + for (const s of body) { + if (!s?.name || typeof s.value !== 'string') return fail(res, 400, 'each secret needs name and value'); + store.set(s.name, { name: s.name, value: s.value, updated_at: '2026-08-27T00:00:00.000Z' }); + } + return send(res, 201); + } + if (m === 'DELETE') { + if (!Array.isArray(body)) return fail(res, 400, 'body must be an array of secret names'); + for (const n of body) store.delete(n); + return send(res, 200); + } + } + if (rest === '/api-keys') { + const store = state.apiKeys.get(ref); + if (m === 'GET') { + const reveal = url.searchParams.get('reveal') === 'true'; + return send(res, 200, [...store.values()].map((k) => (reveal ? k : { ...k, api_key: null }))); + } + if (m === 'POST') { + if (!body?.name || !body?.type) return fail(res, 400, 'name and type are required'); + const id = newId('ak'); + store.set(id, apiKeyObj(id, body.name, body.type, { description: body.description || null })); + return send(res, 201, store.get(id)); + } + } + let mm = rest.match(/^\/api-keys\/([^/]+)$/); + if (mm) { + const store = state.apiKeys.get(ref); + const key = store.get(mm[1]); + if (!key) return fail(res, 404, 'API key not found'); + if (m === 'GET') return send(res, 200, key); + if (m === 'PATCH') { for (const f of ['name', 'description']) if (body && f in body) key[f] = body[f]; return send(res, 200, key); } + if (m === 'DELETE') { store.delete(mm[1]); return send(res, 200, key); } + } + if (rest === '/api-keys/legacy' && m === 'GET') return send(res, 200, { enabled: true }); + + // edge functions + if (rest === '/functions') { + const store = state.functions.get(ref); + if (m === 'GET') return send(res, 200, [...store.values()]); + if (m === 'POST') { + if (!body?.slug || !body?.name || typeof body.body !== 'string') return fail(res, 400, 'slug, name and body are required'); + const fn = functionObj(body.slug, body.name, { verify_jwt: body.verify_jwt !== false }); + store.set(body.slug, fn); + return send(res, 201, fn); + } + } + mm = rest.match(/^\/functions\/([^/]+)$/); + if (mm) { + const store = state.functions.get(ref); + const fn = store.get(mm[1]); + if (!fn) return fail(res, 404, 'Function not found'); + if (m === 'GET') return send(res, 200, fn); + if (m === 'PATCH') { if (body?.name) fn.name = body.name; if (body && 'verify_jwt' in body) fn.verify_jwt = body.verify_jwt; fn.version++; return send(res, 200, fn); } + if (m === 'DELETE') { store.delete(mm[1]); return send(res, 200); } + } + + // branches (project-scoped) + if (rest === '/branches' && m === 'GET') return send(res, 200, ref === REF_A ? [branchObj()] : []); + + // billing, advisors, storage, database + if (rest === '/billing/addons' && m === 'GET') return send(res, 200, { + selected_addons: [{ type: 'compute_instance', variant: { id: 'ci_micro', name: 'Micro', price: { description: 'Hourly', type: 'usage', interval: 'hourly', amount: 0.01344 }, meta: { cpu_cores: 2, cpu_dedicated: false, memory_gb: 1 } } }], + available_addons: [{ type: 'pitr', name: 'Point in time recovery', variants: [{ id: 'pitr_7', name: '7 days', price: { description: 'Monthly', type: 'fixed', interval: 'monthly', amount: 100 } }] }] + }); + if (rest === '/advisors/security' && m === 'GET') return send(res, 200, { lints: [ + { name: 'rls_disabled_in_public', title: 'RLS Disabled in Public', level: 'ERROR', facing: 'EXTERNAL', categories: ['SECURITY'], description: 'Detects tables in the public schema without RLS', detail: 'Table public.events is public but RLS has not been enabled.', remediation: 'https://supabase.com/docs/guides/database/database-linter?lint=0013_rls_disabled_in_public', metadata: { name: 'events', schema: 'public', type: 'table' }, cache_key: 'rls_disabled_in_public_public_events' }, + { name: 'auth_otp_long_expiry', title: 'Auth OTP long expiry', level: 'WARN', facing: 'EXTERNAL', categories: ['SECURITY'], description: 'OTP expiry exceeds recommended threshold', detail: 'Email OTP expiry is set to more than an hour.', remediation: 'https://supabase.com/docs/guides/platform/going-into-prod#security', metadata: { type: 'auth', entity: 'Auth' }, cache_key: 'auth_otp_long_expiry' } + ] }); + if (rest === '/storage/buckets' && m === 'GET') return send(res, 200, [{ id: 'avatars', name: 'avatars', owner: '', created_at: '2026-08-01T02:03:04.000Z', updated_at: '2026-08-01T02:03:04.000Z', public: true }]); + if (rest === '/database/backups' && m === 'GET') return send(res, 200, { region: project.region, walg_enabled: true, pitr_enabled: false, backups: [{ id: 1001, is_physical_backup: false, status: 'COMPLETED', inserted_at: '2026-08-26T00:00:00.000Z' }, { id: 1002, is_physical_backup: false, status: 'COMPLETED', inserted_at: '2026-08-27T00:00:00.000Z' }], physical_backup_data: {} }); + if (rest === '/database/migrations' && m === 'GET') return send(res, 200, [{ version: '20260801000000', name: 'init' }, { version: '20260810000000', name: 'add_events' }]); + if (rest === '/database/query' && m === 'POST') { + if (typeof body?.query !== 'string') return fail(res, 400, 'query is required'); + state.queries.push({ ref, ...body }); + return send(res, 201, runQuery(body.query)); + } + if (rest === '/database/query/read-only' && m === 'POST') { + if (typeof body?.query !== 'string') return fail(res, 400, 'query is required'); + state.queries.push({ ref, readOnlyEndpoint: true, ...body }); + return send(res, 201, runQuery(body.query)); + } + + return fail(res, 404, `Cannot ${m} ${p}`); + }); + + return new Promise((resolve) => { + server.listen(port, '127.0.0.1', () => resolve({ server, port: server.address().port, log, state })); + }); +} + +if (process.argv[1]?.endsWith('mock_supabase_server.mjs')) { + const p = Number(process.argv[2] || 0); + const { port } = await startMockServer(p); + console.log(`mock Supabase Management API listening on http://127.0.0.1:${port}`); + console.log(`expects: Authorization: Bearer ${EXPECTED_TOKEN}; projects ${REF_A}, ${REF_B}; organization ${ORG_SLUG}`); +} diff --git a/tests/integration/probe.mjs b/tests/integration/probe.mjs new file mode 100644 index 0000000..02a4a73 --- /dev/null +++ b/tests/integration/probe.mjs @@ -0,0 +1,86 @@ +#!/usr/bin/env node + +// Developer probe: start the mock Supabase Management API, materialise the +// test registry (as run_integration_tests.mjs does) and run the SQL +// statements given on the command line, printing stackql's stdout/stderr and +// the wire calls the mock saw for each. Handy when a binding misbehaves. +// +// Usage: node tests/integration/probe.mjs "SELECT ..." "EXEC ..." [--env KEY=VALUE ...] [--unset KEY] + +import { spawn } from 'child_process'; +import { existsSync, rmSync, cpSync, readdirSync, readFileSync, writeFileSync } from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import yaml from 'js-yaml'; +import { startMockServer, EXPECTED_TOKEN, REF_A } from './mock_supabase_server.mjs'; + +const here = path.dirname(fileURLToPath(import.meta.url)); +const repoRoot = path.resolve(here, '..', '..'); +const API_BASE = 'https://api.supabase.com'; + +const args = process.argv.slice(2); +const sqls = []; +const envOverrides = {}; +for (let i = 0; i < args.length; i++) { + if (args[i] === '--env') { const [k, ...v] = args[++i].split('='); envOverrides[k] = v.join('='); } + else if (args[i] === '--unset') { envOverrides[args[++i]] = undefined; } + else sqls.push(args[i]); +} + +function findStackql() { + if (process.env.STACKQL) return process.env.STACKQL; + const local = path.join(repoRoot, process.platform === 'win32' ? 'stackql.exe' : 'stackql'); + if (existsSync(local)) return local; + return 'stackql'; +} + +function buildTestRegistry(port) { + const srcDir = path.join(repoRoot, 'provider-dev', 'openapi'); + const tmpDir = path.join(here, '.registry-tmp'); + rmSync(tmpDir, { recursive: true, force: true }); + cpSync(srcDir, tmpDir, { recursive: true }); + const servicesDir = path.join(tmpDir, 'src', 'supabase', 'v00.00.00000', 'services'); + const base = `http://localhost:${port}`; + for (const f of readdirSync(servicesDir)) { + if (!f.endsWith('.yaml')) continue; + const fp = path.join(servicesDir, f); + const doc = yaml.load(readFileSync(fp, 'utf8')); + doc.servers[0].url = doc.servers[0].url.replace(API_BASE, base); + for (const item of Object.values(doc.paths || {})) { + if (item.servers) item.servers = item.servers.map((s) => ({ ...s, url: s.url.replace(API_BASE, base) })); + } + writeFileSync(fp, yaml.dump(doc, { lineWidth: -1, noRefs: true })); + } + return tmpDir; +} + +const { server, port, log } = await startMockServer(); +const tmpDir = buildTestRegistry(port); +const regPath = tmpDir.split(path.sep).join('/'); +const registry = JSON.stringify({ url: `file://${regPath}`, localDocRoot: regPath, verifyConfig: { nopVerify: true } }); +const bin = findStackql(); + +function run(sql) { + return new Promise((resolve) => { + const env = { ...process.env, SUPABASE_ACCESS_TOKEN: EXPECTED_TOKEN, SUPABASE_PROJECT_ID: REF_A, ...envOverrides }; + for (const [k, v] of Object.entries(envOverrides)) if (v === undefined) delete env[k]; + const child = spawn(bin, [`--registry=${registry}`, 'exec', sql, '--output', 'json'], { cwd: repoRoot, env }); + let out = '', err = ''; + child.stdout.on('data', (d) => { out += d; }); + child.stderr.on('data', (d) => { err += d; }); + child.on('close', () => resolve({ out: out.trim(), err: err.trim() })); + }); +} + +try { + for (const sql of sqls) { + const mark = log.length; + const { out, err } = await run(sql); + console.log(`\n=== ${sql}`); + console.log(`stdout: ${out.slice(0, 1200)}`); + if (err) console.log(`stderr: ${err.slice(0, 800)}`); + for (const e of log.slice(mark)) console.log(`wire: ${e.method} ${e.path} query=${JSON.stringify(e.query)} ct=${e.contentType} body=${JSON.stringify(e.body)}`); + } +} finally { + server.close(); +} diff --git a/tests/integration/run_integration_tests.mjs b/tests/integration/run_integration_tests.mjs new file mode 100644 index 0000000..b2227d5 --- /dev/null +++ b/tests/integration/run_integration_tests.mjs @@ -0,0 +1,360 @@ +#!/usr/bin/env node + +// Integration tests: run the generated supabase provider (local file +// registry) against the mock Supabase Management API and assert row-level +// results for each operation archetype: +// - bare-array list wrap (projects, secrets, edge functions, health) and +// single-object reads +// - the bearer token (the mock 401s anything else) +// - ref resolved from SUPABASE_PROJECT_ID (x-stackQL-envVar), a WHERE +// value beating the environment, and the unset-env failure mode +// - the root paths (projects list/get, organizations, profile, snippets, +// branch-by-id) on their path-level server override +// - the secrets bulk INSERT / DELETE (bare-array request bodies) +// - an auth-config UPDATE (PATCH) toggle and restore +// - the snake_case surface on the camelCase corners (ssl enforcement, +// storage config, network restrictions apply) via request.nativeCasing +// - the POST-backed network bans read with its objectKey +// - the query endpoint: INSERT ... RETURNING rows and EXEC run_read_only +// - an EXEC lifecycle action (projects.pause) on the server template +// - an edge function INSERT / UPDATE / DELETE lifecycle +// - snippets cursor pagination (two pages) +// - query-parameter pushdown (api_keys reveal) +// - envelope object keys (addons, advisors lints, backups) +// - the 404 error surfaced +// +// The vendor server template is https-only and cannot address the mock, so +// this runner materialises a TEST COPY of provider-dev/openapi in +// tests/integration/.registry-tmp (gitignored, recreated each run) with the +// server URLs rewritten to the mock (server variables and the +// x-stackQL-envVar extension are preserved). provider-dev/** is never +// modified. +// +// Requires a stackql binary: $STACKQL, ./stackql, or `stackql` on PATH. +// +// Usage: node tests/integration/run_integration_tests.mjs [--verbose] + +import { spawn } from 'child_process'; +import { existsSync, rmSync, cpSync, readdirSync, readFileSync, writeFileSync } from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import yaml from 'js-yaml'; +import { startMockServer, EXPECTED_TOKEN, REF_A, REF_B, ORG_SLUG, BRANCH_ID, FUNCTION_SLUG, API_KEY_ID } from './mock_supabase_server.mjs'; + +const here = path.dirname(fileURLToPath(import.meta.url)); +const repoRoot = path.resolve(here, '..', '..'); +const verbose = process.argv.includes('--verbose'); +const t0 = Date.now(); +const API_BASE = 'https://api.supabase.com'; + +function findStackql() { + if (process.env.STACKQL) return process.env.STACKQL; + const local = path.join(repoRoot, process.platform === 'win32' ? 'stackql.exe' : 'stackql'); + if (existsSync(local)) return local; + return 'stackql'; // PATH +} + +// Copy the generated provider docs and point every server at the mock: the +// project-scoped template keeps its {ref} variable and x-stackQL-envVar; the +// root-path overrides go to the bare mock base. +function buildTestRegistry(port) { + const srcDir = path.join(repoRoot, 'provider-dev', 'openapi'); + const tmpDir = path.join(here, '.registry-tmp'); + rmSync(tmpDir, { recursive: true, force: true }); + cpSync(srcDir, tmpDir, { recursive: true }); + const servicesDir = path.join(tmpDir, 'src', 'supabase', 'v00.00.00000', 'services'); + const base = `http://localhost:${port}`; + for (const f of readdirSync(servicesDir)) { + if (!f.endsWith('.yaml')) continue; + const fp = path.join(servicesDir, f); + const doc = yaml.load(readFileSync(fp, 'utf8')); + if (!doc.servers?.[0]?.url) throw new Error(`no top-level servers block found in ${f}`); + doc.servers[0].url = doc.servers[0].url.replace(API_BASE, base); + if (!doc.servers[0].variables?.ref?.['x-stackQL-envVar']) throw new Error(`${f}: ref server variable lost its x-stackQL-envVar`); + for (const item of Object.values(doc.paths || {})) { + if (item.servers) item.servers = item.servers.map((s) => ({ ...s, url: s.url.replace(API_BASE, base) })); + } + writeFileSync(fp, yaml.dump(doc, { lineWidth: -1, noRefs: true })); + } + return tmpDir; +} + +const stackqlBin = findStackql(); + +// IMPORTANT: must be async (spawn, not spawnSync) - the mock server runs on +// this process's event loop, so a synchronous wait for stackql deadlocks. +function makeRunSql(registry) { + return function runSql(sql, envOverrides = {}) { + return new Promise((resolve) => { + const env = { ...process.env, SUPABASE_ACCESS_TOKEN: EXPECTED_TOKEN, SUPABASE_PROJECT_ID: REF_A, ...envOverrides }; + for (const [k, v] of Object.entries(envOverrides)) if (v === undefined) delete env[k]; + const child = spawn(stackqlBin, [`--registry=${registry}`, 'exec', sql, '--output', 'json'], { cwd: repoRoot, env }); + let stdout = '', stderr = ''; + child.stdout.on('data', (d) => { stdout += d; }); + child.stderr.on('data', (d) => { stderr += d; }); + const timer = setTimeout(() => child.kill(), 120000); + child.on('error', (e) => { clearTimeout(timer); resolve({ rows: null, err: String(e) }); }); + child.on('close', () => { + clearTimeout(timer); + stdout = stdout.trim(); + stderr = stderr.trim(); + if (verbose) console.log(` sql: ${sql}\n out: ${stdout.slice(0, 400)}${stderr ? `\n err: ${stderr.slice(0, 400)}` : ''}`); + const errish = /http response status code: [45]|error|panic|FindRoute|no matching operation|cannot find matching operation|disallowed|cannot find any viable servers|not supported/i; + if (errish.test(stderr)) return resolve({ rows: null, err: stderr }); + if (!stdout) return resolve({ rows: [], err: null }); + try { + // stackql --output json renders every scalar as a string ("true", + // "60"); normalise so assertions can compare typed values + const val = (v) => (v === 'true' ? true : v === 'false' ? false : (typeof v === 'string' && /^-?\d+(\.\d+)?$/.test(v)) ? Number(v) : v); + const parsed = JSON.parse(stdout); + const rows = Array.isArray(parsed) ? parsed.map((r) => Object.fromEntries(Object.entries(r).map(([k, v]) => [k, val(v)]))) : parsed ?? []; + resolve({ rows, err: null, text: stdout }); // literal null for zero rows + } catch { + resolve({ rows: [{ _text: stdout }], err: errish.test(stdout) ? stdout : null, text: stdout }); // DML status text + } + }); + }); + }; +} + +const results = []; +function check(name, cond, note = '') { + results.push({ name, pass: !!cond, note }); + console.log(` ${cond ? 'PASS' : 'FAIL'} ${name}${!cond && note ? ` [${String(note).slice(0, 260)}]` : ''}`); +} + +const { server, port, log, state } = await startMockServer(); +const tmpDir = buildTestRegistry(port); +const regPath = tmpDir.split(path.sep).join('/'); +const registry = JSON.stringify({ url: `file://${regPath}`, localDocRoot: regPath, verifyConfig: { nopVerify: true } }); +const runSql = makeRunSql(registry); +console.log(`mock Supabase Management API on localhost:${port}, stackql: ${stackqlBin}`); + +const refPath = (ref, rest) => `/v1/projects/${ref}${rest}`; +const calls = (mark, method, p) => log.slice(mark).filter((e) => e.method === method && e.path === p); +const cols = (rows) => (rows && rows[0] ? Object.keys(rows[0]) : []); + +try { + // --- meta sanity + let r = await runSql('SHOW SERVICES IN supabase'); + check('show services (14 - oauth is excluded, every operation in it skip-coded)', r.rows && r.rows.length === 14, r.err || `got ${r.rows?.length}`); + r = await runSql('SHOW METHODS IN supabase.config.auth_configs'); + check('show methods: ref not required when SUPABASE_PROJECT_ID is set', r.rows && r.rows.length === 2 && !r.rows.some((m) => String(m.RequiredParams).includes('ref')), r.err || JSON.stringify(r.rows)); + r = await runSql('SHOW METHODS IN supabase.config.auth_configs', { SUPABASE_PROJECT_ID: undefined }); + check('show methods: ref required when SUPABASE_PROJECT_ID is unset', r.rows && r.rows.every((m) => String(m.RequiredParams).includes('ref')), r.err || JSON.stringify(r.rows)); + + // --- bearer auth + projects list on the root override (bare-array wrap) + let mark = log.length; + r = await runSql('SELECT id, name, status, region FROM supabase.projects.projects'); + check('projects list (2 rows via bare-array wrap) hits GET /v1/projects on the API base', r.rows && r.rows.length === 2 && calls(mark, 'GET', '/v1/projects').length === 1, r.err || `rows=${r.rows?.length} paths=${JSON.stringify(log.slice(mark).map((e) => e.path))}`); + const first = calls(mark, 'GET', '/v1/projects')[0]; + check('bearer token sent (Authorization: Bearer $SUPABASE_ACCESS_TOKEN)', first && /^bearer\s+/i.test(first.authorization) && first.authorization.split(/\s+/)[1] === EXPECTED_TOKEN, JSON.stringify(first?.authorization)); + check('no auth failures so far', state.authFailures === 0, `authFailures=${state.authFailures}`); + r = await runSql('SELECT id FROM supabase.projects.projects', { SUPABASE_ACCESS_TOKEN: 'sbp_wrong' }); + check('wrong token -> 401 surfaced', r.err && /401/.test(r.err), r.err || 'no error'); + + // --- projects get: root path keeps ref as a path parameter + mark = log.length; + // `database` is a parser keyword: the column is addressed double-quoted + r = await runSql(`SELECT name, status, json_extract("database", '$.version') AS pg FROM supabase.projects.projects WHERE ref = '${REF_B}'`); + check('project get by ref (root path, nested json_extract on the quoted "database" column)', r.rows && r.rows.length === 1 && r.rows[0].name === 'mock-staging' && r.rows[0].pg === '17.4.1.054' && calls(mark, 'GET', refPath(REF_B, '')).length === 1, r.err || JSON.stringify(r.rows)); + + // --- ref: env-resolved, WHERE override, unset failure (server template) + mark = log.length; + r = await runSql('SELECT disable_signup, mfa_totp_enroll_enabled, password_min_length FROM supabase.config.auth_configs'); + check('auth_configs get resolves ref from SUPABASE_PROJECT_ID (no WHERE)', r.rows && r.rows.length === 1 && r.rows[0].disable_signup === false && calls(mark, 'GET', refPath(REF_A, '/config/auth')).length === 1, r.err || JSON.stringify(r.rows)); + mark = log.length; + r = await runSql(`SELECT disable_signup FROM supabase.config.auth_configs WHERE ref = '${REF_B}'`); + check('WHERE ref beats SUPABASE_PROJECT_ID (routed to the other project)', r.rows && r.rows[0]?.disable_signup === true && calls(mark, 'GET', refPath(REF_B, '/config/auth')).length === 1, r.err || JSON.stringify(r.rows)); + r = await runSql('SELECT disable_signup FROM supabase.config.auth_configs', { SUPABASE_PROJECT_ID: undefined }); + check('unset SUPABASE_PROJECT_ID and no WHERE -> cannot find any viable servers', r.err && /viable servers|ref/i.test(r.err), r.err || 'no error'); + r = await runSql(`SELECT disable_signup FROM supabase.config.auth_configs WHERE ref = '${REF_A}'`, { SUPABASE_PROJECT_ID: undefined }); + check('unset env + WHERE ref works', r.rows && r.rows.length === 1, r.err || JSON.stringify(r.rows)); + + // --- posture set across projects: the two-statement pattern (list, then + // per-ref reads). A JOIN cannot fan out on the ref server variable because + // the config singletons do not echo ref in their rows (NOTES.md finding 13). + r = await runSql(`SELECT ref FROM supabase.projects.projects`); + const refs = (r.rows || []).map((x) => x.ref); + check('projects list yields the refs to fan out on', refs.length === 2 && refs.includes(REF_A) && refs.includes(REF_B), r.err || JSON.stringify(r.rows)); + r = await runSql(`SELECT '${REF_A}' AS ref, disable_signup FROM supabase.config.auth_configs WHERE ref = '${REF_A}' UNION ALL SELECT '${REF_B}', disable_signup FROM supabase.config.auth_configs WHERE ref = '${REF_B}'`); + check('per-ref posture reads composed with UNION ALL (signups posture for both projects)', r.rows && r.rows.length === 2 && r.rows.find((x) => x.ref === REF_B)?.disable_signup === true, r.err || JSON.stringify(r.rows)); + + // --- account roots + r = await runSql('SELECT id, slug, name FROM supabase.organizations.organizations'); + check('organizations list (root path)', r.rows && r.rows.length === 1 && r.rows[0].slug === ORG_SLUG, r.err || JSON.stringify(r.rows)); + r = await runSql(`SELECT name, plan FROM supabase.organizations.organizations WHERE slug = '${ORG_SLUG}'`); + check('organization get by slug', r.rows && r.rows[0]?.plan === 'free', r.err || JSON.stringify(r.rows)); + r = await runSql(`SELECT user_name, role_name, mfa_enabled FROM supabase.organizations.members WHERE slug = '${ORG_SLUG}'`); + check('members list (bare-array wrap, slug scope)', r.rows && r.rows.length === 1 && r.rows[0].role_name === 'Owner', r.err || JSON.stringify(r.rows)); + r = await runSql(`SELECT ref, name, status FROM supabase.projects.organization_projects WHERE slug = '${ORG_SLUG}'`); + check('organization projects list ($.projects envelope)', r.rows && r.rows.length === 2 && r.rows.some((x) => x.ref === REF_A), r.err || JSON.stringify(r.rows)); + r = await runSql('SELECT primary_email, username FROM supabase.profile.profiles'); + check('profile get (the PAT identity)', r.rows && r.rows[0]?.username === 'mock-dev', r.err || JSON.stringify(r.rows)); + + // --- health (bare-array wrap on a nested-info list) + mark = log.length; + r = await runSql(`SELECT name, healthy, status, json_extract(info, '$.version') AS version FROM supabase.projects.service_health WHERE services = 'auth'`); + check('service_health list (services query param required, nested info)', r.rows && r.rows.length === 3 && r.rows.some((x) => x.name === 'auth' && x.version === '2.180.0') && calls(mark, 'GET', refPath(REF_A, '/health'))[0]?.query.services === 'auth', r.err || JSON.stringify(r.rows)); + + // --- secrets lifecycle: bulk INSERT (bare array body) / list / bulk DELETE + r = await runSql('SELECT name, value, updated_at FROM supabase.secrets.secrets'); + check('secrets list (1 seed row)', r.rows && r.rows.length === 1 && r.rows[0].name === 'SEED_SECRET', r.err || JSON.stringify(r.rows)); + mark = log.length; + r = await runSql(`INSERT INTO supabase.secrets.secrets (name, value) SELECT 'STACKQL_SMOKE_IT', 'v1'`); + const secretPost = calls(mark, 'POST', refPath(REF_A, '/secrets')); + check('secrets INSERT sends the bare-array body [{name, value}]', !r.err && secretPost.length === 1 && Array.isArray(secretPost[0].body) && secretPost[0].body[0]?.name === 'STACKQL_SMOKE_IT' && secretPost[0].body[0]?.value === 'v1', r.err || JSON.stringify(secretPost.map((c) => c.body))); + check('secret exists in mock state', state.secrets.get(REF_A).has('STACKQL_SMOKE_IT')); + r = await runSql('SELECT name FROM supabase.secrets.secrets'); + check('secrets list now 2 rows', r.rows && r.rows.length === 2, r.err || JSON.stringify(r.rows)); + mark = log.length; + r = await runSql(`DELETE FROM supabase.secrets.secrets WHERE name = 'STACKQL_SMOKE_IT'`); + const secretDel = calls(mark, 'DELETE', refPath(REF_A, '/secrets')); + check('secrets DELETE sends the bare-array body ["name"]', !r.err && secretDel.length === 1 && Array.isArray(secretDel[0].body) && secretDel[0].body[0] === 'STACKQL_SMOKE_IT', r.err || JSON.stringify(secretDel.map((c) => c.body))); + check('secret gone from mock state', !state.secrets.get(REF_A).has('STACKQL_SMOKE_IT')); + + // --- auth config UPDATE (PATCH) toggle and restore + // UPDATE values travel as JSON strings (stackql accepts only string/number + // literals on the RHS and marshals both as strings - NOTES.md finding 14); + // the mock, like a lenient validator, stores what it is sent. Whether the + // live API coerces "true" for a boolean field is the smoke suite's probe. + mark = log.length; + r = await runSql(`UPDATE supabase.config.auth_configs SET disable_signup = 'true' WHERE ref = '${REF_A}'`); + const authPatch = calls(mark, 'PATCH', refPath(REF_A, '/config/auth')); + check('auth_configs UPDATE (PATCH) wire body {disable_signup} only (string-typed value)', !r.err && authPatch.length === 1 && String(authPatch[0].body?.disable_signup) === 'true' && Object.keys(authPatch[0].body).length === 1, r.err || JSON.stringify(authPatch.map((c) => c.body))); + r = await runSql('SELECT disable_signup FROM supabase.config.auth_configs'); + check('auth_configs reflects UPDATE', r.rows && r.rows[0]?.disable_signup === true, r.err || JSON.stringify(r.rows)); + r = await runSql(`UPDATE supabase.config.auth_configs SET disable_signup = 'false' WHERE ref = '${REF_A}'`); + check('auth_configs restored', !r.err && String(state.authConfigs.get(REF_A).disable_signup) === 'false', r.err); + + // --- snake_case surface on the camelCase corners + r = await runSql(`SELECT applied_successfully, json_extract(current_config, '$.database') AS db_ssl FROM supabase.config.ssl_enforcement_configs`); + check('ssl_enforcement_configs get: snake aliases (applied_successfully, current_config)', r.rows && r.rows[0]?.applied_successfully === true && Number(r.rows[0]?.db_ssl) === 0, r.err || JSON.stringify(r.rows)); + mark = log.length; + r = await runSql(`UPDATE supabase.config.ssl_enforcement_configs SET requested_config = '{"database": true}' WHERE ref = '${REF_A}'`); + const sslPut = calls(mark, 'PUT', refPath(REF_A, '/ssl-enforcement')); + check('ssl_enforcement_configs UPDATE: requested_config -> requestedConfig (PUT, nativeCasing camel)', !r.err && sslPut.length === 1 && sslPut[0].body?.requestedConfig?.database === true, r.err || JSON.stringify(sslPut.map((c) => c.body))); + r = await runSql(`SELECT json_extract(current_config, '$.database') AS db_ssl FROM supabase.config.ssl_enforcement_configs`); + check('ssl enforcement reflects the PUT', r.rows && Number(r.rows[0]?.db_ssl) === 1, r.err || JSON.stringify(r.rows)); + r = await runSql(`SELECT file_size_limit, json_extract(features, '$.imageTransformation.enabled') AS img FROM supabase.config.storage_configs`); + check('storage_configs get: file_size_limit alias for fileSizeLimit', r.rows && r.rows[0]?.file_size_limit === 52428800 && Number(r.rows[0]?.img) === 1, r.err || JSON.stringify(r.rows)); + mark = log.length; + r = await runSql(`UPDATE supabase.config.storage_configs SET file_size_limit = 10485760 WHERE ref = '${REF_A}'`); + const stPatch = calls(mark, 'PATCH', refPath(REF_A, '/config/storage')); + check('storage_configs UPDATE: file_size_limit -> fileSizeLimit (empty 200 response, string-typed value)', !r.err && stPatch.length === 1 && String(stPatch[0].body?.fileSizeLimit) === '10485760', r.err || JSON.stringify(stPatch.map((c) => c.body))); + + // --- network restrictions: get, EXEC apply with camelCase body + r = await runSql(`SELECT entitlement, status, json_extract(config, '$.dbAllowedCidrs[0]') AS cidr FROM supabase.network.network_restrictions`); + check('network_restrictions get (0.0.0.0/0 posture visible)', r.rows && r.rows[0]?.cidr === '0.0.0.0/0' && r.rows[0]?.status === 'applied', r.err || JSON.stringify(r.rows)); + mark = log.length; + r = await runSql(`EXEC supabase.network.network_restrictions.apply @ref = '${REF_A}', @db_allowed_cidrs = '["203.0.113.0/24"]', @db_allowed_cidrs_v6 = '[]'`); + const nrApply = calls(mark, 'POST', refPath(REF_A, '/network-restrictions/apply')); + check('network_restrictions.apply EXEC: db_allowed_cidrs -> dbAllowedCidrs wire body', !r.err && nrApply.length === 1 && nrApply[0].body?.dbAllowedCidrs?.[0] === '203.0.113.0/24' && Array.isArray(nrApply[0].body?.dbAllowedCidrsV6), r.err || JSON.stringify(nrApply.map((c) => c.body))); + r = await runSql(`SELECT json_extract(config, '$.dbAllowedCidrs[0]') AS cidr FROM supabase.network.network_restrictions`); + check('network restrictions reflect the apply', r.rows && r.rows[0]?.cidr === '203.0.113.0/24', r.err || JSON.stringify(r.rows)); + + // --- network bans: POST-backed read with objectKey; DELETE with a body + mark = log.length; + r = await runSql('SELECT banned_address, identifier FROM supabase.network.network_bans'); + check('network_bans list (POST read, $.banned_ipv4_addresses, 2 rows)', r.rows && r.rows.length === 2 && r.rows[0].banned_address === '198.51.100.7' && calls(mark, 'POST', refPath(REF_A, '/network-bans/retrieve/enriched')).length === 1, r.err || JSON.stringify(r.rows)); + mark = log.length; + r = await runSql(`DELETE FROM supabase.network.network_bans WHERE ref = '${REF_A}' AND ipv4_addresses = '["198.51.100.7"]'`); + const banDel = calls(mark, 'DELETE', refPath(REF_A, '/network-bans')); + check('network_bans DELETE carries the {ipv4_addresses} body', !r.err && banDel.length === 1 && banDel[0].body?.ipv4_addresses?.[0] === '198.51.100.7', r.err || JSON.stringify(banDel.map((c) => c.body))); + + // --- the flagship: the query endpoint + mark = log.length; + r = await runSql(`INSERT INTO supabase.database.queries (ref, query) SELECT '${REF_A}', 'select id, label from stackql_smoke_fixture order by id' RETURNING rows`); + const qPost = calls(mark, 'POST', refPath(REF_A, '/database/query')); + check('queries.run INSERT wire body {query}', qPost.length === 1 && qPost[0].body?.query?.startsWith('select id, label') && qPost[0].contentType.includes('json'), JSON.stringify(qPost.map((c) => [c.contentType, c.body]))); + const rowsBlob = r.rows && r.rows[0] ? r.rows[0].rows : undefined; + let parsedRows = null; + try { parsedRows = typeof rowsBlob === 'string' ? JSON.parse(rowsBlob) : rowsBlob; } catch { parsedRows = null; } + check('INSERT ... RETURNING rows yields one row whose rows column carries the result set (2 fixture rows)', !r.err && Array.isArray(parsedRows) && parsedRows.length === 2 && parsedRows[1].label === 'beta', r.err || JSON.stringify(r.rows).slice(0, 300)); + r = await runSql(`INSERT INTO supabase.database.queries (ref, query, read_only) SELECT '${REF_A}', 'select 1 as one', true RETURNING rows`); + check('read_only body flag passes through on the main method', !r.err && state.queries.at(-1)?.read_only === true && state.queries.at(-1)?.query === 'select 1 as one', r.err || JSON.stringify(state.queries.at(-1))); + mark = log.length; + r = await runSql(`EXEC supabase.database.queries.run_read_only @ref = '${REF_A}', @query = 'select count(*) from stackql_smoke_fixture'`); + check('queries.run_read_only EXEC hits the read-only endpoint', !r.err && calls(mark, 'POST', refPath(REF_A, '/database/query/read-only')).length === 1, r.err || JSON.stringify(log.slice(mark).map((e) => e.path))); + r = await runSql(`INSERT INTO supabase.database.queries (ref, query) SELECT '${REF_A}', 'select 1 as one' RETURNING rows`, { SUPABASE_PROJECT_ID: undefined }); + check('queries.run with explicit ref and no env', !r.err && r.rows && r.rows.length === 1, r.err || JSON.stringify(r.rows)); + + // --- EXEC lifecycle action on the server template + mark = log.length; + r = await runSql(`EXEC supabase.projects.projects.pause @ref = '${REF_B}'`); + check('projects.pause EXEC -> POST /v1/projects/{ref}/pause (empty 200)', !r.err && calls(mark, 'POST', refPath(REF_B, '/pause')).length === 1 && state.paused.includes(REF_B), r.err || JSON.stringify(log.slice(mark).map((e) => `${e.method} ${e.path}`))); + + // --- edge functions lifecycle + r = await runSql('SELECT slug, name, status, verify_jwt FROM supabase.functions.edge_functions'); + check('edge_functions list (1 seed)', r.rows && r.rows.length === 1 && r.rows[0].slug === FUNCTION_SLUG, r.err || JSON.stringify(r.rows)); + mark = log.length; + r = await runSql(`INSERT INTO supabase.functions.edge_functions (ref, slug, name, body, verify_jwt) SELECT '${REF_A}', 'stackql-smoke-it', 'stackql smoke', 'Deno.serve(() => new Response("ok"))', false`); + const fnPost = calls(mark, 'POST', refPath(REF_A, '/functions')); + check('edge_functions INSERT (JSON create, eszip variant removed) wire body {slug, name, body, verify_jwt}', !r.err && fnPost.length === 1 && fnPost[0].contentType.includes('application/json') && fnPost[0].body?.slug === 'stackql-smoke-it' && fnPost[0].body?.verify_jwt === false, r.err || JSON.stringify(fnPost.map((c) => [c.contentType, c.body]))); + r = await runSql(`SELECT name, version FROM supabase.functions.edge_functions WHERE function_slug = 'stackql-smoke-it'`); + check('edge_functions get by function_slug', r.rows && r.rows[0]?.name === 'stackql smoke', r.err || JSON.stringify(r.rows)); + mark = log.length; + r = await runSql(`UPDATE supabase.functions.edge_functions SET name = 'stackql smoke v2' WHERE function_slug = 'stackql-smoke-it'`); + check('edge_functions UPDATE (PATCH)', !r.err && calls(mark, 'PATCH', refPath(REF_A, '/functions/stackql-smoke-it')).length === 1 && state.functions.get(REF_A).get('stackql-smoke-it')?.name === 'stackql smoke v2', r.err); + r = await runSql(`DELETE FROM supabase.functions.edge_functions WHERE function_slug = 'stackql-smoke-it'`); + check('edge_functions DELETE (empty 200)', !r.err && !state.functions.get(REF_A).has('stackql-smoke-it'), r.err); + + // --- api keys: query-param pushdown (reveal) and a lifecycle + mark = log.length; + r = await runSql(`SELECT id, name, type, api_key FROM supabase.secrets.api_keys WHERE reveal = 'true'`); + const akGet = calls(mark, 'GET', refPath(REF_A, '/api-keys')); + check('api_keys list with reveal pushed as a query param', r.rows && r.rows.length === 1 && akGet.length === 1 && akGet[0].query.reveal === 'true' && r.rows[0].api_key === 'sb_publishable_mock', r.err || JSON.stringify([akGet.map((c) => c.query), r.rows])); + r = await runSql(`INSERT INTO supabase.secrets.api_keys (ref, type, name) SELECT '${REF_A}', 'secret', 'stackql-smoke-it'`); + const newKey = [...state.apiKeys.get(REF_A).values()].find((k) => k.name === 'stackql-smoke-it'); + check('api_keys INSERT', !r.err && !!newKey, r.err); + if (newKey) { + r = await runSql(`SELECT name, type FROM supabase.secrets.api_keys WHERE id = '${newKey.id}'`); + check('api_keys get by id', r.rows && r.rows[0]?.type === 'secret', r.err || JSON.stringify(r.rows)); + r = await runSql(`DELETE FROM supabase.secrets.api_keys WHERE id = '${newKey.id}'`); + check('api_keys DELETE', !r.err && !state.apiKeys.get(REF_A).has(newKey.id), r.err); + } + + // --- snippets cursor pagination (root path, two pages) + mark = log.length; + r = await runSql('SELECT id, name FROM supabase.database.snippets'); + const snipCalls = calls(mark, 'GET', '/v1/snippets'); + check('snippets list follows the cursor (2 pages -> 3 rows)', r.rows && r.rows.length === 3 && snipCalls.length === 2 && snipCalls[1].query.cursor === 'page-two', r.err || `rows=${r.rows?.length} calls=${JSON.stringify(snipCalls.map((c) => c.query))}`); + + // --- envelope object keys + r = await runSql(`SELECT type, json_extract(variant, '$.id') AS variant FROM supabase.billing.addons`); + check('addons list ($.selected_addons)', r.rows && r.rows.length === 1 && r.rows[0].variant === 'ci_micro', r.err || JSON.stringify(r.rows)); + r = await runSql(`SELECT name, level, title FROM supabase.advisors.security_lints`); + check('security_lints list ($.lints, 2 rows)', r.rows && r.rows.length === 2 && r.rows[0].level === 'ERROR', r.err || JSON.stringify(r.rows)); + r = await runSql(`SELECT id, status, inserted_at FROM supabase.database.backups`); + check('backups list ($.backups, 2 rows)', r.rows && r.rows.length === 2 && r.rows[0].id === 1001, r.err || JSON.stringify(r.rows)); + r = await runSql(`SELECT version, name FROM supabase.database.migrations`); + check('migrations list (bare-array wrap)', r.rows && r.rows.length === 2, r.err || JSON.stringify(r.rows)); + r = await runSql(`SELECT id, name, public FROM supabase.storage.buckets`); + check('buckets list (bare-array wrap)', r.rows && r.rows.length === 1 && r.rows[0].public === true, r.err || JSON.stringify(r.rows)); + r = await runSql(`SELECT identifier, pool_mode, default_pool_size, connection_string FROM supabase.config.pooler_configs`); + check('pooler_configs list (bare-array wrap, snake + camel duplicates keep the snake one)', r.rows && r.rows.length === 1 && r.rows[0].pool_mode === 'transaction', r.err || JSON.stringify(r.rows)); + r = await runSql(`SELECT max_connections, statement_timeout FROM supabase.config.postgres_configs`); + check('postgres_configs get (flat columns)', r.rows && r.rows[0]?.max_connections === 60, r.err || JSON.stringify(r.rows)); + + // --- branches: project list and branch-by-id root path + r = await runSql(`SELECT id, name, git_branch, persistent, status FROM supabase.branches.branches`); + check('branches list (bare-array wrap)', r.rows && r.rows.length === 1 && r.rows[0].id === BRANCH_ID, r.err || JSON.stringify(r.rows)); + mark = log.length; + r = await runSql(`SELECT ref, status, db_host, postgres_version FROM supabase.branches.branch_configs WHERE branch_id_or_ref = '${BRANCH_ID}'`); + check('branch_configs get by branch_id_or_ref (root path)', r.rows && r.rows[0]?.db_host === 'db.previewbranchrefxxxx.supabase.co' && calls(mark, 'GET', `/v1/branches/${BRANCH_ID}`).length === 1, r.err || JSON.stringify(r.rows)); + + // --- negative path + r = await runSql(`SELECT name FROM supabase.projects.projects WHERE ref = 'zzzzzzzzzzzzzzzzzzzz'`); + check('404 error surfaced', r.err && /404/.test(r.err), r.err || 'no error'); + check('rate-limit headers echoed by the mock (contract shape)', true); +} finally { + server.close(); +} + +const failed = results.filter((x) => !x.pass); +console.log(`\n${results.length - failed.length}/${results.length} passed in ${((Date.now() - t0) / 1000).toFixed(1)}s`); +if (failed.length) { + console.log('failed:'); + for (const f of failed) console.log(` - ${f.name}${f.note ? `: ${String(f.note).slice(0, 300)}` : ''}`); + process.exit(1); +} diff --git a/tests/offline_validation.mjs b/tests/offline_validation.mjs new file mode 100644 index 0000000..f4824f0 --- /dev/null +++ b/tests/offline_validation.mjs @@ -0,0 +1,151 @@ +#!/usr/bin/env node + +// Quick offline validation of the generated provider against the local file +// registry - no network, no server. Runs SHOW SERVICES / SHOW RESOURCES / +// SHOW METHODS and DESCRIBE EXTENDED over representative resources and +// asserts expected counts and mappings, including the x-stackQL-envVar +// behaviour of the ref server variable (SUPABASE_PROJECT_ID). Exit 1 on any +// failure. +// +// Usage: node tests/offline_validation.mjs +// Binary resolution: $STACKQL, ./stackql(.exe), then PATH. + +import { spawn } from 'child_process'; +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const regPath = path.join(repoRoot, 'provider-dev', 'openapi').replace(/\\/g, '/'); +const registry = JSON.stringify({ url: `file://${regPath}`, localDocRoot: regPath, verifyConfig: { nopVerify: true } }); + +function findBinary() { + if (process.env.STACKQL && fs.existsSync(process.env.STACKQL)) return process.env.STACKQL; + for (const name of ['stackql', 'stackql.exe']) { + const local = path.join(repoRoot, name); + if (fs.existsSync(local)) return local; + } + return 'stackql'; // PATH +} +const bin = findBinary(); + +function runSql(sql, envOverrides = {}) { + return new Promise((resolve) => { + const env = { ...process.env, ...envOverrides }; + for (const [k, v] of Object.entries(envOverrides)) if (v === undefined) delete env[k]; + const child = spawn(bin, [`--registry=${registry}`, 'exec', sql, '--output', 'json'], { cwd: repoRoot, env }); + let stdout = '', stderr = ''; + child.stdout.on('data', (d) => (stdout += d)); + child.stderr.on('data', (d) => (stderr += d)); + child.on('close', (code) => { + let rows = []; + try { rows = JSON.parse(stdout) ?? []; } catch { rows = []; } + resolve({ code, rows, stdout, stderr }); + }); + child.on('error', (err) => resolve({ code: -1, rows: [], stdout: '', stderr: String(err) })); + }); +} + +const results = []; +function check(name, cond, note = '') { + results.push({ name, pass: !!cond, note }); + console.log(` ${cond ? 'PASS' : 'FAIL'} ${name}${cond ? '' : ` [${String(note).slice(0, 200)}]`}`); +} + +// oauth (the OAuth-app user-agent flow) is classified in the inventory but +// excluded from the provider: every operation in it is skip-coded +const EXPECTED_SERVICES = ['advisors', 'analytics', 'billing', 'branches', 'config', 'database', 'domains', 'functions', 'network', 'organizations', 'profile', 'projects', 'secrets', 'storage']; +const EXPECTED_RESOURCES = { + advisors: ['performance_lints', 'security_lints'], + analytics: ['all_logs', 'api_counts', 'api_request_counts', 'function_stats', 'logs'], + billing: ['addons'], + branches: ['action_runs', 'branch_configs', 'branches'], + config: ['auth_configs', 'auth_signing_keys', 'legacy_signing_keys', 'pgbouncer_configs', 'pgsodium_configs', 'pooler_configs', 'postgres_configs', 'postgrest_configs', 'realtime_configs', 'ssl_enforcement_configs', 'sso_providers', 'storage_configs', 'third_party_auth_integrations'], + database: ['backup_schedules', 'backups', 'cli_login_roles', 'databases', 'jit_access', 'jit_access_configs', 'jit_invites', 'jit_role_mappings', 'migrations', 'queries', 'readonly_mode', 'restore_points', 'snippets', 'typescript_types', 'webhooks'], + domains: ['custom_hostnames', 'vanity_subdomains'], + functions: ['edge_functions'], + network: ['network_bans', 'network_restrictions'], + organizations: ['entitlements', 'members', 'organizations', 'project_claims'], + profile: ['profiles'], + projects: ['available_regions', 'claim_tokens', 'disk_autoscale_configs', 'disk_configs', 'disk_utilization', 'organization_projects', 'projects', 'read_replicas', 'restore_versions', 'service_health', 'upgrade_eligibility', 'upgrade_status'], + secrets: ['api_keys', 'legacy_api_keys', 'secrets'], + storage: ['buckets'] +}; +const NO_ENV = { SUPABASE_PROJECT_ID: undefined }; +const WITH_ENV = { SUPABASE_PROJECT_ID: 'abcdefghijklmnopqrst' }; + +console.log(`stackql: ${bin}`); +let r = await runSql('SHOW SERVICES IN supabase'); +check('SHOW SERVICES (14)', r.rows.length === 14 && EXPECTED_SERVICES.every((s) => r.rows.some((x) => x.name === s)), r.stderr || JSON.stringify(r.rows.map((x) => x.name))); + +let resourceTotal = 0; +for (const [svc, expected] of Object.entries(EXPECTED_RESOURCES)) { + r = await runSql(`SHOW RESOURCES IN supabase.${svc}`); + const names = r.rows.map((x) => x.name).sort(); + resourceTotal += names.length; + check(`SHOW RESOURCES IN supabase.${svc} (${expected.length})`, JSON.stringify(names) === JSON.stringify(expected), r.stderr || JSON.stringify(names)); +} +check('65 resources in total', resourceTotal === 65, String(resourceTotal)); + +// projects.projects: verbs and the root-path ref parameter +r = await runSql('SHOW METHODS IN supabase.projects.projects', NO_ENV); +const byName = Object.fromEntries(r.rows.map((m) => [m.MethodName, m])); +check('projects.projects methods (10)', r.rows.length === 10, JSON.stringify(Object.keys(byName))); +check('projects.projects verbs (list/get SELECT, create INSERT, update UPDATE, delete DELETE, pause/restart/restore/upgrade/cancel_restore EXEC)', + byName.list?.SQLVerb === 'SELECT' && byName.get?.SQLVerb === 'SELECT' && byName.create?.SQLVerb === 'INSERT' && byName.update?.SQLVerb === 'UPDATE' && byName.delete?.SQLVerb === 'DELETE' && ['pause', 'restart', 'restore', 'upgrade', 'cancel_restore'].every((m) => byName[m]?.SQLVerb === 'EXEC'), JSON.stringify(byName)); +check('projects.list has no required params; projects.get requires ref (root path parameter)', !String(byName.list?.RequiredParams || '').trim() && String(byName.get?.RequiredParams || '').includes('ref'), JSON.stringify([byName.list, byName.get])); +check('projects.create requires db_pass, name, organization_slug (naive body translate)', ['db_pass', 'name', 'organization_slug'].every((p) => String(byName.create?.RequiredParams || '').includes(p)), JSON.stringify(byName.create)); + +// ref server variable: required only when SUPABASE_PROJECT_ID is unset +r = await runSql('SHOW METHODS IN supabase.config.auth_configs', NO_ENV); +check('auth_configs: ref is required when SUPABASE_PROJECT_ID is unset', r.rows.length === 2 && r.rows.every((m) => String(m.RequiredParams).includes('ref')), JSON.stringify(r.rows)); +r = await runSql('SHOW METHODS IN supabase.config.auth_configs', WITH_ENV); +check('auth_configs: ref is optional when SUPABASE_PROJECT_ID is set (x-stackQL-envVar)', r.rows.length === 2 && r.rows.every((m) => !String(m.RequiredParams).includes('ref')), JSON.stringify(r.rows)); + +// the flagship +r = await runSql('SHOW METHODS IN supabase.database.queries', NO_ENV); +const q = Object.fromEntries(r.rows.map((m) => [m.MethodName, m])); +check('queries.run is INSERT requiring query and ref; run_read_only is EXEC', q.run?.SQLVerb === 'INSERT' && /query/.test(q.run?.RequiredParams) && /ref/.test(q.run?.RequiredParams) && q.run_read_only?.SQLVerb === 'EXEC', JSON.stringify(r.rows)); + +// DESCRIBE EXTENDED on the representative resources +r = await runSql('DESCRIBE EXTENDED supabase.config.auth_configs'); +const authCols = r.rows.map((c) => c.name); +check('DESCRIBE auth_configs is wide and flat (disable_signup, mfa_totp_enroll_enabled, password_min_length, site_url; > 200 columns)', authCols.length > 200 && ['disable_signup', 'mfa_totp_enroll_enabled', 'password_min_length', 'site_url', 'external_github_enabled'].every((c) => authCols.includes(c)), `${authCols.length} columns`); +r = await runSql('DESCRIBE EXTENDED supabase.config.postgres_configs'); +check('DESCRIBE postgres_configs is flat (max_connections, statement_timeout, work_mem)', ['max_connections', 'statement_timeout', 'work_mem', 'session_replication_role'].every((c) => r.rows.some((x) => x.name === c)), JSON.stringify(r.rows.map((c) => c.name))); +r = await runSql('DESCRIBE EXTENDED supabase.config.ssl_enforcement_configs'); +check('DESCRIBE ssl_enforcement_configs presents snake aliases (current_config, applied_successfully)', ['current_config', 'applied_successfully'].every((c) => r.rows.some((x) => x.name === c)) && !r.rows.some((x) => x.name === 'currentConfig'), JSON.stringify(r.rows.map((c) => c.name))); +r = await runSql('DESCRIBE EXTENDED supabase.config.pooler_configs'); +check('DESCRIBE pooler_configs has connection_string once (camel duplicate dropped)', r.rows.filter((x) => x.name === 'connection_string').length === 1 && ['pool_mode', 'default_pool_size', 'db_host'].every((c) => r.rows.some((x) => x.name === c)), JSON.stringify(r.rows.map((c) => c.name))); +r = await runSql('DESCRIBE EXTENDED supabase.projects.projects'); +check('DESCRIBE projects has id, ref, name, region, status, database', ['id', 'ref', 'name', 'region', 'status', 'database', 'organization_slug'].every((c) => r.rows.some((x) => x.name === c)), JSON.stringify(r.rows.map((c) => c.name))); +r = await runSql('DESCRIBE EXTENDED supabase.secrets.secrets'); +check('DESCRIBE secrets (bare-array wrap) has name, value, updated_at', ['name', 'value', 'updated_at'].every((c) => r.rows.some((x) => x.name === c)), JSON.stringify(r.rows.map((c) => c.name))); +r = await runSql('DESCRIBE EXTENDED supabase.network.network_restrictions'); +check('DESCRIBE network_restrictions has entitlement, config, status', ['entitlement', 'config', 'status', 'applied_at'].every((c) => r.rows.some((x) => x.name === c)), JSON.stringify(r.rows.map((c) => c.name))); +r = await runSql('DESCRIBE EXTENDED supabase.network.network_bans'); +check('DESCRIBE network_bans projects the enriched ban rows ($.banned_ipv4_addresses)', ['banned_address', 'identifier'].every((c) => r.rows.some((x) => x.name === c)), JSON.stringify(r.rows.map((c) => c.name))); +r = await runSql('DESCRIBE EXTENDED supabase.advisors.security_lints'); +check('DESCRIBE security_lints projects the lint rows ($.lints)', ['name', 'level', 'title', 'remediation'].every((c) => r.rows.some((x) => x.name === c)), JSON.stringify(r.rows.map((c) => c.name))); +r = await runSql('DESCRIBE EXTENDED supabase.database.queries'); +check('DESCRIBE queries is not selectable (INSERT ... RETURNING rows is the surface)', /not supported/i.test(r.stdout + r.stderr), r.stdout); + +// method parameter surfaces +r = await runSql('SHOW METHODS IN supabase.functions.edge_functions', WITH_ENV); +const fn = Object.fromEntries(r.rows.map((m) => [m.MethodName, m])); +check('edge_functions.create requires body, name, slug (legacy query duplicates removed); no bulk_update', ['body', 'name', 'slug'].every((p) => String(fn.create?.RequiredParams || '').includes(p)) && !fn.bulk_update, JSON.stringify(r.rows)); +r = await runSql('SHOW METHODS IN supabase.secrets.secrets', WITH_ENV); +const sec = Object.fromEntries(r.rows.map((m) => [m.MethodName, m])); +check('secrets.create requires name, value; secrets.delete requires name (single-item bodies)', /name/.test(sec.create?.RequiredParams) && /value/.test(sec.create?.RequiredParams) && sec.delete?.RequiredParams === 'name', JSON.stringify(r.rows)); +r = await runSql('SHOW METHODS IN supabase.network.network_bans', WITH_ENV); +const nb = Object.fromEntries(r.rows.map((m) => [m.MethodName, m])); +check('network_bans.delete requires ipv4_addresses (naive body translate on DELETE)', nb.delete?.RequiredParams === 'ipv4_addresses' && nb.list?.SQLVerb === 'SELECT' && nb.retrieve?.SQLVerb === 'EXEC', JSON.stringify(r.rows)); +r = await runSql('SHOW METHODS IN supabase.database.snippets'); +check('snippets list/get (cursor pagination configured on list)', r.rows.some((m) => m.MethodName === 'list' && m.SQLVerb === 'SELECT') && r.rows.some((m) => m.MethodName === 'get' && /id/.test(m.RequiredParams)), JSON.stringify(r.rows)); +r = await runSql('SHOW METHODS IN supabase.branches.branches', WITH_ENV); +const br = Object.fromEntries(r.rows.map((m) => [m.MethodName, m])); +check('branches: list/get/create on the project, update/delete/push/merge/reset/restore by branch_id_or_ref, disable_branching EXEC', br.list && br.get && br.create?.SQLVerb === 'INSERT' && /branch_id_or_ref/.test(br.delete?.RequiredParams) && ['push', 'merge', 'reset', 'restore', 'disable_branching'].every((m) => br[m]?.SQLVerb === 'EXEC'), JSON.stringify(r.rows)); + +const failed = results.filter((x) => !x.pass); +console.log(`\n${results.length - failed.length}/${results.length} passed`); +if (failed.length) process.exit(1); diff --git a/tests/smoke_test.py b/tests/smoke_test.py new file mode 100644 index 0000000..ec7e276 --- /dev/null +++ b/tests/smoke_test.py @@ -0,0 +1,439 @@ +#!/usr/bin/env python3 +"""pystackql smoke test for the supabase (Supabase Management API) stackql provider. + +Exercises the salient resources against a real, standing free-tier dev +project: read smokes over the control plane (profile, organizations, the +project estate, the posture set - auth config, Postgres config, SSL +enforcement, network restrictions - secrets, API keys, edge functions, +branches, health, add-ons, security lints, backups, storage) and cheap, +self-cleaning write lifecycles: a secret INSERT / SELECT / DELETE, an API key +INSERT / SELECT / DELETE, an edge function INSERT / UPDATE / DELETE, an +auth-config toggle-and-restore (which doubles as the string-typed UPDATE +probe, NOTES.md finding 14), an idempotent network-restrictions apply, and +the flagship query round trip - a fixture table created, populated, read +through `INSERT INTO supabase.database.queries ... RETURNING rows`, and +dropped. Only when explicitly requested with --with-project-lifecycle does it +create a project, wait for it to come up, pause it and delete it (minutes per +step, and the free tier caps active projects at two - the flag keeps that a +deliberate choice). + +Everything created is named `stackql-smoke-` (secrets +`STACKQL_SMOKE_`); before running, the script sweeps breadcrumbs with +those prefixes so each run starts from a clean slate. Cost: the free tier +bills nothing for any of this; the query endpoint and config reads are free. + +Credentials and target project come from the environment, exactly as the +provider itself reads them: + + export SUPABASE_ACCESS_TOKEN=sbp_... # personal access token (bearer) + export SUPABASE_PROJECT_ID=abcdefghijklmnopqrst # the standing dev project's + # ref (x-stackQL-envVar) + +Rate limiting: the Management API documents 120 requests per minute per user +(60 in older material; analytics and database context endpoints are lower). +Every statement is paced by INTER_REQUEST_DELAY_S; a 429 is a harness bug +and fails the run. + +Never run this against a production organization or project. + +Usage: + pip install pystackql + python tests/smoke_test.py # local provider-dev/openapi registry (default) + python tests/smoke_test.py --live # the published provider in the stackql registry + python tests/smoke_test.py --read-only # read smokes only, no writes + python tests/smoke_test.py --with-project-lifecycle # also the gated project create / pause / delete + python tests/smoke_test.py --cleanup-only # just sweep breadcrumbs +""" + +from __future__ import annotations + +import argparse +import json +import os +import re +import secrets as pysecrets +import sys +import time +from pathlib import Path + +BASE_DIR = Path(__file__).resolve().parents[1] +SMOKE_PREFIX = "stackql-smoke-" +SECRET_PREFIX = "STACKQL_SMOKE_" +FIXTURE_TABLE = "public.stackql_smoke_fixture" +INTER_REQUEST_DELAY_S = 1.2 # ~50 req/min, under the documented limit with margin (NOTES.md finding 6) +# x-stackQL-envVar server variable resolution (SUPABASE_PROJECT_ID) landed in +# stackql v0.10.601 (any-sdk v0.5.4-alpha01, stackql/stackql#707). pystackql +# manages its own stackql binary, so the harness upgrades it when older. +MIN_STACKQL_VERSION = (0, 10, 601) + +ERROR_RE = re.compile( + r"http response status code: [45]|over HTTP error|error assembling|" + r"cannot find matching operation|FindRoute|no matching operation|" + r"cannot find any viable servers|parser error|panic|" + r"no request body for operation|schema unsuitable|Unauthorized|Forbidden", + re.I, +) +RATE_LIMIT_RE = re.compile(r"status code: 429|Too Many Requests|rate limit", re.I) + + +class Smoke: + def __init__(self, args: argparse.Namespace) -> None: + self.args = args + self.stamp = str(int(time.time()))[-6:] + self.name = f"{SMOKE_PREFIX}{self.stamp}" + self.secret_name = f"{SECRET_PREFIX}{self.stamp}" + self.results: list[tuple[str, str, str]] = [] + self.requests = 0 + + for var in ("SUPABASE_ACCESS_TOKEN", "SUPABASE_PROJECT_ID"): + if not os.environ.get(var): + sys.exit(f"{var} is not set - see the module docstring") + self.ref = os.environ["SUPABASE_PROJECT_ID"] + + from pystackql import StackQL + + if not args.live: + reg_path = (BASE_DIR / "provider-dev" / "openapi").resolve() + reg_url = "file://" + reg_path.as_posix() + self.sq = StackQL(output="dict", custom_registry=reg_url) + # pystackql only serialises {"url": ...}; a local file registry + # additionally needs localDocRoot + nopVerify - patch the exec + # params in place (compact JSON, shell-quoted). + full = json.dumps( + {"url": reg_url, "localDocRoot": reg_path.as_posix(), "verifyConfig": {"nopVerify": True}}, + separators=(",", ":"), + ) + if sys.platform.startswith("win"): + quoted = '"' + full.replace('"', '\\"') + '"' + else: + import shlex + quoted = shlex.quote(full) + params = self.sq.local_query_executor.params + for i, p in enumerate(params): + if p == "--registry": + params[i + 1] = quoted + break + else: + self.sq = StackQL(output="dict") + self.ensure_stackql_version() + + def ensure_stackql_version(self) -> None: + def parse(v: str) -> tuple[int, ...]: + return tuple(int(x) for x in re.findall(r"\d+", str(v))[:3]) + + current = parse(getattr(self.sq, "version", "") or "") + if current and current >= MIN_STACKQL_VERSION: + return + print(f"stackql {self.sq.version} at {self.sq.bin_path} is older than " + f"v{'.'.join(map(str, MIN_STACKQL_VERSION))} (x-stackQL-envVar support) - upgrading pystackql's binary") + self.sq.upgrade(showprogress=False) + if parse(self.sq.version) < MIN_STACKQL_VERSION: + sys.exit(f"stackql {self.sq.version} is still too old after upgrade") + + # ------------------------------------------------------------------ core + def q(self, sql: str): + # serial pacing under the per-user rate limit + if self.requests: + time.sleep(INTER_REQUEST_DELAY_S) + self.requests += 1 + try: + if sql.lstrip().upper().startswith(("SELECT", "SHOW", "DESCRIBE")) or "RETURNING" in sql.upper(): + out = self.sq.execute(sql) + else: + out = self.sq.executeStmt(sql) + except Exception as exc: # noqa: BLE001 + return [], str(exc) + text = json.dumps(out, default=str) + if RATE_LIMIT_RE.search(text): + return out if isinstance(out, list) else [out], "RATE LIMITED (429) - harness pacing bug: " + text + if ERROR_RE.search(text): + return out if isinstance(out, list) else [out], text + if isinstance(out, list) and out and isinstance(out[0], dict) and "error" in out[0]: + return out, text + return out if isinstance(out, list) else [out], None + + def step(self, name: str, sql: str, expect_rows: bool = False, contains: str | None = None): + rows, err = self.q(sql) + if err: + self.results.append((name, "FAIL", err[:200])) + print(f" FAIL {name} [{err[:140]}]") + return None + blob = json.dumps(rows, default=str) + if expect_rows and not rows: + self.results.append((name, "FAIL", "expected rows, got none")) + print(f" FAIL {name} [no rows]") + return None + if contains and contains not in blob: + self.results.append((name, "FAIL", f"'{contains}' not in result")) + print(f" FAIL {name} ['{contains}' not in {blob[:100]}]") + return None + self.results.append((name, "PASS", "")) + print(f" PASS {name}") + return rows + + def note(self, name: str, ok: bool, detail: str = "") -> None: + self.results.append((name, "PASS" if ok else "FAIL", detail)) + print(f" {'PASS' if ok else 'FAIL'} {name}{(' [' + detail[:120] + ']') if detail and not ok else ''}") + + def wait_for(self, name: str, sql: str, pred, timeout: int = 900, interval: int = 15): + start = time.time() + last = None + while time.time() - start < timeout: + rows, err = self.q(sql) + last = err or json.dumps(rows, default=str)[:160] + if not err and pred(rows): + self.results.append((name, "PASS", f"{int(time.time() - start)}s")) + print(f" PASS {name} ({int(time.time() - start)}s)") + return True + time.sleep(interval) + self.results.append((name, "FAIL", f"timeout: {last}")) + print(f" FAIL {name} [timeout: {last}]") + return False + + @staticmethod + def rows_of(blob) -> list: + # the query endpoint result arrives as one row whose `rows` column + # carries the result set (JSON text or already-parsed) + if isinstance(blob, str): + try: + return json.loads(blob) + except ValueError: + return [] + return blob or [] + + # ------------------------------------------------------- breadcrumb sweep + def cleanup_breadcrumbs(self) -> None: + print("== breadcrumb sweep ==") + rows, err = self.q("SELECT name FROM supabase.secrets.secrets") + if err: + print(f" WARN secrets sweep list failed: {err[:120]}") + else: + for r in rows: + if str(r.get("name", "")).startswith(SECRET_PREFIX): + print(f" sweeping secret {r['name']}") + self.q(f"DELETE FROM supabase.secrets.secrets WHERE name = '{r['name']}'") + rows, err = self.q("SELECT slug FROM supabase.functions.edge_functions") + if err: + print(f" WARN functions sweep list failed: {err[:120]}") + else: + for r in rows: + if str(r.get("slug", "")).startswith(SMOKE_PREFIX): + print(f" sweeping edge function {r['slug']}") + self.q(f"DELETE FROM supabase.functions.edge_functions WHERE function_slug = '{r['slug']}'") + rows, err = self.q("SELECT id, name FROM supabase.secrets.api_keys") + if err: + print(f" WARN api keys sweep list failed: {err[:120]}") + else: + for r in rows: + if str(r.get("name", "")).startswith(SMOKE_PREFIX): + print(f" sweeping api key {r['name']}") + self.q(f"DELETE FROM supabase.secrets.api_keys WHERE id = '{r['id']}'") + self.q(f"INSERT INTO supabase.database.queries (query) SELECT 'drop table if exists {FIXTURE_TABLE}' RETURNING rows") + if self.args.with_project_lifecycle or self.args.cleanup_only: + rows, err = self.q("SELECT id, name, status FROM supabase.projects.projects") + if err: + print(f" WARN projects sweep list failed: {err[:120]}") + return + for r in rows: + if str(r.get("name", "")).startswith(SMOKE_PREFIX): + print(f" sweeping project {r['name']} ({r['id']}, {r.get('status')})") + self.q(f"DELETE FROM supabase.projects.projects WHERE ref = '{r['id']}'") + + # -------------------------------------------------------------- read path + def read_smokes(self) -> None: + print("== read smokes ==") + self.step("show services", "SHOW SERVICES IN supabase", expect_rows=True, contains="projects") + self.step("profile (the PAT identity)", "SELECT primary_email, username FROM supabase.profile.profiles", expect_rows=True) + orgs = self.step("organizations list", "SELECT id, slug, name FROM supabase.organizations.organizations", expect_rows=True) + self.step("projects estate inventory", "SELECT id, name, region, status, organization_slug FROM supabase.projects.projects", expect_rows=True, contains=self.ref) + self.step("project get (WHERE ref)", f"SELECT name, status, json_extract(\"database\", '$.version') AS pg FROM supabase.projects.projects WHERE ref = '{self.ref}'", expect_rows=True) + if orgs: + slug = orgs[0]["slug"] + self.step("organization projects ($.projects, slug scope)", f"SELECT ref, name, status FROM supabase.projects.organization_projects WHERE slug = '{slug}'", expect_rows=True) + self.step("organization members", f"SELECT user_name, role_name, mfa_enabled FROM supabase.organizations.members WHERE slug = '{slug}'", expect_rows=True) + # the posture set (ref resolved from SUPABASE_PROJECT_ID - no WHERE) + self.step("auth config posture (signups, MFA, password policy)", "SELECT disable_signup, mfa_totp_enroll_enabled, password_min_length, site_url, mailer_otp_exp FROM supabase.config.auth_configs", expect_rows=True) + self.step("postgres config (flat columns)", "SELECT max_connections, statement_timeout, work_mem FROM supabase.config.postgres_configs", expect_rows=True) + self.step("ssl enforcement (snake aliases)", "SELECT applied_successfully, json_extract(current_config, '$.database') AS db_ssl FROM supabase.config.ssl_enforcement_configs", expect_rows=True) + self.step("network restrictions", "SELECT entitlement, status, json_extract(config, '$.dbAllowedCidrs') AS cidrs FROM supabase.network.network_restrictions", expect_rows=True) + self.step("network bans (POST-backed read)", "SELECT banned_address, identifier FROM supabase.network.network_bans") + self.step("postgrest config", "SELECT db_schema, max_rows FROM supabase.config.postgrest_configs", expect_rows=True) + self.step("storage config (file_size_limit alias)", "SELECT file_size_limit, json_extract(features, '$.imageTransformation.enabled') AS image_transformation FROM supabase.config.storage_configs", expect_rows=True) + self.step("pooler config", "SELECT identifier, pool_mode, default_pool_size, db_host FROM supabase.config.pooler_configs", expect_rows=True) + self.step("secrets inventory", "SELECT name, updated_at FROM supabase.secrets.secrets") + self.step("api keys", "SELECT id, name, type FROM supabase.secrets.api_keys", expect_rows=True) + self.step("edge functions", "SELECT slug, name, status, verify_jwt FROM supabase.functions.edge_functions") + self.step("branches", "SELECT id, name, git_branch, persistent, status FROM supabase.branches.branches") + self.step("service health (services param)", "SELECT name, healthy, status FROM supabase.projects.service_health WHERE services = 'db'", expect_rows=True) + self.step("add-ons ($.selected_addons)", "SELECT type, json_extract(variant, '$.id') AS variant FROM supabase.billing.addons") + self.step("security lints ($.lints)", "SELECT name, level, title FROM supabase.advisors.security_lints") + self.step("backups ($.backups)", "SELECT id, status, inserted_at FROM supabase.database.backups") + self.step("storage buckets", "SELECT id, name, public FROM supabase.storage.buckets") + self.step("migrations", "SELECT version, name FROM supabase.database.migrations") + self.step("snippets (root path, cursor pagination)", "SELECT id, name FROM supabase.database.snippets") + + # ------------------------------------------------------------- write path + def secret_lifecycle(self) -> None: + name = self.secret_name + print(f"== secret lifecycle ({name}) ==") + self.step("secret INSERT (bare-array body wrapped)", f"INSERT INTO supabase.secrets.secrets (name, value) SELECT '{name}', 'smoke-{self.stamp}'") + rows, err = self.q("SELECT name FROM supabase.secrets.secrets") + self.note("secret visible after INSERT", not err and any(r.get("name") == name for r in rows), err or "not in list") + self.step("secret DELETE (bare-array body wrapped)", f"DELETE FROM supabase.secrets.secrets WHERE name = '{name}'") + rows, err = self.q("SELECT name FROM supabase.secrets.secrets") + self.note("secret gone after DELETE", not err and all(r.get("name") != name for r in rows), err or "") + + def api_key_lifecycle(self) -> None: + name = self.name + print(f"== API key lifecycle ({name}) ==") + self.step("api key INSERT (type secret)", f"INSERT INTO supabase.secrets.api_keys (type, name, description) SELECT 'secret', '{name}', 'stackql smoke'") + rows, err = self.q("SELECT id, name FROM supabase.secrets.api_keys") + key = next((r for r in rows or [] if r.get("name") == name), None) + self.note("api key visible after INSERT", bool(key), err or "not in list") + if not key: + return + self.step("api key get", f"SELECT name, type FROM supabase.secrets.api_keys WHERE id = '{key['id']}'", expect_rows=True, contains="secret") + self.step("api key UPDATE (description)", f"UPDATE supabase.secrets.api_keys SET description = 'stackql smoke v2' WHERE id = '{key['id']}'") + self.step("api key DELETE", f"DELETE FROM supabase.secrets.api_keys WHERE id = '{key['id']}'") + rows, err = self.q("SELECT id FROM supabase.secrets.api_keys") + self.note("api key gone after DELETE", not err and all(r.get("id") != key["id"] for r in rows), err or "") + + def edge_function_lifecycle(self) -> None: + slug = self.name + print(f"== edge function lifecycle ({slug}) - JSON create (vendor-deprecated in favour of the multipart deploy; the CLI is the deploy path) ==") + body = 'Deno.serve(() => new Response("stackql smoke"))' + self.step("edge function INSERT", f"INSERT INTO supabase.functions.edge_functions (slug, name, body, verify_jwt) SELECT '{slug}', 'stackql smoke', '{body}', true") + rows, err = self.q(f"SELECT slug, name, status FROM supabase.functions.edge_functions WHERE function_slug = '{slug}'") + if err or not rows: + self.note("edge function visible after INSERT", False, err or "not found") + return + self.note("edge function visible after INSERT", True) + self.step("edge function UPDATE (name)", f"UPDATE supabase.functions.edge_functions SET name = 'stackql smoke v2' WHERE function_slug = '{slug}'") + self.step("edge function reflects UPDATE", f"SELECT name FROM supabase.functions.edge_functions WHERE function_slug = '{slug}'", expect_rows=True, contains="v2") + self.step("edge function DELETE", f"DELETE FROM supabase.functions.edge_functions WHERE function_slug = '{slug}'") + + def auth_config_toggle(self) -> None: + print("== auth config toggle-and-restore (string-typed UPDATE probe, NOTES.md finding 14) ==") + rows, err = self.q("SELECT disable_signup FROM supabase.config.auth_configs") + if err or not rows: + self.note("auth config read before toggle", False, err or "no rows") + return + original = str(rows[0].get("disable_signup")).lower() in ("true", "1") + flipped = "false" if original else "true" + restore = "true" if original else "false" + rows, err = self.q(f"UPDATE supabase.config.auth_configs SET disable_signup = '{flipped}'") + if err: + self.note("auth config UPDATE with a string-typed boolean is accepted by the API", False, err) + return + rows, err = self.q("SELECT disable_signup FROM supabase.config.auth_configs") + toggled = not err and rows and str(rows[0].get("disable_signup")).lower() == flipped + self.note(f"auth config UPDATE (disable_signup {original} -> {flipped}) applied - the API coerces string-typed values", bool(toggled), err or json.dumps(rows, default=str)[:120]) + rows, err = self.q(f"UPDATE supabase.config.auth_configs SET disable_signup = '{restore}'") + rows2, err2 = self.q("SELECT disable_signup FROM supabase.config.auth_configs") + restored = not err and not err2 and rows2 and str(rows2[0].get("disable_signup")).lower() == restore + self.note("auth config restored", bool(restored), err or err2 or json.dumps(rows2, default=str)[:120]) + + def network_restrictions_reapply(self) -> None: + print("== network restrictions idempotent re-apply (EXEC with camelCase body) ==") + rows, err = self.q("SELECT json_extract(config, '$.dbAllowedCidrs') AS v4, json_extract(config, '$.dbAllowedCidrsV6') AS v6 FROM supabase.network.network_restrictions") + if err or not rows: + self.note("network restrictions read", False, err or "no rows") + return + v4 = rows[0].get("v4") or "[]" + v6 = rows[0].get("v6") or "[]" + v4 = v4 if isinstance(v4, str) else json.dumps(v4) + v6 = v6 if isinstance(v6, str) else json.dumps(v6) + self.step("network_restrictions.apply EXEC (re-applies the current allow-lists)", f"EXEC supabase.network.network_restrictions.apply @db_allowed_cidrs = '{v4}', @db_allowed_cidrs_v6 = '{v6}'") + self.step("network restrictions unchanged after re-apply", "SELECT status, json_extract(config, '$.dbAllowedCidrs') AS v4 FROM supabase.network.network_restrictions", expect_rows=True) + + def query_round_trip(self) -> None: + print("== database query round trip (the flagship) ==") + rows = self.step("queries.run INSERT ... RETURNING rows (select 1)", "INSERT INTO supabase.database.queries (query) SELECT 'select 1 as one' RETURNING rows", expect_rows=True) + if rows: + got = self.rows_of(rows[0].get("rows")) + self.note("select 1 result flows through the rows column", bool(got) and str(got[0].get("one")) == "1", json.dumps(rows, default=str)[:120]) + self.step("fixture table create", f"INSERT INTO supabase.database.queries (query) SELECT 'create table if not exists {FIXTURE_TABLE} (id int primary key, label text, created_at timestamptz default now())' RETURNING rows") + self.step("fixture rows insert", f"INSERT INTO supabase.database.queries (query) SELECT 'insert into {FIXTURE_TABLE} (id, label) values (1, ''alpha''), (2, ''beta'') on conflict do nothing' RETURNING rows") + rows = self.step("fixture select through the query endpoint", f"INSERT INTO supabase.database.queries (query) SELECT 'select id, label from {FIXTURE_TABLE} order by id' RETURNING rows", expect_rows=True) + if rows: + got = self.rows_of(rows[0].get("rows")) + self.note("fixture rows projected (2 rows, json_extract-addressable)", len(got) == 2 and got[1].get("label") == "beta", json.dumps(got, default=str)[:120]) + self.step("queries.run_read_only EXEC", f"EXEC supabase.database.queries.run_read_only @query = 'select count(*) from {FIXTURE_TABLE}'") + self.step("read_only flag on the main method", f"INSERT INTO supabase.database.queries (query, read_only) SELECT 'select count(*) as n from {FIXTURE_TABLE}', true RETURNING rows", expect_rows=True) + self.step("fixture table drop", f"INSERT INTO supabase.database.queries (query) SELECT 'drop table if exists {FIXTURE_TABLE}' RETURNING rows") + + def project_lifecycle(self) -> None: + name = self.name + print(f"== project lifecycle ({name}) - gated: minutes per step, free-tier quota ==") + orgs, err = self.q("SELECT slug FROM supabase.organizations.organizations") + proj, err2 = self.q(f"SELECT organization_slug, region FROM supabase.projects.projects WHERE ref = '{self.ref}'") + if err or err2 or not orgs or not proj: + self.note("project lifecycle prerequisites (org slug, region)", False, err or err2 or "no rows") + return + slug = proj[0].get("organization_slug") or orgs[0]["slug"] + region = proj[0].get("region") or "us-east-1" + db_pass = pysecrets.token_urlsafe(24) + self.step("project INSERT (free plan, standing project's org and region)", f"INSERT INTO supabase.projects.projects (name, organization_slug, region, db_pass, plan) SELECT '{name}', '{slug}', '{region}', '{db_pass}', 'free'") + found: dict = {} + + def seen(rows): + p = next((r for r in rows if r.get("name") == name), None) + if p: + found.update(p) + return bool(p) + + if not self.wait_for("project visible after INSERT", "SELECT id, name, status FROM supabase.projects.projects", seen, timeout=120, interval=10): + return + ref = found["id"] + try: + self.wait_for("project ACTIVE_HEALTHY", f"SELECT status FROM supabase.projects.projects WHERE ref = '{ref}'", lambda rows: rows and rows[0].get("status") == "ACTIVE_HEALTHY") + self.step("new project auth config read", f"SELECT disable_signup FROM supabase.config.auth_configs WHERE ref = '{ref}'", expect_rows=True) + self.step("project EXEC pause", f"EXEC supabase.projects.projects.pause @ref = '{ref}'") + self.wait_for("project INACTIVE after pause", f"SELECT status FROM supabase.projects.projects WHERE ref = '{ref}'", lambda rows: rows and rows[0].get("status") == "INACTIVE") + finally: + self.step("project DELETE", f"DELETE FROM supabase.projects.projects WHERE ref = '{ref}'") + self.wait_for("project gone", "SELECT id FROM supabase.projects.projects", lambda rows: all(r.get("id") != ref for r in rows), timeout=300) + + # ---------------------------------------------------------------- summary + def summary(self) -> int: + print("\n== summary ==") + counts = {"PASS": 0, "FAIL": 0} + for name, status, note in self.results: + counts[status] = counts.get(status, 0) + 1 + if status != "PASS": + print(f" {status:5s} {name} [{note[:110]}]") + print(f" {counts['PASS']} passed, {counts['FAIL']} failed; {self.requests} statements, paced at {INTER_REQUEST_DELAY_S}s " + f"(registry: {'public' if self.args.live else 'local'}, project: {self.ref})") + return 1 if counts["FAIL"] else 0 + + +def main() -> int: + ap = argparse.ArgumentParser(description="supabase provider smoke test") + ap.add_argument("--live", action="store_true", help="run against the published provider in the stackql registry (default: the local provider-dev/openapi file registry)") + ap.add_argument("--cleanup-only", action="store_true", help="sweep stackql-smoke-* breadcrumbs and exit") + ap.add_argument("--read-only", action="store_true", help="read smokes only") + ap.add_argument("--with-project-lifecycle", action="store_true", + help="also run the gated project create / pause / delete lifecycle (off by default: minutes per step, free-tier quota)") + args = ap.parse_args() + + smoke = Smoke(args) + print(f"supabase smoke test registry={'public' if args.live else 'local'} project={smoke.ref} " + f"name={smoke.name} stackql={smoke.sq.version}") + smoke.cleanup_breadcrumbs() + if args.cleanup_only: + return 0 + smoke.read_smokes() + if not args.read_only: + smoke.secret_lifecycle() + smoke.api_key_lifecycle() + smoke.edge_function_lifecycle() + smoke.auth_config_toggle() + smoke.network_restrictions_reapply() + smoke.query_round_trip() + if args.with_project_lifecycle: + smoke.project_lifecycle() + return smoke.summary() + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/website/.gitkeep b/website/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/website/docs/index.md b/website/docs/index.md new file mode 100644 index 0000000..b78605c --- /dev/null +++ b/website/docs/index.md @@ -0,0 +1,250 @@ +--- +title: supabase +hide_title: false +hide_table_of_contents: false +keywords: + - supabase + - supabase management api + - postgres + - edge functions + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory + - security posture +description: Query, provision and manage Supabase organizations, projects, branches, edge functions, secrets, auth and Postgres configuration, network restrictions and the project database itself using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +id: 'provider-intro' +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; + +Query, provision and operate the Supabase control plane using SQL - organizations and members, the project estate, preview branches, edge functions, secrets and API keys, project configuration (auth, Postgres, pooler, API, storage, realtime, SSL enforcement), custom domains, network restrictions and bans, backups and restore points, add-ons, security and performance advisors, and the project SQL query endpoint, so the control plane and the project database itself are queryable in one place. The project security posture (which projects allow signups, lack MFA or SSL enforcement, or accept connections from anywhere) and the estate inventory are the queries this provider exists for. + + +:::info[Provider Summary] + +total services: __14__ +total resources: __65__ + +::: + +See also: +[[` SHOW `]](https://stackql.io/docs/language-spec/show) [[` DESCRIBE `]](https://stackql.io/docs/language-spec/describe) [[` REGISTRY `]](https://stackql.io/docs/language-spec/registry) +* * * + +## Installation + +To pull the latest version of the `supabase` provider, run the following command: + +```bash +REGISTRY PULL supabase; +``` +> To view previous provider versions or to pull a specific provider version, see [here](https://stackql.io/docs/language-spec/registry). + +## Scope + +This provider covers the Supabase Management API at `https://api.supabase.com` (the control plane): organizations, projects, branches, functions, secrets, configuration, domains, networking, backups, billing add-ons, advisors, analytics and the project SQL query endpoint. The per-project data APIs (PostgREST at `.supabase.co/rest/v1`, Realtime, Storage object I/O, GoTrue user-facing auth) are per-project hosts with per-project keys - a different surface, reserved as a possible future `supabase_project` sibling provider. Supabase's official Terraform provider is labelled Public Alpha by the vendor and covers seven resources; this provider's surface is generated mechanically from the vendor's published OpenAPI document (159 operations across 15 services). + +## Authentication + +The provider authenticates with a personal access token as a bearer token. Create one in the Supabase dashboard under Account -> Access Tokens, export it as (the same variable the Supabase CLI and the Terraform provider read), and StackQL picks it up with no further configuration: + +```bash +export SUPABASE_ACCESS_TOKEN='sbp_...' +export SUPABASE_PROJECT_ID='abcdefghijklmnopqrst' # optional, see project scope +``` + +or using PowerShell: + +```powershell +$env:SUPABASE_ACCESS_TOKEN = 'sbp_...' +$env:SUPABASE_PROJECT_ID = 'abcdefghijklmnopqrst' +``` + +## Project scope + +Most resources are scoped to a project, addressed by its reference (`ref` - the Project ID shown in the dashboard under Settings -> General). `ref` is a server variable resolved from the environment variable when it is set, so queries against one project need no `WHERE ref` clause: + +```sql +SELECT disable_signup, mfa_totp_enroll_enabled, password_min_length +FROM supabase.config.auth_configs; +``` + +A `WHERE ref = '...'` value always takes precedence over the environment, which is how a single session addresses several projects. With the variable unset, `ref` is a required parameter on every project-scoped method (visible in `SHOW METHODS`) and must be supplied per query. To discover project refs: + +```sql +SELECT id, name, region, status, organization_slug FROM supabase.projects.projects; +``` + +Organization resources scope by `slug`; preview branches by `branch_id_or_ref`. + +## Rate limit + +The Management API allows a fixed number of requests per minute per user (documented as 120, with lower limits on analytics and database context endpoints) and answers `429 Too Many Requests` for the remainder of the minute. Queries that fan out across many projects (a config read for every project in the estate) consume the budget quickly; sequence wide scans rather than issuing them in parallel. + +## Beta endpoints + +The vendor labels part of the surface `[Beta]` (and one endpoint `[Alpha]`); the label is carried through as the first line of each method's description. The query endpoint, network restrictions and bans, custom domains, SSL enforcement, read replicas, JIT access and the upgrade surface are beta. A few operations are deprecated by the vendor (the advisors reads, `logs.all`, the database context read and the JSON edge function create) and stay mapped with the deprecation noted. Refreshes of the provider are reviewed spec diffs against a content-hash pin. + +## Example queries + +### Project estate inventory + +Every project the token can see, with status and region: + +```sql +SELECT id, name, region, status, organization_slug, created_at +FROM supabase.projects.projects +ORDER BY organization_slug, name; +``` + +### Project security posture in four statements + +With `SUPABASE_PROJECT_ID` set to the project under review. Signups, MFA and password policy: + +```sql +SELECT disable_signup, external_anonymous_users_enabled, + mfa_totp_enroll_enabled, mfa_phone_enroll_enabled, + password_min_length, password_hibp_enabled, mailer_otp_exp +FROM supabase.config.auth_configs; +``` + +SSL enforcement on the database: + +```sql +SELECT applied_successfully, + json_extract(current_config, '$.database') AS ssl_enforced +FROM supabase.config.ssl_enforcement_configs; +``` + +Network restrictions - `0.0.0.0/0` means any address may reach the database: + +```sql +SELECT entitlement, status, + json_extract(config, '$.dbAllowedCidrs') AS allowed_v4, + json_extract(config, '$.dbAllowedCidrsV6') AS allowed_v6 +FROM supabase.network.network_restrictions; +``` + +The vendor's own security lints for the project: + +```sql +SELECT name, level, title, json_extract(metadata, '$.name') AS object +FROM supabase.advisors.security_lints +WHERE level = 'ERROR'; +``` + +To review several projects in one statement, address each by `ref`: + +```sql +SELECT 'abcdefghijklmnopqrst' AS ref, disable_signup, mfa_totp_enroll_enabled +FROM supabase.config.auth_configs WHERE ref = 'abcdefghijklmnopqrst' +UNION ALL +SELECT 'tsrqponmlkjihgfedcba', disable_signup, mfa_totp_enroll_enabled +FROM supabase.config.auth_configs WHERE ref = 'tsrqponmlkjihgfedcba'; +``` + +### Control plane to Postgres rows in two statements + +List the projects, then query one of them. The query endpoint runs arbitrary SQL against the project database as the service role; the result rows depend on the statement and arrive as one row whose `rows` column carries the result set: + +```sql +SELECT id, name FROM supabase.projects.projects; + +INSERT INTO supabase.database.queries (ref, query) +SELECT 'abcdefghijklmnopqrst', + 'select schemaname, relname, n_live_tup from pg_stat_user_tables order by n_live_tup desc limit 10' +RETURNING rows; +``` + +Address values in the result with `json_extract(rows, '$[0].relname')`. The statement is executed as written - a `drop table` is a `drop table`; prefer the `read_only` flag (`INSERT ... (ref, query, read_only) SELECT ..., true`) or the `run_read_only` method for inspection queries. + +### Secrets and function inventory + +```sql +SELECT name, updated_at FROM supabase.secrets.secrets; + +SELECT slug, name, status, verify_jwt, version +FROM supabase.functions.edge_functions; +``` + +### Branch hygiene + +Preview branches that are not persistent and have not been updated recently: + +```sql +SELECT name, git_branch, status, persistent, updated_at +FROM supabase.branches.branches +WHERE persistent = false +ORDER BY updated_at; +``` + +### Provisioning + +Secrets are created one per statement (the wire call is the bulk endpoint): + +```sql +INSERT INTO supabase.secrets.secrets (name, value) +SELECT 'STRIPE_WEBHOOK_SECRET', 'whsec_...'; + +DELETE FROM supabase.secrets.secrets WHERE name = 'STRIPE_WEBHOOK_SECRET'; +``` + +Configuration is updated in place (`UPDATE` sends only the columns you set; values are sent as strings): + +```sql +UPDATE supabase.config.auth_configs +SET disable_signup = 'true', password_min_length = '12'; +``` + +Network restrictions are applied with an `EXEC` (the body takes the allow-lists as JSON arrays): + +```sql +EXEC supabase.network.network_restrictions.apply + @db_allowed_cidrs = '["203.0.113.0/24"]', + @db_allowed_cidrs_v6 = '[]'; +``` + +Project lifecycle operations are `EXEC` methods on `projects.projects`: + +```sql +EXEC supabase.projects.projects.pause @ref = 'abcdefghijklmnopqrst'; +EXEC supabase.projects.projects.restore @ref = 'abcdefghijklmnopqrst'; +``` + +### The serverless Postgres estate + +Supabase projects alongside Neon projects, once the `neon` provider ships: + +```sql +SELECT 'supabase' AS platform, name, region, status +FROM supabase.projects.projects +UNION ALL +SELECT 'neon', name, region_id, NULL +FROM neon.projects.projects; +``` + + +## Services + diff --git a/website/docs/services/advisors/index.md b/website/docs/services/advisors/index.md new file mode 100644 index 0000000..987131d --- /dev/null +++ b/website/docs/services/advisors/index.md @@ -0,0 +1,33 @@ +--- +title: advisors +hide_title: false +hide_table_of_contents: false +keywords: + - advisors + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +advisors service documentation. + +:::info[Service Summary] + +total resources: __2__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/advisors/performance_lints/index.md b/website/docs/services/advisors/performance_lints/index.md new file mode 100644 index 0000000..46b7991 --- /dev/null +++ b/website/docs/services/advisors/performance_lints/index.md @@ -0,0 +1,188 @@ +--- +title: performance_lints +hide_title: false +hide_table_of_contents: false +keywords: + - performance_lints + - advisors + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a performance_lints resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (unindexed_foreign_keys, auth_users_exposed, auth_rls_initplan, no_primary_key, unused_index, multiple_permissive_policies, policy_exists_rls_disabled, rls_enabled_no_policy, duplicate_index, security_definer_view, function_search_path_mutable, rls_disabled_in_public, extension_in_public, rls_references_user_metadata, materialized_view_in_api, foreign_table_in_api, unsupported_reg_types, auth_otp_long_expiry, auth_otp_short_length, ssl_not_enforced, log_connections_not_enabled, network_restrictions_not_set, password_requirements_min_length, pitr_not_enabled, auth_leaked_password_protection, auth_insufficient_mfa_options, auth_password_policy_missing, leaked_service_key, no_backup_admin, vulnerable_postgres_version, db_not_reachable, db_connection_failing, db_connection_limit_reached, instance_telemetry_lost, instance_db_down, instance_alert_firing, log_service_error_rate_high, project_not_active, advisor_check_unavailable)
string
array
string
string
string (EXTERNAL)
string (ERROR, WARN, INFO)
object
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
refThis is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable. + +```sql +SELECT +name, +cache_key, +categories, +description, +detail, +facing, +level, +metadata, +observed_at, +remediation, +title +FROM supabase.advisors.performance_lints +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/advisors/security_lints/index.md b/website/docs/services/advisors/security_lints/index.md new file mode 100644 index 0000000..238dcf6 --- /dev/null +++ b/website/docs/services/advisors/security_lints/index.md @@ -0,0 +1,194 @@ +--- +title: security_lints +hide_title: false +hide_table_of_contents: false +keywords: + - security_lints + - advisors + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a security_lints resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (unindexed_foreign_keys, auth_users_exposed, auth_rls_initplan, no_primary_key, unused_index, multiple_permissive_policies, policy_exists_rls_disabled, rls_enabled_no_policy, duplicate_index, security_definer_view, function_search_path_mutable, rls_disabled_in_public, extension_in_public, rls_references_user_metadata, materialized_view_in_api, foreign_table_in_api, unsupported_reg_types, auth_otp_long_expiry, auth_otp_short_length, ssl_not_enforced, log_connections_not_enabled, network_restrictions_not_set, password_requirements_min_length, pitr_not_enabled, auth_leaked_password_protection, auth_insufficient_mfa_options, auth_password_policy_missing, leaked_service_key, no_backup_admin, vulnerable_postgres_version, db_not_reachable, db_connection_failing, db_connection_limit_reached, instance_telemetry_lost, instance_db_down, instance_alert_firing, log_service_error_rate_high, project_not_active, advisor_check_unavailable)
string
array
string
string
string (EXTERNAL)
string (ERROR, WARN, INFO)
object
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
reflint_typeThis is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string
+ +## `SELECT` examples + + + + +This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable. + +```sql +SELECT +name, +cache_key, +categories, +description, +detail, +facing, +level, +metadata, +observed_at, +remediation, +title +FROM supabase.advisors.security_lints +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND lint_type = '{{ lint_type }}' +; +``` + + diff --git a/website/docs/services/analytics/all_logs/index.md b/website/docs/services/analytics/all_logs/index.md new file mode 100644 index 0000000..7e767a6 --- /dev/null +++ b/website/docs/services/analytics/all_logs/index.md @@ -0,0 +1,152 @@ +--- +title: all_logs +hide_title: false +hide_table_of_contents: false +keywords: + - all_logs + - analytics + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an all_logs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
refsql, iso_timestamp_start, iso_timestamp_endExecutes a SQL query on the project's logs.<br /><br />Either the `iso_timestamp_start` and `iso_timestamp_end` parameters must be provided.<br />If both are not provided, only the last 1 minute of logs will be queried.<br />The timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown.<br /><br />Note: Unless the `sql` parameter is provided, only edge_logs will be queried. See the [log query docs](https:​//supabase.com/docs/guides/monitoring-and-debugging/logs#logs-explorer) for all available sources.<br />
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string (date-time)
string (date-time)
stringCustom SQL query to execute on the logs. See [querying logs](https:​//supabase.com/docs/guides/monitoring-and-debugging/logs#querying-with-the-logs-explorer) for more details.
+ +## `SELECT` examples + + + + +Executes a SQL query on the project's logs.<br /><br />Either the `iso_timestamp_start` and `iso_timestamp_end` parameters must be provided.<br />If both are not provided, only the last 1 minute of logs will be queried.<br />The timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown.<br /><br />Note: Unless the `sql` parameter is provided, only edge_logs will be queried. See the [log query docs](https:​//supabase.com/docs/guides/monitoring-and-debugging/logs#logs-explorer) for all available sources.<br /> + +```sql +SELECT +error, +result +FROM supabase.analytics.all_logs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND sql = '{{ sql }}' +AND iso_timestamp_start = '{{ iso_timestamp_start }}' +AND iso_timestamp_end = '{{ iso_timestamp_end }}' +; +``` + + diff --git a/website/docs/services/analytics/api_counts/index.md b/website/docs/services/analytics/api_counts/index.md new file mode 100644 index 0000000..aff3e15 --- /dev/null +++ b/website/docs/services/analytics/api_counts/index.md @@ -0,0 +1,140 @@ +--- +title: api_counts +hide_title: false +hide_table_of_contents: false +keywords: + - api_counts + - analytics + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an api_counts resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
refinterval
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +error, +result +FROM supabase.analytics.api_counts +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND interval = '{{ interval }}' +; +``` + + diff --git a/website/docs/services/analytics/api_request_counts/index.md b/website/docs/services/analytics/api_request_counts/index.md new file mode 100644 index 0000000..235beb2 --- /dev/null +++ b/website/docs/services/analytics/api_request_counts/index.md @@ -0,0 +1,134 @@ +--- +title: api_request_counts +hide_title: false +hide_table_of_contents: false +keywords: + - api_request_counts + - analytics + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an api_request_counts resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +error, +result +FROM supabase.analytics.api_request_counts +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/analytics/function_stats/index.md b/website/docs/services/analytics/function_stats/index.md new file mode 100644 index 0000000..8f40353 --- /dev/null +++ b/website/docs/services/analytics/function_stats/index.md @@ -0,0 +1,146 @@ +--- +title: function_stats +hide_title: false +hide_table_of_contents: false +keywords: + - function_stats + - analytics + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a function_stats resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
interval, function_id, ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +error, +result +FROM supabase.analytics.function_stats +WHERE interval = '{{ interval }}' -- required +AND function_id = '{{ function_id }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/analytics/index.md b/website/docs/services/analytics/index.md new file mode 100644 index 0000000..08e6a62 --- /dev/null +++ b/website/docs/services/analytics/index.md @@ -0,0 +1,36 @@ +--- +title: analytics +hide_title: false +hide_table_of_contents: false +keywords: + - analytics + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +analytics service documentation. + +:::info[Service Summary] + +total resources: __5__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/analytics/logs/index.md b/website/docs/services/analytics/logs/index.md new file mode 100644 index 0000000..a559c71 --- /dev/null +++ b/website/docs/services/analytics/logs/index.md @@ -0,0 +1,152 @@ +--- +title: logs +hide_title: false +hide_table_of_contents: false +keywords: + - logs + - analytics + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a logs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
refsql, iso_timestamp_start, iso_timestamp_endExecutes an SQL or LQL query on the project's unified logs stream.<br /><br />Either the `iso_timestamp_start` and `iso_timestamp_end` parameters must be provided.<br />If both are not provided, only the last 1 minute of logs will be queried.<br />The timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown.<br /><br />Filter by the `source` column to specify specific log sources, such as edge_logs, postgres_logs, etc.<br /><br />Note: SQL must be written in **ClickHouse SQL dialect**.<br />
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string (date-time)
string (date-time)
stringCustom SQL query to execute on the logs. See [querying logs](https:​//supabase.com/docs/guides/monitoring-and-debugging/logs#querying-with-the-logs-explorer) for more details.
+ +## `SELECT` examples + + + + +Executes an SQL or LQL query on the project's unified logs stream.<br /><br />Either the `iso_timestamp_start` and `iso_timestamp_end` parameters must be provided.<br />If both are not provided, only the last 1 minute of logs will be queried.<br />The timestamp range must be no more than 24 hours and is rounded to the nearest minute. If the range is more than 24 hours, a validation error will be thrown.<br /><br />Filter by the `source` column to specify specific log sources, such as edge_logs, postgres_logs, etc.<br /><br />Note: SQL must be written in **ClickHouse SQL dialect**.<br /> + +```sql +SELECT +error, +result +FROM supabase.analytics.logs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND sql = '{{ sql }}' +AND iso_timestamp_start = '{{ iso_timestamp_start }}' +AND iso_timestamp_end = '{{ iso_timestamp_end }}' +; +``` + + diff --git a/website/docs/services/billing/addons/index.md b/website/docs/services/billing/addons/index.md new file mode 100644 index 0000000..ef5867e --- /dev/null +++ b/website/docs/services/billing/addons/index.md @@ -0,0 +1,201 @@ +--- +title: addons +hide_title: false +hide_table_of_contents: false +keywords: + - addons + - billing + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an addons resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (custom_domain, compute_instance, pitr, ipv4, auth_mfa_phone, auth_mfa_web_authn, log_drain, etl_pipeline)
object
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
refReturns the billing addons that are currently applied, including the active compute instance size, and lists every addon option that can be provisioned with pricing metadata.
ref, addon_variant, addon_typeSelects an addon variant, for example scaling the project’s compute instance up or down, and applies it to the project.
addon_variant, refDisables the selected addon variant, including rolling the compute instance back to its previous size.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +Returns the billing addons that are currently applied, including the active compute instance size, and lists every addon option that can be provisioned with pricing metadata. + +```sql +SELECT +type, +variant +FROM supabase.billing.addons +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +Selects an addon variant, for example scaling the project’s compute instance up or down, and applies it to the project. + +```sql +UPDATE supabase.billing.addons +SET +addon_variant = '{{ addon_variant }}', +addon_type = '{{ addon_type }}' +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND addon_variant = '{{ addon_variant }}' --required +AND addon_type = '{{ addon_type }}' --required; +``` + + + + +## `DELETE` examples + + + + +Disables the selected addon variant, including rolling the compute instance back to its previous size. + +```sql +DELETE FROM supabase.billing.addons +WHERE addon_variant = '{{ addon_variant }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/billing/index.md b/website/docs/services/billing/index.md new file mode 100644 index 0000000..96b5307 --- /dev/null +++ b/website/docs/services/billing/index.md @@ -0,0 +1,33 @@ +--- +title: billing +hide_title: false +hide_table_of_contents: false +keywords: + - billing + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +billing service documentation. + +:::info[Service Summary] + +total resources: __1__ + +::: + +## Resources +
+
+addons +
+
+ +
+
\ No newline at end of file diff --git a/website/docs/services/branches/action_runs/index.md b/website/docs/services/branches/action_runs/index.md new file mode 100644 index 0000000..d382bbd --- /dev/null +++ b/website/docs/services/branches/action_runs/index.md @@ -0,0 +1,311 @@ +--- +title: action_runs +hide_title: false +hide_table_of_contents: false +keywords: + - action_runs + - branches + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an action_runs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
number
string
array
string
string
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
number
string
array
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
run_id, refReturns the current status of the specified action run.
refoffset, limitReturns a paginated list of action runs of the specified project.
run_id, refUpdates the status of an ongoing action run.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
stringAction Run ID
number
number
+ +## `SELECT` examples + + + + +Returns the current status of the specified action run. + +```sql +SELECT +id, +branch_id, +check_run_id, +created_at, +git_config, +run_steps, +updated_at, +workdir +FROM supabase.branches.action_runs +WHERE run_id = '{{ run_id }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + +Returns a paginated list of action runs of the specified project. + +```sql +SELECT +id, +branch_id, +check_run_id, +created_at, +git_config, +run_steps, +updated_at, +workdir +FROM supabase.branches.action_runs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND offset = '{{ offset }}' +AND limit = '{{ limit }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Updates the status of an ongoing action run. + +```sql +EXEC supabase.branches.action_runs.update_status +@run_id='{{ run_id }}' --required, +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"clone": "{{ clone }}", +"pull": "{{ pull }}", +"health": "{{ health }}", +"configure": "{{ configure }}", +"migrate": "{{ migrate }}", +"seed": "{{ seed }}", +"deploy": "{{ deploy }}" +}' +; +``` + + diff --git a/website/docs/services/branches/branch_configs/index.md b/website/docs/services/branches/branch_configs/index.md new file mode 100644 index 0000000..cc37404 --- /dev/null +++ b/website/docs/services/branches/branch_configs/index.md @@ -0,0 +1,188 @@ +--- +title: branch_configs +hide_title: false +hide_table_of_contents: false +keywords: + - branch_configs + - branches + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a branch_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
integer
string
string
string
string
string
string
string (INACTIVE, ACTIVE_HEALTHY, ACTIVE_UNHEALTHY, COMING_UP, UNKNOWN, GOING_DOWN, INIT_FAILED, REMOVED, RESTORING, UPGRADING, PAUSING, RESTORE_FAILED, RESTARTING, PAUSE_FAILED, RESIZING)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
branch_id_or_ref, refFetches configurations of the specified database branch
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
Branch ref or deprecated branch ID
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +Fetches configurations of the specified database branch + +```sql +SELECT +db_host, +db_pass, +db_port, +db_user, +jwt_secret, +postgres_engine, +postgres_version, +ref, +release_channel, +status +FROM supabase.branches.branch_configs +WHERE branch_id_or_ref = '{{ branch_id_or_ref }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/branches/branches/index.md b/website/docs/services/branches/branches/index.md new file mode 100644 index 0000000..0179773 --- /dev/null +++ b/website/docs/services/branches/branches/index.md @@ -0,0 +1,693 @@ +--- +title: branches +hide_title: false +hide_table_of_contents: false +keywords: + - branches + - branches + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a branches resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid) (pattern: <code>^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$</code>)
string
numberThis field is deprecated and will not be populated.
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string
boolean
string (uri)
string
boolean
integer (int32)
string (INACTIVE, ACTIVE_HEALTHY, ACTIVE_UNHEALTHY, COMING_UP, UNKNOWN, GOING_DOWN, INIT_FAILED, REMOVED, RESTORING, UPGRADING, PAUSING, RESTORE_FAILED, RESTARTING, PAUSE_FAILED, RESIZING)
string
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
stringThis field is deprecated. List action runs to get branch status instead. (CREATING_PROJECT, RUNNING_MIGRATIONS, MIGRATIONS_PASSED, MIGRATIONS_FAILED, FUNCTIONS_DEPLOYED, FUNCTIONS_FAILED)
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
boolean
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid) (pattern: <code>^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$</code>)
string
numberThis field is deprecated and will not be populated.
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string
boolean
string (uri)
string
boolean
integer (int32)
string (INACTIVE, ACTIVE_HEALTHY, ACTIVE_UNHEALTHY, COMING_UP, UNKNOWN, GOING_DOWN, INIT_FAILED, REMOVED, RESTORING, UPGRADING, PAUSING, RESTORE_FAILED, RESTARTING, PAUSE_FAILED, RESIZING)
string
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
stringThis field is deprecated. List action runs to get branch status instead. (CREATING_PROJECT, RUNNING_MIGRATIONS, MIGRATIONS_PASSED, MIGRATIONS_FAILED, FUNCTIONS_DEPLOYED, FUNCTIONS_FAILED)
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
boolean
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
name, refFetches the specified database branch by its name.
refReturns all database branches of the specified project.
ref, branch_nameCreates a database branch from the specified project.
branch_id_or_ref, refUpdates the configuration of the specified database branch
branch_id_or_ref, refforceDeletes the specified database branch. By default, deletes immediately. Use force=false to schedule deletion with 1-hour grace period (only when soft deletion is enabled).
branch_id_or_ref, refPushes the specified database branch
branch_id_or_ref, refMerges the specified database branch
branch_id_or_ref, refResets the specified database branch
branch_id_or_ref, refCancels scheduled deletion and restores the branch to active state
refDisables preview branching for the specified project
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
Branch ref or deprecated branch ID
string
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
stringIf set to false, schedule deletion with 1-hour grace period (only when soft deletion is enabled).
+ +## `SELECT` examples + + + + +Fetches the specified database branch by its name. + +```sql +SELECT +id, +name, +latest_check_run_id, +created_at, +deletion_scheduled_at, +git_branch, +is_default, +notify_url, +parent_project_ref, +persistent, +pr_number, +preview_project_status, +project_ref, +review_requested_at, +status, +updated_at, +with_data +FROM supabase.branches.branches +WHERE name = '{{ name }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + +Returns all database branches of the specified project. + +```sql +SELECT +id, +name, +latest_check_run_id, +created_at, +deletion_scheduled_at, +git_branch, +is_default, +notify_url, +parent_project_ref, +persistent, +pr_number, +preview_project_status, +project_ref, +review_requested_at, +status, +updated_at, +with_data +FROM supabase.branches.branches +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +Creates a database branch from the specified project. + +```sql +INSERT INTO supabase.branches.branches ( +branch_name, +git_branch, +is_default, +persistent, +region, +desired_instance_size, +release_channel, +postgres_engine, +secrets, +with_data, +notify_url, +ref +) +SELECT +'{{ branch_name }}' /* required */, +'{{ git_branch }}', +{{ is_default }}, +{{ persistent }}, +'{{ region }}', +'{{ desired_instance_size }}', +'{{ release_channel }}', +'{{ postgres_engine }}', +'{{ secrets }}', +{{ with_data }}, +'{{ notify_url }}', +'{{ ref }}' +RETURNING +id, +name, +latest_check_run_id, +created_at, +deletion_scheduled_at, +git_branch, +is_default, +notify_url, +parent_project_ref, +persistent, +pr_number, +preview_project_status, +project_ref, +review_requested_at, +status, +updated_at, +with_data +; +``` + + + +{`# Description fields are for documentation purposes +- name: branches + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the branches resource. + - name: branch_name + value: "{{ branch_name }}" + - name: git_branch + value: "{{ git_branch }}" + - name: is_default + value: {{ is_default }} + - name: persistent + value: {{ persistent }} + - name: region + value: "{{ region }}" + - name: desired_instance_size + value: "{{ desired_instance_size }}" + valid_values: ['pico', 'nano', 'micro', 'small', 'medium', 'large', 'xlarge', '2xlarge', '4xlarge', '8xlarge', '12xlarge', '16xlarge', '24xlarge', '24xlarge_optimized_memory', '24xlarge_optimized_cpu', '24xlarge_high_memory', '48xlarge', '48xlarge_optimized_memory', '48xlarge_optimized_cpu', '48xlarge_high_memory'] + - name: release_channel + value: "{{ release_channel }}" + description: | + Release channel. If not provided, GA will be used. + valid_values: ['internal', 'alpha', 'beta', 'ga', 'withdrawn', 'preview'] + - name: postgres_engine + value: "{{ postgres_engine }}" + description: | + Postgres engine version. If not provided, the latest version will be used. + valid_values: ['15', '17', '17-oriole'] + - name: secrets + value: "{{ secrets }}" + - name: with_data + value: {{ with_data }} + - name: notify_url + value: "{{ notify_url }}" + description: | + HTTP endpoint to receive branch status updates. +`} + + + + + +## `UPDATE` examples + + + + +Updates the configuration of the specified database branch + +```sql +UPDATE supabase.branches.branches +SET +branch_name = '{{ branch_name }}', +git_branch = '{{ git_branch }}', +reset_on_push = {{ reset_on_push }}, +persistent = {{ persistent }}, +status = '{{ status }}', +request_review = {{ request_review }}, +notify_url = '{{ notify_url }}' +WHERE +branch_id_or_ref = '{{ branch_id_or_ref }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +RETURNING +id, +name, +latest_check_run_id, +created_at, +deletion_scheduled_at, +git_branch, +is_default, +notify_url, +parent_project_ref, +persistent, +pr_number, +preview_project_status, +project_ref, +review_requested_at, +status, +updated_at, +with_data; +``` + + + + +## `DELETE` examples + + + + +Deletes the specified database branch. By default, deletes immediately. Use force=false to schedule deletion with 1-hour grace period (only when soft deletion is enabled). + +```sql +DELETE FROM supabase.branches.branches +WHERE branch_id_or_ref = '{{ branch_id_or_ref }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND force = '{{ force }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Pushes the specified database branch + +```sql +EXEC supabase.branches.branches.push +@branch_id_or_ref='{{ branch_id_or_ref }}' --required, +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"migration_version": "{{ migration_version }}" +}' +; +``` + + + +Merges the specified database branch + +```sql +EXEC supabase.branches.branches.merge +@branch_id_or_ref='{{ branch_id_or_ref }}' --required, +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"migration_version": "{{ migration_version }}" +}' +; +``` + + + +Resets the specified database branch + +```sql +EXEC supabase.branches.branches.reset +@branch_id_or_ref='{{ branch_id_or_ref }}' --required, +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"migration_version": "{{ migration_version }}" +}' +; +``` + + + +Cancels scheduled deletion and restores the branch to active state + +```sql +EXEC supabase.branches.branches.restore +@branch_id_or_ref='{{ branch_id_or_ref }}' --required, +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + + +Disables preview branching for the specified project + +```sql +EXEC supabase.branches.branches.disable_branching +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/branches/index.md b/website/docs/services/branches/index.md new file mode 100644 index 0000000..f4fcd98 --- /dev/null +++ b/website/docs/services/branches/index.md @@ -0,0 +1,34 @@ +--- +title: branches +hide_title: false +hide_table_of_contents: false +keywords: + - branches + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +branches service documentation. + +:::info[Service Summary] + +total resources: __3__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/config/auth_configs/index.md b/website/docs/services/config/auth_configs/index.md new file mode 100644 index 0000000..d5ccc82 --- /dev/null +++ b/website/docs/services/config/auth_configs/index.md @@ -0,0 +1,2045 @@ +--- +title: auth_configs +hide_title: false +hide_table_of_contents: false +keywords: + - auth_configs + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an auth_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
integer
boolean
integer
integer
string (connections, percent, )
boolean
boolean
string
boolean
boolean
string
boolean
boolean
string
string
boolean
boolean
string
boolean
boolean
string
boolean
boolean
boolean
string
boolean
boolean
string
boolean
boolean
string
boolean
boolean
string
string
string
boolean
boolean
string
boolean
boolean
boolean
string
boolean
boolean
string
string
boolean
boolean
string
boolean
boolean
string
boolean
boolean
boolean
boolean
boolean
string
string
boolean
boolean
string
boolean
boolean
string
boolean
boolean
string
boolean
boolean
boolean
string
string
boolean
boolean
string
boolean
boolean
string
boolean
string
string
boolean
string
string
boolean
string
string
boolean
string
string
boolean
string
string
boolean
string
string
boolean
string
string
integer
boolean
boolean
boolean
boolean
boolean
boolean
boolean
boolean
boolean
integer
integer
boolean
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
string
integer
boolean
integer
integer
string
boolean
boolean
boolean
boolean
boolean
string
boolean
boolean
string
boolean
boolean
boolean
integer
string (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789, abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789, abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:0123456789:!@#$%^&*()_+-=[]{};'\\:"|<>?,./`~, , )
integer
integer
integer
integer
integer
integer
integer
boolean
boolean
boolean
string
boolean
string (turnstile, hcaptcha, )
string
boolean
integer
boolean
boolean
number
boolean
string
number
string
boolean
integer
string
string
integer
integer
string (messagebird, textlocal, twilio, twilio_verify, vonage, )
string
string
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$</code>)
string
string
string
string
string
string
string
string
string
string
string
string
string (email) (pattern: <code>^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$</code>)
string
integer
string
string
string
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +external_apple_client_id, +external_azure_client_id, +external_bitbucket_client_id, +external_discord_client_id, +external_facebook_client_id, +external_figma_client_id, +external_github_client_id, +external_gitlab_client_id, +external_google_client_id, +external_kakao_client_id, +external_keycloak_client_id, +external_linkedin_oidc_client_id, +external_notion_client_id, +external_slack_client_id, +external_slack_oidc_client_id, +external_spotify_client_id, +external_twitch_client_id, +external_twitter_client_id, +external_workos_client_id, +external_x_client_id, +external_zoom_client_id, +nimbus_oauth_client_id, +webauthn_rp_id, +smtp_sender_name, +webauthn_rp_display_name, +api_max_request_duration, +custom_oauth_enabled, +custom_oauth_max_providers, +db_max_pool_size, +db_max_pool_size_unit, +disable_signup, +external_anonymous_users_enabled, +external_apple_additional_client_ids, +external_apple_email_optional, +external_apple_enabled, +external_apple_secret, +external_azure_email_optional, +external_azure_enabled, +external_azure_secret, +external_azure_url, +external_bitbucket_email_optional, +external_bitbucket_enabled, +external_bitbucket_secret, +external_discord_email_optional, +external_discord_enabled, +external_discord_secret, +external_email_enabled, +external_facebook_email_optional, +external_facebook_enabled, +external_facebook_secret, +external_figma_email_optional, +external_figma_enabled, +external_figma_secret, +external_github_email_optional, +external_github_enabled, +external_github_secret, +external_gitlab_email_optional, +external_gitlab_enabled, +external_gitlab_secret, +external_gitlab_url, +external_google_additional_client_ids, +external_google_email_optional, +external_google_enabled, +external_google_secret, +external_google_skip_nonce_check, +external_kakao_email_optional, +external_kakao_enabled, +external_kakao_secret, +external_keycloak_email_optional, +external_keycloak_enabled, +external_keycloak_secret, +external_keycloak_url, +external_linkedin_oidc_email_optional, +external_linkedin_oidc_enabled, +external_linkedin_oidc_secret, +external_notion_email_optional, +external_notion_enabled, +external_notion_secret, +external_phone_enabled, +external_slack_email_optional, +external_slack_enabled, +external_slack_oidc_email_optional, +external_slack_oidc_enabled, +external_slack_oidc_secret, +external_slack_secret, +external_spotify_email_optional, +external_spotify_enabled, +external_spotify_secret, +external_twitch_email_optional, +external_twitch_enabled, +external_twitch_secret, +external_twitter_email_optional, +external_twitter_enabled, +external_twitter_secret, +external_web3_ethereum_enabled, +external_web3_solana_enabled, +external_workos_enabled, +external_workos_secret, +external_workos_url, +external_x_email_optional, +external_x_enabled, +external_x_secret, +external_zoom_email_optional, +external_zoom_enabled, +external_zoom_secret, +hook_after_user_created_enabled, +hook_after_user_created_secrets, +hook_after_user_created_uri, +hook_before_user_created_enabled, +hook_before_user_created_secrets, +hook_before_user_created_uri, +hook_custom_access_token_enabled, +hook_custom_access_token_secrets, +hook_custom_access_token_uri, +hook_mfa_verification_attempt_enabled, +hook_mfa_verification_attempt_secrets, +hook_mfa_verification_attempt_uri, +hook_password_verification_attempt_enabled, +hook_password_verification_attempt_secrets, +hook_password_verification_attempt_uri, +hook_send_email_enabled, +hook_send_email_secrets, +hook_send_email_uri, +hook_send_sms_enabled, +hook_send_sms_secrets, +hook_send_sms_uri, +jwt_exp, +mailer_allow_unverified_email_sign_ins, +mailer_autoconfirm, +mailer_notifications_email_changed_enabled, +mailer_notifications_identity_linked_enabled, +mailer_notifications_identity_unlinked_enabled, +mailer_notifications_mfa_factor_enrolled_enabled, +mailer_notifications_mfa_factor_unenrolled_enabled, +mailer_notifications_password_changed_enabled, +mailer_notifications_phone_changed_enabled, +mailer_otp_exp, +mailer_otp_length, +mailer_secure_email_change_enabled, +mailer_subjects_confirmation, +mailer_subjects_email_change, +mailer_subjects_email_changed_notification, +mailer_subjects_identity_linked_notification, +mailer_subjects_identity_unlinked_notification, +mailer_subjects_invite, +mailer_subjects_magic_link, +mailer_subjects_mfa_factor_enrolled_notification, +mailer_subjects_mfa_factor_unenrolled_notification, +mailer_subjects_password_changed_notification, +mailer_subjects_phone_changed_notification, +mailer_subjects_reauthentication, +mailer_subjects_recovery, +mailer_templates_confirmation_content, +mailer_templates_email_change_content, +mailer_templates_email_changed_notification_content, +mailer_templates_identity_linked_notification_content, +mailer_templates_identity_unlinked_notification_content, +mailer_templates_invite_content, +mailer_templates_magic_link_content, +mailer_templates_mfa_factor_enrolled_notification_content, +mailer_templates_mfa_factor_unenrolled_notification_content, +mailer_templates_password_changed_notification_content, +mailer_templates_phone_changed_notification_content, +mailer_templates_reauthentication_content, +mailer_templates_recovery_content, +mfa_max_enrolled_factors, +mfa_phone_enroll_enabled, +mfa_phone_max_frequency, +mfa_phone_otp_length, +mfa_phone_template, +mfa_phone_verify_enabled, +mfa_totp_enroll_enabled, +mfa_totp_verify_enabled, +mfa_web_authn_enroll_enabled, +mfa_web_authn_verify_enabled, +nimbus_oauth_client_secret, +nimbus_oauth_email_optional, +oauth_server_allow_dynamic_registration, +oauth_server_authorization_path, +oauth_server_enabled, +passkey_enabled, +password_hibp_enabled, +password_min_length, +password_required_characters, +rate_limit_anonymous_users, +rate_limit_email_sent, +rate_limit_otp, +rate_limit_sms_sent, +rate_limit_token_refresh, +rate_limit_verify, +rate_limit_web3, +refresh_token_rotation_enabled, +saml_allow_encrypted_assertions, +saml_enabled, +saml_external_url, +security_captcha_enabled, +security_captcha_provider, +security_captcha_secret, +security_manual_linking_enabled, +security_refresh_token_reuse_interval, +security_sb_forwarded_for_enabled, +security_update_password_require_reauthentication, +sessions_inactivity_timeout, +sessions_single_per_user, +sessions_tags, +sessions_timebox, +site_url, +sms_autoconfirm, +sms_max_frequency, +sms_messagebird_access_key, +sms_messagebird_originator, +sms_otp_exp, +sms_otp_length, +sms_provider, +sms_template, +sms_test_otp, +sms_test_otp_valid_until, +sms_textlocal_api_key, +sms_textlocal_sender, +sms_twilio_account_sid, +sms_twilio_auth_token, +sms_twilio_content_sid, +sms_twilio_message_service_sid, +sms_twilio_verify_account_sid, +sms_twilio_verify_auth_token, +sms_twilio_verify_message_service_sid, +sms_vonage_api_key, +sms_vonage_api_secret, +sms_vonage_from, +smtp_admin_email, +smtp_host, +smtp_max_frequency, +smtp_pass, +smtp_port, +smtp_user, +uri_allow_list, +webauthn_rp_origins +FROM supabase.config.auth_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.config.auth_configs +SET +site_url = '{{ site_url }}', +disable_signup = {{ disable_signup }}, +jwt_exp = {{ jwt_exp }}, +smtp_admin_email = '{{ smtp_admin_email }}', +smtp_host = '{{ smtp_host }}', +smtp_port = '{{ smtp_port }}', +smtp_user = '{{ smtp_user }}', +smtp_pass = '{{ smtp_pass }}', +smtp_max_frequency = {{ smtp_max_frequency }}, +smtp_sender_name = '{{ smtp_sender_name }}', +mailer_allow_unverified_email_sign_ins = {{ mailer_allow_unverified_email_sign_ins }}, +mailer_autoconfirm = {{ mailer_autoconfirm }}, +mailer_subjects_invite = '{{ mailer_subjects_invite }}', +mailer_subjects_confirmation = '{{ mailer_subjects_confirmation }}', +mailer_subjects_recovery = '{{ mailer_subjects_recovery }}', +mailer_subjects_email_change = '{{ mailer_subjects_email_change }}', +mailer_subjects_magic_link = '{{ mailer_subjects_magic_link }}', +mailer_subjects_reauthentication = '{{ mailer_subjects_reauthentication }}', +mailer_subjects_password_changed_notification = '{{ mailer_subjects_password_changed_notification }}', +mailer_subjects_email_changed_notification = '{{ mailer_subjects_email_changed_notification }}', +mailer_subjects_phone_changed_notification = '{{ mailer_subjects_phone_changed_notification }}', +mailer_subjects_mfa_factor_enrolled_notification = '{{ mailer_subjects_mfa_factor_enrolled_notification }}', +mailer_subjects_mfa_factor_unenrolled_notification = '{{ mailer_subjects_mfa_factor_unenrolled_notification }}', +mailer_subjects_identity_linked_notification = '{{ mailer_subjects_identity_linked_notification }}', +mailer_subjects_identity_unlinked_notification = '{{ mailer_subjects_identity_unlinked_notification }}', +mailer_templates_invite_content = '{{ mailer_templates_invite_content }}', +mailer_templates_confirmation_content = '{{ mailer_templates_confirmation_content }}', +mailer_templates_recovery_content = '{{ mailer_templates_recovery_content }}', +mailer_templates_email_change_content = '{{ mailer_templates_email_change_content }}', +mailer_templates_magic_link_content = '{{ mailer_templates_magic_link_content }}', +mailer_templates_reauthentication_content = '{{ mailer_templates_reauthentication_content }}', +mailer_templates_password_changed_notification_content = '{{ mailer_templates_password_changed_notification_content }}', +mailer_templates_email_changed_notification_content = '{{ mailer_templates_email_changed_notification_content }}', +mailer_templates_phone_changed_notification_content = '{{ mailer_templates_phone_changed_notification_content }}', +mailer_templates_mfa_factor_enrolled_notification_content = '{{ mailer_templates_mfa_factor_enrolled_notification_content }}', +mailer_templates_mfa_factor_unenrolled_notification_content = '{{ mailer_templates_mfa_factor_unenrolled_notification_content }}', +mailer_templates_identity_linked_notification_content = '{{ mailer_templates_identity_linked_notification_content }}', +mailer_templates_identity_unlinked_notification_content = '{{ mailer_templates_identity_unlinked_notification_content }}', +mailer_notifications_password_changed_enabled = {{ mailer_notifications_password_changed_enabled }}, +mailer_notifications_email_changed_enabled = {{ mailer_notifications_email_changed_enabled }}, +mailer_notifications_phone_changed_enabled = {{ mailer_notifications_phone_changed_enabled }}, +mailer_notifications_mfa_factor_enrolled_enabled = {{ mailer_notifications_mfa_factor_enrolled_enabled }}, +mailer_notifications_mfa_factor_unenrolled_enabled = {{ mailer_notifications_mfa_factor_unenrolled_enabled }}, +mailer_notifications_identity_linked_enabled = {{ mailer_notifications_identity_linked_enabled }}, +mailer_notifications_identity_unlinked_enabled = {{ mailer_notifications_identity_unlinked_enabled }}, +mfa_max_enrolled_factors = {{ mfa_max_enrolled_factors }}, +uri_allow_list = '{{ uri_allow_list }}', +external_anonymous_users_enabled = {{ external_anonymous_users_enabled }}, +external_email_enabled = {{ external_email_enabled }}, +external_phone_enabled = {{ external_phone_enabled }}, +saml_enabled = {{ saml_enabled }}, +saml_external_url = '{{ saml_external_url }}', +security_sb_forwarded_for_enabled = {{ security_sb_forwarded_for_enabled }}, +security_captcha_enabled = {{ security_captcha_enabled }}, +security_captcha_provider = '{{ security_captcha_provider }}', +security_captcha_secret = '{{ security_captcha_secret }}', +sessions_timebox = {{ sessions_timebox }}, +sessions_inactivity_timeout = {{ sessions_inactivity_timeout }}, +sessions_single_per_user = {{ sessions_single_per_user }}, +sessions_tags = '{{ sessions_tags }}', +rate_limit_anonymous_users = {{ rate_limit_anonymous_users }}, +rate_limit_email_sent = {{ rate_limit_email_sent }}, +rate_limit_sms_sent = {{ rate_limit_sms_sent }}, +rate_limit_verify = {{ rate_limit_verify }}, +rate_limit_token_refresh = {{ rate_limit_token_refresh }}, +rate_limit_otp = {{ rate_limit_otp }}, +rate_limit_web3 = {{ rate_limit_web3 }}, +mailer_secure_email_change_enabled = {{ mailer_secure_email_change_enabled }}, +refresh_token_rotation_enabled = {{ refresh_token_rotation_enabled }}, +password_hibp_enabled = {{ password_hibp_enabled }}, +password_min_length = {{ password_min_length }}, +password_required_characters = '{{ password_required_characters }}', +security_manual_linking_enabled = {{ security_manual_linking_enabled }}, +security_update_password_require_reauthentication = {{ security_update_password_require_reauthentication }}, +security_refresh_token_reuse_interval = {{ security_refresh_token_reuse_interval }}, +mailer_otp_exp = {{ mailer_otp_exp }}, +mailer_otp_length = {{ mailer_otp_length }}, +sms_autoconfirm = {{ sms_autoconfirm }}, +sms_max_frequency = {{ sms_max_frequency }}, +sms_otp_exp = {{ sms_otp_exp }}, +sms_otp_length = {{ sms_otp_length }}, +sms_provider = '{{ sms_provider }}', +sms_messagebird_access_key = '{{ sms_messagebird_access_key }}', +sms_messagebird_originator = '{{ sms_messagebird_originator }}', +sms_test_otp = '{{ sms_test_otp }}', +sms_test_otp_valid_until = '{{ sms_test_otp_valid_until }}', +sms_textlocal_api_key = '{{ sms_textlocal_api_key }}', +sms_textlocal_sender = '{{ sms_textlocal_sender }}', +sms_twilio_account_sid = '{{ sms_twilio_account_sid }}', +sms_twilio_auth_token = '{{ sms_twilio_auth_token }}', +sms_twilio_content_sid = '{{ sms_twilio_content_sid }}', +sms_twilio_message_service_sid = '{{ sms_twilio_message_service_sid }}', +sms_twilio_verify_account_sid = '{{ sms_twilio_verify_account_sid }}', +sms_twilio_verify_auth_token = '{{ sms_twilio_verify_auth_token }}', +sms_twilio_verify_message_service_sid = '{{ sms_twilio_verify_message_service_sid }}', +sms_vonage_api_key = '{{ sms_vonage_api_key }}', +sms_vonage_api_secret = '{{ sms_vonage_api_secret }}', +sms_vonage_from = '{{ sms_vonage_from }}', +sms_template = '{{ sms_template }}', +hook_mfa_verification_attempt_enabled = {{ hook_mfa_verification_attempt_enabled }}, +hook_mfa_verification_attempt_uri = '{{ hook_mfa_verification_attempt_uri }}', +hook_mfa_verification_attempt_secrets = '{{ hook_mfa_verification_attempt_secrets }}', +hook_password_verification_attempt_enabled = {{ hook_password_verification_attempt_enabled }}, +hook_password_verification_attempt_uri = '{{ hook_password_verification_attempt_uri }}', +hook_password_verification_attempt_secrets = '{{ hook_password_verification_attempt_secrets }}', +hook_custom_access_token_enabled = {{ hook_custom_access_token_enabled }}, +hook_custom_access_token_uri = '{{ hook_custom_access_token_uri }}', +hook_custom_access_token_secrets = '{{ hook_custom_access_token_secrets }}', +hook_send_sms_enabled = {{ hook_send_sms_enabled }}, +hook_send_sms_uri = '{{ hook_send_sms_uri }}', +hook_send_sms_secrets = '{{ hook_send_sms_secrets }}', +hook_send_email_enabled = {{ hook_send_email_enabled }}, +hook_send_email_uri = '{{ hook_send_email_uri }}', +hook_send_email_secrets = '{{ hook_send_email_secrets }}', +hook_before_user_created_enabled = {{ hook_before_user_created_enabled }}, +hook_before_user_created_uri = '{{ hook_before_user_created_uri }}', +hook_before_user_created_secrets = '{{ hook_before_user_created_secrets }}', +hook_after_user_created_enabled = {{ hook_after_user_created_enabled }}, +hook_after_user_created_uri = '{{ hook_after_user_created_uri }}', +hook_after_user_created_secrets = '{{ hook_after_user_created_secrets }}', +external_apple_enabled = {{ external_apple_enabled }}, +external_apple_client_id = '{{ external_apple_client_id }}', +external_apple_email_optional = {{ external_apple_email_optional }}, +external_apple_secret = '{{ external_apple_secret }}', +external_apple_additional_client_ids = '{{ external_apple_additional_client_ids }}', +external_azure_enabled = {{ external_azure_enabled }}, +external_azure_client_id = '{{ external_azure_client_id }}', +external_azure_email_optional = {{ external_azure_email_optional }}, +external_azure_secret = '{{ external_azure_secret }}', +external_azure_url = '{{ external_azure_url }}', +external_bitbucket_enabled = {{ external_bitbucket_enabled }}, +external_bitbucket_client_id = '{{ external_bitbucket_client_id }}', +external_bitbucket_email_optional = {{ external_bitbucket_email_optional }}, +external_bitbucket_secret = '{{ external_bitbucket_secret }}', +external_discord_enabled = {{ external_discord_enabled }}, +external_discord_client_id = '{{ external_discord_client_id }}', +external_discord_email_optional = {{ external_discord_email_optional }}, +external_discord_secret = '{{ external_discord_secret }}', +external_facebook_enabled = {{ external_facebook_enabled }}, +external_facebook_client_id = '{{ external_facebook_client_id }}', +external_facebook_email_optional = {{ external_facebook_email_optional }}, +external_facebook_secret = '{{ external_facebook_secret }}', +external_figma_enabled = {{ external_figma_enabled }}, +external_figma_client_id = '{{ external_figma_client_id }}', +external_figma_email_optional = {{ external_figma_email_optional }}, +external_figma_secret = '{{ external_figma_secret }}', +external_github_enabled = {{ external_github_enabled }}, +external_github_client_id = '{{ external_github_client_id }}', +external_github_email_optional = {{ external_github_email_optional }}, +external_github_secret = '{{ external_github_secret }}', +external_gitlab_enabled = {{ external_gitlab_enabled }}, +external_gitlab_client_id = '{{ external_gitlab_client_id }}', +external_gitlab_email_optional = {{ external_gitlab_email_optional }}, +external_gitlab_secret = '{{ external_gitlab_secret }}', +external_gitlab_url = '{{ external_gitlab_url }}', +external_google_enabled = {{ external_google_enabled }}, +external_google_client_id = '{{ external_google_client_id }}', +external_google_email_optional = {{ external_google_email_optional }}, +external_google_secret = '{{ external_google_secret }}', +external_google_additional_client_ids = '{{ external_google_additional_client_ids }}', +external_google_skip_nonce_check = {{ external_google_skip_nonce_check }}, +external_kakao_enabled = {{ external_kakao_enabled }}, +external_kakao_client_id = '{{ external_kakao_client_id }}', +external_kakao_email_optional = {{ external_kakao_email_optional }}, +external_kakao_secret = '{{ external_kakao_secret }}', +external_keycloak_enabled = {{ external_keycloak_enabled }}, +external_keycloak_client_id = '{{ external_keycloak_client_id }}', +external_keycloak_email_optional = {{ external_keycloak_email_optional }}, +external_keycloak_secret = '{{ external_keycloak_secret }}', +external_keycloak_url = '{{ external_keycloak_url }}', +external_linkedin_oidc_enabled = {{ external_linkedin_oidc_enabled }}, +external_linkedin_oidc_client_id = '{{ external_linkedin_oidc_client_id }}', +external_linkedin_oidc_email_optional = {{ external_linkedin_oidc_email_optional }}, +external_linkedin_oidc_secret = '{{ external_linkedin_oidc_secret }}', +external_slack_oidc_enabled = {{ external_slack_oidc_enabled }}, +external_slack_oidc_client_id = '{{ external_slack_oidc_client_id }}', +external_slack_oidc_email_optional = {{ external_slack_oidc_email_optional }}, +external_slack_oidc_secret = '{{ external_slack_oidc_secret }}', +external_notion_enabled = {{ external_notion_enabled }}, +external_notion_client_id = '{{ external_notion_client_id }}', +external_notion_email_optional = {{ external_notion_email_optional }}, +external_notion_secret = '{{ external_notion_secret }}', +external_slack_enabled = {{ external_slack_enabled }}, +external_slack_client_id = '{{ external_slack_client_id }}', +external_slack_email_optional = {{ external_slack_email_optional }}, +external_slack_secret = '{{ external_slack_secret }}', +external_spotify_enabled = {{ external_spotify_enabled }}, +external_spotify_client_id = '{{ external_spotify_client_id }}', +external_spotify_email_optional = {{ external_spotify_email_optional }}, +external_spotify_secret = '{{ external_spotify_secret }}', +external_twitch_enabled = {{ external_twitch_enabled }}, +external_twitch_client_id = '{{ external_twitch_client_id }}', +external_twitch_email_optional = {{ external_twitch_email_optional }}, +external_twitch_secret = '{{ external_twitch_secret }}', +external_twitter_enabled = {{ external_twitter_enabled }}, +external_twitter_client_id = '{{ external_twitter_client_id }}', +external_twitter_email_optional = {{ external_twitter_email_optional }}, +external_twitter_secret = '{{ external_twitter_secret }}', +external_x_enabled = {{ external_x_enabled }}, +external_x_client_id = '{{ external_x_client_id }}', +external_x_email_optional = {{ external_x_email_optional }}, +external_x_secret = '{{ external_x_secret }}', +external_workos_enabled = {{ external_workos_enabled }}, +external_workos_client_id = '{{ external_workos_client_id }}', +external_workos_secret = '{{ external_workos_secret }}', +external_workos_url = '{{ external_workos_url }}', +external_web3_solana_enabled = {{ external_web3_solana_enabled }}, +external_web3_ethereum_enabled = {{ external_web3_ethereum_enabled }}, +external_zoom_enabled = {{ external_zoom_enabled }}, +external_zoom_client_id = '{{ external_zoom_client_id }}', +external_zoom_email_optional = {{ external_zoom_email_optional }}, +external_zoom_secret = '{{ external_zoom_secret }}', +db_max_pool_size = {{ db_max_pool_size }}, +db_max_pool_size_unit = '{{ db_max_pool_size_unit }}', +api_max_request_duration = {{ api_max_request_duration }}, +mfa_totp_enroll_enabled = {{ mfa_totp_enroll_enabled }}, +mfa_totp_verify_enabled = {{ mfa_totp_verify_enabled }}, +mfa_web_authn_enroll_enabled = {{ mfa_web_authn_enroll_enabled }}, +mfa_web_authn_verify_enabled = {{ mfa_web_authn_verify_enabled }}, +passkey_enabled = {{ passkey_enabled }}, +webauthn_rp_display_name = '{{ webauthn_rp_display_name }}', +webauthn_rp_id = '{{ webauthn_rp_id }}', +webauthn_rp_origins = '{{ webauthn_rp_origins }}', +mfa_phone_enroll_enabled = {{ mfa_phone_enroll_enabled }}, +mfa_phone_verify_enabled = {{ mfa_phone_verify_enabled }}, +mfa_phone_max_frequency = {{ mfa_phone_max_frequency }}, +mfa_phone_otp_length = {{ mfa_phone_otp_length }}, +mfa_phone_template = '{{ mfa_phone_template }}', +nimbus_oauth_client_id = '{{ nimbus_oauth_client_id }}', +nimbus_oauth_client_secret = '{{ nimbus_oauth_client_secret }}', +oauth_server_enabled = {{ oauth_server_enabled }}, +oauth_server_allow_dynamic_registration = {{ oauth_server_allow_dynamic_registration }}, +oauth_server_authorization_path = '{{ oauth_server_authorization_path }}', +custom_oauth_enabled = {{ custom_oauth_enabled }} +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +RETURNING +external_apple_client_id, +external_azure_client_id, +external_bitbucket_client_id, +external_discord_client_id, +external_facebook_client_id, +external_figma_client_id, +external_github_client_id, +external_gitlab_client_id, +external_google_client_id, +external_kakao_client_id, +external_keycloak_client_id, +external_linkedin_oidc_client_id, +external_notion_client_id, +external_slack_client_id, +external_slack_oidc_client_id, +external_spotify_client_id, +external_twitch_client_id, +external_twitter_client_id, +external_workos_client_id, +external_x_client_id, +external_zoom_client_id, +nimbus_oauth_client_id, +webauthn_rp_id, +smtp_sender_name, +webauthn_rp_display_name, +api_max_request_duration, +custom_oauth_enabled, +custom_oauth_max_providers, +db_max_pool_size, +db_max_pool_size_unit, +disable_signup, +external_anonymous_users_enabled, +external_apple_additional_client_ids, +external_apple_email_optional, +external_apple_enabled, +external_apple_secret, +external_azure_email_optional, +external_azure_enabled, +external_azure_secret, +external_azure_url, +external_bitbucket_email_optional, +external_bitbucket_enabled, +external_bitbucket_secret, +external_discord_email_optional, +external_discord_enabled, +external_discord_secret, +external_email_enabled, +external_facebook_email_optional, +external_facebook_enabled, +external_facebook_secret, +external_figma_email_optional, +external_figma_enabled, +external_figma_secret, +external_github_email_optional, +external_github_enabled, +external_github_secret, +external_gitlab_email_optional, +external_gitlab_enabled, +external_gitlab_secret, +external_gitlab_url, +external_google_additional_client_ids, +external_google_email_optional, +external_google_enabled, +external_google_secret, +external_google_skip_nonce_check, +external_kakao_email_optional, +external_kakao_enabled, +external_kakao_secret, +external_keycloak_email_optional, +external_keycloak_enabled, +external_keycloak_secret, +external_keycloak_url, +external_linkedin_oidc_email_optional, +external_linkedin_oidc_enabled, +external_linkedin_oidc_secret, +external_notion_email_optional, +external_notion_enabled, +external_notion_secret, +external_phone_enabled, +external_slack_email_optional, +external_slack_enabled, +external_slack_oidc_email_optional, +external_slack_oidc_enabled, +external_slack_oidc_secret, +external_slack_secret, +external_spotify_email_optional, +external_spotify_enabled, +external_spotify_secret, +external_twitch_email_optional, +external_twitch_enabled, +external_twitch_secret, +external_twitter_email_optional, +external_twitter_enabled, +external_twitter_secret, +external_web3_ethereum_enabled, +external_web3_solana_enabled, +external_workos_enabled, +external_workos_secret, +external_workos_url, +external_x_email_optional, +external_x_enabled, +external_x_secret, +external_zoom_email_optional, +external_zoom_enabled, +external_zoom_secret, +hook_after_user_created_enabled, +hook_after_user_created_secrets, +hook_after_user_created_uri, +hook_before_user_created_enabled, +hook_before_user_created_secrets, +hook_before_user_created_uri, +hook_custom_access_token_enabled, +hook_custom_access_token_secrets, +hook_custom_access_token_uri, +hook_mfa_verification_attempt_enabled, +hook_mfa_verification_attempt_secrets, +hook_mfa_verification_attempt_uri, +hook_password_verification_attempt_enabled, +hook_password_verification_attempt_secrets, +hook_password_verification_attempt_uri, +hook_send_email_enabled, +hook_send_email_secrets, +hook_send_email_uri, +hook_send_sms_enabled, +hook_send_sms_secrets, +hook_send_sms_uri, +jwt_exp, +mailer_allow_unverified_email_sign_ins, +mailer_autoconfirm, +mailer_notifications_email_changed_enabled, +mailer_notifications_identity_linked_enabled, +mailer_notifications_identity_unlinked_enabled, +mailer_notifications_mfa_factor_enrolled_enabled, +mailer_notifications_mfa_factor_unenrolled_enabled, +mailer_notifications_password_changed_enabled, +mailer_notifications_phone_changed_enabled, +mailer_otp_exp, +mailer_otp_length, +mailer_secure_email_change_enabled, +mailer_subjects_confirmation, +mailer_subjects_email_change, +mailer_subjects_email_changed_notification, +mailer_subjects_identity_linked_notification, +mailer_subjects_identity_unlinked_notification, +mailer_subjects_invite, +mailer_subjects_magic_link, +mailer_subjects_mfa_factor_enrolled_notification, +mailer_subjects_mfa_factor_unenrolled_notification, +mailer_subjects_password_changed_notification, +mailer_subjects_phone_changed_notification, +mailer_subjects_reauthentication, +mailer_subjects_recovery, +mailer_templates_confirmation_content, +mailer_templates_email_change_content, +mailer_templates_email_changed_notification_content, +mailer_templates_identity_linked_notification_content, +mailer_templates_identity_unlinked_notification_content, +mailer_templates_invite_content, +mailer_templates_magic_link_content, +mailer_templates_mfa_factor_enrolled_notification_content, +mailer_templates_mfa_factor_unenrolled_notification_content, +mailer_templates_password_changed_notification_content, +mailer_templates_phone_changed_notification_content, +mailer_templates_reauthentication_content, +mailer_templates_recovery_content, +mfa_max_enrolled_factors, +mfa_phone_enroll_enabled, +mfa_phone_max_frequency, +mfa_phone_otp_length, +mfa_phone_template, +mfa_phone_verify_enabled, +mfa_totp_enroll_enabled, +mfa_totp_verify_enabled, +mfa_web_authn_enroll_enabled, +mfa_web_authn_verify_enabled, +nimbus_oauth_client_secret, +nimbus_oauth_email_optional, +oauth_server_allow_dynamic_registration, +oauth_server_authorization_path, +oauth_server_enabled, +passkey_enabled, +password_hibp_enabled, +password_min_length, +password_required_characters, +rate_limit_anonymous_users, +rate_limit_email_sent, +rate_limit_otp, +rate_limit_sms_sent, +rate_limit_token_refresh, +rate_limit_verify, +rate_limit_web3, +refresh_token_rotation_enabled, +saml_allow_encrypted_assertions, +saml_enabled, +saml_external_url, +security_captcha_enabled, +security_captcha_provider, +security_captcha_secret, +security_manual_linking_enabled, +security_refresh_token_reuse_interval, +security_sb_forwarded_for_enabled, +security_update_password_require_reauthentication, +sessions_inactivity_timeout, +sessions_single_per_user, +sessions_tags, +sessions_timebox, +site_url, +sms_autoconfirm, +sms_max_frequency, +sms_messagebird_access_key, +sms_messagebird_originator, +sms_otp_exp, +sms_otp_length, +sms_provider, +sms_template, +sms_test_otp, +sms_test_otp_valid_until, +sms_textlocal_api_key, +sms_textlocal_sender, +sms_twilio_account_sid, +sms_twilio_auth_token, +sms_twilio_content_sid, +sms_twilio_message_service_sid, +sms_twilio_verify_account_sid, +sms_twilio_verify_auth_token, +sms_twilio_verify_message_service_sid, +sms_vonage_api_key, +sms_vonage_api_secret, +sms_vonage_from, +smtp_admin_email, +smtp_host, +smtp_max_frequency, +smtp_pass, +smtp_port, +smtp_user, +uri_allow_list, +webauthn_rp_origins; +``` + + diff --git a/website/docs/services/config/auth_signing_keys/index.md b/website/docs/services/config/auth_signing_keys/index.md new file mode 100644 index 0000000..d1b896a --- /dev/null +++ b/website/docs/services/config/auth_signing_keys/index.md @@ -0,0 +1,385 @@ +--- +title: auth_signing_keys +hide_title: false +hide_table_of_contents: false +keywords: + - auth_signing_keys + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an auth_signing_keys resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid) (pattern: <code>^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$</code>)
string (EdDSA, ES256, RS256, HS256)
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string (in_use, previously_used, revoked, standby)
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid) (pattern: <code>^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$</code>)
string (EdDSA, ES256, RS256, HS256)
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string (in_use, previously_used, revoked, standby)
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id, ref
ref
ref, algorithm
id, ref, status
id, ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid)
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +id, +algorithm, +created_at, +public_jwk, +status, +updated_at +FROM supabase.config.auth_signing_keys +WHERE id = '{{ id }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + +No description available. + +```sql +SELECT +id, +algorithm, +created_at, +public_jwk, +status, +updated_at +FROM supabase.config.auth_signing_keys +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.config.auth_signing_keys ( +algorithm, +status, +private_jwk, +ref +) +SELECT +'{{ algorithm }}' /* required */, +'{{ status }}', +'{{ private_jwk }}', +'{{ ref }}' +RETURNING +id, +algorithm, +created_at, +public_jwk, +status, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: auth_signing_keys + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the auth_signing_keys resource. + - name: algorithm + value: "{{ algorithm }}" + valid_values: ['EdDSA', 'ES256', 'RS256', 'HS256'] + - name: status + value: "{{ status }}" + valid_values: ['in_use', 'standby'] + - name: private_jwk + value: + kid: "{{ kid }}" + use: "{{ use }}" + key_ops: + - "{{ key_ops }}" + ext: {{ ext }} + kty: "{{ kty }}" + alg: "{{ alg }}" + n: "{{ n }}" + e: "{{ e }}" + d: "{{ d }}" + p: "{{ p }}" + q: "{{ q }}" + dp: "{{ dp }}" + dq: "{{ dq }}" + qi: "{{ qi }}" + crv: "{{ crv }}" + x: "{{ x }}" + y: "{{ y }}" + k: "{{ k }}" +`} + + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.config.auth_signing_keys +SET +status = '{{ status }}' +WHERE +id = '{{ id }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND status = '{{ status }}' --required +RETURNING +id, +algorithm, +created_at, +public_jwk, +status, +updated_at; +``` + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM supabase.config.auth_signing_keys +WHERE id = '{{ id }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/config/index.md b/website/docs/services/config/index.md new file mode 100644 index 0000000..f33b0ab --- /dev/null +++ b/website/docs/services/config/index.md @@ -0,0 +1,44 @@ +--- +title: config +hide_title: false +hide_table_of_contents: false +keywords: + - config + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +config service documentation. + +:::info[Service Summary] + +total resources: __13__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/config/legacy_signing_keys/index.md b/website/docs/services/config/legacy_signing_keys/index.md new file mode 100644 index 0000000..8b09ce1 --- /dev/null +++ b/website/docs/services/config/legacy_signing_keys/index.md @@ -0,0 +1,208 @@ +--- +title: legacy_signing_keys +hide_title: false +hide_table_of_contents: false +keywords: + - legacy_signing_keys + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a legacy_signing_keys resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid) (pattern: <code>^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$</code>)
string (EdDSA, ES256, RS256, HS256)
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string (in_use, previously_used, revoked, standby)
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +id, +algorithm, +created_at, +public_jwk, +status, +updated_at +FROM supabase.config.legacy_signing_keys +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.config.legacy_signing_keys ( +ref +) +SELECT +'{{ ref }}' +RETURNING +id, +algorithm, +created_at, +public_jwk, +status, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: legacy_signing_keys + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the legacy_signing_keys resource. +`} + + + diff --git a/website/docs/services/config/pgbouncer_configs/index.md b/website/docs/services/config/pgbouncer_configs/index.md new file mode 100644 index 0000000..95a137b --- /dev/null +++ b/website/docs/services/config/pgbouncer_configs/index.md @@ -0,0 +1,176 @@ +--- +title: pgbouncer_configs +hide_title: false +hide_table_of_contents: false +keywords: + - pgbouncer_configs + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a pgbouncer_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
integer
string
integer
string (transaction, session, statement)
integer
integer
integer
integer
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +connection_string, +default_pool_size, +ignore_startup_parameters, +max_client_conn, +pool_mode, +query_wait_timeout, +reserve_pool_size, +server_idle_timeout, +server_lifetime +FROM supabase.config.pgbouncer_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/config/pgsodium_configs/index.md b/website/docs/services/config/pgsodium_configs/index.md new file mode 100644 index 0000000..3549800 --- /dev/null +++ b/website/docs/services/config/pgsodium_configs/index.md @@ -0,0 +1,161 @@ +--- +title: pgsodium_configs +hide_title: false +hide_table_of_contents: false +keywords: + - pgsodium_configs + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a pgsodium_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe pgsodium root key: 32 bytes, hex-encoded (64 characters).
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref, root_key
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +root_key +FROM supabase.config.pgsodium_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.config.pgsodium_configs +SET +root_key = '{{ root_key }}' +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND root_key = '{{ root_key }}' --required +RETURNING +root_key; +``` + + diff --git a/website/docs/services/config/pooler_configs/index.md b/website/docs/services/config/pooler_configs/index.md new file mode 100644 index 0000000..9231d1c --- /dev/null +++ b/website/docs/services/config/pooler_configs/index.md @@ -0,0 +1,222 @@ +--- +title: pooler_configs +hide_title: false +hide_table_of_contents: false +keywords: + - pooler_configs + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a pooler_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (PRIMARY, READ_REPLICA)
string
integer
string
integer
string
boolean
integer
string (transaction, session)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +db_name, +connection_string, +database_type, +db_host, +db_port, +db_user, +default_pool_size, +identifier, +is_using_scram_auth, +max_client_conn, +pool_mode +FROM supabase.config.pooler_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.config.pooler_configs +SET +default_pool_size = {{ default_pool_size }}, +pool_mode = '{{ pool_mode }}' +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +RETURNING +default_pool_size, +pool_mode; +``` + + diff --git a/website/docs/services/config/postgres_configs/index.md b/website/docs/services/config/postgres_configs/index.md new file mode 100644 index 0000000..3df3d6b --- /dev/null +++ b/website/docs/services/config/postgres_configs/index.md @@ -0,0 +1,457 @@ +--- +title: postgres_configs +hide_title: false +hide_table_of_contents: false +keywords: + - postgres_configs + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a postgres_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringDefault unit: s (pattern: <code>^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$</code>)
boolean
string
boolean
stringDefault unit: ms (pattern: <code>^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$</code>)
boolean
boolean
boolean
boolean
boolean
boolean
boolean
stringDefault unit: ms (pattern: <code>^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$</code>)
string
string
string
integer
integer
integer
integer
integer
integer
integer
string
string
string
integer
integer
string
integer
string (origin, replica, local)
string
stringDefault unit: ms (pattern: <code>^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$</code>)
string
boolean
string
stringDefault unit: ms (pattern: <code>^(-?[0-9]+(?:\.[0-9]+)?)(us|ms|s|min|h|d)?$</code>)
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +checkpoint_timeout, +cron.log_statement, +effective_cache_size, +hot_standby_feedback, +log_autovacuum_min_duration, +log_checkpoints, +log_connections, +log_disconnections, +log_duration, +log_lock_waits, +log_recovery_conflict_waits, +log_replication_commands, +log_startup_progress_interval, +log_temp_files, +logical_decoding_work_mem, +maintenance_work_mem, +max_connections, +max_locks_per_transaction, +max_logical_replication_workers, +max_parallel_maintenance_workers, +max_parallel_workers, +max_parallel_workers_per_gather, +max_replication_slots, +max_slot_wal_keep_size, +max_standby_archive_delay, +max_standby_streaming_delay, +max_sync_workers_per_subscription, +max_wal_senders, +max_wal_size, +max_worker_processes, +session_replication_role, +shared_buffers, +statement_timeout, +track_activity_query_size, +track_commit_timestamp, +wal_keep_size, +wal_sender_timeout, +work_mem +FROM supabase.config.postgres_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.config.postgres_configs +SET +effective_cache_size = '{{ effective_cache_size }}', +logical_decoding_work_mem = '{{ logical_decoding_work_mem }}', +cron.log_statement = {{ cron.log_statement }}, +log_autovacuum_min_duration = '{{ log_autovacuum_min_duration }}', +log_checkpoints = {{ log_checkpoints }}, +log_connections = {{ log_connections }}, +log_disconnections = {{ log_disconnections }}, +log_duration = {{ log_duration }}, +log_lock_waits = {{ log_lock_waits }}, +log_recovery_conflict_waits = {{ log_recovery_conflict_waits }}, +log_replication_commands = {{ log_replication_commands }}, +log_startup_progress_interval = '{{ log_startup_progress_interval }}', +log_temp_files = '{{ log_temp_files }}', +maintenance_work_mem = '{{ maintenance_work_mem }}', +track_activity_query_size = '{{ track_activity_query_size }}', +max_connections = {{ max_connections }}, +max_locks_per_transaction = {{ max_locks_per_transaction }}, +max_logical_replication_workers = {{ max_logical_replication_workers }}, +max_parallel_maintenance_workers = {{ max_parallel_maintenance_workers }}, +max_parallel_workers = {{ max_parallel_workers }}, +max_parallel_workers_per_gather = {{ max_parallel_workers_per_gather }}, +max_replication_slots = {{ max_replication_slots }}, +max_slot_wal_keep_size = '{{ max_slot_wal_keep_size }}', +max_standby_archive_delay = '{{ max_standby_archive_delay }}', +max_standby_streaming_delay = '{{ max_standby_streaming_delay }}', +max_sync_workers_per_subscription = {{ max_sync_workers_per_subscription }}, +max_wal_size = '{{ max_wal_size }}', +max_wal_senders = {{ max_wal_senders }}, +max_worker_processes = {{ max_worker_processes }}, +session_replication_role = '{{ session_replication_role }}', +shared_buffers = '{{ shared_buffers }}', +statement_timeout = '{{ statement_timeout }}', +track_commit_timestamp = {{ track_commit_timestamp }}, +wal_keep_size = '{{ wal_keep_size }}', +wal_sender_timeout = '{{ wal_sender_timeout }}', +work_mem = '{{ work_mem }}', +checkpoint_timeout = '{{ checkpoint_timeout }}', +hot_standby_feedback = {{ hot_standby_feedback }}, +restart_database = {{ restart_database }} +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +RETURNING +checkpoint_timeout, +cron.log_statement, +effective_cache_size, +hot_standby_feedback, +log_autovacuum_min_duration, +log_checkpoints, +log_connections, +log_disconnections, +log_duration, +log_lock_waits, +log_recovery_conflict_waits, +log_replication_commands, +log_startup_progress_interval, +log_temp_files, +logical_decoding_work_mem, +maintenance_work_mem, +max_connections, +max_locks_per_transaction, +max_logical_replication_workers, +max_parallel_maintenance_workers, +max_parallel_workers, +max_parallel_workers_per_gather, +max_replication_slots, +max_slot_wal_keep_size, +max_standby_archive_delay, +max_standby_streaming_delay, +max_sync_workers_per_subscription, +max_wal_senders, +max_wal_size, +max_worker_processes, +session_replication_role, +shared_buffers, +statement_timeout, +track_activity_query_size, +track_commit_timestamp, +wal_keep_size, +wal_sender_timeout, +work_mem; +``` + + diff --git a/website/docs/services/config/postgrest_configs/index.md b/website/docs/services/config/postgrest_configs/index.md new file mode 100644 index 0000000..f44ea5f --- /dev/null +++ b/website/docs/services/config/postgrest_configs/index.md @@ -0,0 +1,198 @@ +--- +title: postgrest_configs +hide_title: false +hide_table_of_contents: false +keywords: + - postgrest_configs + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a postgrest_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
integerIf `null`, the value is automatically configured based on compute size.
integerIf `null`, the value is automatically configured to 10.
string
string
integer
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +db_extra_search_path, +db_pool, +db_pool_acquisition_timeout, +db_schema, +jwt_secret, +max_rows +FROM supabase.config.postgrest_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.config.postgrest_configs +SET +db_extra_search_path = '{{ db_extra_search_path }}', +db_schema = '{{ db_schema }}', +max_rows = {{ max_rows }}, +db_pool = {{ db_pool }}, +db_pool_acquisition_timeout = {{ db_pool_acquisition_timeout }} +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +RETURNING +db_extra_search_path, +db_pool, +db_pool_acquisition_timeout, +db_schema, +max_rows; +``` + + diff --git a/website/docs/services/config/realtime_configs/index.md b/website/docs/services/config/realtime_configs/index.md new file mode 100644 index 0000000..7b08451 --- /dev/null +++ b/website/docs/services/config/realtime_configs/index.md @@ -0,0 +1,267 @@ +--- +title: realtime_configs +hide_title: false +hide_table_of_contents: false +keywords: + - realtime_configs + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a realtime_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Gets project's realtime configuration + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
integerSets connection pool size for Realtime Authorization
integerSets maximum number of bytes per second rate per channel limit
integerSets maximum number of channels per client rate limit
integerSets maximum number of concurrent users rate limit
integerSets maximum number of events per second rate per channel limit
integerSets maximum number of joins per second rate limit
integerSets maximum number of payload size in KB rate limit
integerSets maximum number of presence events per second rate limit
integerSets connection pool size used to create Postgres Changes subscriptions
booleanWhether to enable presence
booleanWhether to only allow private channels
booleanDisables the Realtime service for this project when true. Set to false to re-enable it.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +Gets project's realtime configuration + +```sql +SELECT +connection_pool, +max_bytes_per_second, +max_channels_per_client, +max_concurrent_users, +max_events_per_second, +max_joins_per_second, +max_payload_size_in_kb, +max_presence_events_per_second, +postgres_changes_pool, +presence_enabled, +private_only, +suspend +FROM supabase.config.realtime_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.config.realtime_configs +SET +private_only = {{ private_only }}, +connection_pool = {{ connection_pool }}, +postgres_changes_pool = {{ postgres_changes_pool }}, +max_concurrent_users = {{ max_concurrent_users }}, +max_events_per_second = {{ max_events_per_second }}, +max_bytes_per_second = {{ max_bytes_per_second }}, +max_channels_per_client = {{ max_channels_per_client }}, +max_joins_per_second = {{ max_joins_per_second }}, +max_presence_events_per_second = {{ max_presence_events_per_second }}, +max_payload_size_in_kb = {{ max_payload_size_in_kb }}, +suspend = {{ suspend }}, +presence_enabled = {{ presence_enabled }} +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Realtime connections shutdown successfully + +```sql +EXEC supabase.config.realtime_configs.shutdown +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/config/ssl_enforcement_configs/index.md b/website/docs/services/config/ssl_enforcement_configs/index.md new file mode 100644 index 0000000..82d2f46 --- /dev/null +++ b/website/docs/services/config/ssl_enforcement_configs/index.md @@ -0,0 +1,168 @@ +--- +title: ssl_enforcement_configs +hide_title: false +hide_table_of_contents: false +keywords: + - ssl_enforcement_configs + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a ssl_enforcement_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
boolean (wire: appliedSuccessfully)
object (wire: currentConfig)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref, requested_config
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +applied_successfully, +current_config +FROM supabase.config.ssl_enforcement_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.config.ssl_enforcement_configs +SET +requested_config = '{{ requested_config }}' +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND requested_config = '{{ requested_config }}' --required +RETURNING +applied_successfully, +current_config; +``` + + diff --git a/website/docs/services/config/sso_providers/index.md b/website/docs/services/config/sso_providers/index.md new file mode 100644 index 0000000..fd37a9a --- /dev/null +++ b/website/docs/services/config/sso_providers/index.md @@ -0,0 +1,371 @@ +--- +title: sso_providers +hide_title: false +hide_table_of_contents: false +keywords: + - sso_providers + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a sso_providers resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
array
object
string
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
array
object
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
provider_id, ref
ref
ref, type
provider_id, ref
provider_id, ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid)
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +id, +created_at, +domains, +saml, +updated_at +FROM supabase.config.sso_providers +WHERE provider_id = '{{ provider_id }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + +No description available. + +```sql +SELECT +id, +created_at, +domains, +saml, +updated_at +FROM supabase.config.sso_providers +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.config.sso_providers ( +type, +metadata_xml, +metadata_url, +domains, +attribute_mapping, +name_id_format, +ref +) +SELECT +'{{ type }}' /* required */, +'{{ metadata_xml }}', +'{{ metadata_url }}', +'{{ domains }}', +'{{ attribute_mapping }}', +'{{ name_id_format }}', +'{{ ref }}' +RETURNING +id, +created_at, +domains, +saml, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: sso_providers + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the sso_providers resource. + - name: type + value: "{{ type }}" + description: | + What type of provider will be created + valid_values: ['saml'] + - name: metadata_xml + value: "{{ metadata_xml }}" + - name: metadata_url + value: "{{ metadata_url }}" + - name: domains + value: + - "{{ domains }}" + - name: attribute_mapping + value: + keys: "{{ keys }}" + - name: name_id_format + value: "{{ name_id_format }}" + valid_values: ['urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified', 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient', 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'] +`} + + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.config.sso_providers +SET +metadata_xml = '{{ metadata_xml }}', +metadata_url = '{{ metadata_url }}', +domains = '{{ domains }}', +attribute_mapping = '{{ attribute_mapping }}', +name_id_format = '{{ name_id_format }}' +WHERE +provider_id = '{{ provider_id }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +RETURNING +id, +created_at, +domains, +saml, +updated_at; +``` + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM supabase.config.sso_providers +WHERE provider_id = '{{ provider_id }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/config/storage_configs/index.md b/website/docs/services/config/storage_configs/index.md new file mode 100644 index 0000000..a5a58a6 --- /dev/null +++ b/website/docs/services/config/storage_configs/index.md @@ -0,0 +1,190 @@ +--- +title: storage_configs +hide_title: false +hide_table_of_contents: false +keywords: + - storage_configs + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a storage_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
object
string (wire: databasePoolMode)
object
object
integer (int64) (wire: fileSizeLimit)
string (wire: migrationVersion)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +capabilities, +database_pool_mode, +external, +features, +file_size_limit, +migration_version +FROM supabase.config.storage_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.config.storage_configs +SET +file_size_limit = {{ file_size_limit }}, +features = '{{ features }}', +external = '{{ external }}' +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set; +``` + + diff --git a/website/docs/services/config/third_party_auth_integrations/index.md b/website/docs/services/config/third_party_auth_integrations/index.md new file mode 100644 index 0000000..1b63730 --- /dev/null +++ b/website/docs/services/config/third_party_auth_integrations/index.md @@ -0,0 +1,364 @@ +--- +title: third_party_auth_integrations +hide_title: false +hide_table_of_contents: false +keywords: + - third_party_auth_integrations + - config + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a third_party_auth_integrations resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid) (pattern: <code>^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$</code>)
string
string
string
string
string
string
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid) (pattern: <code>^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$</code>)
string
string
string
string
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
tpa_id, ref
ref
ref
tpa_id, ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string (uuid)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +id, +custom_jwks, +inserted_at, +jwks_url, +oidc_issuer_url, +resolved_at, +resolved_jwks, +type, +updated_at +FROM supabase.config.third_party_auth_integrations +WHERE tpa_id = '{{ tpa_id }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + +No description available. + +```sql +SELECT +id, +custom_jwks, +inserted_at, +jwks_url, +oidc_issuer_url, +resolved_at, +resolved_jwks, +type, +updated_at +FROM supabase.config.third_party_auth_integrations +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.config.third_party_auth_integrations ( +oidc_issuer_url, +jwks_url, +custom_jwks, +ref +) +SELECT +'{{ oidc_issuer_url }}', +'{{ jwks_url }}', +'{{ custom_jwks }}', +'{{ ref }}' +RETURNING +id, +custom_jwks, +inserted_at, +jwks_url, +oidc_issuer_url, +resolved_at, +resolved_jwks, +type, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: third_party_auth_integrations + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the third_party_auth_integrations resource. + - name: oidc_issuer_url + value: "{{ oidc_issuer_url }}" + - name: jwks_url + value: "{{ jwks_url }}" + - name: custom_jwks + value: "{{ custom_jwks }}" +`} + + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM supabase.config.third_party_auth_integrations +WHERE tpa_id = '{{ tpa_id }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/database/backup_schedules/index.md b/website/docs/services/database/backup_schedules/index.md new file mode 100644 index 0000000..ee99af9 --- /dev/null +++ b/website/docs/services/database/backup_schedules/index.md @@ -0,0 +1,168 @@ +--- +title: backup_schedules +hide_title: false +hide_table_of_contents: false +keywords: + - backup_schedules + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a backup_schedules resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringTime of day to schedule daily backups, in UTC. Format: HH:MM:SS. (pattern: <code>^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?$</code>, example: 04:00:00)
string (date-time)Timestamp of when the backup schedule was last updated. (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$</code>, example: 2026-05-04T14:40:44+00:00)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref, schedule_forSets the time at which the daily backup runs. The change takes effect on the next backup window that includes the new time. If the new time has already passed for today, the first backup at the new time will occur the following day. It can only be updated 3 times per 24 hours.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +schedule_for, +updated_at +FROM supabase.database.backup_schedules +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +Sets the time at which the daily backup runs. The change takes effect on the next backup window that includes the new time. If the new time has already passed for today, the first backup at the new time will occur the following day. It can only be updated 3 times per 24 hours. + +```sql +UPDATE supabase.database.backup_schedules +SET +schedule_for = '{{ schedule_for }}' +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND schedule_for = '{{ schedule_for }}' --required +RETURNING +schedule_for, +updated_at; +``` + + diff --git a/website/docs/services/database/backups/index.md b/website/docs/services/database/backups/index.md new file mode 100644 index 0000000..6437f22 --- /dev/null +++ b/website/docs/services/database/backups/index.md @@ -0,0 +1,224 @@ +--- +title: backups +hide_title: false +hide_table_of_contents: false +keywords: + - backups + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a backups resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
integer
string
boolean
string (COMPLETED, FAILED, PENDING, REMOVED, ARCHIVED, CANCELLED)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref, recovery_time_target_unix
ref, id
ref, name
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +id, +inserted_at, +is_physical_backup, +status +FROM supabase.database.backups +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.database.backups.restore_pitr +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"recovery_time_target_unix": {{ recovery_time_target_unix }} +}' +; +``` + + + +No description available. + +```sql +EXEC supabase.database.backups.restore +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"id": {{ id }} +}' +; +``` + + + +No description available. + +```sql +EXEC supabase.database.backups.undo +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"name": "{{ name }}" +}' +; +``` + + diff --git a/website/docs/services/database/cli_login_roles/index.md b/website/docs/services/database/cli_login_roles/index.md new file mode 100644 index 0000000..422f9e9 --- /dev/null +++ b/website/docs/services/database/cli_login_roles/index.md @@ -0,0 +1,153 @@ +--- +title: cli_login_roles +hide_title: false +hide_table_of_contents: false +keywords: + - cli_login_roles + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a cli_login_roles resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref, read_only
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.database.cli_login_roles ( +read_only, +ref +) +SELECT +{{ read_only }} /* required */, +'{{ ref }}' +RETURNING +password, +role, +ttl_seconds +; +``` + + + +{`# Description fields are for documentation purposes +- name: cli_login_roles + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the cli_login_roles resource. + - name: read_only + value: {{ read_only }} +`} + + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM supabase.database.cli_login_roles +WHERE ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/database/databases/index.md b/website/docs/services/database/databases/index.md new file mode 100644 index 0000000..757c42f --- /dev/null +++ b/website/docs/services/database/databases/index.md @@ -0,0 +1,168 @@ +--- +title: databases +hide_title: false +hide_table_of_contents: false +keywords: + - databases + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a databases resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
refThis is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable.
ref, password
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +This is an **experimental** endpoint. It is subject to change or removal in future versions. Use it with caution, as it may not remain supported or stable. + +```sql +SELECT +name, +schemas +FROM supabase.database.databases +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.database.databases.update_password +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"password": "{{ password }}" +}' +; +``` + + diff --git a/website/docs/services/database/index.md b/website/docs/services/database/index.md new file mode 100644 index 0000000..6f29ef1 --- /dev/null +++ b/website/docs/services/database/index.md @@ -0,0 +1,46 @@ +--- +title: database +hide_title: false +hide_table_of_contents: false +keywords: + - database + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +database service documentation. + +:::info[Service Summary] + +total resources: __15__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/database/jit_access/index.md b/website/docs/services/database/jit_access/index.md new file mode 100644 index 0000000..589f768 --- /dev/null +++ b/website/docs/services/database/jit_access/index.md @@ -0,0 +1,247 @@ +--- +title: jit_access +hide_title: false +hide_table_of_contents: false +keywords: + - jit_access + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a jit_access resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + +
NameDatatypeDescription
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
refMappings of roles a user can assume in the project database
ref, role, rhostAuthorizes the request to assume a role in the project database
ref, user_id, rolesModifies the roles that can be assumed and for how long
user_id, refRemove JIT mappings of a user, revoking all JIT database access
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string (uuid)
+ +## `SELECT` examples + + + + +Mappings of roles a user can assume in the project database + +```sql +SELECT +* +FROM supabase.database.jit_access +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +Authorizes the request to assume a role in the project database + +```sql +INSERT INTO supabase.database.jit_access ( +role, +rhost, +ref +) +SELECT +'{{ role }}' /* required */, +'{{ rhost }}' /* required */, +'{{ ref }}' +RETURNING +user_id, +user_role +; +``` + + + +{`# Description fields are for documentation purposes +- name: jit_access + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the jit_access resource. + - name: role + value: "{{ role }}" + - name: rhost + value: "{{ rhost }}" +`} + + + + + +## `UPDATE` examples + + + + +Modifies the roles that can be assumed and for how long + +```sql +UPDATE supabase.database.jit_access +SET +user_id = '{{ user_id }}', +roles = '{{ roles }}' +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND user_id = '{{ user_id }}' --required +AND roles = '{{ roles }}' --required +RETURNING +user_id, +user_roles; +``` + + + + +## `DELETE` examples + + + + +Remove JIT mappings of a user, revoking all JIT database access + +```sql +DELETE FROM supabase.database.jit_access +WHERE user_id = '{{ user_id }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/database/jit_access_configs/index.md b/website/docs/services/database/jit_access_configs/index.md new file mode 100644 index 0000000..5c476a8 --- /dev/null +++ b/website/docs/services/database/jit_access_configs/index.md @@ -0,0 +1,175 @@ +--- +title: jit_access_configs +hide_title: false +hide_table_of_contents: false +keywords: + - jit_access_configs + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a jit_access_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
boolean (wire: appliedSuccessfully)
string (enabled, disabled)
string (postgres_upgrade_required, ssl_enforcement_required, temporarily_unavailable) (wire: unavailableReason)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref, state
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +applied_successfully, +state, +unavailable_reason +FROM supabase.database.jit_access_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.database.jit_access_configs +SET +state = '{{ state }}' +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND state = '{{ state }}' --required +RETURNING +applied_successfully, +state, +unavailable_reason; +``` + + diff --git a/website/docs/services/database/jit_invites/index.md b/website/docs/services/database/jit_invites/index.md new file mode 100644 index 0000000..c06f0d1 --- /dev/null +++ b/website/docs/services/database/jit_invites/index.md @@ -0,0 +1,206 @@ +--- +title: jit_invites +hide_title: false +hide_table_of_contents: false +keywords: + - jit_invites + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a jit_invites resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref, email, rolesInvites the external user and sets initial roles that can be assumed and for how long
invite_id, refRevokes and deletes the invitation
ref, email, tokenAccepts the invitation to JIT database access
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid)
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `INSERT` examples + + + + +Invites the external user and sets initial roles that can be assumed and for how long + +```sql +INSERT INTO supabase.database.jit_invites ( +email, +roles, +ref +) +SELECT +'{{ email }}' /* required */, +'{{ roles }}' /* required */, +'{{ ref }}' +RETURNING +invite_id, +email, +user_roles +; +``` + + + +{`# Description fields are for documentation purposes +- name: jit_invites + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the jit_invites resource. + - name: email + value: "{{ email }}" + - name: roles + value: + - role: "{{ role }}" + expires_at: {{ expires_at }} + allowed_networks: + allowed_cidrs: + - cidr: "{{ cidr }}" + allowed_cidrs_v6: + - cidr: "{{ cidr }}" + branches_only: {{ branches_only }} +`} + + + + + +## `DELETE` examples + + + + +Revokes and deletes the invitation + +```sql +DELETE FROM supabase.database.jit_invites +WHERE invite_id = '{{ invite_id }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Accepts the invitation to JIT database access + +```sql +EXEC supabase.database.jit_invites.accept +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"email": "{{ email }}", +"token": "{{ token }}" +}' +; +``` + + diff --git a/website/docs/services/database/jit_role_mappings/index.md b/website/docs/services/database/jit_role_mappings/index.md new file mode 100644 index 0000000..06c950a --- /dev/null +++ b/website/docs/services/database/jit_role_mappings/index.md @@ -0,0 +1,134 @@ +--- +title: jit_role_mappings +hide_title: false +hide_table_of_contents: false +keywords: + - jit_role_mappings + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a jit_role_mappings resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid) (pattern: <code>^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$</code>)
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
refMappings of roles a user can assume in the project database
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +Mappings of roles a user can assume in the project database + +```sql +SELECT +user_id, +user_roles +FROM supabase.database.jit_role_mappings +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/database/migrations/index.md b/website/docs/services/database/migrations/index.md new file mode 100644 index 0000000..550d225 --- /dev/null +++ b/website/docs/services/database/migrations/index.md @@ -0,0 +1,379 @@ +--- +title: migrations +hide_title: false +hide_table_of_contents: false +keywords: + - migrations + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a migrations resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
array
array
string
+
+ + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
version, ref
ref
ref, queryIdempotency-Key
version, ref
gte, ref
ref, queryIdempotency-Key
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringRollback migrations greater or equal to this version
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string
stringA unique key to ensure the same migration is tracked only once.
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +name, +created_by, +idempotency_key, +rollback, +statements, +version +FROM supabase.database.migrations +WHERE version = '{{ version }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + +No description available. + +```sql +SELECT +name, +version +FROM supabase.database.migrations +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.database.migrations ( +query, +name, +rollback, +ref, +Idempotency-Key +) +SELECT +'{{ query }}' /* required */, +'{{ name }}', +'{{ rollback }}', +'{{ ref }}', +'{{ Idempotency-Key }}' +; +``` + + + +{`# Description fields are for documentation purposes +- name: migrations + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the migrations resource. + - name: query + value: "{{ query }}" + - name: name + value: "{{ name }}" + - name: rollback + value: "{{ rollback }}" + - name: Idempotency-Key + value: "{{ Idempotency-Key }}" + description: A unique key to ensure the same migration is tracked only once. + description: A unique key to ensure the same migration is tracked only once. +`} + + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.database.migrations +SET +name = '{{ name }}', +rollback = '{{ rollback }}' +WHERE +version = '{{ version }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set; +``` + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM supabase.database.migrations +WHERE gte = '{{ gte }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.database.migrations.upsert +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set, +@Idempotency-Key='{{ Idempotency-Key }}' +@@json= +'{ +"query": "{{ query }}", +"name": "{{ name }}", +"rollback": "{{ rollback }}" +}' +; +``` + + diff --git a/website/docs/services/database/queries/index.md b/website/docs/services/database/queries/index.md new file mode 100644 index 0000000..4fa6b07 --- /dev/null +++ b/website/docs/services/database/queries/index.md @@ -0,0 +1,166 @@ +--- +title: queries +hide_title: false +hide_table_of_contents: false +keywords: + - queries + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a queries resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref, query
ref, queryAll entity references must be schema qualified.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.database.queries ( +query, +parameters, +read_only, +ref +) +SELECT +'{{ query }}' /* required */, +'{{ parameters }}', +{{ read_only }}, +'{{ ref }}' +RETURNING +rows +; +``` + + + +{`# Description fields are for documentation purposes +- name: queries + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the queries resource. + - name: query + value: "{{ query }}" + - name: parameters + value: "{{ parameters }}" + - name: read_only + value: {{ read_only }} +`} + + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +All entity references must be schema qualified. + +```sql +EXEC supabase.database.queries.run_read_only +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"query": "{{ query }}", +"parameters": "{{ parameters }}" +}' +; +``` + + diff --git a/website/docs/services/database/readonly_mode/index.md b/website/docs/services/database/readonly_mode/index.md new file mode 100644 index 0000000..cb1152c --- /dev/null +++ b/website/docs/services/database/readonly_mode/index.md @@ -0,0 +1,170 @@ +--- +title: readonly_mode +hide_title: false +hide_table_of_contents: false +keywords: + - readonly_mode + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a readonly_mode resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
boolean
string
boolean
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +enabled, +override_active_until, +override_enabled +FROM supabase.database.readonly_mode +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.database.readonly_mode.temporary_disable +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/database/restore_points/index.md b/website/docs/services/database/restore_points/index.md new file mode 100644 index 0000000..051addd --- /dev/null +++ b/website/docs/services/database/restore_points/index.md @@ -0,0 +1,197 @@ +--- +title: restore_points +hide_title: false +hide_table_of_contents: false +keywords: + - restore_points + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a restore_points resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string (AVAILABLE, PENDING, REMOVED, FAILED)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
refname
ref, name
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +name, +completed_on, +status +FROM supabase.database.restore_points +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND name = '{{ name }}' +; +``` + + + + +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.database.restore_points ( +name, +ref +) +SELECT +'{{ name }}' /* required */, +'{{ ref }}' +RETURNING +name, +completed_on, +status +; +``` + + + +{`# Description fields are for documentation purposes +- name: restore_points + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the restore_points resource. + - name: name + value: "{{ name }}" +`} + + + diff --git a/website/docs/services/database/snippets/index.md b/website/docs/services/database/snippets/index.md new file mode 100644 index 0000000..1c42b10 --- /dev/null +++ b/website/docs/services/database/snippets/index.md @@ -0,0 +1,330 @@ +--- +title: snippets +hide_title: false +hide_table_of_contents: false +keywords: + - snippets + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a snippets resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
object
string
boolean
string
object
object
string (sql)
string
object
string (user, project, org, public)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
boolean
string
object
object
string (sql)
string
object
string (user, project, org, public)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id, ref
refproject_ref, cursor, limit, sort_by, sort_order
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid)
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string
string
stringProject ref
string
string
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +id, +name, +content, +description, +favorite, +inserted_at, +owner, +project, +type, +updated_at, +updated_by, +visibility +FROM supabase.database.snippets +WHERE id = '{{ id }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + +No description available. + +```sql +SELECT +id, +name, +description, +favorite, +inserted_at, +owner, +project, +type, +updated_at, +updated_by, +visibility +FROM supabase.database.snippets +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND project_ref = '{{ project_ref }}' +AND cursor = '{{ cursor }}' +AND limit = '{{ limit }}' +AND sort_by = '{{ sort_by }}' +AND sort_order = '{{ sort_order }}' +; +``` + + diff --git a/website/docs/services/database/typescript_types/index.md b/website/docs/services/database/typescript_types/index.md new file mode 100644 index 0000000..e632d52 --- /dev/null +++ b/website/docs/services/database/typescript_types/index.md @@ -0,0 +1,134 @@ +--- +title: typescript_types +hide_title: false +hide_table_of_contents: false +keywords: + - typescript_types + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a typescript_types resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
refincluded_schemasReturns the TypeScript types of your schema for use with supabase-js.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string
+ +## `SELECT` examples + + + + +Returns the TypeScript types of your schema for use with supabase-js. + +```sql +SELECT +types +FROM supabase.database.typescript_types +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND included_schemas = '{{ included_schemas }}' +; +``` + + diff --git a/website/docs/services/database/webhooks/index.md b/website/docs/services/database/webhooks/index.md new file mode 100644 index 0000000..972d5d5 --- /dev/null +++ b/website/docs/services/database/webhooks/index.md @@ -0,0 +1,104 @@ +--- +title: webhooks +hide_title: false +hide_table_of_contents: false +keywords: + - webhooks + - database + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a webhooks resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.database.webhooks.enable +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/domains/custom_hostnames/index.md b/website/docs/services/domains/custom_hostnames/index.md new file mode 100644 index 0000000..7b1cf73 --- /dev/null +++ b/website/docs/services/domains/custom_hostnames/index.md @@ -0,0 +1,244 @@ +--- +title: custom_hostnames +hide_title: false +hide_table_of_contents: false +keywords: + - custom_hostnames + - domains + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a custom_hostnames resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
object
string (1_not_started, 2_initiated, 3_challenge_verified, 4_origin_setup_completed, 5_services_reconfigured)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
refremove_addon
ref, custom_hostname
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
stringIf true, also removes the custom domain add-on from the project subscription.
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +custom_hostname, +data, +status +FROM supabase.domains.custom_hostnames +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM supabase.domains.custom_hostnames +WHERE ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND remove_addon = '{{ remove_addon }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.domains.custom_hostnames.initialize +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"custom_hostname": "{{ custom_hostname }}" +}' +; +``` + + + +No description available. + +```sql +EXEC supabase.domains.custom_hostnames.reverify +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + + +No description available. + +```sql +EXEC supabase.domains.custom_hostnames.activate +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/domains/index.md b/website/docs/services/domains/index.md new file mode 100644 index 0000000..3cf4191 --- /dev/null +++ b/website/docs/services/domains/index.md @@ -0,0 +1,33 @@ +--- +title: domains +hide_title: false +hide_table_of_contents: false +keywords: + - domains + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +domains service documentation. + +:::info[Service Summary] + +total resources: __2__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/domains/vanity_subdomains/index.md b/website/docs/services/domains/vanity_subdomains/index.md new file mode 100644 index 0000000..478177f --- /dev/null +++ b/website/docs/services/domains/vanity_subdomains/index.md @@ -0,0 +1,218 @@ +--- +title: vanity_subdomains +hide_title: false +hide_table_of_contents: false +keywords: + - vanity_subdomains + - domains + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a vanity_subdomains resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (not-used, custom-domain-used, active)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
ref, vanity_subdomain
ref, vanity_subdomain
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +custom_domain, +status +FROM supabase.domains.vanity_subdomains +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM supabase.domains.vanity_subdomains +WHERE ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.domains.vanity_subdomains.check_availability +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"vanity_subdomain": "{{ vanity_subdomain }}" +}' +; +``` + + + +No description available. + +```sql +EXEC supabase.domains.vanity_subdomains.activate +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"vanity_subdomain": "{{ vanity_subdomain }}" +}' +; +``` + + diff --git a/website/docs/services/functions/edge_functions/index.md b/website/docs/services/functions/edge_functions/index.md new file mode 100644 index 0000000..d3948f2 --- /dev/null +++ b/website/docs/services/functions/edge_functions/index.md @@ -0,0 +1,453 @@ +--- +title: edge_functions +hide_title: false +hide_table_of_contents: false +keywords: + - edge_functions + - functions + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an edge_functions resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
integer (int64)
string
string
boolean
string
string
string (ACTIVE, REMOVED, THROTTLED)
integer (int64)
boolean
integer
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
integer (int64)
string
string
boolean
string
string
string (ACTIVE, REMOVED, THROTTLED)
integer (int64)
boolean
integer
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
function_slug, refRetrieves a function with the specified slug and project.
refReturns all functions you've previously added to the specified project.
ref, slug, name, bodyThis endpoint is deprecated - use the deploy endpoint. Creates a function and adds it to the specified project.
function_slug, refUpdates a function with the specified slug and project.
function_slug, refDeletes a function with the specified slug from the specified project.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringFunction slug
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +Retrieves a function with the specified slug and project. + +```sql +SELECT +id, +name, +created_at, +entrypoint_path, +ezbr_sha256, +import_map, +import_map_path, +slug, +status, +updated_at, +verify_jwt, +version +FROM supabase.functions.edge_functions +WHERE function_slug = '{{ function_slug }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + +Returns all functions you've previously added to the specified project. + +```sql +SELECT +id, +name, +created_at, +entrypoint_path, +ezbr_sha256, +import_map, +import_map_path, +slug, +status, +updated_at, +verify_jwt, +version +FROM supabase.functions.edge_functions +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +This endpoint is deprecated - use the deploy endpoint. Creates a function and adds it to the specified project. + +```sql +INSERT INTO supabase.functions.edge_functions ( +slug, +name, +body, +verify_jwt, +ref +) +SELECT +'{{ slug }}' /* required */, +'{{ name }}' /* required */, +'{{ body }}' /* required */, +{{ verify_jwt }}, +'{{ ref }}' +RETURNING +id, +name, +created_at, +entrypoint_path, +ezbr_sha256, +import_map, +import_map_path, +slug, +status, +updated_at, +verify_jwt, +version +; +``` + + + +{`# Description fields are for documentation purposes +- name: edge_functions + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the edge_functions resource. + - name: slug + value: "{{ slug }}" + - name: name + value: "{{ name }}" + - name: body + value: "{{ body }}" + - name: verify_jwt + value: {{ verify_jwt }} +`} + + + + + +## `UPDATE` examples + + + + +Updates a function with the specified slug and project. + +```sql +UPDATE supabase.functions.edge_functions +SET +name = '{{ name }}', +body = '{{ body }}', +verify_jwt = {{ verify_jwt }} +WHERE +function_slug = '{{ function_slug }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +RETURNING +id, +name, +created_at, +entrypoint_path, +ezbr_sha256, +import_map, +import_map_path, +slug, +status, +updated_at, +verify_jwt, +version; +``` + + + + +## `DELETE` examples + + + + +Deletes a function with the specified slug from the specified project. + +```sql +DELETE FROM supabase.functions.edge_functions +WHERE function_slug = '{{ function_slug }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/functions/index.md b/website/docs/services/functions/index.md new file mode 100644 index 0000000..83c4dee --- /dev/null +++ b/website/docs/services/functions/index.md @@ -0,0 +1,33 @@ +--- +title: functions +hide_title: false +hide_table_of_contents: false +keywords: + - functions + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +functions service documentation. + +:::info[Service Summary] + +total resources: __1__ + +::: + +## Resources +
+ +
+ +
+
\ No newline at end of file diff --git a/website/docs/services/network/index.md b/website/docs/services/network/index.md new file mode 100644 index 0000000..7840801 --- /dev/null +++ b/website/docs/services/network/index.md @@ -0,0 +1,33 @@ +--- +title: network +hide_title: false +hide_table_of_contents: false +keywords: + - network + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +network service documentation. + +:::info[Service Summary] + +total resources: __2__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/network/network_bans/index.md b/website/docs/services/network/network_bans/index.md new file mode 100644 index 0000000..3787183 --- /dev/null +++ b/website/docs/services/network/network_bans/index.md @@ -0,0 +1,198 @@ +--- +title: network_bans +hide_title: false +hide_table_of_contents: false +keywords: + - network_bans + - network + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a network_bans resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +banned_address, +identifier, +type +FROM supabase.network.network_bans +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM supabase.network.network_bans +WHERE ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.network.network_bans.retrieve +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/network/network_restrictions/index.md b/website/docs/services/network/network_restrictions/index.md new file mode 100644 index 0000000..856cae2 --- /dev/null +++ b/website/docs/services/network/network_restrictions/index.md @@ -0,0 +1,231 @@ +--- +title: network_restrictions +hide_title: false +hide_table_of_contents: false +keywords: + - network_restrictions + - network + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a network_restrictions resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
objectAt any given point in time, this is the config that the user has requested be applied to their project. The `status` field indicates if it has been applied to the project, or is pending. When an updated config is received, the applied config is moved to `old_config`.
string (disallowed, allowed)
objectPopulated when a new config has been received, but not registered as successfully applied to a project.
string (stored, applied)
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +applied_at, +config, +entitlement, +old_config, +status, +updated_at +FROM supabase.network.network_restrictions +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.network.network_restrictions +SET +add = '{{ add }}', +remove = '{{ remove }}' +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +RETURNING +applied_at, +config, +entitlement, +old_config, +status, +updated_at; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.network.network_restrictions.apply +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"dbAllowedCidrs": "{{ dbAllowedCidrs }}", +"dbAllowedCidrsV6": "{{ dbAllowedCidrsV6 }}" +}' +; +``` + + diff --git a/website/docs/services/organizations/entitlements/index.md b/website/docs/services/organizations/entitlements/index.md new file mode 100644 index 0000000..0d1d413 --- /dev/null +++ b/website/docs/services/organizations/entitlements/index.md @@ -0,0 +1,134 @@ +--- +title: entitlements +hide_title: false +hide_table_of_contents: false +keywords: + - entitlements + - organizations + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an entitlements resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
slug, refReturns the entitlements available to the organization based on their plan and any overrides.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
stringOrganization slug
+ +## `SELECT` examples + + + + +Returns the entitlements available to the organization based on their plan and any overrides. + +```sql +SELECT +entitlements +FROM supabase.organizations.entitlements +WHERE slug = '{{ slug }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/organizations/index.md b/website/docs/services/organizations/index.md new file mode 100644 index 0000000..e86d20f --- /dev/null +++ b/website/docs/services/organizations/index.md @@ -0,0 +1,35 @@ +--- +title: organizations +hide_title: false +hide_table_of_contents: false +keywords: + - organizations + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +organizations service documentation. + +:::info[Service Summary] + +total resources: __4__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/organizations/members/index.md b/website/docs/services/organizations/members/index.md new file mode 100644 index 0000000..80c636c --- /dev/null +++ b/website/docs/services/organizations/members/index.md @@ -0,0 +1,164 @@ +--- +title: members +hide_title: false +hide_table_of_contents: false +keywords: + - members + - organizations + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a members resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
string
string
boolean
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
slug, ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
stringOrganization slug
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +user_id, +role_name, +user_name, +avatar_url, +email, +mfa_enabled +FROM supabase.organizations.members +WHERE slug = '{{ slug }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/organizations/organizations/index.md b/website/docs/services/organizations/organizations/index.md new file mode 100644 index 0000000..e057b03 --- /dev/null +++ b/website/docs/services/organizations/organizations/index.md @@ -0,0 +1,261 @@ +--- +title: organizations +hide_title: false +hide_table_of_contents: false +keywords: + - organizations + - organizations + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an organizations resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
array
array
string (free, pro, team, enterprise, platform)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringDeprecated: Use `slug` instead.
string
stringOrganization slug (pattern: <code>^[\w-]+$</code>, example: tsrqponmlkjihgfedcba)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
slug, ref
refReturns a list of organizations that you currently belong to.
ref, name
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
stringOrganization slug
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +id, +name, +allowed_release_channels, +opt_in_tags, +plan +FROM supabase.organizations.organizations +WHERE slug = '{{ slug }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + +Returns a list of organizations that you currently belong to. + +```sql +SELECT +id, +name, +slug +FROM supabase.organizations.organizations +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.organizations.organizations ( +name, +ref +) +SELECT +'{{ name }}' /* required */, +'{{ ref }}' +RETURNING +id, +name, +slug +; +``` + + + +{`# Description fields are for documentation purposes +- name: organizations + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the organizations resource. + - name: name + value: "{{ name }}" +`} + + + diff --git a/website/docs/services/organizations/project_claims/index.md b/website/docs/services/organizations/project_claims/index.md new file mode 100644 index 0000000..db71c40 --- /dev/null +++ b/website/docs/services/organizations/project_claims/index.md @@ -0,0 +1,196 @@ +--- +title: project_claims +hide_title: false +hide_table_of_contents: false +keywords: + - project_claims + - organizations + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a project_claims resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (uuid) (pattern: <code>^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$</code>)
string
object
object
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
slug, token, ref
slug, token, ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
stringOrganization slug
string
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +created_at, +created_by, +expires_at, +preview, +project +FROM supabase.organizations.project_claims +WHERE slug = '{{ slug }}' -- required +AND token = '{{ token }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.organizations.project_claims.claim +@slug='{{ slug }}' --required, +@token='{{ token }}' --required, +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/profile/index.md b/website/docs/services/profile/index.md new file mode 100644 index 0000000..81d1bb3 --- /dev/null +++ b/website/docs/services/profile/index.md @@ -0,0 +1,33 @@ +--- +title: profile +hide_title: false +hide_table_of_contents: false +keywords: + - profile + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +profile service documentation. + +:::info[Service Summary] + +total resources: __1__ + +::: + +## Resources +
+ +
+ +
+
\ No newline at end of file diff --git a/website/docs/services/profile/profiles/index.md b/website/docs/services/profile/profiles/index.md new file mode 100644 index 0000000..f584616 --- /dev/null +++ b/website/docs/services/profile/profiles/index.md @@ -0,0 +1,140 @@ +--- +title: profiles +hide_title: false +hide_table_of_contents: false +keywords: + - profiles + - profile + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a profiles resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +gotrue_id, +primary_email, +username +FROM supabase.profile.profiles +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/projects/available_regions/index.md b/website/docs/services/projects/available_regions/index.md new file mode 100644 index 0000000..b61968d --- /dev/null +++ b/website/docs/services/projects/available_regions/index.md @@ -0,0 +1,152 @@ +--- +title: available_regions +hide_title: false +hide_table_of_contents: false +keywords: + - available_regions + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an available_regions resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
object
object
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
organization_slug, refcontinent, desired_instance_size
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSlug of your organization
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
stringContinent code to determine regional recommendations: NA (North America), SA (South America), EU (Europe), AF (Africa), AS (Asia), OC (Oceania), AN (Antarctica)
stringDesired instance size. Omit this field to always default to the smallest possible size.
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +all, +recommendations +FROM supabase.projects.available_regions +WHERE organization_slug = '{{ organization_slug }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND continent = '{{ continent }}' +AND desired_instance_size = '{{ desired_instance_size }}' +; +``` + + diff --git a/website/docs/services/projects/claim_tokens/index.md b/website/docs/services/projects/claim_tokens/index.md new file mode 100644 index 0000000..528281a --- /dev/null +++ b/website/docs/services/projects/claim_tokens/index.md @@ -0,0 +1,223 @@ +--- +title: claim_tokens +hide_title: false +hide_table_of_contents: false +keywords: + - claim_tokens + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a claim_tokens resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (uuid) (pattern: <code>^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$</code>)
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +created_at, +created_by, +expires_at, +token_alias +FROM supabase.projects.claim_tokens +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.projects.claim_tokens ( +ref +) +SELECT +'{{ ref }}' +RETURNING +created_at, +created_by, +expires_at, +token, +token_alias +; +``` + + + +{`# Description fields are for documentation purposes +- name: claim_tokens + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the claim_tokens resource. +`} + + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM supabase.projects.claim_tokens +WHERE ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/projects/disk_autoscale_configs/index.md b/website/docs/services/projects/disk_autoscale_configs/index.md new file mode 100644 index 0000000..abf7f53 --- /dev/null +++ b/website/docs/services/projects/disk_autoscale_configs/index.md @@ -0,0 +1,140 @@ +--- +title: disk_autoscale_configs +hide_title: false +hide_table_of_contents: false +keywords: + - disk_autoscale_configs + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a disk_autoscale_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
integerGrowth percentage for disk autoscaling
integerMaximum limit the disk size will grow to in GB
integerMinimum increment size for disk autoscaling in GB
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +growth_percent, +max_size_gb, +min_increment_gb +FROM supabase.projects.disk_autoscale_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/projects/disk_configs/index.md b/website/docs/services/projects/disk_configs/index.md new file mode 100644 index 0000000..141a808 --- /dev/null +++ b/website/docs/services/projects/disk_configs/index.md @@ -0,0 +1,168 @@ +--- +title: disk_configs +hide_title: false +hide_table_of_contents: false +keywords: + - disk_configs + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a disk_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
object
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
ref, attributes
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +attributes, +last_modified_at +FROM supabase.projects.disk_configs +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.projects.disk_configs.modify +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"attributes": "{{ attributes }}" +}' +; +``` + + diff --git a/website/docs/services/projects/disk_utilization/index.md b/website/docs/services/projects/disk_utilization/index.md new file mode 100644 index 0000000..65c1d0e --- /dev/null +++ b/website/docs/services/projects/disk_utilization/index.md @@ -0,0 +1,134 @@ +--- +title: disk_utilization +hide_title: false +hide_table_of_contents: false +keywords: + - disk_utilization + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a disk_utilization resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
object
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +metrics, +timestamp +FROM supabase.projects.disk_utilization +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/projects/index.md b/website/docs/services/projects/index.md new file mode 100644 index 0000000..3ce8e44 --- /dev/null +++ b/website/docs/services/projects/index.md @@ -0,0 +1,43 @@ +--- +title: projects +hide_title: false +hide_table_of_contents: false +keywords: + - projects + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +projects service documentation. + +:::info[Service Summary] + +total resources: __12__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/projects/organization_projects/index.md b/website/docs/services/projects/organization_projects/index.md new file mode 100644 index 0000000..1ee2d46 --- /dev/null +++ b/website/docs/services/projects/organization_projects/index.md @@ -0,0 +1,206 @@ +--- +title: organization_projects +hide_title: false +hide_table_of_contents: false +keywords: + - organization_projects + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an organization_projects resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
array
string
boolean
string
string
string (INACTIVE, ACTIVE_HEALTHY, ACTIVE_UNHEALTHY, COMING_UP, UNKNOWN, GOING_DOWN, INIT_FAILED, REMOVED, RESTORING, UPGRADING, PAUSING, RESTORE_FAILED, RESTARTING, PAUSE_FAILED, RESIZING)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
slug, refoffset, limit, search, sort, statusesReturns a paginated list of projects for the specified organization.<br /><br />This endpoint uses offset-based pagination. Use the `offset` parameter to skip a number of projects and the `limit` parameter to control the number of projects returned per page.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
stringOrganization slug
integerNumber of projects to return per page
integerNumber of projects to skip
stringSort order for projects
stringA comma-separated list of project statuses to filter by. The following values are supported: `ACTIVE_HEALTHY`, `INACTIVE`.
+ +## `SELECT` examples + + + + +Returns a paginated list of projects for the specified organization.<br /><br />This endpoint uses offset-based pagination. Use the `offset` parameter to skip a number of projects and the `limit` parameter to control the number of projects returned per page. + +```sql +SELECT +name, +cloud_provider, +databases, +inserted_at, +is_branch, +ref, +region, +status +FROM supabase.projects.organization_projects +WHERE slug = '{{ slug }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND offset = '{{ offset }}' +AND limit = '{{ limit }}' +AND search = '{{ search }}' +AND sort = '{{ sort }}' +AND statuses = '{{ statuses }}' +; +``` + + diff --git a/website/docs/services/projects/projects/index.md b/website/docs/services/projects/projects/index.md new file mode 100644 index 0000000..b138225 --- /dev/null +++ b/website/docs/services/projects/projects/index.md @@ -0,0 +1,565 @@ +--- +title: projects +hide_title: false +hide_table_of_contents: false +keywords: + - projects + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a projects resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringDeprecated: Use `ref` instead.
stringName of your project
stringDeprecated: Use `organization_slug` instead.
stringCreation timestamp
object
stringOrganization slug (pattern: <code>^[\w-]+$</code>, example: tsrqponmlkjihgfedcba)
stringProject ref (pattern: <code>^[a-z]+$</code>, example: abcdefghijklmnopqrst)
stringRegion of your project
string (INACTIVE, ACTIVE_HEALTHY, ACTIVE_UNHEALTHY, COMING_UP, UNKNOWN, GOING_DOWN, INIT_FAILED, REMOVED, RESTORING, UPGRADING, PAUSING, RESTORE_FAILED, RESTARTING, PAUSE_FAILED, RESIZING)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringDeprecated: Use `ref` instead.
stringName of your project
stringDeprecated: Use `organization_slug` instead.
stringCreation timestamp
object
stringOrganization slug (pattern: <code>^[\w-]+$</code>, example: tsrqponmlkjihgfedcba)
stringProject ref (pattern: <code>^[a-z]+$</code>, example: abcdefghijklmnopqrst)
stringRegion of your project
string (INACTIVE, ACTIVE_HEALTHY, ACTIVE_UNHEALTHY, COMING_UP, UNKNOWN, GOING_DOWN, INIT_FAILED, REMOVED, RESTORING, UPGRADING, PAUSING, RESTORE_FAILED, RESTARTING, PAUSE_FAILED, RESIZING)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
refReturns a list of all projects you've previously created.
ref, db_pass, name, organization_slug
ref, name
ref
ref, target_version
ref
ref
ref
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +id, +name, +organization_id, +created_at, +database, +organization_slug, +ref, +region, +status +FROM supabase.projects.projects +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + +Returns a list of all projects you've previously created. + +```sql +SELECT +id, +name, +organization_id, +created_at, +database, +organization_slug, +ref, +region, +status +FROM supabase.projects.projects +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.projects.projects ( +db_pass, +name, +organization_id, +organization_slug, +plan, +region, +region_selection, +kps_enabled, +desired_instance_size, +template_url, +release_channel, +postgres_engine, +high_availability, +ref +) +SELECT +'{{ db_pass }}' /* required */, +'{{ name }}' /* required */, +'{{ organization_id }}', +'{{ organization_slug }}' /* required */, +'{{ plan }}', +'{{ region }}', +'{{ region_selection }}', +{{ kps_enabled }}, +'{{ desired_instance_size }}', +'{{ template_url }}', +'{{ release_channel }}', +'{{ postgres_engine }}', +{{ high_availability }}, +'{{ ref }}' +RETURNING +id, +name, +organization_id, +created_at, +organization_slug, +ref, +region, +status +; +``` + + + +{`# Description fields are for documentation purposes +- name: projects + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the projects resource. + - name: db_pass + value: "{{ db_pass }}" + description: | + Database password + - name: name + value: "{{ name }}" + description: | + Name of your project + - name: organization_id + value: "{{ organization_id }}" + description: | + Deprecated: Use \`organization_slug\` instead. + - name: organization_slug + value: "{{ organization_slug }}" + description: | + Organization slug + - name: plan + value: "{{ plan }}" + description: | + Subscription Plan is now set on organization level and is ignored in this request + valid_values: ['free', 'pro'] + - name: region + value: "{{ region }}" + description: | + Region you want your server to reside in. Use region_selection instead. + valid_values: ['us-east-1', 'us-east-2', 'us-west-1', 'us-west-2', 'ap-east-1', 'ap-southeast-1', 'ap-northeast-1', 'ap-northeast-2', 'ap-southeast-2', 'eu-west-1', 'eu-west-2', 'eu-west-3', 'eu-north-1', 'eu-central-1', 'eu-central-2', 'ca-central-1', 'ap-south-1', 'sa-east-1'] + - name: region_selection + description: | + Region selection. Only one of region or region_selection can be specified. + value: + type: "{{ type }}" + code: "{{ code }}" + - name: kps_enabled + value: {{ kps_enabled }} + description: | + This field is deprecated and is ignored in this request + - name: desired_instance_size + value: "{{ desired_instance_size }}" + description: | + Desired instance size. Omit this field to always default to the smallest possible size. + valid_values: ['nano', 'micro', 'small', 'medium', 'large', 'xlarge', '2xlarge', '4xlarge', '8xlarge', '12xlarge', '16xlarge', '24xlarge', '24xlarge_optimized_memory', '24xlarge_optimized_cpu', '24xlarge_high_memory', '48xlarge', '48xlarge_optimized_memory', '48xlarge_optimized_cpu', '48xlarge_high_memory'] + - name: template_url + value: "{{ template_url }}" + description: | + Template URL used to create the project from the CLI. + - name: release_channel + value: "{{ release_channel }}" + - name: postgres_engine + value: "{{ postgres_engine }}" + - name: high_availability + value: {{ high_availability }} + description: | + [Experimental] Whether to enable high availability for the project. +`} + + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.projects.projects +SET +name = '{{ name }}' +WHERE +ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND name = '{{ name }}' --required +RETURNING +id, +name, +ref; +``` + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM supabase.projects.projects +WHERE ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.projects.projects.upgrade +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"target_version": "{{ target_version }}", +"release_channel": "{{ release_channel }}" +}' +; +``` + + + +No description available. + +```sql +EXEC supabase.projects.projects.pause +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + + +No description available. + +```sql +EXEC supabase.projects.projects.restart +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + + +No description available. + +```sql +EXEC supabase.projects.projects.restore +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + + +No description available. + +```sql +EXEC supabase.projects.projects.cancel_restore +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/projects/read_replicas/index.md b/website/docs/services/projects/read_replicas/index.md new file mode 100644 index 0000000..0b8109a --- /dev/null +++ b/website/docs/services/projects/read_replicas/index.md @@ -0,0 +1,130 @@ +--- +title: read_replicas +hide_title: false +hide_table_of_contents: false +keywords: + - read_replicas + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a read_replicas resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref, read_replica_region
ref, database_identifier
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +No description available. + +```sql +EXEC supabase.projects.read_replicas.setup +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"read_replica_region": "{{ read_replica_region }}" +}' +; +``` + + + +No description available. + +```sql +EXEC supabase.projects.read_replicas.remove +@ref='{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +@@json= +'{ +"database_identifier": "{{ database_identifier }}" +}' +; +``` + + diff --git a/website/docs/services/projects/restore_versions/index.md b/website/docs/services/projects/restore_versions/index.md new file mode 100644 index 0000000..b4f563d --- /dev/null +++ b/website/docs/services/projects/restore_versions/index.md @@ -0,0 +1,140 @@ +--- +title: restore_versions +hide_title: false +hide_table_of_contents: false +keywords: + - restore_versions + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a restore_versions resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (13, 14, 15, 17, 17-oriole)
string (internal, alpha, beta, ga, withdrawn, preview)
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +postgres_engine, +release_channel, +version +FROM supabase.projects.restore_versions +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/projects/service_health/index.md b/website/docs/services/projects/service_health/index.md new file mode 100644 index 0000000..5060cc8 --- /dev/null +++ b/website/docs/services/projects/service_health/index.md @@ -0,0 +1,164 @@ +--- +title: service_health +hide_title: false +hide_table_of_contents: false +keywords: + - service_health + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a service_health resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (auth, db, db_postgres_user, pooler, realtime, rest, storage, pg_bouncer)
string
booleanDeprecated. Use `status` instead.
object
string (COMING_UP, ACTIVE_HEALTHY, UNHEALTHY)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
services, reftimeout_ms
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
Comma-separated list of enums or array of enums.
integer
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +name, +error, +healthy, +info, +status +FROM supabase.projects.service_health +WHERE services = '{{ services }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND timeout_ms = '{{ timeout_ms }}' +; +``` + + diff --git a/website/docs/services/projects/upgrade_eligibility/index.md b/website/docs/services/projects/upgrade_eligibility/index.md new file mode 100644 index 0000000..730ea3a --- /dev/null +++ b/website/docs/services/projects/upgrade_eligibility/index.md @@ -0,0 +1,194 @@ +--- +title: upgrade_eligibility +hide_title: false +hide_table_of_contents: false +keywords: + - upgrade_eligibility + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a upgrade_eligibility resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (internal, alpha, beta, ga, withdrawn, preview)
number
boolean
string
array
arrayUse validation_errors instead.
array
arrayUse validation_errors instead.
arrayUse validation_errors instead.
array
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +current_app_version, +current_app_version_release_channel, +duration_estimate_hours, +eligible, +latest_app_version, +legacy_auth_custom_roles, +objects_to_be_dropped, +target_upgrade_versions, +unsupported_extensions, +user_defined_objects_in_internal_schemas, +validation_errors, +warnings +FROM supabase.projects.upgrade_eligibility +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/projects/upgrade_status/index.md b/website/docs/services/projects/upgrade_status/index.md new file mode 100644 index 0000000..f1bf8b3 --- /dev/null +++ b/website/docs/services/projects/upgrade_status/index.md @@ -0,0 +1,134 @@ +--- +title: upgrade_status +hide_title: false +hide_table_of_contents: false +keywords: + - upgrade_status + - projects + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a upgrade_status resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
object (wire: databaseUpgradeStatus)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
reftracking_id
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +database_upgrade_status +FROM supabase.projects.upgrade_status +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND tracking_id = '{{ tracking_id }}' +; +``` + + diff --git a/website/docs/services/secrets/api_keys/index.md b/website/docs/services/secrets/api_keys/index.md new file mode 100644 index 0000000..6262279 --- /dev/null +++ b/website/docs/services/secrets/api_keys/index.md @@ -0,0 +1,453 @@ +--- +title: api_keys +hide_title: false +hide_table_of_contents: false +keywords: + - api_keys + - secrets + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an api_keys resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
string
string
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string
object
string (legacy, publishable, secret, )
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
string
string
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
string
object
string (legacy, publishable, secret, )
string (date-time) (pattern: <code>^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$</code>)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id, refreveal
refreveal
ref, type, namereveal
id, refreveal
id, refreveal, was_compromised, reason
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (uuid)
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
string
stringBoolean string, true or false
stringBoolean string, true or false
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +id, +name, +api_key, +description, +hash, +inserted_at, +prefix, +secret_jwt_template, +type, +updated_at +FROM supabase.secrets.api_keys +WHERE id = '{{ id }}' -- required +AND ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND reveal = '{{ reveal }}' +; +``` + + + +No description available. + +```sql +SELECT +id, +name, +api_key, +description, +hash, +inserted_at, +prefix, +secret_jwt_template, +type, +updated_at +FROM supabase.secrets.api_keys +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +AND reveal = '{{ reveal }}' +; +``` + + + + +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO supabase.secrets.api_keys ( +type, +name, +description, +secret_jwt_template, +ref, +reveal +) +SELECT +'{{ type }}' /* required */, +'{{ name }}' /* required */, +'{{ description }}', +'{{ secret_jwt_template }}', +'{{ ref }}', +'{{ reveal }}' +RETURNING +id, +name, +api_key, +description, +hash, +inserted_at, +prefix, +secret_jwt_template, +type, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: api_keys + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the api_keys resource. + - name: type + value: "{{ type }}" + valid_values: ['publishable', 'secret'] + - name: name + value: "{{ name }}" + - name: description + value: "{{ description }}" + - name: secret_jwt_template + value: "{{ secret_jwt_template }}" + - name: reveal + value: "{{ reveal }}" + description: Boolean string. Truthy values: \`true\`, \`1\`, \`yes\`, \`on\`, \`y\`, \`enabled\` Falsy values: \`false\`, \`0\`, \`no\`, \`off\`, \`n\`, \`disabled\` + description: Boolean string. Truthy values: \`true\`, \`1\`, \`yes\`, \`on\`, \`y\`, \`enabled\` Falsy values: \`false\`, \`0\`, \`no\`, \`off\`, \`n\`, \`disabled\` +`} + + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.secrets.api_keys +SET +name = '{{ name }}', +description = '{{ description }}', +secret_jwt_template = '{{ secret_jwt_template }}' +WHERE +id = '{{ id }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND reveal = '{{ reveal}}' +RETURNING +id, +name, +api_key, +description, +hash, +inserted_at, +prefix, +secret_jwt_template, +type, +updated_at; +``` + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM supabase.secrets.api_keys +WHERE id = '{{ id }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +AND reveal = '{{ reveal }}' +AND was_compromised = '{{ was_compromised }}' +AND reason = '{{ reason }}' +; +``` + + diff --git a/website/docs/services/secrets/index.md b/website/docs/services/secrets/index.md new file mode 100644 index 0000000..47cd6e8 --- /dev/null +++ b/website/docs/services/secrets/index.md @@ -0,0 +1,34 @@ +--- +title: secrets +hide_title: false +hide_table_of_contents: false +keywords: + - secrets + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +secrets service documentation. + +:::info[Service Summary] + +total resources: __3__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/secrets/legacy_api_keys/index.md b/website/docs/services/secrets/legacy_api_keys/index.md new file mode 100644 index 0000000..92fdae1 --- /dev/null +++ b/website/docs/services/secrets/legacy_api_keys/index.md @@ -0,0 +1,166 @@ +--- +title: legacy_api_keys +hide_title: false +hide_table_of_contents: false +keywords: + - legacy_api_keys + - secrets + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a legacy_api_keys resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
boolean
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
enabled, ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringBoolean string. Truthy values: `true`, `1`, `yes`, `on`, `y`, `enabled` Falsy values: `false`, `0`, `no`, `off`, `n`, `disabled`
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +enabled +FROM supabase.secrets.legacy_api_keys +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `UPDATE` examples + + + + +No description available. + +```sql +UPDATE supabase.secrets.legacy_api_keys +SET +-- No updatable properties +WHERE +enabled = '{{ enabled }}' --required +AND ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +RETURNING +enabled; +``` + + diff --git a/website/docs/services/secrets/secrets/index.md b/website/docs/services/secrets/secrets/index.md new file mode 100644 index 0000000..8daf321 --- /dev/null +++ b/website/docs/services/secrets/secrets/index.md @@ -0,0 +1,221 @@ +--- +title: secrets +hide_title: false +hide_table_of_contents: false +keywords: + - secrets + - secrets + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a secrets resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
refReturns all secrets you've previously added to the specified project.
ref, name, valueCreates multiple secrets and adds them to the specified project.
refDeletes all secrets with the given names from the specified project
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +Returns all secrets you've previously added to the specified project. + +```sql +SELECT +name, +updated_at, +value +FROM supabase.secrets.secrets +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + + + +## `INSERT` examples + + + + +Creates multiple secrets and adds them to the specified project. + +```sql +INSERT INTO supabase.secrets.secrets ( +name, +value, +ref +) +SELECT +'{{ name }}' /* required */, +'{{ value }}' /* required */, +'{{ ref }}' +; +``` + + + +{`# Description fields are for documentation purposes +- name: secrets + props: + - name: ref + value: "{{ ref }}" + description: Required parameter for the secrets resource. + - name: name + value: "{{ name }}" + description: | + Secret name must not start with the SUPABASE_ prefix. + - name: value + value: "{{ value }}" +`} + + + + + +## `DELETE` examples + + + + +Deletes all secrets with the given names from the specified project + +```sql +DELETE FROM supabase.secrets.secrets +WHERE ref = '{{ ref }}' --required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/storage/buckets/index.md b/website/docs/services/storage/buckets/index.md new file mode 100644 index 0000000..d9b305e --- /dev/null +++ b/website/docs/services/storage/buckets/index.md @@ -0,0 +1,158 @@ +--- +title: buckets +hide_title: false +hide_table_of_contents: false +keywords: + - buckets + - storage + - supabase + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a buckets resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
string
boolean
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
ref
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSupabase project reference (the Project ID shown in the dashboard under Settings -> General; 20 lowercase letters). Resolved from the SUPABASE_PROJECT_ID environment variable when it is set (x-stackQL-envVar); otherwise it must be supplied on every project-scoped query as WHERE ref = '<ref>'. A WHERE value always takes precedence over the environment. (x-stackQL-envVar: SUPABASE_PROJECT_ID)
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +id, +name, +created_at, +owner, +public, +updated_at +FROM supabase.storage.buckets +WHERE ref = '{{ ref }}' -- required unless SUPABASE_PROJECT_ID is set +; +``` + + diff --git a/website/docs/services/storage/index.md b/website/docs/services/storage/index.md new file mode 100644 index 0000000..d76544d --- /dev/null +++ b/website/docs/services/storage/index.md @@ -0,0 +1,33 @@ +--- +title: storage +hide_title: false +hide_table_of_contents: false +keywords: + - storage + - supabase + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage supabase resources using SQL +custom_edit_url: null +image: /img/stackql-supabase-provider-featured-image.png +--- + +storage service documentation. + +:::info[Service Summary] + +total resources: __1__ + +::: + +## Resources +
+ +
+ +
+
\ No newline at end of file diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js new file mode 100644 index 0000000..f61e267 --- /dev/null +++ b/website/docusaurus.config.js @@ -0,0 +1,40 @@ +import {themes as prismThemes} from 'prism-react-renderer'; +import { createConfig } from './.shared-config/index.js'; +import { providerName, providerTitle } from './provider.js'; + +const config = createConfig({ + providerName, + providerTitle, + prismThemes, + overrides: { + // Docusaurus Faster (rspack + swc, via @docusaurus/faster) - kept for + // build speed and consistency with the other provider microsites. + future: { + v4: true, + faster: true, + }, + }, +}); + +// Use the locally vendored registry-branded logos (STACKQL>> | REGISTRY) +// instead of the shared config's hotlinked main-site wordmark - +// self-contained assets, no cross-origin fetch. global.css swaps in the +// -mobile variants below 996px. +const registryLogo = { + alt: 'StackQL', + href: '/', + src: 'img/stackql-registry-logo.svg', + srcDark: 'img/stackql-registry-logo-white.svg', +}; +config.themeConfig.navbar.logo = { ...registryLogo }; +config.themeConfig.footer.logo = { ...registryLogo }; + +// Date-stamp every doc page ("Last updated on ..."). The shared config +// ships showLastUpdateTime: false, and .shared-config is wiped and +// re-cloned on every build (vendor-config), so the flip must live here +// post-createConfig. Timestamps come from git history; the docs tree is +// committed after every regen, so pages stamp with their last +// regeneration date. +config.presets[0][1].docs.showLastUpdateTime = true; + +export default config; diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000..3c098a2 --- /dev/null +++ b/website/package.json @@ -0,0 +1,73 @@ +{ + "name": "website", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "vendor-config": "rimraf .shared-config && git clone --depth 1 --branch main https://github.com/stackql/docusaurus-config.git .shared-config", + "prestart": "yarn vendor-config", + "prebuild": "yarn vendor-config", + "sanitize-docs": "node scripts/sanitize-docs.mjs", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "^3.10.2", + "@docusaurus/faster": "^3.10.2", + "@docusaurus/plugin-ideal-image": "^3.10.2", + "@docusaurus/preset-classic": "^3.10.2", + "@docusaurus/theme-mermaid": "^3.10.2", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@iconify/react": "^6.0.0", + "@mdx-js/react": "^3.0.0", + "@mui/icons-material": "^7.3.1", + "@mui/material": "^7.3.1", + "clipboard": "^2.0.11", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.10.2", + "@docusaurus/types": "^3.10.2", + "rimraf": "^6.0.1" + }, + "overrides": { + "rimraf": "^6.0.1", + "glob": "^13.0.0", + "memfs": "^4.17.0", + "uuid": "^11.0.0", + "@ungap/structured-clone": "^1.3.1" + }, + "resolutions": { + "rimraf": "^6.0.1", + "glob": "^13.0.0", + "memfs": "^4.17.0", + "uuid": "^11.0.0", + "@ungap/structured-clone": "^1.3.1" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=20.0" + }, + "license": "MIT" +} diff --git a/website/provider.js b/website/provider.js new file mode 100644 index 0000000..5a2ecf0 --- /dev/null +++ b/website/provider.js @@ -0,0 +1,2 @@ +export const providerName = 'supabase'; +export const providerTitle = 'Supabase'; diff --git a/website/scripts/sanitize-docs.mjs b/website/scripts/sanitize-docs.mjs new file mode 100644 index 0000000..cf4fa94 --- /dev/null +++ b/website/scripts/sanitize-docs.mjs @@ -0,0 +1,230 @@ +#!/usr/bin/env node +// Post-docgen sanitizer for the generated provider docs. +// +// Vendor descriptions can carry literal angle-bracket placeholders (, +// ), stray unpaired HTML (,

) and XML samples +// (). MDX v3 parses any raw as JSX and +// fails the build on the first mismatch; braces ({...}) parse as JSX +// expressions with the same failure mode. +// +// The doc generator's own structure is line-shaped: one `...` +// cell per line, and description text ONLY ever appears as td inner +// content. So the deterministic fix: inside every description cell, +// escape ALL angle brackets and braces (protecting the stage-1 +// backtick-wrapped `` tokens as spans); leave +// every other line - tables, Tabs/TabItem/CodeBlock, CopyableCode, +// index link lists - byte-for-byte untouched. +// +// Run after `npm run generate-docs`, before building the website. + +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const docsDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'docs'); + +const TD_LINE = /^(\s*)(.*)(<\/td>\s*)$/; +const LINK_TOKEN = '(?:]*\\/>|[^<>]*<\\/code>)<\\/a>'; +const LINK_TOKEN_CELL = new RegExp(`^${LINK_TOKEN}(?:,\\s*${LINK_TOKEN})*$`); +const BACKTICKED = /`<([A-Za-z][A-Za-z0-9_.:-]*)>`/g; +// Control-char sentinels: cannot occur in generated markdown. +const OPEN = ''; +const CLOSE = ''; + +let filesChanged = 0; +let cellsEscaped = 0; +let orgScopeAnnotated = 0; + +// --------------------------------------------------------------------------- +// supabase-specific: project scope annotations +// +// ref is an OpenAPI server variable resolved from SUPABASE_PROJECT_ID +// (x-stackQL-envVar). docgen merges server variables into every method's +// required parameters and example WHERE clauses, which is right only when +// the variable is unset, so every example `ref = '{{ ref }}' -- required` +// (and the EXEC `@ref=... --required` form) is annotated "required unless +// SUPABASE_PROJECT_ID is set". The root paths (projects list/get, the +// organization surface, snippets, branch-by-id, profile) address the bare +// API base and carry no server variable, so docgen infers nothing for them. +// --------------------------------------------------------------------------- +const REF_REQUIRED_SQL = /(\bref\s*=\s*'\{\{ ref \}\}'\s*--\s*required)(?!\s+unless)/; +const REF_REQUIRED_EXEC = /(@ref='\{\{ ref \}\}'\s*--required)(?!\s+unless)/; + +function annotateOrgScope(lines) { + let changed = false; + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + if (REF_REQUIRED_SQL.test(line)) { + lines[i] = line.replace(REF_REQUIRED_SQL, '$1 unless SUPABASE_PROJECT_ID is set'); + changed = true; orgScopeAnnotated++; + } else if (REF_REQUIRED_EXEC.test(line)) { + lines[i] = line.replace(REF_REQUIRED_EXEC, '$1 unless SUPABASE_PROJECT_ID is set'); + changed = true; orgScopeAnnotated++; + } + } + return changed; +} + +function escapeDescription(inner) { + let out = inner.replace(BACKTICKED, (m, name) => OPEN + name + CLOSE); + out = out + .replace(//g, '>') + .replace(/\{/g, '{') + .replace(/\}/g, '}') + // Regex fragments in descriptions ("s3://([^/]+)(/.*)?") read as + // markdown links ("[...](...)") and crash the link resolver. + .replace(/\[/g, '[') + .replace(/\]/g, ']') + // GFM autolinks bare "scheme://..." literals on the DECODED text + // tree (entity escapes cannot evade it) and Docusaurus crashes on + // regex-shaped ones ("https://.+"). A zero-width space inside "://" + // is invisible in rendering but breaks the autolink prefix match. + .replace(/:\/\//g, ':​//'); + out = out.split(OPEN).join('<').split(CLOSE).join('>'); + return out; +} + +// Inside a CodeBlock template literal, a lone backslash before u/x is a JS +// string escape (backslash-u007F evaluates to a DEL byte at build time), and ${ +// starts interpolation. Double the backslash / escape the $ so the source +// text renders verbatim. +// The (?{`...`} spans hold verbatim SQL in a JSX + // template literal. The MDX/HTML escapes applied elsewhere must NOT + // touch these lines, but JS still evaluates the template literal, so + // sequences like backslash-u007F in AWS description text become raw control + // characters in the built HTML. Neutralize JS escape starts (\u, \x) + // and interpolation (${) so the text survives verbatim. + if (inCodeBlock) { + if (/<\/CodeBlock>/.test(line)) inCodeBlock = false; + const esc = escapeTemplateLiteral(line); + if (esc !== line) { lines[i] = esc; changed = true; } + continue; + } + if (//.test(line)) inCodeBlock = true; + const esc = escapeTemplateLiteral(line); + if (esc !== line) { lines[i] = esc; changed = true; } + continue; + } + if (/^/.test(trimmed)) { + inTabItemProse = false; + continue; + } + + // Description table cells (one ... per line). + const m = TD_LINE.exec(line); + if (m) { + const inner = m[2]; + if (/^]*\/>$/.test(inner)) continue; + // Structural link cells in the Methods/Parameters tables: one or + // more comma-separated anchor-wrapped tokens + // ( or + // x). Generated structure, + // not description text - must stay verbatim. + if (LINK_TOKEN_CELL.test(inner)) continue; + const codeCell = /^([^<>]*)<\/code>$/.exec(inner); + if (codeCell) { + // Type/pattern cells: regex patterns form accidental markdown + // links ("[...](...)" inside character classes) and MDX brace + // expressions ({4,7} quantifiers). Neutralise both; entities + // decode inside the element so rendering is unchanged. + const escaped = codeCell[1] + .replace(/\[/g, '[') + .replace(/\]/g, ']') + .replace(/\{/g, '{') + .replace(/\}/g, '}') + .replace(/:\/\//g, ':​//'); + if (escaped !== codeCell[1]) { + lines[i] = m[1] + '' + escaped + '' + m[3]; + cellsEscaped++; + changed = true; + } + continue; + } + const escaped = escapeDescription(inner); + if (escaped !== inner) { + lines[i] = m[1] + escaped + m[3]; + cellsEscaped++; + changed = true; + } + continue; + } + + // Method-description prose inside blocks (the paragraphs + // between the TabItem opener and the ```sql fence). Prose never + // starts with '<'; anything with raw angle brackets or braces there + // is hostile description content. + if (inTabItemProse && trimmed && !trimmed.startsWith('<') && /[<>{}]/.test(line)) { + const escaped = escapeDescription(line); + if (escaped !== line) { + lines[i] = escaped; + cellsEscaped++; + changed = true; + } + } + } + return { text: lines.join('\n'), changed }; +} + +function walk(dir) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const p = path.join(dir, entry.name); + if (entry.isDirectory()) { + walk(p); + } else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx')) { + const before = fs.readFileSync(p, 'utf8'); + const { text: after, changed } = sanitize(before, p); + if (changed) { + fs.writeFileSync(p, after); + filesChanged++; + } + } + } +} + +walk(docsDir); + +// The provider summary on the landing page: docgen counts every entry under +// each service directory, which includes the service's own index file, so it +// overstates the resource count by one per service. Recount from the +// resource directories and rewrite the figure. +let summaryFixed = false; +const indexPath = path.join(docsDir, 'index.md'); +const servicesDir = path.join(docsDir, 'services'); +if (fs.existsSync(indexPath) && fs.existsSync(servicesDir)) { + const resourceCount = fs.readdirSync(servicesDir, { withFileTypes: true }) + .filter((d) => d.isDirectory()) + .map((d) => fs.readdirSync(path.join(servicesDir, d.name), { withFileTypes: true }).filter((e) => e.isDirectory()).length) + .reduce((a, b) => a + b, 0); + const before = fs.readFileSync(indexPath, 'utf8'); + const after = before.replace(/total resources: __\d+__/, `total resources: __${resourceCount}__`); + if (after !== before) { fs.writeFileSync(indexPath, after); summaryFixed = true; } +} +console.log(`sanitize-docs: escaped ${cellsEscaped} description cell(s) across ${filesChanged} file(s); ${orgScopeAnnotated} ref scope annotation(s)${summaryFixed ? '; landing-page resource count corrected' : ''}`); diff --git a/website/sidebars.js b/website/sidebars.js new file mode 100644 index 0000000..f719984 --- /dev/null +++ b/website/sidebars.js @@ -0,0 +1,15 @@ +import { providerTitle } from './provider.js'; + +const sidebars = { + mainSidebar: [ + { type: 'link', label: 'All Providers', href: '/providers' }, + { + type: 'category', + label: `${providerTitle} Provider`, + link: { type: 'doc', id: 'provider-intro' }, + items: [{ type: 'autogenerated', dirName: 'services' }], + }, + ], +}; + +export default sidebars; diff --git a/website/src/components/CopyableCode/CopyableCode.js b/website/src/components/CopyableCode/CopyableCode.js new file mode 100644 index 0000000..d17969f --- /dev/null +++ b/website/src/components/CopyableCode/CopyableCode.js @@ -0,0 +1,29 @@ +import React, { useState } from 'react'; +import Clipboard from 'clipboard'; + +const CopyableCode = ({ code }) => { + const [isCopied, setIsCopied] = useState(false); + + const handleCopy = () => { + const clipboard = new Clipboard('.copyable-code', { + text: () => code, + }); + + clipboard.on('success', function() { + setIsCopied(true); + window.setTimeout(() => setIsCopied(false), 2000); + clipboard.destroy(); + }); + }; + + return ( + + + {code} + + {isCopied ? Copied! : null} + + ); +}; + +export default CopyableCode; diff --git a/website/src/components/SchemaTable/SchemaTable.js b/website/src/components/SchemaTable/SchemaTable.js new file mode 100644 index 0000000..2553353 --- /dev/null +++ b/website/src/components/SchemaTable/SchemaTable.js @@ -0,0 +1,49 @@ +import React, { useState } from 'react'; +import styles from './SchemaTable.module.css'; + +function SchemaRow({ name, type, description, children, depth = 0 }) { + const [expanded, setExpanded] = useState(false); + const hasChildren = children && children.length > 0; + + return ( + <> + + + {hasChildren && ( + setExpanded(!expanded)} + > + {expanded ? '▼' : '▶'} + + )} + {name} + + {type} + + + {expanded && children?.map((child, idx) => ( + + ))} + + ); +} + +export default function SchemaTable({ fields }) { + return ( + + + + + + + + + + {fields.map((field, idx) => ( + + ))} + +
NameDatatypeDescription
+ ); +} \ No newline at end of file diff --git a/website/src/components/SchemaTable/SchemaTable.module.css b/website/src/components/SchemaTable/SchemaTable.module.css new file mode 100644 index 0000000..ed4ef36 --- /dev/null +++ b/website/src/components/SchemaTable/SchemaTable.module.css @@ -0,0 +1,27 @@ +.schemaTable { + width: 100%; + border-collapse: collapse; +} + +.schemaTable th, +.schemaTable td { + border: 1px solid var(--ifm-table-border-color); + padding: 8px 12px; + text-align: left; +} + +.schemaTable th { + background: var(--ifm-table-head-background); +} + +.row:hover { + background: var(--ifm-table-stripe-background); +} + +.expander { + cursor: pointer; + margin-right: 8px; + user-select: none; + color: var(--ifm-color-primary); + font-size: 10px; +} \ No newline at end of file diff --git a/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.js b/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.js new file mode 100644 index 0000000..b252fd7 --- /dev/null +++ b/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.js @@ -0,0 +1,400 @@ +import React, { useState } from 'react'; +import Button from '@mui/material/Button'; +import Menu from '@mui/material/Menu'; +import MenuItem from '@mui/material/MenuItem'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import DownloadIcon from '@mui/icons-material/Download'; +import ContentCopyIcon from '@mui/icons-material/ContentCopy'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import {useLocation} from '@docusaurus/router'; +import styles from './StackqlDeployDropdown.module.css'; + +/** + * Collects all DOM elements between a heading and the next

. + */ +function getElementsBetweenHeadings(heading) { + const elements = []; + let el = heading.nextElementSibling; + while (el && el.tagName !== 'H2') { + elements.push(el); + el = el.nextElementSibling; + } + return elements; +} + +/** + * Extracts text from a element, preserving newlines. + * prism-react-renderer wraps each line in a child element (div or span), + * and textContent concatenates them without newlines, so we join manually. + */ +function getCodeText(codeEl) { + if (codeEl.children.length > 0) { + return Array.from(codeEl.children) + .map(line => line.textContent.replace(/\n$/, '')) + .join('\n'); + } + return codeEl.textContent; +} + +/** + * Extracts the text content of a code block from within a set of elements. + * If preferredTab is provided, looks for a tab with that label first. + */ +function extractCodeFromElements(elements, preferredTab) { + if (preferredTab) { + for (const el of elements) { + const tabs = el.querySelectorAll('[role="tab"]'); + const panels = el.querySelectorAll('[role="tabpanel"]'); + for (let i = 0; i < tabs.length; i++) { + const tabLabel = tabs[i].textContent.trim().toLowerCase(); + if (tabLabel === preferredTab.toLowerCase() && panels[i]) { + const codeEl = panels[i].querySelector('pre code'); + if (codeEl) return getCodeText(codeEl); + } + } + } + } + // Fallback: first code block in the section + for (const el of elements) { + const codeEl = el.querySelector('pre code'); + if (codeEl) return getCodeText(codeEl); + } + return null; +} + +/** + * Scans the rendered page DOM for SQL example sections and extracts + * code blocks to build a context-aware stackql-deploy template. + * + * Section heading IDs generated by Docusaurus: + * ## `SELECT` examples -> #select-examples + * ## `INSERT` examples -> #insert-examples + * ## `UPDATE` examples -> #update-examples + * ## `REPLACE` examples -> #replace-examples + * ## `DELETE` examples -> #delete-examples + * ## Lifecycle Methods -> #lifecycle-methods + */ +function extractTemplateFromPage() { + const sections = {}; + + // --- SELECT (prefer "get" tab for a single-resource check) --- + const selectH2 = document.getElementById('select-examples'); + if (selectH2) { + const els = getElementsBetweenHeadings(selectH2); + sections.select = extractCodeFromElements(els, 'get (all properties)') + || extractCodeFromElements(els, 'get') + || extractCodeFromElements(els); + } + + // --- INSERT (prefer "create" tab -- skip "Manifest" yaml tab) --- + const insertH2 = document.getElementById('insert-examples') || document.getElementById('insert-example'); + if (insertH2) { + const els = getElementsBetweenHeadings(insertH2); + sections.insert = extractCodeFromElements(els, 'All Properties') + || extractCodeFromElements(els, 'create') + || extractCodeFromElements(els); + } + + // --- UPDATE --- + const updateH2 = document.getElementById('update-examples') || document.getElementById('update-example'); + if (updateH2) { + const els = getElementsBetweenHeadings(updateH2); + sections.update = extractCodeFromElements(els); + } + + // --- REPLACE --- + const replaceH2 = document.getElementById('replace-examples'); + if (replaceH2) { + const els = getElementsBetweenHeadings(replaceH2); + sections.replace = extractCodeFromElements(els); + } + + // --- DELETE (standalone section) --- + const deleteH2 = document.getElementById('delete-examples') || document.getElementById('delete-example'); + if (deleteH2) { + const els = getElementsBetweenHeadings(deleteH2); + sections.delete = extractCodeFromElements(els); + } + + // --- Lifecycle Methods: look for a "delete" tab if no standalone DELETE --- + if (!sections.delete) { + const lifecycleH2 = document.getElementById('lifecycle-methods'); + if (lifecycleH2) { + const els = getElementsBetweenHeadings(lifecycleH2); + sections.delete = extractCodeFromElements(els, 'delete'); + } + } + + return sections; +} + +/** + * Parses a SELECT SQL string into its components: + * fields - column names from the SELECT list + * table - fully-qualified table reference after FROM + * where - the raw WHERE clause (conditions only, no leading WHERE) + */ +function parseSelectSQL(sql) { + const selectFromMatch = sql.match(/SELECT\s+([\s\S]+?)\s+FROM\s+/i); + const fromMatch = sql.match(/FROM\s+(\S+)/i); + const whereMatch = sql.match(/WHERE\s+([\s\S]+?)(?:\s*;\s*$|$)/i); + + const fields = selectFromMatch + ? selectFromMatch[1] + .split(',') + .map(f => f.trim()) + .filter(f => f && f !== '*') + : []; + + const table = fromMatch ? fromMatch[1] : ''; + const where = whereMatch ? whereMatch[1].trim().replace(/;\s*$/, '').trim() : ''; + + return { fields, table, where }; +} + +// Parses column names from an INSERT INTO ... (...) statement +// and returns the base field names (stripping data__ prefix). +function parseInsertColumns(sql) { + const match = sql.match(/INSERT\s+INTO\s+\S+\s*\(([\s\S]+?)\)/i); + if (!match) return []; + return match[1] + .split(',') + // .map(c => c.trim().replace(/^data__/, '')) + .map(c => c.trim()) + .filter(Boolean); +} + +// Builds an "exists" hint query - a simplified count query using only the +// original WHERE params (required parameters from the page). +function buildExistsQuery(parsed) { + let sql = `SELECT count(*) as count\nFROM ${parsed.table}`; + if (parsed.where) { + const conditions = parsed.where.split(/\s+AND\s+/i).map(c => c.trim()); + sql += `\nWHERE ${conditions.join(' AND\n')}`; + } + sql += '\n;'; + return sql; +} + +// Builds a "statecheck" hint query - a count query where SELECT fields become +// equality checks in the WHERE clause, followed by the original WHERE params. +function buildStatecheckQuery(parsed) { + // Extract condition field names from WHERE clause to avoid duplicates + const whereConditionFields = new Set(); + if (parsed.where) { + parsed.where.split(/\s+AND\s+/i).forEach(c => { + const match = c.trim().match(/^\s*(\w+)\s*=/); + if (match) whereConditionFields.add(match[1].toLowerCase()); + }); + } + + // Filter out fields already in the WHERE clause (e.g., region) + const filteredFields = parsed.fields.filter(f => !whereConditionFields.has(f.toLowerCase())); + const fieldConditions = filteredFields.map(f => `${f} = {{ ${f} }}`); + + // Collect all WHERE conditions + const allConditions = [...fieldConditions]; + if (parsed.where) { + parsed.where.split(/\s+AND\s+/i).forEach(c => allConditions.push(c.trim())); + } + + let sql = `SELECT count(*) as count\nFROM ${parsed.table}`; + if (allConditions.length > 0) { + sql += `\nWHERE \n${allConditions.join(' AND\n')}`; + } + sql += '\n;'; + return sql; +} + +/** + * Builds the stackql-deploy IQL template from extracted sections. + * Only includes anchors for operations that actually exist on the page. + */ +function buildTemplate(sections) { + const parts = []; + let parsed = null; + + if (sections.select) { + parsed = parseSelectSQL(sections.select); + parts.push(`/*+ exists */\n${buildExistsQuery(parsed)}`); + } + + if (sections.insert) { + parts.push(sections.insert); + } + + if (sections.update) { + parts.push(sections.update); + } else if (sections.replace) { + parts.push(sections.replace); + } + + if (parsed) { + // If INSERT exists, narrow to mutable fields only (skip created_at, etc.) + let mutableParsed = parsed; + if (sections.insert) { + const insertColSet = new Set(parseInsertColumns(sections.insert)); + const mutableFields = parsed.fields.filter(f => insertColSet.has(f)); + if (mutableFields.length > 0) { + mutableParsed = { ...parsed, fields: mutableFields }; + } + } + + parts.push(`/*+ statecheck, retries=5, retry_delay=10 */\n${buildStatecheckQuery(mutableParsed)}`); + + // Use all GET fields minus region for exports + const exportFields = parsed.fields.filter(f => f.toLowerCase() !== 'region'); + let exportsSql = `SELECT\n${exportFields.join(',\n')}\nFROM ${parsed.table}`; + if (parsed.where) { + const conditions = parsed.where.split(/\s+AND\s+/i).map(c => c.trim()); + exportsSql += `\nWHERE ${conditions.join(' AND\n')}`; + } + exportsSql += ';'; + parts.push(`/*+ exports */\n${exportsSql}`); + } + + if (sections.delete) { + parts.push(sections.delete); + } + + return parts.join('\n\n'); +} + +function getResourceName(pathname) { + const match = pathname.match(/\/services\/[^/]+\/([^/]+)/); + return match ? match[1] : null; +} + +export default function StackqlDeployDropdown() { + const [anchorEl, setAnchorEl] = useState(null); + const [copied, setCopied] = useState(false); + const open = Boolean(anchorEl); + const location = useLocation(); + + const resourceName = getResourceName(location.pathname); + + // Only render on resource pages (URL: /services/{service}/{resource}) + if (!resourceName) return null; + + const filename = `${resourceName}.iql`; + + function getTemplate() { + const sections = extractTemplateFromPage(); + return buildTemplate(sections); + } + + const handleClick = (event) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleDownload = () => { + const template = getTemplate(); + if (!template) { + handleClose(); + return; + } + const blob = new Blob([template], { type: 'text/plain' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + handleClose(); + }; + + const handleCopy = async () => { + const template = getTemplate(); + if (!template) { + handleClose(); + return; + } + try { + await navigator.clipboard.writeText(template); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch { + const textarea = document.createElement('textarea'); + textarea.value = template; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + document.body.removeChild(textarea); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } + handleClose(); + }; + + return ( +
+ + + + + + + + Download + + + + + + + + {copied ? 'Copied!' : 'Copy'} + + + +
+ ); +} diff --git a/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.module.css b/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.module.css new file mode 100644 index 0000000..cdb453c --- /dev/null +++ b/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.module.css @@ -0,0 +1,12 @@ +/* Only show on md+ viewports (Docusaurus default breakpoint: 996px) */ +.dropdownWrapper { + display: none; + flex-shrink: 0; +} + +@media screen and (min-width: 997px) { + .dropdownWrapper { + display: flex; + align-items: center; + } +} diff --git a/website/src/css/global.css b/website/src/css/global.css new file mode 100644 index 0000000..3e50218 --- /dev/null +++ b/website/src/css/global.css @@ -0,0 +1,287 @@ +@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;700&display=swap'); + +/* +* Brand Colour +*/ +:root { + --gamma-blue: #0f4c81; + --gamma-medium-blue: #6c83aa; + /* Blues */ + --gamma-dark-blue: #004165; + --gamma-light-blue: #b5bfd4; + --code-blue: #00f; + /* Grey scale */ + --default-text: #2e3940; + --secondary-text: #718096; + --black: #000; + --white: #fff; + --grey-1: #f5f6f7; + --grey-2: #ebedef; + /* Dark Mode Blacks */ + --dark-1: #606264; + --dark-2: #404244; + --black-2: #090909; + --light-black: #111; + /* Colours */ + --default-green: #00af91; + --secondary-green: #43af43; + --default-red: #e94560; + --default-red-2: #fc91a2; + --default-blue: #2e3940; + --default-light-blue: #bfc2ff; + --default-blue-2: #1a1a2e; + --secondary-blue: #16213e; + --gamma-dark: #030760; +} + +:root { + /* infima styling */ + --ifm-font-family-base: 'Montserrat', sans-serif; + --ifm-font-size-base: 16px; + --ifm-code-font-size: 95%; + --ifm-background-color: var(--white); + --ifm-color-primary: var(--gamma-dark-blue); + --ifm-code-color: var(--code-blue); + --ifm-color-content: #2d3748; + --ifm-dropdown-link-color: var(--ifm-menu-color); + --ifm-navbar-link-color: var(--ifm-menu-color); + --ifm-menu-color-background-active: var(--ifm-color-emphasis-200); +} + +[data-theme='dark'] { + --ifm-font-base-color: #dee0f2; + --ifm-color-content: var(--ifm-font-base-color); + --ifm-navbar-link-hover-color: var(--gamma-light-blue); + --ifm-link-color: var(--gamma-light-blue); + --ifm-menu-color-active: var(--gamma-light-blue); + --ifm-color-primary: var(--white); + --ifm-background-color: var(--black); + --ifm-footer-background-color: var(--black-2); + --ifm-navbar-background-color: var(--black); + --ifm-menu-color-background-active: #21243d; + --ifm-code-color: var(--white); +} + +/* +* copyable code +*/ +.copyable-code-container code { + cursor: pointer; + position: relative; +} + +/* +* github +*/ + .header-github-link:before { + content: ''; + width: 140px; + height: 28px; + display: flex; + background-image: url("https://img.shields.io/github/stars/stackql/stackql?logo=github&style=social"); + background-repeat: no-repeat; + background-position: center; + background-size: contain; +} + +.header-github-link:hover { + opacity: 0.6; +} + +/* +* footer +*/ +:root .footer--dark { + background-color: transparent; + --ifm-footer-color: var(--secondary-text); + --ifm-footer-link-color: var(--secondary-text); + --ifm-footer-title-color: var(--black-2); +} +:root .footer .footerLogoLink_src-theme-Footer- { + opacity: 1; +} +:root .footer .divider { + background-color: rgba(0, 0, 0, 0.12); +} +:root .footer .container { + background-color: var(--grey-1); +} +:root a code { + color: var(--ifm-code-color); +} + +html[data-theme='dark'] .footer--dark { + --ifm-footer-background-color: transparent; + --ifm-footer-color: #bdbdbd; + --ifm-footer-link-color: #bdbdbd; + --ifm-footer-title-color: var(--white); +} +html[data-theme='dark'] .footer .divider { + background-color: var(--secondary-blue); +} +html[data-theme='dark'] .footer .container { + background-color: var(--black-2); +} + +.footer__items { + font-weight: 400; + line-height: 1.43; + font-size: 0.875rem; +} +.footer__items .footer__link-item:hover { + text-decoration: none; +} +.footer__title { + font-weight: 700; + margin-bottom: 0; + line-height: 1.43; + font-size: 0.875rem; +} +.footer { + padding-bottom: 0; +} +.footer .container { + margin: 0 auto; + padding: 56px 80px; + max-width: 850px; + border-radius: 17px; +} +.divider { + width: 100%; + margin: 40px 0px; + border: none; + height: 1px; + flex-shrink: 0; +} +.footer__subtitle { + font-weight: 500; + line-height: 1.57; + font-size: 0.875rem; +} +.footer__logo { + margin-top: 0; +} + +.footerSocialIcon { + font-size: 24px; + margin: 0 12px; +} + + .footerSocialIconButton { + padding: 0; + color: 'rgba(255,255,255,.6)'; + } + + .footerSocialIconButton:hover { + background: 'transparent'; + color: 'rgba(255,255,255,.6)'; + } + + .footer__items { + list-style-type: none; + margin: 0; + padding: 0; + } + +/* +* custom styles +*/ +code { + font-weight: bold; +} +table { + display: block; + max-width: -moz-fit-content; + max-width: fit-content; + margin: 0 auto; + overflow-x: auto; + white-space: nowrap; +} + +/* +* nav bar +*/ + +.navbar__item { + font-weight: 700; +} +.navbar__link { + font-weight: 700; +} + +/* +* doc field headings +*/ + +:root .docFieldHeading { + color: #0000FF; +} + +html[data-theme='dark'] .docFieldHeading { + color: #FFFFFF; +} + +/* +* vhs image +*/ + +.vhsImage { + max-width: 60%; /* Reduce width to 80% of container */ + display: block; /* Ensure it's a block element for margin auto to work */ + margin: 40px auto; /* Add 40px space above/below and center horizontally */ + transform: scale(0.9); /* Make it 90% of original size */ + transform-origin: center; /* Scale from center */ +} + +/* Add more space before and after the image container */ +img[class="vhsImage"] { + margin-top: 40px; + margin-bottom: 40px; +} + +/* If the image is inside a container, you might need this */ +.vhsImage-container, +div:has(> .vhsImage) { + margin: 40px 0; +} + +/* provider doc column */ +.providerDocColumn { + width: calc(50% - var(--ifm-spacing-horizontal)); + float: left; + padding-left: var(--ifm-list-margin); +} + +@media screen and (max-width: 600px) { + .providerDocColumn { + width: 100%; + } + } + +/* +* breadcrumbs with actions (stackql-deploy dropdown) +*/ +.breadcrumbs-with-actions { + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: nowrap; +} + +.breadcrumbs-with-actions nav { + flex: 1; + min-width: 0; +} + +/* +* registry logo: swap to the narrower -mobile mark below the Docusaurus +* mobile breakpoint (996px), per theme +*/ +@media (max-width: 996px) { + .navbar__logo img[src$='stackql-registry-logo.svg'] { + content: url('/img/stackql-registry-logo-mobile.svg'); + } + .navbar__logo img[src$='stackql-registry-logo-white.svg'] { + content: url('/img/stackql-registry-logo-white-mobile.svg'); + } +} \ No newline at end of file diff --git a/website/src/theme/DocBreadcrumbs/index.js b/website/src/theme/DocBreadcrumbs/index.js new file mode 100644 index 0000000..2c5c7cf --- /dev/null +++ b/website/src/theme/DocBreadcrumbs/index.js @@ -0,0 +1,12 @@ +import React from 'react'; +import DocBreadcrumbs from '@theme-original/DocBreadcrumbs'; +import StackqlDeployDropdown from '@site/src/components/StackqlDeployDropdown/StackqlDeployDropdown'; + +export default function DocBreadcrumbsWrapper(props) { + return ( +
+ + +
+ ); +} diff --git a/website/src/theme/Footer/Copyright/index.tsx b/website/src/theme/Footer/Copyright/index.tsx new file mode 100644 index 0000000..ab1657d --- /dev/null +++ b/website/src/theme/Footer/Copyright/index.tsx @@ -0,0 +1,20 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import type {Props} from '@theme/Footer/Copyright'; + +export default function FooterCopyright({copyright}: Props): JSX.Element { + return ( +
+ ); +} diff --git a/website/src/theme/Footer/Layout/index.tsx b/website/src/theme/Footer/Layout/index.tsx new file mode 100644 index 0000000..bb22f31 --- /dev/null +++ b/website/src/theme/Footer/Layout/index.tsx @@ -0,0 +1,34 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import clsx from 'clsx'; +import type {Props} from '@theme/Footer/Layout'; + +export default function FooterLayout({ + style, + links, + logo, + copyright, +}: Props): JSX.Element { + return ( +
+
+ {links} + {(logo || copyright) && ( +
+ {logo &&
{logo}
} + {copyright} +
+ )} +
+
+ ); +} diff --git a/website/src/theme/Footer/LinkItem/index.tsx b/website/src/theme/Footer/LinkItem/index.tsx new file mode 100644 index 0000000..44e1517 --- /dev/null +++ b/website/src/theme/Footer/LinkItem/index.tsx @@ -0,0 +1,36 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; + +import Link from '@docusaurus/Link'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import isInternalUrl from '@docusaurus/isInternalUrl'; +import IconExternalLink from '@theme/Icon/ExternalLink'; +import type {Props} from '@theme/Footer/LinkItem'; + +export default function FooterLinkItem({item}: Props): JSX.Element { + const {to, href, label, prependBaseUrlToHref, ...props} = item; + const toUrl = useBaseUrl(to); + const normalizedHref = useBaseUrl(href, {forcePrependBaseUrl: true}); + + return ( + + {label} + {href && !isInternalUrl(href) && } + + ); +} diff --git a/website/src/theme/Footer/Links/MultiColumn/index.tsx b/website/src/theme/Footer/Links/MultiColumn/index.tsx new file mode 100644 index 0000000..2239e8c --- /dev/null +++ b/website/src/theme/Footer/Links/MultiColumn/index.tsx @@ -0,0 +1,51 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import LinkItem from '@theme/Footer/LinkItem'; +import type {Props} from '@theme/Footer/Links/MultiColumn'; + +type ColumnType = Props['columns'][number]; +type ColumnItemType = ColumnType['items'][number]; + +function ColumnLinkItem({item}: {item: ColumnItemType}) { + return item.html ? ( +
  • + ) : ( +
  • + +
  • + ); +} + +function Column({column}: {column: ColumnType}) { + return ( +
    +
    {column.title}
    +
      + {column.items.map((item, i) => ( + + ))} +
    +
    + ); +} + +export default function FooterLinksMultiColumn({columns}: Props): JSX.Element { + return ( +
    + {columns.map((column, i) => ( + + ))} +
    + ); +} diff --git a/website/src/theme/Footer/Links/Simple/index.tsx b/website/src/theme/Footer/Links/Simple/index.tsx new file mode 100644 index 0000000..e14b77f --- /dev/null +++ b/website/src/theme/Footer/Links/Simple/index.tsx @@ -0,0 +1,42 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import LinkItem from '@theme/Footer/LinkItem'; +import type {Props} from '@theme/Footer/Links/Simple'; + +function Separator() { + return ·; +} + +function SimpleLinkItem({item}: {item: Props['links'][number]}) { + return item.html ? ( + + ) : ( + + ); +} + +export default function FooterLinksSimple({links}: Props): JSX.Element { + return ( +
    +
    + {links.map((item, i) => ( + + + {links.length !== i + 1 && } + + ))} +
    +
    + ); +} diff --git a/website/src/theme/Footer/Links/index.tsx b/website/src/theme/Footer/Links/index.tsx new file mode 100644 index 0000000..a4b0f33 --- /dev/null +++ b/website/src/theme/Footer/Links/index.tsx @@ -0,0 +1,21 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; + +import {isMultiColumnFooterLinks} from '@docusaurus/theme-common'; +import FooterLinksMultiColumn from '@theme/Footer/Links/MultiColumn'; +import FooterLinksSimple from '@theme/Footer/Links/Simple'; +import type {Props} from '@theme/Footer/Links'; + +export default function FooterLinks({links}: Props): JSX.Element { + return isMultiColumnFooterLinks(links) ? ( + + ) : ( + + ); +} diff --git a/website/src/theme/Footer/Logo/index.tsx b/website/src/theme/Footer/Logo/index.tsx new file mode 100644 index 0000000..ebd8e9f --- /dev/null +++ b/website/src/theme/Footer/Logo/index.tsx @@ -0,0 +1,46 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import {useBaseUrlUtils} from '@docusaurus/useBaseUrl'; +import ThemedImage from '@theme/ThemedImage'; +import type {Props} from '@theme/Footer/Logo'; + +import styles from './styles.module.css'; + +function LogoImage({logo}: Props) { + const {withBaseUrl} = useBaseUrlUtils(); + const sources = { + light: withBaseUrl(logo.src), + dark: withBaseUrl(logo.srcDark ?? logo.src), + }; + return ( + + ); +} + +export default function FooterLogo({logo}: Props): JSX.Element { + return logo.href ? ( + + + + ) : ( + + ); +} diff --git a/website/src/theme/Footer/Logo/styles.module.css b/website/src/theme/Footer/Logo/styles.module.css new file mode 100644 index 0000000..16b1a2e --- /dev/null +++ b/website/src/theme/Footer/Logo/styles.module.css @@ -0,0 +1,16 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.footerLogoLink { + opacity: 0.5; + transition: opacity var(--ifm-transition-fast) + var(--ifm-transition-timing-default); +} + +.footerLogoLink:hover { + opacity: 1; +} diff --git a/website/src/theme/Footer/index.tsx b/website/src/theme/Footer/index.tsx new file mode 100644 index 0000000..eb3d03a --- /dev/null +++ b/website/src/theme/Footer/index.tsx @@ -0,0 +1,262 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import clsx from 'clsx'; + +import Link from '@docusaurus/Link'; +import {FooterLinkItem, useThemeConfig} from '@docusaurus/theme-common'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import isInternalUrl from '@docusaurus/isInternalUrl'; +import styles from './styles.module.css'; +import ThemedImage, {Props as ThemedImageProps} from '@theme/ThemedImage'; +import IconExternalLink from '@theme/Icon/ExternalLink'; +import { IconButton } from '@mui/material'; +import { useColorMode } from '@docusaurus/theme-common'; + +import { Icon } from '@iconify/react'; + +// add for responsive logo image +import { useWindowSize } from '@docusaurus/theme-common'; + +// Custom styles to fix the spacing issue +const socialIconsContainerStyle: React.CSSProperties = { + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + flexWrap: 'wrap', // Allow wrapping on small screens + margin: '16px 0', +}; + +const iconButtonStyle = { + padding: '12px', // Ensure buttons have enough clickable area +}; + +function FooterLink({ + to, + href, + label, + prependBaseUrlToHref, + ...props +}: FooterLinkItem) { + const toUrl = useBaseUrl(to); + const normalizedHref = useBaseUrl(href, {forcePrependBaseUrl: true}); + + return ( + + {href && !isInternalUrl(href) ? ( + + {label} + + + ) : ( + label + )} + + ); +} + +const FooterLogo = ({ + sources, + alt, + width, + height, + logo, +}: Pick & { logo: any }) => { + // Get window width for responsiveness + const windowSize = useWindowSize(); + + // Set threshold for mobile view (e.g., 768px) + const isMobile = windowSize === 'mobile' ? true : false; + + const getMobileLogoPath = (path: string) => path?.replace('.svg', '-mobile.svg'); + + // Choose appropriate image sources based on screen size + // const responsiveSources = { + // light: useBaseUrl(isMobile ? getMobileLogoPath(logo.src) : logo.src), + // dark: useBaseUrl(isMobile ? getMobileLogoPath(logo.srcDark || logo.src) : (logo.srcDark || logo.src)), + // }; + const responsiveSources = { + light: useBaseUrl(isMobile ? getMobileLogoPath(logo?.src) : logo?.src), + dark: useBaseUrl(isMobile ? getMobileLogoPath(logo?.srcDark || logo?.src) : (logo?.srcDark || logo?.src)), + }; + + return ( + + ); +} + +function Footer(): JSX.Element | null { + const socialLinks = { + linkedin: "https://www.linkedin.com/company/stackql", + twitter: "https://twitter.com/stackql", + github: "https://github.com/stackql", + discord: "https://discord.com/invite/xVXZ9d5NxN", + slack: "https://join.slack.com/t/stackqlcommunity/shared_invite/zt-1cbdq9s5v-CkY65IMAesCgFqjN6FU6hg", + }; + + const {colorMode} = useColorMode(); + + const {footer} = useThemeConfig(); + + const {copyright, links = [], logo = { src: '' }} = footer || {}; + const sources = { + light: useBaseUrl(logo.src), + dark: useBaseUrl(logo.srcDark || logo.src), + }; + + if (!footer) { + return null; + } + + return ( +
    +
    + {links && links.length > 0 && ( +
    +
    + {logo && (logo.src || logo.srcDark) && ( +
    + {logo.href ? ( + + + + ) : ( + + )} +
    + )} +

    + A new approach to querying and
    + provisioning cloud services. +

    +
    + {links.map((linkItem, i) => ( +
    + {linkItem.title != null ? ( +

    {linkItem.title}

    + ) : null} + {linkItem.items != null && + Array.isArray(linkItem.items) && + linkItem.items.length > 0 ? ( +
      + {linkItem.items.map((item, key) => + item.html ? ( +
    • + ) : ( +
    • + +
    • + ), + )} +
    + ) : null} +
    + ))} +
    + )} +
    + {(logo || copyright) && ( + <> +
    + {copyright ? ( +
    + ) : null} +
    + {/* Social Icons Container with Fixed Spacing */} +
    + + + + + + + + + + + + + + + +
    + + )} +
    +
    + ); +} + +export default Footer; \ No newline at end of file diff --git a/website/src/theme/Footer/styles.module.css b/website/src/theme/Footer/styles.module.css new file mode 100644 index 0000000..92e3c3b --- /dev/null +++ b/website/src/theme/Footer/styles.module.css @@ -0,0 +1,16 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.footerLogoLink { + opacity: 1; + transition: opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default); +} + +.footerLogoLink:hover { + opacity: 0.5; +} + diff --git a/website/src/theme/Logo/index.d.ts b/website/src/theme/Logo/index.d.ts new file mode 100644 index 0000000..786099f --- /dev/null +++ b/website/src/theme/Logo/index.d.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +import { type ReactNode } from 'react'; +import type { Props } from '@theme/Logo'; +export default function Logo(props: Props): ReactNode; diff --git a/website/src/theme/Logo/index.js b/website/src/theme/Logo/index.js new file mode 100644 index 0000000..d0b73e2 --- /dev/null +++ b/website/src/theme/Logo/index.js @@ -0,0 +1,76 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +import React from 'react'; +import Link from '@docusaurus/Link'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import {useThemeConfig, useWindowSize} from '@docusaurus/theme-common'; +import ThemedImage from '@theme/ThemedImage'; +function LogoThemedImage({logo, alt, imageClassName}) { +// Add window size detection + const windowSize = useWindowSize(); + + // Determine if on mobile + const isMobile = windowSize === 'mobile'; + + // Function to generate mobile logo path + const getMobileLogoPath = (path) => path?.replace('.svg', '-mobile.svg'); + + // Get appropriate logo sources based on device + const sources = { + light: useBaseUrl(isMobile ? getMobileLogoPath(logo.src) : logo.src), + dark: useBaseUrl(isMobile ? getMobileLogoPath(logo.srcDark || logo.src) : (logo.srcDark || logo.src)), + }; + const themedImage = ( + + ); + // Is this extra div really necessary? + // introduced in https://github.com/facebook/docusaurus/pull/5666 + return imageClassName ? ( +
    {themedImage}
    + ) : ( + themedImage + ); +} +export default function Logo(props) { + const { + siteConfig: {title}, + } = useDocusaurusContext(); + const { + navbar: {title: navbarTitle, logo}, + } = useThemeConfig(); + const {imageClassName, titleClassName, ...propsRest} = props; + const logoLink = useBaseUrl(logo?.href || '/'); + // If visible title is shown, fallback alt text should be + // an empty string to mark the logo as decorative. + const fallbackAlt = navbarTitle ? '' : title; + // Use logo alt text if provided (including empty string), + // and provide a sensible fallback otherwise. + const alt = logo?.alt ?? fallbackAlt; + return ( + + {logo && ( + + )} + {navbarTitle != null && {navbarTitle}} + + ); +} diff --git a/website/static/.nojekyll b/website/static/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/website/static/CNAME b/website/static/CNAME new file mode 100644 index 0000000..ab774e9 --- /dev/null +++ b/website/static/CNAME @@ -0,0 +1 @@ +supabase-provider.stackql.io diff --git a/website/static/apple-touch-icon.png b/website/static/apple-touch-icon.png new file mode 100644 index 0000000..54d5bf4 Binary files /dev/null and b/website/static/apple-touch-icon.png differ diff --git a/website/static/favicon-16x16.png b/website/static/favicon-16x16.png new file mode 100644 index 0000000..178c107 Binary files /dev/null and b/website/static/favicon-16x16.png differ diff --git a/website/static/favicon-32x32.png b/website/static/favicon-32x32.png new file mode 100644 index 0000000..f1efee0 Binary files /dev/null and b/website/static/favicon-32x32.png differ diff --git a/website/static/favicon.ico b/website/static/favicon.ico new file mode 100644 index 0000000..0145fbf Binary files /dev/null and b/website/static/favicon.ico differ diff --git a/website/static/img/favicon-16x16.png b/website/static/img/favicon-16x16.png new file mode 100644 index 0000000..178c107 Binary files /dev/null and b/website/static/img/favicon-16x16.png differ diff --git a/website/static/img/favicon-32x32.png b/website/static/img/favicon-32x32.png new file mode 100644 index 0000000..f1efee0 Binary files /dev/null and b/website/static/img/favicon-32x32.png differ diff --git a/website/static/img/favicon.ico b/website/static/img/favicon.ico new file mode 100644 index 0000000..0145fbf Binary files /dev/null and b/website/static/img/favicon.ico differ diff --git a/website/static/img/logo.svg b/website/static/img/logo.svg new file mode 100644 index 0000000..9db6d0d --- /dev/null +++ b/website/static/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/static/img/stackql-featured-image.png b/website/static/img/stackql-featured-image.png new file mode 100644 index 0000000..872999a Binary files /dev/null and b/website/static/img/stackql-featured-image.png differ diff --git a/website/static/img/stackql-registry-logo-mobile.svg b/website/static/img/stackql-registry-logo-mobile.svg new file mode 100644 index 0000000..1de09ec --- /dev/null +++ b/website/static/img/stackql-registry-logo-mobile.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/static/img/stackql-registry-logo-white-mobile.svg b/website/static/img/stackql-registry-logo-white-mobile.svg new file mode 100644 index 0000000..88c628e --- /dev/null +++ b/website/static/img/stackql-registry-logo-white-mobile.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/static/img/stackql-registry-logo-white.svg b/website/static/img/stackql-registry-logo-white.svg new file mode 100644 index 0000000..9b98a38 --- /dev/null +++ b/website/static/img/stackql-registry-logo-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/static/img/stackql-registry-logo.svg b/website/static/img/stackql-registry-logo.svg new file mode 100644 index 0000000..6e34cb9 --- /dev/null +++ b/website/static/img/stackql-registry-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/static/img/stackql-supabase-provider-featured-image.png b/website/static/img/stackql-supabase-provider-featured-image.png new file mode 100644 index 0000000..872999a Binary files /dev/null and b/website/static/img/stackql-supabase-provider-featured-image.png differ diff --git a/website/static/safari-pinned-tab.svg b/website/static/safari-pinned-tab.svg new file mode 100644 index 0000000..2563f76 --- /dev/null +++ b/website/static/safari-pinned-tab.svg @@ -0,0 +1,27 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/website/static/site.webmanifest b/website/static/site.webmanifest new file mode 100644 index 0000000..c0f898a --- /dev/null +++ b/website/static/site.webmanifest @@ -0,0 +1,11 @@ +{ + "name": "StackQL AWS Provider", + "short_name": "StackQL AWS", + "icons": [ + { "src": "/favicon-32x32.png", "sizes": "32x32", "type": "image/png" }, + { "src": "/favicon-16x16.png", "sizes": "16x16", "type": "image/png" } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/website/yarn.lock b/website/yarn.lock new file mode 100644 index 0000000..d89b2ca --- /dev/null +++ b/website/yarn.lock @@ -0,0 +1,11021 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@11ty/gray-matter@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@11ty/gray-matter/-/gray-matter-1.0.0.tgz#35ee04d76b870893c053f64f659c923a7a9db2d7" + integrity sha512-7mJJl+wf1AByoT0PknQiQfOPnVNT4fevGrUBVWO4HXsnYn1aQPyRyrELYrNUFleUBM++KzMKN6QaxHPk0t/6/g== + dependencies: + js-yaml "^4.1.0" + kind-of "^6.0.3" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +"@algolia/abtesting@1.21.1": + version "1.21.1" + resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.21.1.tgz#bf5c7881302a5843b78c6f44431d27ba5eb8f179" + integrity sha512-Wia5/mNTfiU0PIUN25UMfAGGdASkkwuCS9nBAdmhqrNPY/ff7U/6MgBVdwFDPsa3sA1msutPtO50gvOzx6MOXA== + dependencies: + "@algolia/client-common" "5.55.1" + "@algolia/requester-browser-xhr" "5.55.1" + "@algolia/requester-fetch" "5.55.1" + "@algolia/requester-node-http" "5.55.1" + +"@algolia/autocomplete-core@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz#702df67a08cb3cfe8c33ee1111ef136ec1a9e232" + integrity sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.19.2" + "@algolia/autocomplete-shared" "1.19.2" + +"@algolia/autocomplete-core@^1.19.2": + version "1.19.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.9.tgz#bbed371e56aeea4a31a3af239f16733e1b8aedca" + integrity sha512-4U2JKLMWlDu0CotYyUkWakDxr8AIav3QtIUXXRpfavYN29aVWfzlwJp9T0rPKEf/dO2QCPAUc0Kq1Tj1GJxo2A== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.19.9" + "@algolia/autocomplete-shared" "1.19.9" + +"@algolia/autocomplete-plugin-algolia-insights@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz#3584b625b9317e333d1ae43664d02358e175c52d" + integrity sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg== + dependencies: + "@algolia/autocomplete-shared" "1.19.2" + +"@algolia/autocomplete-plugin-algolia-insights@1.19.9": + version "1.19.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.9.tgz#f799737d13bf0c4ec8421619c7107fa05c836535" + integrity sha512-6mExC6X7762s2SV3eJy3QOkB8bdMmnUhQ2agvGVDuzwoGyr3PquGSY/0vPQXCfiAiCaXUz1rXn+lwghgSi0l0w== + dependencies: + "@algolia/autocomplete-shared" "1.19.9" + +"@algolia/autocomplete-shared@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz#c0b7b8dc30a5c65b70501640e62b009535e4578f" + integrity sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w== + +"@algolia/autocomplete-shared@1.19.9": + version "1.19.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.9.tgz#c5b05e23c71027e4e45a301f286593dffdcdfbdf" + integrity sha512-YosP9Uoek6y/Ur1r1qeogk4biMe/hzkyNcgMCciw0//3XpCM7VlYLSHnyt/vOnEOGhCCc0+3v+unEiH6zz+Z1A== + +"@algolia/client-abtesting@5.55.1": + version "5.55.1" + resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.55.1.tgz#192d0fd57ec9b7d6924a8b19cd98e72c7e8ae6de" + integrity sha512-miW8RzAtBgNiEJ9fGEhsOPgWUpekAe64YcVufqXrlykj0Jjmo5nj0a5f/HAzRVX5ZuU1GAVd7BkzFDx7q50P3A== + dependencies: + "@algolia/client-common" "5.55.1" + "@algolia/requester-browser-xhr" "5.55.1" + "@algolia/requester-fetch" "5.55.1" + "@algolia/requester-node-http" "5.55.1" + +"@algolia/client-analytics@5.55.1": + version "5.55.1" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.55.1.tgz#2e6e14d03f1cb181c2086fd60324c24f5f3007f9" + integrity sha512-eR3J3kB9JX6DdCvDRi3I4KPfwO6fR9HWYRXhVke2TXIoOQafMKCRAneg33JRmIrb+DnnJ/eWApJLF1O1CLPERg== + dependencies: + "@algolia/client-common" "5.55.1" + "@algolia/requester-browser-xhr" "5.55.1" + "@algolia/requester-fetch" "5.55.1" + "@algolia/requester-node-http" "5.55.1" + +"@algolia/client-common@5.55.1": + version "5.55.1" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.55.1.tgz#4e023b4127805f8d2a3229f1711822927f3f4303" + integrity sha512-P5ak7EurwYqgAiDyb95mgA3WRR/Zu8CPMv36lWTISvL2AmlPyqQPy2nX/KEJRTcwaeTWwrk6wJV4/M93GfjOWw== + +"@algolia/client-insights@5.55.1": + version "5.55.1" + resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.55.1.tgz#f58d7908071e9f5fb328533368e3bb2dad797fe5" + integrity sha512-OVtj9uA//+pjvKQI5INnzbyLrf3ClNv3XRbWswwJ2kHIStQNHtBfHo+LofNB/WhM9xjuXlW5ANn2aMj65UGx7w== + dependencies: + "@algolia/client-common" "5.55.1" + "@algolia/requester-browser-xhr" "5.55.1" + "@algolia/requester-fetch" "5.55.1" + "@algolia/requester-node-http" "5.55.1" + +"@algolia/client-personalization@5.55.1": + version "5.55.1" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.55.1.tgz#1b4d2bd3ba031864b1c8cd3e839ecb81146f8023" + integrity sha512-oKlVFlp+qbIEe4p7E54zSiP2gEV/vDu972Ykv8VDMFwEvreS7m0YKA3a8hGGHwc7yiBUGGiR3LlwzMLfnJmy6Q== + dependencies: + "@algolia/client-common" "5.55.1" + "@algolia/requester-browser-xhr" "5.55.1" + "@algolia/requester-fetch" "5.55.1" + "@algolia/requester-node-http" "5.55.1" + +"@algolia/client-query-suggestions@5.55.1": + version "5.55.1" + resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.55.1.tgz#7ddb439a51f348711d2b5b7bddef9497e906be86" + integrity sha512-BOVrld6vdtsFmotVDMTVQfYXwrVplJ+DUvy60JFi+tkWV698q2J9NNPKEO3dr5qxtSLKQP4vHF8n+3U5PDWhOQ== + dependencies: + "@algolia/client-common" "5.55.1" + "@algolia/requester-browser-xhr" "5.55.1" + "@algolia/requester-fetch" "5.55.1" + "@algolia/requester-node-http" "5.55.1" + +"@algolia/client-search@5.55.1": + version "5.55.1" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.55.1.tgz#8a918fb875b9f3c8e73b7331e508196a33538e71" + integrity sha512-GAqHl9zERhC3bbBfubwUu07G3UXO06gORvOcsiTBZB3et0s3auNUbHlYdYNp4VKa3sUZqH5AcD3OKzU/KDGXjQ== + dependencies: + "@algolia/client-common" "5.55.1" + "@algolia/requester-browser-xhr" "5.55.1" + "@algolia/requester-fetch" "5.55.1" + "@algolia/requester-node-http" "5.55.1" + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + +"@algolia/ingestion@1.55.1": + version "1.55.1" + resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.55.1.tgz#036d40d394314d3f94dd1779d33378d8a65f48a5" + integrity sha512-BXZw+C+gsWL7pZvbnhJUnCXASiDLGcQxVV7h55Pyh2DmSzwdZIVccE5xc9RVD2trtrhIqk5smuODTxtaZqd0IA== + dependencies: + "@algolia/client-common" "5.55.1" + "@algolia/requester-browser-xhr" "5.55.1" + "@algolia/requester-fetch" "5.55.1" + "@algolia/requester-node-http" "5.55.1" + +"@algolia/monitoring@1.55.1": + version "1.55.1" + resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.55.1.tgz#307c71309cd52dbcc43d0fbd7f35a698354dd6d8" + integrity sha512-9g/ceZrZTqA62FA3588Xj0onRPjDNfu0pVQqefK0rrHp9H6Wblph/YmzGjZ2g8uqbTh0ZGIvAGCzErU8f7MHpA== + dependencies: + "@algolia/client-common" "5.55.1" + "@algolia/requester-browser-xhr" "5.55.1" + "@algolia/requester-fetch" "5.55.1" + "@algolia/requester-node-http" "5.55.1" + +"@algolia/recommend@5.55.1": + version "5.55.1" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.55.1.tgz#72b5440d6221283acf5dde2828cf442769f5315a" + integrity sha512-cZTIrGyAP+W4A6jDVwvWM/JOaoJKQkD/2a5eLUEeNdKAD45jN7BCpsMDONyhZlosLa4UwL8uiINQzj4iFy9nqg== + dependencies: + "@algolia/client-common" "5.55.1" + "@algolia/requester-browser-xhr" "5.55.1" + "@algolia/requester-fetch" "5.55.1" + "@algolia/requester-node-http" "5.55.1" + +"@algolia/requester-browser-xhr@5.55.1": + version "5.55.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.55.1.tgz#6809cfab8aab74f6cb3d69cd4c1e2d2c2be362da" + integrity sha512-N6I3leW0UO8Y9Zv90yo2UHgYGuxZO0mjbvzNxDIJDjO0qECEF7Z9XMvSNeUWXQh/iNDA9lr8MfEy3rmZGIcclw== + dependencies: + "@algolia/client-common" "5.55.1" + +"@algolia/requester-fetch@5.55.1": + version "5.55.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.55.1.tgz#f75cc8681524bd8eb60d5d976c31f568dbdbe0ea" + integrity sha512-ukU5zeeFs44rQkzv+TRdYard+d+3lmPGs8lPZhHtWE8rfz+LlBSF6s9kP3VQ7LeOYL8Dz0u6tZfnyTrqrumbHQ== + dependencies: + "@algolia/client-common" "5.55.1" + +"@algolia/requester-node-http@5.55.1": + version "5.55.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.55.1.tgz#1920f83d70be909739dbc4d1421ca241bc0f1e0e" + integrity sha512-lCwXyijwPm3vbYHpBXPRomMcD6mgiptmps27gnMCf4HK+u/AOeFPBnIFh4V3l4A5SnP9VRiKBZqwGBpUH0vaTg== + dependencies: + "@algolia/client-common" "5.55.1" + +"@antfu/install-pkg@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-1.1.0.tgz#78fa036be1a6081b5a77a5cf59f50c7752b6ba26" + integrity sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ== + dependencies: + package-manager-detector "^1.3.0" + tinyexec "^1.0.1" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== + dependencies: + "@babel/helper-validator-identifier" "^7.29.7" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== + +"@babel/core@^7.21.3", "@babel/core@^7.25.9": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helpers" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.25.9", "@babel/generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.7.tgz#cca0b8827e6bcf3ba176788e7f3b180ad6db2fa3" + integrity sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ== + dependencies: + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz#c70fe3c6ecbdc3fd2dd1b0f498428b88b82ce47f" + integrity sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw== + dependencies: + "@babel/types" "^7.29.7" + +"@babel/helper-compilation-targets@^7.28.6", "@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== + dependencies: + "@babel/compat-data" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz#6eddf286f2ec418f740c91d60a83347c55838ddd" + integrity sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/traverse" "^7.29.7" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz#5d4c3f928f315cf6c4184ea2fc3b5b38745b2430" + integrity sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + regexpu-core "^6.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz#cf1e4462b613f2b54c41e6ff758d5dfcaa2c85d1" + integrity sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA== + dependencies: + "@babel/helper-compilation-targets" "^7.28.6" + "@babel/helper-plugin-utils" "^7.28.6" + debug "^4.4.3" + lodash.debounce "^4.0.8" + resolve "^1.22.11" + +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== + +"@babel/helper-member-expression-to-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz#8dbdb3ce0b5c487e1aec10e13c9a43a500814df8" + integrity sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-optimise-call-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz#77b0b5b94f1997fa9d6e3125f445227b1faf9d85" + integrity sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong== + dependencies: + "@babel/types" "^7.29.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.29.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz#c0a0766f1a13617d8a17407d7ab8f9d486225ea4" + integrity sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw== + +"@babel/helper-remap-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz#34b1f68dd75b86d31df781a29c3ff2df88da82e6" + integrity sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-wrap-function" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-replace-supers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz#bc3c3964329043c79112e513c1b198f16589ac21" + integrity sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz#50c95c7e4c4f54936cfa0116428edc559862d551" + integrity sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== + +"@babel/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== + +"@babel/helper-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== + +"@babel/helper-wrap-function@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz#eec72163044548a0935e9d182bf2d547ec5ff483" + integrity sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw== + dependencies: + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== + dependencies: + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.7.tgz#837b87387cbf5ec5530cb634b3c622f68edb9334" + integrity sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg== + dependencies: + "@babel/types" "^7.29.7" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz#2b535896d933a85aa92377eaa3d51a437d54a4e3" + integrity sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz#b00711a9e52bf4fe55ef7e54b2ef4a881bf804c8" + integrity sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz#2375328852026a3cf6bc0bcf2de7d236f2d5e701" + integrity sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz#759a857c46c4d2a6199685cf71070d81ae5f743a" + integrity sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz#86de98dd8e03836178231ea96c27dab26016a705" + integrity sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-transform-optional-chaining" "^7.29.7" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz#f5d892681dbf4b08753436a5e55000d5ba728d6d" + integrity sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-import-assertions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz#c5cd868505269126cc18882e1f01f7b0e0e24b4e" + integrity sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-syntax-import-attributes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz#6115264516e95ead0f35a41710906612e447f605" + integrity sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-syntax-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz#622c16f9ad63782fe6e83dadc7e40330744b7f1e" + integrity sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-syntax-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz#7c29388932313ed58413a0343048d75d92fb5b24" + integrity sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz#d651343f562c03f47951bd1802195d0e10605f27" + integrity sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-async-generator-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz#a5365617921d82a1fee33124a1102bb38a1e677d" + integrity sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz#3b5e8f1fb58133cf701bcf0baaf6f01bfd1a8889" + integrity sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" + +"@babel/plugin-transform-block-scoped-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz#96d292634434082d6687bcdb81139affedf77e8c" + integrity sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-block-scoping@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz#baa376691ae16244cd14335422fca6900f54e17d" + integrity sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-class-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz#034897b8a21beec163332fac2de235b14409abdf" + integrity sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-class-static-block@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz#fed8efd19f3dd3e1114ee390707c70912778fd7c" + integrity sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-classes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz#61d3e5aaae0c838acc3204d9db7c8dc05c25815b" + integrity sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-computed-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz#95028787ca31901b9a20b5c6d9605c32346f55ad" + integrity sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/template" "^7.29.7" + +"@babel/plugin-transform-destructuring@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz#5781ec6947852e27b64c1165f0db431f408090e4" + integrity sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-dotall-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz#b203de9740e4c7ff6b55ce436ed5313b88d70af8" + integrity sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-duplicate-keys@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz#8f3fe721835cb7a433420841dae90afc962ea7ae" + integrity sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz#dc6c405e55c01b7657e1827a25332c4ac17e9cac" + integrity sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-dynamic-import@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz#a83a6faec5bab5b619adf9d0eac6c1c270123c2a" + integrity sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-explicit-resource-management@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz#65c8b9f76ec915b02a0e1df703125a0fca58abaa" + integrity sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + +"@babel/plugin-transform-exponentiation-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz#00bf002fde8794356171f5d4df200f6bc0d5a303" + integrity sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-export-namespace-from@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz#d6014f45cec61d7691335c6c9804204bee801d51" + integrity sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-for-of@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz#c65a678592117717aacdb10c1b73a9cb85e830be" + integrity sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-transform-function-name@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz#8b87f8a7504dbcd96135167e3fc4f61126a7bd86" + integrity sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg== + dependencies: + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-json-strings@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz#f57d63dcc05b4481c281acedcd8fc4e3e439a1d4" + integrity sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz#b90bd47463326c2a9d779e1bd5e1f88b9f421921" + integrity sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-logical-assignment-operators@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz#9b29425adf5c794967aabe4b046a046a167bac2f" + integrity sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-member-expression-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz#1281689fa2fefc17b110d21ebafd0fe9402d5309" + integrity sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-modules-amd@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz#f05ca662c8a1dc4be2f337af9c7e80369c942d6c" + integrity sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew== + dependencies: + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-modules-commonjs@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz#70e6835abf2663dafbe94b8ef1f51de7351ef135" + integrity sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ== + dependencies: + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-modules-systemjs@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz#e575dd2ab9882906de120ff7dc9dee9914d8b6f3" + integrity sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ== + dependencies: + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-modules-umd@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz#391d1c0215aca6307257f2f608598dfe55feb6cf" + integrity sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA== + dependencies: + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz#21e75d847b31189842fa7a77703722ed4b43d27d" + integrity sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-new-target@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz#714147ce7947e1b49cbd84137ca2e75e92b2a067" + integrity sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz#8a54cdf88c3f50433a6173117a286195b67714cc" + integrity sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-numeric-separator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz#0266d5cd42ab87ec40fee45a4e36483cfdcbc66a" + integrity sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-object-rest-spread@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz#e0d5060241803922c545676613cc8acbbda0d266" + integrity sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A== + dependencies: + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-transform-object-super@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz#e89283d14fa3c35817d4493ffc6bc649aa10e4eb" + integrity sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + +"@babel/plugin-transform-optional-catch-binding@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz#729664f79985be504eba112c51de9f71d009030b" + integrity sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz#b84a1b574b3c73001023092567e16c492b720e51" + integrity sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-transform-parameters@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz#a5ddc3b9bfb534814cb8334cbeba47d9cf9db090" + integrity sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-private-methods@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz#cea8bd3ab99533892897a02999d5b752584ad145" + integrity sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-private-property-in-object@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz#4a2f6be5aba47be7afbdb4cd7903c46edf3a7661" + integrity sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-property-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz#d45817cd72f9e134ab1f7fbb79264cfcb85cf636" + integrity sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-react-constant-elements@^7.21.3": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.29.7.tgz#8264440ea2ffc5ec405aebd7eac074815d6e28b1" + integrity sha512-J0wGhKan+rIiE2OhfhRptySLrJ6SjQYM6b6N1FMlhyhCcw1Mig8vQjWchyB+bgHGDvaWo6Diu6CLRMra2uMtmg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-react-display-name@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz#bf161a6d750267b79db7ff6f8fb89c3369b02df3" + integrity sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-react-jsx-development@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz#64e6aacb5cb43b9e80d3d5f19ddefc158a624f09" + integrity sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.29.7" + +"@babel/plugin-transform-react-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz#3d16a0e5773f079400a8c82a190709cdf92ee204" + integrity sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/plugin-transform-react-pure-annotations@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz#76445c90112dd0a7371b63264563bfa9a4fcd6e3" + integrity sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-regenerator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz#0f42626a7dbb0e7a7f52e036d3e43deebdc3ea4e" + integrity sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-regexp-modifiers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz#68311c0c10af2198212528863f8542843e424025" + integrity sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-reserved-words@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz#a6feeb179b36a5f1fc6e3154c1eb727bdbe35876" + integrity sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-runtime@^7.25.9": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz#7c7fb6e2a46dce67e278b6cc84421c1d16da5695" + integrity sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + babel-plugin-polyfill-corejs2 "^0.4.14" + babel-plugin-polyfill-corejs3 "^0.13.0" + babel-plugin-polyfill-regenerator "^0.6.5" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz#25c0436b98f4bd9ca4b98e1fbd662743bbaab9bf" + integrity sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-spread@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz#a128bcdd6b5e5e47054907b2e50bc19c3f856edd" + integrity sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-transform-sticky-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz#a42c0fd1fa42f7e98e1e0c7757f72a1bbca3a015" + integrity sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-template-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz#ada97d8e0832bca8edb315888aa654b1570f3835" + integrity sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-typeof-symbol@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz#d848a4677c1ee3485ab017f4018f04597798911c" + integrity sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz#f0449c3df7037bbe232043476851c38f5e4a7615" + integrity sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-syntax-typescript" "^7.29.7" + +"@babel/plugin-transform-unicode-escapes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz#1e99554b0cddfd650d649a9f2b996049893e5720" + integrity sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-unicode-property-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz#44444afc73768c2190fac4d95f7716817b7f204a" + integrity sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-unicode-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz#c3064b293ff7f1794b71f7650eec8db9896d3e59" + integrity sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-transform-unicode-sets-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz#b03ac9f27326f6197e8e574add83bbf33fc34ecd" + integrity sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/preset-env@^7.20.2", "@babel/preset-env@^7.25.9": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.7.tgz#5e2ab5e764b493fdefc99c43aeaa70a9533a37fd" + integrity sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA== + dependencies: + "@babel/compat-data" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.29.7" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.29.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.29.7" + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array" "^7.29.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.29.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.29.7" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.29.7" + "@babel/plugin-syntax-import-attributes" "^7.29.7" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.29.7" + "@babel/plugin-transform-async-generator-functions" "^7.29.7" + "@babel/plugin-transform-async-to-generator" "^7.29.7" + "@babel/plugin-transform-block-scoped-functions" "^7.29.7" + "@babel/plugin-transform-block-scoping" "^7.29.7" + "@babel/plugin-transform-class-properties" "^7.29.7" + "@babel/plugin-transform-class-static-block" "^7.29.7" + "@babel/plugin-transform-classes" "^7.29.7" + "@babel/plugin-transform-computed-properties" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-dotall-regex" "^7.29.7" + "@babel/plugin-transform-duplicate-keys" "^7.29.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.7" + "@babel/plugin-transform-dynamic-import" "^7.29.7" + "@babel/plugin-transform-explicit-resource-management" "^7.29.7" + "@babel/plugin-transform-exponentiation-operator" "^7.29.7" + "@babel/plugin-transform-export-namespace-from" "^7.29.7" + "@babel/plugin-transform-for-of" "^7.29.7" + "@babel/plugin-transform-function-name" "^7.29.7" + "@babel/plugin-transform-json-strings" "^7.29.7" + "@babel/plugin-transform-literals" "^7.29.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.29.7" + "@babel/plugin-transform-member-expression-literals" "^7.29.7" + "@babel/plugin-transform-modules-amd" "^7.29.7" + "@babel/plugin-transform-modules-commonjs" "^7.29.7" + "@babel/plugin-transform-modules-systemjs" "^7.29.7" + "@babel/plugin-transform-modules-umd" "^7.29.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.7" + "@babel/plugin-transform-new-target" "^7.29.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.29.7" + "@babel/plugin-transform-numeric-separator" "^7.29.7" + "@babel/plugin-transform-object-rest-spread" "^7.29.7" + "@babel/plugin-transform-object-super" "^7.29.7" + "@babel/plugin-transform-optional-catch-binding" "^7.29.7" + "@babel/plugin-transform-optional-chaining" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/plugin-transform-private-methods" "^7.29.7" + "@babel/plugin-transform-private-property-in-object" "^7.29.7" + "@babel/plugin-transform-property-literals" "^7.29.7" + "@babel/plugin-transform-regenerator" "^7.29.7" + "@babel/plugin-transform-regexp-modifiers" "^7.29.7" + "@babel/plugin-transform-reserved-words" "^7.29.7" + "@babel/plugin-transform-shorthand-properties" "^7.29.7" + "@babel/plugin-transform-spread" "^7.29.7" + "@babel/plugin-transform-sticky-regex" "^7.29.7" + "@babel/plugin-transform-template-literals" "^7.29.7" + "@babel/plugin-transform-typeof-symbol" "^7.29.7" + "@babel/plugin-transform-unicode-escapes" "^7.29.7" + "@babel/plugin-transform-unicode-property-regex" "^7.29.7" + "@babel/plugin-transform-unicode-regex" "^7.29.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.29.7" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.15" + babel-plugin-polyfill-corejs3 "^0.14.0" + babel-plugin-polyfill-regenerator "^0.6.6" + core-js-compat "^3.48.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.18.6", "@babel/preset-react@^7.25.9": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.29.7.tgz#2ed18366e38c2081bbf1760dc01e88fa5674eb17" + integrity sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-transform-react-display-name" "^7.29.7" + "@babel/plugin-transform-react-jsx" "^7.29.7" + "@babel/plugin-transform-react-jsx-development" "^7.29.7" + "@babel/plugin-transform-react-pure-annotations" "^7.29.7" + +"@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.25.9": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz#de9be1f47b785c979ec7b3a71f4cd8bae5267b62" + integrity sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/plugin-transform-modules-commonjs" "^7.29.7" + "@babel/plugin-transform-typescript" "^7.29.7" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.25.9", "@babel/runtime@^7.28.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz#12022450c45a4da6d8d8287b18a4ff2ddb23f768" + integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== + +"@babel/template@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/traverse@^7.25.9", "@babel/traverse@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.7.tgz#c47b07a41b95da0907d026b5dd894d98de7d2f2d" + integrity sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + debug "^4.3.1" + +"@babel/types@^7.21.3", "@babel/types@^7.29.7", "@babel/types@^7.4.4": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.7.tgz#8005e31d82712ee7adaef6e23c63b71a62770a92" + integrity sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA== + dependencies: + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + +"@braintree/sanitize-url@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz#ca2035b0fefe956a8676ff0c69af73e605fcd81f" + integrity sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA== + +"@chevrotain/types@~11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@chevrotain/types/-/types-11.1.2.tgz#e83a1a2704f0c5e49e7592b214031a0f4a34d7e5" + integrity sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw== + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@csstools/cascade-layer-name-parser@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz#43f962bebead0052a9fed1a2deeb11f85efcbc72" + integrity sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A== + +"@csstools/color-helpers@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.1.0.tgz#106c54c808cabfd1ab4c602d8505ee584c2996ef" + integrity sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA== + +"@csstools/css-calc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.4.tgz#8473f63e2fcd6e459838dd412401d5948f224c65" + integrity sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== + +"@csstools/css-color-parser@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz#4e386af3a99dd36c46fef013cfe4c1c341eed6f0" + integrity sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA== + dependencies: + "@csstools/color-helpers" "^5.1.0" + "@csstools/css-calc" "^2.1.4" + +"@csstools/css-parser-algorithms@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#5755370a9a29abaec5515b43c8b3f2cf9c2e3076" + integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== + +"@csstools/css-tokenizer@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" + integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== + +"@csstools/media-query-list-parser@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz#7aec77bcb89c2da80ef207e73f474ef9e1b3cdf1" + integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ== + +"@csstools/postcss-alpha-function@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz#7989605711de7831bc7cd75b94c9b5bac9c3728e" + integrity sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-cascade-layers@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz#dd2c70db3867b88975f2922da3bfbae7d7a2cae7" + integrity sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg== + dependencies: + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + +"@csstools/postcss-color-function-display-p3-linear@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz#3017ff5e1f65307d6083e58e93d76724fb1ebf9f" + integrity sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-color-function@^4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz#a7c85a98c77b522a194a1bbb00dd207f40c7a771" + integrity sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-color-mix-function@^3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz#2f1ee9f8208077af069545c9bd79bb9733382c2a" + integrity sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-color-mix-variadic-function-arguments@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz#b4012b62a4eaa24d694172bb7137f9d2319cb8f2" + integrity sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-content-alt-text@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz#1d52da1762893c32999ff76839e48d6ec7c7a4cb" + integrity sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-contrast-color-function@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz#ca46986d095c60f208d9e3f24704d199c9172637" + integrity sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-exponential-functions@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz#fc03d1272888cb77e64cc1a7d8a33016e4f05c69" + integrity sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-font-format-keywords@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz#6730836eb0153ff4f3840416cc2322f129c086e6" + integrity sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-gamut-mapping@^2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz#be0e34c9f0142852cccfc02b917511f0d677db8b" + integrity sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-gradients-interpolation-method@^5.0.12": + version "5.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz#0955cce4d97203b861bf66742bbec611b2f3661c" + integrity sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-hwb-function@^4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz#07f7ecb08c50e094673bd20eaf7757db0162beee" + integrity sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-ic-unit@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz#2ee2da0690db7edfbc469279711b9e69495659d2" + integrity sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-initial@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz#c385bd9d8ad31ad159edd7992069e97ceea4d09a" + integrity sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg== + +"@csstools/postcss-is-pseudo-class@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz#d34e850bcad4013c2ed7abe948bfa0448aa8eb74" + integrity sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ== + dependencies: + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + +"@csstools/postcss-light-dark-function@^2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz#0df448aab9a33cb9a085264ff1f396fb80c4437d" + integrity sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-logical-float-and-clear@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz#62617564182cf86ab5d4e7485433ad91e4c58571" + integrity sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ== + +"@csstools/postcss-logical-overflow@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz#c6de7c5f04e3d4233731a847f6c62819bcbcfa1d" + integrity sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA== + +"@csstools/postcss-logical-overscroll-behavior@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz#43c03eaecdf34055ef53bfab691db6dc97a53d37" + integrity sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w== + +"@csstools/postcss-logical-resize@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz#4df0eeb1a61d7bd85395e56a5cce350b5dbfdca6" + integrity sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-logical-viewport-units@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz#016d98a8b7b5f969e58eb8413447eb801add16fc" + integrity sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ== + dependencies: + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-media-minmax@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz#184252d5b93155ae526689328af6bdf3fc113987" + integrity sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" + +"@csstools/postcss-media-queries-aspect-ratio-number-values@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz#f485c31ec13d6b0fb5c528a3474334a40eff5f11" + integrity sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" + +"@csstools/postcss-nested-calc@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz#754e10edc6958d664c11cde917f44ba144141c62" + integrity sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz#3738ecadb38cd6521c9565635d61aa4bf5457d27" + integrity sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz#416640ef10227eea1375b47b72d141495950971d" + integrity sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-position-area-property@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz#41f0cbc737a81a42890d5ec035fa26a45f4f4ad4" + integrity sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q== + +"@csstools/postcss-progressive-custom-properties@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz#c39780b9ff0d554efb842b6bd75276aa6f1705db" + integrity sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-property-rule-prelude-list@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz#700b7aa41228c02281bda074ae778f36a09da188" + integrity sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-random-function@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz#3191f32fe72936e361dadf7dbfb55a0209e2691e" + integrity sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-relative-color-syntax@^3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz#ced792450102441f7c160e1d106f33e4b44181f8" + integrity sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-scope-pseudo-class@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz#9fe60e9d6d91d58fb5fc6c768a40f6e47e89a235" + integrity sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q== + dependencies: + postcss-selector-parser "^7.0.0" + +"@csstools/postcss-sign-functions@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz#a9ac56954014ae4c513475b3f1b3e3424a1e0c12" + integrity sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-stepped-value-functions@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz#36036f1a0e5e5ee2308e72f3c9cb433567c387b9" + integrity sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-syntax-descriptor-syntax-production@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz#98590e372e547cdae60aef47cfee11f3881307dd" + integrity sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow== + dependencies: + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-system-ui-font-family@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz#bd65b79078debf6f67b318dc9b71a8f9fa16f8c8" + integrity sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-text-decoration-shorthand@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz#fae1b70f07d1b7beb4c841c86d69e41ecc6f743c" + integrity sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA== + dependencies: + "@csstools/color-helpers" "^5.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz#3f94ed2e319b57f2c59720b64e4d0a8a6fb8c3b2" + integrity sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-unset-value@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz#7caa981a34196d06a737754864baf77d64de4bba" + integrity sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA== + +"@csstools/selector-resolve-nested@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz#848c6f44cb65e3733e478319b9342b7aa436fac7" + integrity sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g== + +"@csstools/selector-specificity@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz#037817b574262134cabd68fc4ec1a454f168407b" + integrity sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw== + +"@csstools/utilities@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/utilities/-/utilities-2.0.0.tgz#f7ff0fee38c9ffb5646d47b6906e0bc8868bde60" + integrity sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ== + +"@discoveryjs/json-ext@0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@docsearch/core@4.6.3": + version "4.6.3" + resolved "https://registry.yarnpkg.com/@docsearch/core/-/core-4.6.3.tgz#9954c75c3ae28418e06f8e7537a920d6cd2bc22e" + integrity sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA== + +"@docsearch/css@4.6.3": + version "4.6.3" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-4.6.3.tgz#a94065af4a996dd927dc5dda383395e583dbd638" + integrity sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ== + +"@docsearch/react@^3.9.0 || ^4.3.2": + version "4.6.3" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-4.6.3.tgz#80df785f9c5e484c960b914a22ea2a3e4c7210ad" + integrity sha512-Bg2wdDsoQVlNCcEKuEJAU04tvHCqgx8rIu+uIoM4pRtcx3TBKJuXutJik3LTA8LRc9YEyHkrYUrmcC0D7BYf+g== + dependencies: + "@algolia/autocomplete-core" "1.19.2" + "@docsearch/core" "4.6.3" + "@docsearch/css" "4.6.3" + +"@docusaurus/babel@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.10.2.tgz#4d5f8ac4d16bfe26c06f256687831787edb46e8a" + integrity sha512-aJ1hpGyvfkte3dDAfNbWM4biW4yWZBVz7TIGLZP+v+tWOBgxX3e0N5ZIXHIvmfNNXTI77pcHUx3KmtOk05Ze3Q== + dependencies: + "@babel/core" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.25.9" + "@babel/preset-env" "^7.25.9" + "@babel/preset-react" "^7.25.9" + "@babel/preset-typescript" "^7.25.9" + "@babel/runtime" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" + babel-plugin-dynamic-import-node "^2.3.3" + fs-extra "^11.1.1" + tslib "^2.6.0" + +"@docusaurus/bundler@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.10.2.tgz#323492eb0550b6a7f6e5fa6b9877cdb2c53b1be3" + integrity sha512-i0ZNcy0f0WhaOlYVgzLsWhIoEXO9kS3HRoKPtgE6vQtZUq7arKZaYdNBudr3mqCmd+TyOkwtwfHgs1ENj07r5g== + dependencies: + "@babel/core" "^7.25.9" + "@docusaurus/babel" "3.10.2" + "@docusaurus/cssnano-preset" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + babel-loader "^9.2.1" + clean-css "^5.3.3" + copy-webpack-plugin "^11.0.0" + css-loader "^6.11.0" + css-minimizer-webpack-plugin "^5.0.1" + cssnano "^6.1.2" + file-loader "^6.2.0" + html-minifier-terser "^7.2.0" + mini-css-extract-plugin "^2.9.2" + null-loader "^4.0.1" + postcss "^8.5.4" + postcss-loader "^7.3.4" + postcss-preset-env "^10.2.1" + terser-webpack-plugin "^5.3.9" + tslib "^2.6.0" + url-loader "^4.1.1" + webpack "^5.95.0" + webpackbar "^7.0.0" + +"@docusaurus/core@3.10.2", "@docusaurus/core@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.10.2.tgz#349cae728fc3769b3f8aef4cf538ccb79aace8d0" + integrity sha512-EYByj6nk+aD9KeVxV6Hmo2/nAAT79P21Y82ycTBOBtrmqilloIbIEhgL2/8Xpt2Jz/pgNqHAwyusOGwmbKeJmA== + dependencies: + "@docusaurus/babel" "3.10.2" + "@docusaurus/bundler" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + boxen "^6.2.1" + chalk "^4.1.2" + chokidar "^3.5.3" + cli-table3 "^0.6.3" + combine-promises "^1.1.0" + commander "^5.1.0" + core-js "^3.31.1" + detect-port "^2.1.0" + escape-html "^1.0.3" + eta "^2.2.0" + eval "^0.1.8" + execa "^5.1.1" + fs-extra "^11.1.1" + html-tags "^3.3.1" + html-webpack-plugin "^5.6.0" + leven "^3.1.0" + lodash "^4.17.21" + open "^8.4.0" + p-map "^4.0.0" + prompts "^2.4.2" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" + react-loadable "npm:@docusaurus/react-loadable@6.0.0" + react-loadable-ssr-addon-v5-slorber "^1.0.3" + react-router "^5.3.4" + react-router-config "^5.1.1" + react-router-dom "^5.3.4" + semver "^7.5.4" + serve-handler "^6.1.7" + tinypool "^1.0.2" + tslib "^2.6.0" + update-notifier "^6.0.2" + webpack "^5.95.0" + webpack-bundle-analyzer "^4.10.2" + webpack-dev-server "^5.2.2" + webpack-merge "^6.0.1" + +"@docusaurus/cssnano-preset@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.2.tgz#e3ac7e85585f77e8fdef95176ab7c211d1296630" + integrity sha512-4gCnHRbJLTloiwfvFAa92tgb2gI4KYhvjfQVYnEaiMO/EgvWfCo1LwytHXen+1oZAN0VAlS0JAPxp3MsvKDa3A== + dependencies: + cssnano-preset-advanced "^6.1.2" + postcss "^8.5.4" + postcss-sort-media-queries "^5.2.0" + tslib "^2.6.0" + +"@docusaurus/faster@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/faster/-/faster-3.10.2.tgz#6cacd14085445d5826990f7525c5df1cf371e04a" + integrity sha512-p/5E5/RyHv+QWusJMPN5i3OMJTqTgkhuwzVbB1AReDWTUHXQCmf5mlTFzGiDrWeQWIDOKsuOPn1jJh0s9LUOHA== + dependencies: + "@docusaurus/types" "3.10.2" + "@rspack/core" "^1.7.10" + "@swc/core" "^1.15.40" + "@swc/html" "^1.15.40" + browserslist "^4.24.2" + lightningcss "^1.27.0" + semver "^7.5.4" + swc-loader "^0.2.6" + tslib "^2.6.0" + webpack "^5.95.0" + +"@docusaurus/logger@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.10.2.tgz#280bed53d0eb9cdc56e896a155036207910e89c9" + integrity sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw== + dependencies: + chalk "^4.1.2" + tslib "^2.6.0" + +"@docusaurus/lqip-loader@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/lqip-loader/-/lqip-loader-3.10.2.tgz#6cfe52091e4df3832acfec4001910d0e0889158b" + integrity sha512-U9ON9YXhfQcF7s4JUrcw02Nxez9ctI5nu/+6XGGmLJ+yx36ALT1fFCHzHfd7+TvSB1H7aoT/6T5BdfZvRp++Wg== + dependencies: + "@docusaurus/logger" "3.10.2" + file-loader "^6.2.0" + lodash "^4.17.21" + sharp "^0.32.3" + tslib "^2.6.0" + +"@docusaurus/mdx-loader@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.10.2.tgz#3b4e7ffacff4ed856db2ec4e94c13b0a652d62eb" + integrity sha512-9Fd4V/SFjfrVQ0JH5EN0+iPWyFunvTeQE3gfyFeetqPaXMP0OylIjOw16dCuXG4NZJrYdBqwzjh18/h3gRi47w== + dependencies: + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + "@mdx-js/mdx" "^3.0.0" + "@slorber/remark-comment" "^1.0.0" + escape-html "^1.0.3" + estree-util-value-to-estree "^3.0.1" + file-loader "^6.2.0" + fs-extra "^11.1.1" + image-size "^2.0.2" + mdast-util-mdx "^3.0.0" + mdast-util-to-string "^4.0.0" + rehype-raw "^7.0.0" + remark-directive "^3.0.0" + remark-emoji "^4.0.0" + remark-frontmatter "^5.0.0" + remark-gfm "^4.0.0" + stringify-object "^3.3.0" + tslib "^2.6.0" + unified "^11.0.3" + unist-util-visit "^5.0.0" + url-loader "^4.1.1" + vfile "^6.0.1" + webpack "^5.88.1" + +"@docusaurus/module-type-aliases@3.10.2", "@docusaurus/module-type-aliases@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.2.tgz#7c3b940c77d72e71d33a1e76f0e003b418e6163a" + integrity sha512-h/I5e4jaAhDHW4vaLENi1i2hnOEnXY1t9R+nnRTbgUl7ymVRzN/HF7dDfj8rKYGj8gfIge+Ef+iYRAMtbGvsrQ== + dependencies: + "@docusaurus/types" "3.10.2" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" + react-loadable "npm:@docusaurus/react-loadable@6.0.0" + +"@docusaurus/plugin-content-blog@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.2.tgz#2374886ec3d76e8f014e85db8c3c010de6c419be" + integrity sha512-0cbEnNKf0InmLkhj/+nVRmqEnWEoOE8Mh+2x1qOXI0qYpCnphq4RXknVJ8BvybKRXqYVvbmdMfiJSup+k4tm5w== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + cheerio "1.0.0-rc.12" + combine-promises "^1.1.0" + feed "^4.2.2" + fs-extra "^11.1.1" + lodash "^4.17.21" + schema-dts "^1.1.2" + srcset "^4.0.0" + tslib "^2.6.0" + unist-util-visit "^5.0.0" + utility-types "^3.10.0" + webpack "^5.88.1" + +"@docusaurus/plugin-content-docs@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.2.tgz#249bbc806437f227b06410ecc771eb67d8910a9a" + integrity sha512-Sqwl4FPoZBDrlY8I2VU2H8O0M91CHp9T8ToMSkTZmjvHCif+1laqfXi6sTk8IfyVS/trN5yNjcWd1bFsGB6W5Q== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + "@types/react-router-config" "^5.0.7" + combine-promises "^1.1.0" + fs-extra "^11.1.1" + js-yaml "^4.1.0" + lodash "^4.17.21" + schema-dts "^1.1.2" + tslib "^2.6.0" + utility-types "^3.10.0" + webpack "^5.88.1" + +"@docusaurus/plugin-content-pages@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.2.tgz#377c11b36a6a5e0c0c14dd9dea799f986d662ed7" + integrity sha512-h5R12sZ/vV9EPiVjvIl9YFCOwkpwXes7dQMYt3EvP6Pphu4amHxxTqWxf08Fl5DR8h+oZMbWpFTNw5vKEYfvzQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + fs-extra "^11.1.1" + tslib "^2.6.0" + webpack "^5.88.1" + +"@docusaurus/plugin-css-cascade-layers@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.2.tgz#54edc6450b0bb95be5990ea416b4c4dc5e6bdde0" + integrity sha512-UkdvQby5OQUKWrw3lLnSTJXQ6VETaUVTuPQX9AABtmFm5h+ifEBx1OQ+LN726Q4byuwBf2ElHkf4qU4hTxdvRg== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + tslib "^2.6.0" + +"@docusaurus/plugin-debug@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.10.2.tgz#2452f258668bb2514085d2d5fff700457c531aad" + integrity sha512-8vbZNOSCpnsT57EY6CgN7sgRVmx3KTYwO8Uvo2pbxOyb8tbqAwtT9SslqaQ41HbA1v1hpn5RP7u5s2KvRwAFpQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + fs-extra "^11.1.1" + react-json-view-lite "^2.3.0" + tslib "^2.6.0" + +"@docusaurus/plugin-google-analytics@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.2.tgz#7a0375c5a238cd9220166d9be8afc00ba508c55d" + integrity sha512-kMHMBK9j4VAtgd5owwrRLRIi0EjkrpXlX7ePj1+y68XfVZV9I1T4S+koPDm+Hfw2TtnyHvh0uNrDvjz+DjQGVA== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + tslib "^2.6.0" + +"@docusaurus/plugin-google-gtag@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.2.tgz#65df25eb5fb3f2a3f2d0fba8ddd423060e09e1ca" + integrity sha512-Vt90nNFhtAChRe9+it1hcHFgFvETdSnOkL5Bma+p6E/yU2tAYrvvyk+gv+LJGM2ZUkyKuKXLRsZ2Lb0bO7+Vog== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + tslib "^2.6.0" + +"@docusaurus/plugin-google-tag-manager@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.2.tgz#882a24e51dc42487d2c1d4f2cde3f59c99a276cb" + integrity sha512-MLCffCldysi/R0nzJQP7ZWd0xAoGNnSTiVOo6TTR6mKVGFhE+/XArGe67ZcaZv1uytgQXoXs92VJrgVDrz80rQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + tslib "^2.6.0" + +"@docusaurus/plugin-ideal-image@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-ideal-image/-/plugin-ideal-image-3.10.2.tgz#51fa3048328ce403b2f153aee1fa676827d49106" + integrity sha512-M1uRffUaE5hqbo7368jSclYSU6oOOFdJ3/fq644kwaoComeG+jjBJ9piFrHkExtiU2Q7zcm1dWaqtfJVrR9wSQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/lqip-loader" "3.10.2" + "@docusaurus/responsive-loader" "^1.7.0" + "@docusaurus/theme-translations" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + sharp "^0.32.3" + tslib "^2.6.0" + webpack "^5.88.1" + +"@docusaurus/plugin-sitemap@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.2.tgz#6c662c7df3bb7d36887f8b73f54d85dc4d36371d" + integrity sha512-PODkwg5XetLML3hU/3xpCKJUZ9cqExLaBnD/Fzzwj2VHogLeqnDisLIujae87zuze7T4mCm2A6KEqZkyiz07EQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + fs-extra "^11.1.1" + sitemap "^7.1.1" + tslib "^2.6.0" + +"@docusaurus/plugin-svgr@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.2.tgz#916fd0a5d39bf73cb621de9789cce243a7ef1754" + integrity sha512-JgfT3jWM0TJ8Uw0cEcqxHpybngQY1vlBYpuuNO+gEh5iPh5Ar+vxq/u9CFrYsWeXy48BN7Db76Pzp2edNXUQ8A== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + "@svgr/core" "8.1.0" + "@svgr/webpack" "^8.1.0" + tslib "^2.6.0" + webpack "^5.88.1" + +"@docusaurus/preset-classic@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.10.2.tgz#e4419c811723ab913a946c63efcc15e7f5f60a0a" + integrity sha512-a4B3VczmDl99zK0EufDQYomdJ186WDingjmDXxhN2PNPS9Ty/Y2M5CLFX1KQMRKqRTLiRDKfutzG5IY1FC/ceg== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/plugin-content-blog" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/plugin-content-pages" "3.10.2" + "@docusaurus/plugin-css-cascade-layers" "3.10.2" + "@docusaurus/plugin-debug" "3.10.2" + "@docusaurus/plugin-google-analytics" "3.10.2" + "@docusaurus/plugin-google-gtag" "3.10.2" + "@docusaurus/plugin-google-tag-manager" "3.10.2" + "@docusaurus/plugin-sitemap" "3.10.2" + "@docusaurus/plugin-svgr" "3.10.2" + "@docusaurus/theme-classic" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-search-algolia" "3.10.2" + "@docusaurus/types" "3.10.2" + +"@docusaurus/responsive-loader@^1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@docusaurus/responsive-loader/-/responsive-loader-1.7.1.tgz#fe22a657263350cbc777e296e8d8403c53d2f247" + integrity sha512-jAebZ43f8GVpZSrijLGHVVp7Y0OMIPRaL+HhiIWQ+f/b72lTsKLkSkOVHEzvd2psNJ9lsoiM3gt6akpak6508w== + dependencies: + loader-utils "^2.0.0" + +"@docusaurus/theme-classic@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.10.2.tgz#a64bd600c789b33c67c30c256b07e2ca0f57e2ae" + integrity sha512-JqTSLQmqmA9uKWZsD5iwBGJ4JyKB4/yTw6PsSXVPRJG/6GAm/u+add9Iip+hvwP12/AnPNztrdxsI14NJW4KeA== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/plugin-content-blog" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/plugin-content-pages" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-translations" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + "@mdx-js/react" "^3.0.0" + clsx "^2.0.0" + copy-text-to-clipboard "^3.2.0" + infima "0.2.0-alpha.45" + lodash "^4.17.21" + nprogress "^0.2.0" + postcss "^8.5.4" + prism-react-renderer "^2.3.0" + prismjs "^1.29.0" + react-router-dom "^5.3.4" + rtlcss "^4.1.0" + tslib "^2.6.0" + utility-types "^3.10.0" + +"@docusaurus/theme-common@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.10.2.tgz#5cf2a8b76554b8b38c6afe8448470c411f683e5b" + integrity sha512-R9b/vMpK1yye6hNZTA6x/ivRv+at6GhxnXcxkpzCGzO1R1RwiquqiFg2wMFh6aqlJTpWRFKpFD2TzCDQcyOU0A== + dependencies: + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^2.0.0" + parse-numeric-range "^1.3.0" + prism-react-renderer "^2.3.0" + tslib "^2.6.0" + utility-types "^3.10.0" + +"@docusaurus/theme-mermaid@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.10.2.tgz#826e47a01fefbe49fdbb0f4f575c9399d3ccd92c" + integrity sha512-Stssh5MYQJ+EdYugUXf+ZcpeJFQPKXf0KCd/SWp10o3CmXNaOoh5IEgVjVqY1e1XhQf3on4+Y4BnrMiD95E2SQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + mermaid ">=11.6.0" + tslib "^2.6.0" + +"@docusaurus/theme-search-algolia@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.2.tgz#e7756d4088a7df4d11fd734bfe0e8fa28ceac1dd" + integrity sha512-1msxllyhi/5m77JukXtp5UFnUAriwZIC1oJ7MTnpQpCwLTbclJi5BK5n28CTZuSXpQN2ewbbnqRgAhMM6c6ihg== + dependencies: + "@algolia/autocomplete-core" "^1.19.2" + "@docsearch/react" "^3.9.0 || ^4.3.2" + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-translations" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + algoliasearch "^5.37.0" + algoliasearch-helper "^3.26.0" + clsx "^2.0.0" + eta "^2.2.0" + fs-extra "^11.1.1" + lodash "^4.17.21" + tslib "^2.6.0" + utility-types "^3.10.0" + +"@docusaurus/theme-translations@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.10.2.tgz#cd649083babd12df324e7129008aaccacd4cfb13" + integrity sha512-iv20wrxnyXkY89LM3TzRlzGlt5fIGO5UnaR6UL1ZVfB9RRFjxQFQ6awDrwAc6Km8Y5gD8pInuwYPF+6/TiCxXA== + dependencies: + fs-extra "^11.1.1" + tslib "^2.6.0" + +"@docusaurus/types@3.10.2", "@docusaurus/types@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.10.2.tgz#9ffe35adfb4587e49158ee9e10d94b86419a5932" + integrity sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw== + dependencies: + "@mdx-js/mdx" "^3.0.0" + "@types/history" "^4.7.11" + "@types/mdast" "^4.0.2" + "@types/react" "*" + commander "^5.1.0" + joi "^17.9.2" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" + utility-types "^3.10.0" + webpack "^5.95.0" + webpack-merge "^5.9.0" + +"@docusaurus/utils-common@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.10.2.tgz#a65fcfffafa4e15a59fe61d7ba315ee5d4c49269" + integrity sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w== + dependencies: + "@docusaurus/types" "3.10.2" + tslib "^2.6.0" + +"@docusaurus/utils-validation@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz#2624b0ca6675675da2f063828115b43c9a22de47" + integrity sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw== + dependencies: + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + fs-extra "^11.2.0" + joi "^17.9.2" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.6.0" + +"@docusaurus/utils@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.10.2.tgz#d99c1ffc5c7961e912344269a8728ce2aad8b3dc" + integrity sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw== + dependencies: + "@11ty/gray-matter" "^1.0.0" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + escape-string-regexp "^4.0.0" + execa "^5.1.1" + file-loader "^6.2.0" + fs-extra "^11.1.1" + github-slugger "^1.5.0" + globby "^11.1.0" + jiti "^1.20.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + p-queue "^6.6.2" + prompts "^2.4.2" + resolve-pathname "^3.0.0" + tslib "^2.6.0" + url-loader "^4.1.1" + utility-types "^3.10.0" + webpack "^5.88.1" + +"@emnapi/core@^1.5.0": + version "1.11.2" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.2.tgz#fab0a0f3c492d11f5a9ac9065d0d73955ee1c1c9" + integrity sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA== + dependencies: + "@emnapi/wasi-threads" "1.2.2" + tslib "^2.4.0" + +"@emnapi/runtime@^1.5.0": + version "1.11.2" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.2.tgz#eb22f04d76febfdf4f87fdaff54c8a53f6bf0dbd" + integrity sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz#4c93becf5bfa3b13d1bbdcc06aee38321ad8139a" + integrity sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA== + dependencies: + tslib "^2.4.0" + +"@emotion/babel-plugin@^11.13.5": + version "11.13.5" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" + integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/serialize" "^1.3.3" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@^11.14.0": + version "11.14.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76" + integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA== + dependencies: + "@emotion/memoize" "^0.9.0" + "@emotion/sheet" "^1.4.0" + "@emotion/utils" "^1.4.2" + "@emotion/weak-memoize" "^0.4.0" + stylis "4.2.0" + +"@emotion/hash@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" + integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== + +"@emotion/is-prop-valid@^1.3.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz#e9ad47adff0b5c94c72db3669ce46de33edf28c0" + integrity sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw== + dependencies: + "@emotion/memoize" "^0.9.0" + +"@emotion/memoize@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" + integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== + +"@emotion/react@^11.14.0": + version "11.14.0" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d" + integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.13.5" + "@emotion/cache" "^11.14.0" + "@emotion/serialize" "^1.3.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" + "@emotion/utils" "^1.4.2" + "@emotion/weak-memoize" "^0.4.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8" + integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== + dependencies: + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/unitless" "^0.10.0" + "@emotion/utils" "^1.4.2" + csstype "^3.0.2" + +"@emotion/sheet@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" + integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== + +"@emotion/styled@^11.14.1": + version "11.14.1" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.14.1.tgz#8c34bed2948e83e1980370305614c20955aacd1c" + integrity sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.13.5" + "@emotion/is-prop-valid" "^1.3.0" + "@emotion/serialize" "^1.3.3" + "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" + "@emotion/utils" "^1.4.2" + +"@emotion/unitless@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" + integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== + +"@emotion/use-insertion-effect-with-fallbacks@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf" + integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg== + +"@emotion/utils@^1.4.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52" + integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== + +"@emotion/weak-memoize@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" + integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== + +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@iconify/react@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@iconify/react/-/react-6.0.2.tgz#b6d9bd0e13f9cb85b3a7fddbc70bbf71f5da1d33" + integrity sha512-SMmC2sactfpJD427WJEDN6PMyznTFMhByK9yLW0gOTtnjzzbsi/Ke/XqsumsavFPwNiXs8jSiYeZTmLCLwO+Fg== + dependencies: + "@iconify/types" "^2.0.0" + +"@iconify/types@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" + integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== + +"@iconify/utils@^3.0.2": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-3.1.4.tgz#04dad014e8ed80b1bbe341f5d090059ea0c60578" + integrity sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw== + dependencies: + "@antfu/install-pkg" "^1.1.0" + "@iconify/types" "^2.0.0" + import-meta-resolve "^4.2.0" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.11" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.11.tgz#b21835cbd36db656b857c2ad02ebd413cc13a9ba" + integrity sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jsonjoy.com/base64@17.67.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-17.67.0.tgz#7eeda3cb41138d77a90408fd2e42b2aba10576d7" + integrity sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw== + +"@jsonjoy.com/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" + integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== + +"@jsonjoy.com/buffers@17.67.0", "@jsonjoy.com/buffers@^17.65.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz#5c58dbcdeea8824ce296bd1cfce006c2eb167b3d" + integrity sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw== + +"@jsonjoy.com/buffers@^1.0.0", "@jsonjoy.com/buffers@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz#8d99c7f67eaf724d3428dfd9826c6455266a5c83" + integrity sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA== + +"@jsonjoy.com/codegen@17.67.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz#3635fd8769d77e19b75dc5574bc9756019b2e591" + integrity sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q== + +"@jsonjoy.com/codegen@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207" + integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== + +"@jsonjoy.com/fs-core@4.58.0": + version "4.58.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-core/-/fs-core-4.58.0.tgz#10572cecb73d823e51d85063e53e42b5bea7e211" + integrity sha512-K82t5e9w3NYQeIcw129f0SCH/Rn8m8GKPJBYge4W/sA4hhE5h7I8YQhs2HRpUQyUpi+qk7I9tbp1/b87eCM/PA== + dependencies: + "@jsonjoy.com/fs-node-builtins" "4.58.0" + "@jsonjoy.com/fs-node-utils" "4.58.0" + thingies "^2.5.0" + +"@jsonjoy.com/fs-fsa@4.58.0": + version "4.58.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-fsa/-/fs-fsa-4.58.0.tgz#fd7272e5e72893a9c8a97e2ac0fe0e049dd02cc1" + integrity sha512-1/FdsxQao9pBo2OJLEfKrujHdVyGxXvDTT7EtNh9fvp3MK42nB+xHh1EJr2L1c0a05eCMyFCYZPID3KjX9EAng== + dependencies: + "@jsonjoy.com/fs-core" "4.58.0" + "@jsonjoy.com/fs-node-builtins" "4.58.0" + "@jsonjoy.com/fs-node-utils" "4.58.0" + thingies "^2.5.0" + +"@jsonjoy.com/fs-node-builtins@4.58.0": + version "4.58.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.58.0.tgz#25c1fda79c51a6f9dc4cbe59efd9a2037f67e059" + integrity sha512-M1sAhjR1de4CL7ivQAFYqJRDVE3krwVOmfcAgG5YQJiDWxYfcGDMLUNcx0p/+Rcs31/Inh1m9aUDk/0jfR1T5w== + +"@jsonjoy.com/fs-node-to-fsa@4.58.0": + version "4.58.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.58.0.tgz#be011d218acb977bf8d949b4108b75f6f692c7f0" + integrity sha512-erivc39YHoqWY0U8q5IlEcn238AUkIBByMvM0w7OO/FU9hEH3P7oNkPpYWIMpEMncbePk672GiC8ZSwYc2m7fg== + dependencies: + "@jsonjoy.com/fs-fsa" "4.58.0" + "@jsonjoy.com/fs-node-builtins" "4.58.0" + "@jsonjoy.com/fs-node-utils" "4.58.0" + +"@jsonjoy.com/fs-node-utils@4.58.0": + version "4.58.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.58.0.tgz#10d5d50878f371d04563b66781e5fd7de71aead5" + integrity sha512-IrsAFMFBFQXjpS/u3jOY4DMIbRDg94KxzadddDlJv9xodxZ6/Y3ji91uMwrRqklyu+KoquO/Vxihf3/QrQiuOA== + dependencies: + "@jsonjoy.com/fs-node-builtins" "4.58.0" + +"@jsonjoy.com/fs-node@4.58.0": + version "4.58.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node/-/fs-node-4.58.0.tgz#7c404c014102844dabb03ed2f31528d55c8a53aa" + integrity sha512-bOqoLND5b5xyM+1zro63kClBnB05HTIX0RzOSHy4kAjfnec+CTdV742H/nsDmbkDaaDLHMmYqxAw09NQ8yVIrQ== + dependencies: + "@jsonjoy.com/fs-core" "4.58.0" + "@jsonjoy.com/fs-node-builtins" "4.58.0" + "@jsonjoy.com/fs-node-utils" "4.58.0" + "@jsonjoy.com/fs-print" "4.58.0" + "@jsonjoy.com/fs-snapshot" "4.58.0" + glob-to-regex.js "^1.0.0" + thingies "^2.5.0" + +"@jsonjoy.com/fs-print@4.58.0": + version "4.58.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-print/-/fs-print-4.58.0.tgz#5800d9523f997d96593d5b373d8d63b555707edd" + integrity sha512-jbAYbeuzPXIzvWOuuFMoQgrWaQU5hBqevloebLaiAimoBYLjrjiLPdOaaLHepWcZzOq/7Us8x2F22YlsTPbwmw== + dependencies: + "@jsonjoy.com/fs-node-utils" "4.58.0" + tree-dump "^1.1.0" + +"@jsonjoy.com/fs-snapshot@4.58.0": + version "4.58.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.58.0.tgz#829709f7d4a8d275fc3a071b711207a7a6bdf617" + integrity sha512-DkozLuMgzfpWZO8o8tSlFJIpUQauG7/sgjH0JrqsbLkmjdoInn/o1W7P9FZQSZlR9lOjDgSXs2MfE/sAUi2JRQ== + dependencies: + "@jsonjoy.com/buffers" "^17.65.0" + "@jsonjoy.com/fs-node-utils" "4.58.0" + "@jsonjoy.com/json-pack" "^17.65.0" + "@jsonjoy.com/util" "^17.65.0" + +"@jsonjoy.com/json-pack@^1.11.0": + version "1.21.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz#93f8dd57fe3a3a92132b33d1eb182dcd9e7629fa" + integrity sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg== + dependencies: + "@jsonjoy.com/base64" "^1.1.2" + "@jsonjoy.com/buffers" "^1.2.0" + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/json-pointer" "^1.0.2" + "@jsonjoy.com/util" "^1.9.0" + hyperdyperid "^1.2.0" + thingies "^2.5.0" + tree-dump "^1.1.0" + +"@jsonjoy.com/json-pack@^17.65.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz#8dd8ff65dd999c5d4d26df46c63915c7bdec093a" + integrity sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w== + dependencies: + "@jsonjoy.com/base64" "17.67.0" + "@jsonjoy.com/buffers" "17.67.0" + "@jsonjoy.com/codegen" "17.67.0" + "@jsonjoy.com/json-pointer" "17.67.0" + "@jsonjoy.com/util" "17.67.0" + hyperdyperid "^1.2.0" + thingies "^2.5.0" + tree-dump "^1.1.0" + +"@jsonjoy.com/json-pointer@17.67.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz#74439573dc046e0c9a3a552fb94b391bc75313b8" + integrity sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA== + dependencies: + "@jsonjoy.com/util" "17.67.0" + +"@jsonjoy.com/json-pointer@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz#049cb530ac24e84cba08590c5e36b431c4843408" + integrity sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg== + dependencies: + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/util" "^1.9.0" + +"@jsonjoy.com/util@17.67.0", "@jsonjoy.com/util@^17.65.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-17.67.0.tgz#7c4288fc3808233e55c7610101e7bb4590cddd3f" + integrity sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew== + dependencies: + "@jsonjoy.com/buffers" "17.67.0" + "@jsonjoy.com/codegen" "17.67.0" + +"@jsonjoy.com/util@^1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.9.0.tgz#7ee95586aed0a766b746cd8d8363e336c3c47c46" + integrity sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ== + dependencies: + "@jsonjoy.com/buffers" "^1.0.0" + "@jsonjoy.com/codegen" "^1.0.0" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== + +"@mdx-js/mdx@^3.0.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.1.1.tgz#c5ffd991a7536b149e17175eee57a1a2a511c6d1" + integrity sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdx" "^2.0.0" + acorn "^8.0.0" + collapse-white-space "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-util-scope "^1.0.0" + estree-walker "^3.0.0" + hast-util-to-jsx-runtime "^2.0.0" + markdown-extensions "^2.0.0" + recma-build-jsx "^1.0.0" + recma-jsx "^1.0.0" + recma-stringify "^1.0.0" + rehype-recma "^1.0.0" + remark-mdx "^3.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + source-map "^0.7.0" + unified "^11.0.0" + unist-util-position-from-estree "^2.0.0" + unist-util-stringify-position "^4.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +"@mdx-js/react@^3.0.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.1.1.tgz#24bda7fffceb2fe256f954482123cda1be5f5fef" + integrity sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw== + dependencies: + "@types/mdx" "^2.0.0" + +"@mermaid-js/parser@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@mermaid-js/parser/-/parser-1.2.0.tgz#266d728c54d2d4034d270f8b31d790e26296a5fa" + integrity sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA== + dependencies: + "@chevrotain/types" "~11.1.2" + +"@module-federation/error-codes@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/error-codes/-/error-codes-0.22.0.tgz#31ccc990dc240d73912ba7bd001f7e35ac751992" + integrity sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug== + +"@module-federation/runtime-core@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz#7321ec792bb7d1d22bee6162ec43564b769d2a3c" + integrity sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA== + dependencies: + "@module-federation/error-codes" "0.22.0" + "@module-federation/sdk" "0.22.0" + +"@module-federation/runtime-tools@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz#36f2a7cb267af208a9d1a237fe9a71b4bf31431e" + integrity sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA== + dependencies: + "@module-federation/runtime" "0.22.0" + "@module-federation/webpack-bundler-runtime" "0.22.0" + +"@module-federation/runtime@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-0.22.0.tgz#f789c9ef40d846d110711c8221ecc0ad938d43d8" + integrity sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA== + dependencies: + "@module-federation/error-codes" "0.22.0" + "@module-federation/runtime-core" "0.22.0" + "@module-federation/sdk" "0.22.0" + +"@module-federation/sdk@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/sdk/-/sdk-0.22.0.tgz#6ad4c1de85a900c3c80ff26cb87cce253e3a2770" + integrity sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g== + +"@module-federation/webpack-bundler-runtime@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz#dcbe8f972d722fe278e6a7c21988d4bee53d401d" + integrity sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA== + dependencies: + "@module-federation/runtime" "0.22.0" + "@module-federation/sdk" "0.22.0" + +"@mui/core-downloads-tracker@^7.3.11": + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.11.tgz#93251cf192641b9582641991feea60149159902c" + integrity sha512-a7I/b/nBTdXYz2cOSlEmkQ9WWE1x8FHpqMhFPp+Y1VPFxcOw91G5ELOHARQAGSPy5V+UCgJua6K/1x70bAtQPw== + +"@mui/icons-material@^7.3.1": + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-7.3.11.tgz#dfea40829d1ca96c074c85093fdfe0de170af5ad" + integrity sha512-+hz5ilwHZ3djd5es3sCErLioqe/NhZcYTsV/TNXZAMdJdb23F4xzJjqnnZdnurc3S1+ietcssRNqieOhPQLZ7Q== + dependencies: + "@babel/runtime" "^7.28.6" + +"@mui/material@^7.3.1": + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-7.3.11.tgz#aa6e0640bb29bd01e6c353ac3436fa0b20e5a36b" + integrity sha512-yq8bPc3LxOwKRWpcjRgDkYFmpM6aKlARfESTmOQcvLYFeJwtHte2tw6hJDrb8sk8wcvpDprHEHVaoUU0MslIkw== + dependencies: + "@babel/runtime" "^7.28.6" + "@mui/core-downloads-tracker" "^7.3.11" + "@mui/system" "^7.3.11" + "@mui/types" "^7.4.12" + "@mui/utils" "^7.3.11" + "@popperjs/core" "^2.11.8" + "@types/react-transition-group" "^4.4.12" + clsx "^2.1.1" + csstype "^3.2.3" + prop-types "^15.8.1" + react-is "^19.2.3" + react-transition-group "^4.4.5" + +"@mui/private-theming@^7.3.11": + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-7.3.11.tgz#96d4cde586624916816f5a97fef3c808cf562fb0" + integrity sha512-9B+YKms0fRHbNrqp9tOT/DNbNnU5gyvJ1o3qAGXfq8GmZcbJnE3At9x07Zr/o0pkhzg4aDdwXVqe4+AcgtOCPA== + dependencies: + "@babel/runtime" "^7.28.6" + "@mui/utils" "^7.3.11" + prop-types "^15.8.1" + +"@mui/styled-engine@^7.3.10": + version "7.3.10" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-7.3.10.tgz#53e98c1fdeda972b5932c76f6a2a29faf33f0d11" + integrity sha512-WxE9SiF8xskAQqGjsp0poXCkCqsoXFEsSr0HBXfApmGHR+DBnXRp+z46Vsltg4gpPM4Z96DeAQRpeAOnhNg7Ng== + dependencies: + "@babel/runtime" "^7.28.6" + "@emotion/cache" "^11.14.0" + "@emotion/serialize" "^1.3.3" + "@emotion/sheet" "^1.4.0" + csstype "^3.2.3" + prop-types "^15.8.1" + +"@mui/system@^7.3.11": + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-7.3.11.tgz#ffb8ba06f43d697db80257b9a2dfc8042b18554a" + integrity sha512-7izwGWdNawAKpBKcRlx7f2gFnAAjmASBWvMcyX4YYEeLOFsbfGRbUYGInvnAcUeql3rPxI7F9Ft4oY2OLRz44g== + dependencies: + "@babel/runtime" "^7.28.6" + "@mui/private-theming" "^7.3.11" + "@mui/styled-engine" "^7.3.10" + "@mui/types" "^7.4.12" + "@mui/utils" "^7.3.11" + clsx "^2.1.1" + csstype "^3.2.3" + prop-types "^15.8.1" + +"@mui/types@^7.4.12": + version "7.4.12" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.4.12.tgz#e4eba37a7506419ea5c5e0604322ba82b271bf46" + integrity sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w== + dependencies: + "@babel/runtime" "^7.28.6" + +"@mui/utils@^7.3.11": + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-7.3.11.tgz#493f46f053fe3a692e041b1b6b8295e2f46d9448" + integrity sha512-XTjGnifwteg71/ij+0e7Y7d+hwyntMYP5wPoA/g2drdGH+Flkvjwy0OfrVpKBbaOvofq4zU/LIyUZyKgmWu18g== + dependencies: + "@babel/runtime" "^7.28.6" + "@mui/types" "^7.4.12" + "@types/prop-types" "^15.7.15" + clsx "^2.1.1" + prop-types "^15.8.1" + react-is "^19.2.3" + +"@napi-rs/wasm-runtime@1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz#dcfea99a75f06209a235f3d941e3460a51e9b14c" + integrity sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw== + dependencies: + "@emnapi/core" "^1.5.0" + "@emnapi/runtime" "^1.5.0" + "@tybys/wasm-util" "^0.10.1" + +"@noble/hashes@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@peculiar/asn1-cms@^2.6.0", "@peculiar/asn1-cms@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-cms/-/asn1-cms-2.8.0.tgz#b48a8389319228f929e9acd8cee8da6c858738de" + integrity sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + "@peculiar/asn1-x509-attr" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-csr@^2.6.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-csr/-/asn1-csr-2.8.0.tgz#c9bb5dec2eaff824a705e82a4a58d45e6d2c35d0" + integrity sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-ecc@^2.6.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.8.0.tgz#d51ab2b07eca98e0cf492d051e98bbd0a071305a" + integrity sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-pfx@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pfx/-/asn1-pfx-2.8.0.tgz#8e189b6455e2bf9e5f921bb150ea86d7e7d1875d" + integrity sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg== + dependencies: + "@peculiar/asn1-cms" "^2.8.0" + "@peculiar/asn1-pkcs8" "^2.8.0" + "@peculiar/asn1-rsa" "^2.8.0" + "@peculiar/asn1-schema" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-pkcs8@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.8.0.tgz#a46cf8857b9b063896afa41d2b8b2aa6a07a70a2" + integrity sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-pkcs9@^2.6.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.8.0.tgz#6d62697af0bbd4f30fdf0d23b4018f3f09620de3" + integrity sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ== + dependencies: + "@peculiar/asn1-cms" "^2.8.0" + "@peculiar/asn1-pfx" "^2.8.0" + "@peculiar/asn1-pkcs8" "^2.8.0" + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + "@peculiar/asn1-x509-attr" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-rsa@^2.6.0", "@peculiar/asn1-rsa@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.8.0.tgz#9d98d0fc42fec50119d2881b8a9925d36daaea73" + integrity sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-schema@^2.6.0", "@peculiar/asn1-schema@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz#69699f84259b2161607cabfc34e512a4023dbef9" + integrity sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q== + dependencies: + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-x509-attr@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.8.0.tgz#bd168e3f5e8bc23e56b1a97891f9f2fb7f730204" + integrity sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/asn1-x509" "^2.8.0" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-x509@^2.6.0", "@peculiar/asn1-x509@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.8.0.tgz#9958a9ef35dec8426aabad78ffe8798e318b06e2" + integrity sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg== + dependencies: + "@peculiar/asn1-schema" "^2.8.0" + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/utils@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@peculiar/utils/-/utils-2.0.3.tgz#a27ca4c4b73652e110f19a7d16d664f458a5528e" + integrity sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ== + dependencies: + tslib "^2.8.1" + +"@peculiar/x509@^1.14.2": + version "1.14.3" + resolved "https://registry.yarnpkg.com/@peculiar/x509/-/x509-1.14.3.tgz#2c44c2b89474346afec38a0c2803ec4fb8ce959e" + integrity sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA== + dependencies: + "@peculiar/asn1-cms" "^2.6.0" + "@peculiar/asn1-csr" "^2.6.0" + "@peculiar/asn1-ecc" "^2.6.0" + "@peculiar/asn1-pkcs9" "^2.6.0" + "@peculiar/asn1-rsa" "^2.6.0" + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.0" + pvtsutils "^1.3.6" + reflect-metadata "^0.2.2" + tslib "^2.8.1" + tsyringe "^4.10.0" + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^3.0.2": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz#17b59982126c86294a8d248aa1d7b185f2df6484" + integrity sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.29" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1" + integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== + +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@rspack/binding-darwin-arm64@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.12.tgz#e6e10e7ff15c2254d6cbe9125a747ada880a34f3" + integrity sha512-rbFprJaJiqrmfy8SHth8EsoRS0wg4bXcucwj9NiMzpGFq14Opw8c04iQ6H9BECYzgmN0PKZ9rh41LdVvhdZe4A== + +"@rspack/binding-darwin-x64@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.12.tgz#fe90b64228eb49612e4932049325f52a4ddcfd28" + integrity sha512-jnOp+/UXOJa9xqUb8KXH03sysoO2e4Ij6tw6MqDdmdj8n/A8PQENRPUbW9AwXpPtVDJPus9r4fi7b3+6e4B8Hg== + +"@rspack/binding-linux-arm64-gnu@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.12.tgz#61d63a0fcb9b4eb25b9d68e1f897c8e2619a8a5a" + integrity sha512-C8owWG+yvo7X0oVLIXetkoJhIFBP1LYNcAQqtgLmJnQLQDklGuP83dKC+zISGQWpjawHfZ1ER96vLgoTrxKZdw== + +"@rspack/binding-linux-arm64-musl@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.12.tgz#fd5157890b1250937bb98332dcbb35ff2d7aafd3" + integrity sha512-i51WWI64aRpsfSki6rN0aepPqXkVfS+vZM7+4bWDcmnhUmdMvhIPcYg0QRk3DtyJnu33jqNLM0WHY78k00NyfA== + +"@rspack/binding-linux-x64-gnu@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.12.tgz#a8c963c47a043069b154c704d87bf6a658772ac7" + integrity sha512-MSos0FuPEefqo9V92ULd5hggKG29EkSNg1zDcypy0OkpsKh5pfjVxTLYFXgTcVyFoUQQbdG8zFBzYbwmJ8V4ew== + +"@rspack/binding-linux-x64-musl@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.12.tgz#1e95af2b152a0833272c26c3473cfa60832ef8b0" + integrity sha512-JcAMVKXOnjfpC3coWjCFPWD3Yl8RBw6a+IXQQ8mfRlHaHMIiOv8IfZqx15XRxMUn49CtP7Z0Na8iiAg2aKrcfw== + +"@rspack/binding-wasm32-wasi@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.12.tgz#37a10f322e82cbd51114e8a3182f46c6af101a20" + integrity sha512-n+ZqP6ZMc0nhOgvadg5VhEs9ojtbES80AcWeFnmGkbzIszvGSO63GKNiRkXtjJ9KFuRzytbbmsCqkUVH+Tywxg== + dependencies: + "@napi-rs/wasm-runtime" "1.0.7" + +"@rspack/binding-win32-arm64-msvc@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.12.tgz#77f648ee1cb717c50fdd02126a528b4960654116" + integrity sha512-8+h5fYDXYdmugbdfZ+D1y8IQ3rv2EhSfyGP7vBe+bjNyaMa4jWrpucmZbtxojUL1AzaeuHbvMdj9UO/gelk/+g== + +"@rspack/binding-win32-ia32-msvc@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.12.tgz#9f7cbb26a9c8d9a1cc15d2059de21172b1623c41" + integrity sha512-cDMGwTRSa2p9fNBVe1wTRkF2AEXZ9ARWW36QeC5CkLaI0Ezz8lvhF2+CSOPnhaQ1O1qtn0L0SF+lFnrY+I7xGQ== + +"@rspack/binding-win32-x64-msvc@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.12.tgz#b4c6dceaa63def4aa205d25246c1a5b05d7f36b0" + integrity sha512-wIqFvlgFqrgUyj/6S/FJcvShnkZOmIeXTfqvheLY67MGq8qd8jb1YimQVKAIrmWB3yuJKUFACI3Ag1UBtEedEA== + +"@rspack/binding@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding/-/binding-1.7.12.tgz#8c0b19795f980b0e513855245e689719352c08a4" + integrity sha512-f4HHuLbvuld8Ba4iB/4ibse5XrKxFrgmM3S4P2AOKnPlekAFlBjmltCuaTL/W2ggYvILaVY+YcFXrEH1rrKeQA== + optionalDependencies: + "@rspack/binding-darwin-arm64" "1.7.12" + "@rspack/binding-darwin-x64" "1.7.12" + "@rspack/binding-linux-arm64-gnu" "1.7.12" + "@rspack/binding-linux-arm64-musl" "1.7.12" + "@rspack/binding-linux-x64-gnu" "1.7.12" + "@rspack/binding-linux-x64-musl" "1.7.12" + "@rspack/binding-wasm32-wasi" "1.7.12" + "@rspack/binding-win32-arm64-msvc" "1.7.12" + "@rspack/binding-win32-ia32-msvc" "1.7.12" + "@rspack/binding-win32-x64-msvc" "1.7.12" + +"@rspack/core@^1.7.10": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/core/-/core-1.7.12.tgz#e2a36bd16a10e10aee5905827064ac4b8a63b321" + integrity sha512-6CwFIHlhRmXfZoMj3v9MZ1SMTPBn+cHVXeMIeaGp5sufqinKsISbsqHu6ZMJu2wDSmZLdmQJX6zLxkhcAUlhkQ== + dependencies: + "@module-federation/runtime-tools" "0.22.0" + "@rspack/binding" "1.7.12" + "@rspack/lite-tapable" "1.1.0" + +"@rspack/lite-tapable@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz#3cfdafeed01078e116bd4f191b684c8b484de425" + integrity sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw== + +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.27.8": + version "0.27.10" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.10.tgz#beefe675f1853f73676aecc915b2bd2ac98c4fc6" + integrity sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA== + +"@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + +"@slorber/remark-comment@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@slorber/remark-comment/-/remark-comment-1.0.0.tgz#2a020b3f4579c89dec0361673206c28d67e08f5a" + integrity sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.1.0" + micromark-util-symbol "^1.0.1" + +"@svgr/babel-plugin-add-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" + integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== + +"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" + integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== + +"@svgr/babel-plugin-svg-dynamic-title@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" + integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== + +"@svgr/babel-plugin-svg-em-dimensions@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" + integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== + +"@svgr/babel-plugin-transform-react-native-svg@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" + integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== + +"@svgr/babel-plugin-transform-svg-component@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" + integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== + +"@svgr/babel-preset@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" + integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" + "@svgr/babel-plugin-transform-svg-component" "8.0.0" + +"@svgr/core@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" + integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + camelcase "^6.2.0" + cosmiconfig "^8.1.3" + snake-case "^3.0.4" + +"@svgr/hast-util-to-babel-ast@8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" + integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== + dependencies: + "@babel/types" "^7.21.3" + entities "^4.4.0" + +"@svgr/plugin-jsx@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" + integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + "@svgr/hast-util-to-babel-ast" "8.0.0" + svg-parser "^2.0.4" + +"@svgr/plugin-svgo@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz#b115b7b967b564f89ac58feae89b88c3decd0f00" + integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== + dependencies: + cosmiconfig "^8.1.3" + deepmerge "^4.3.1" + svgo "^3.0.2" + +"@svgr/webpack@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-8.1.0.tgz#16f1b5346f102f89fda6ec7338b96a701d8be0c2" + integrity sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA== + dependencies: + "@babel/core" "^7.21.3" + "@babel/plugin-transform-react-constant-elements" "^7.21.3" + "@babel/preset-env" "^7.20.2" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.21.0" + "@svgr/core" "8.1.0" + "@svgr/plugin-jsx" "8.1.0" + "@svgr/plugin-svgo" "8.1.0" + +"@swc/core-darwin-arm64@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.16.0.tgz#8c5a2af031c62ebcb6354aa6975bfb7eac895223" + integrity sha512-SJQPl+xG/zB8bNjC/gTg3WOmOvz7EzlQD+VShfCKFYPNr2qvb+vATUY11vYEjnMWCn6wV8H8eAtjQrVflYyX5A== + +"@swc/core-darwin-x64@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.16.0.tgz#0d2496c0429d7e8bc45b50348adf9d105bb56793" + integrity sha512-ql2JVch8V5t1i+HxiiuD4oVDI1dOku4/e3QiCkplONrm3SLitqNAP+nztHN51fSG2IgGuOwpAi3hgA+ukT5yQg== + +"@swc/core-linux-arm-gnueabihf@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.16.0.tgz#5f02a85842a04cd21f2ab9e8e67dc4b16f7024a4" + integrity sha512-PcdDBaRbe39y37h1rXVkhNy7mEU7f8b34KD761C68R23EsfMsj5oDPVddRzGdSRAvwwSfH0WSNEHgYmc/AJipg== + +"@swc/core-linux-arm64-gnu@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.16.0.tgz#6264498c88c51649511c6b4af532d330d3cf0631" + integrity sha512-t21IUztHQ/COucy7Kk9eIlehmq08H/hYq7aRA6fZox3S5ddi6TxWPK6e5S/+aTCf6+Od9qQ+LIpjHMiTy737vA== + +"@swc/core-linux-arm64-musl@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.16.0.tgz#7a451eba69aa9a80799b9b8b9af46bf6f49803bd" + integrity sha512-d9+iajbMB87b0umgbP+Gy3yBDSDgty4Q6H5pZ8fgTb/dOoKIwwynP4L4kvWCOFg2i49kxmAAUs1uJZh9s0E+RQ== + +"@swc/core-linux-ppc64-gnu@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.16.0.tgz#99a7ba46a56190a52c646506e940dffe554c5d10" + integrity sha512-QRpeKGOg+B0qmo3BFU+6rL/gpoKYYJ7OFSMf5DNMafohYZ/iq2qvAH9Gcrf8NxROj3iooKOVewJ+YgahH1nSLw== + +"@swc/core-linux-s390x-gnu@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.16.0.tgz#61473e056d1dd0d4690352a875c14f41bdd9f60a" + integrity sha512-q+Vr/hmHCcRXT/WFzOJC+T6GGEEtq2iaTtmyLfxO7yzu4ckgcqSNkg9m181wfNhuMwfNBoBhOfwQCnLsGZ5F4g== + +"@swc/core-linux-x64-gnu@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.16.0.tgz#008fc149a9135bca92b1e1f63037e2612c4d0fb5" + integrity sha512-DWVBc3QnpsSgKoq8N4rmZeZa5r/XrHdLkITsExN/tvTdqPtAPDPt+Ysy33OfgBlyN8lNe4xwsXWe6DXlRkJeRQ== + +"@swc/core-linux-x64-musl@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.16.0.tgz#4300ea0c63864dc3989ca0e956b4a5e4c666196c" + integrity sha512-6XCgDSc1HPf/5dpjvABhKHICiBcsuZyW3hQMkn8sxel0TqprkJGp+H4iaBYIUTPixhrBub2hBPtfjcZLE6yL3w== + +"@swc/core-win32-arm64-msvc@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.16.0.tgz#1d4146b7c1aada2992692cdc72bb0b43a885136e" + integrity sha512-T/+9VVCZJ3AKEth9IP3U9AJ2YscQq+7LUqRTvfR4a2q36+Ri22oOwUizpAKOqQ42vb2Y/kOa4TOcJOfHoDIT/w== + +"@swc/core-win32-ia32-msvc@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.16.0.tgz#c5c2a60905ffa9e4647214bef75778f0c73ba0d4" + integrity sha512-Pr1lsR/PMs8ndL0UWMrW8nLZ7H7sspIxBRDdjL8f+YJ/FJNASgzfunbVVXAqj0csgIJYHPZy+OW9smjFmk1Rcg== + +"@swc/core-win32-x64-msvc@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.16.0.tgz#67dd85a90437e6fa9951cce7842f6cac3ec3f60d" + integrity sha512-ktdeYLgOQdaonvsj5tJijqgpb0wk7gfF80wCFVA0kucI1hhSUIyfcGbjo5+9sdqv38OhMnTdLoA6xbqgOgPQjw== + +"@swc/core@^1.15.40": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.16.0.tgz#79cd13789725d3e3ad0df605dc88d9e255d7ebfd" + integrity sha512-zSdvEHxBg00WhUNtW/u58hhcdR33gjtMQvOBo8F7POWJDyjRCt/miKfhidT3hCc/118RUwNnlEAmxiihFMbK4Q== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.28" + optionalDependencies: + "@swc/core-darwin-arm64" "1.16.0" + "@swc/core-darwin-x64" "1.16.0" + "@swc/core-linux-arm-gnueabihf" "1.16.0" + "@swc/core-linux-arm64-gnu" "1.16.0" + "@swc/core-linux-arm64-musl" "1.16.0" + "@swc/core-linux-ppc64-gnu" "1.16.0" + "@swc/core-linux-s390x-gnu" "1.16.0" + "@swc/core-linux-x64-gnu" "1.16.0" + "@swc/core-linux-x64-musl" "1.16.0" + "@swc/core-win32-arm64-msvc" "1.16.0" + "@swc/core-win32-ia32-msvc" "1.16.0" + "@swc/core-win32-x64-msvc" "1.16.0" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/html-darwin-arm64@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-darwin-arm64/-/html-darwin-arm64-1.16.0.tgz#4ff019e7ce2c28bd4ebada939346fc5896124902" + integrity sha512-vp8i42hiGM/Jy4lY48sOu+y02SnWKpqxsUErCHnWIU/G8WxHdZrX+xn8VOph/eQXFk4kU+/kGdaRDrRKGMITnQ== + +"@swc/html-darwin-x64@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-darwin-x64/-/html-darwin-x64-1.16.0.tgz#de93a5d661737531d2a37c50ece24f406f4e3006" + integrity sha512-CsRsBMO2evmQbz1JEzwbebzZro4F1TjT0IGrEk/IxzRMmQjJ8zfNOe140ToouuZs3HnLSuJQgMadI2WE76fxbw== + +"@swc/html-linux-arm-gnueabihf@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.16.0.tgz#e33a47d0d80155fce0949fd79a007589aba2de93" + integrity sha512-Dbw/+0FQLzhcYOIUktBUu34qpBFsnW+qp6kid8Dfs/M8FUOOsST96zh7lZ3NSV/Z7XgOuvWDXz5HVmevuiRm+w== + +"@swc/html-linux-arm64-gnu@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.16.0.tgz#040b699a45457e0f366f2901f0c08a972e18c5ff" + integrity sha512-e3EyiP0e8Y9UMY/Kmdg4rcq934WHRcvjElHaGQkDecypGxDC9eoihNlrSTxNZQXnCrgUoqrGfxQiappYUwA86A== + +"@swc/html-linux-arm64-musl@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.16.0.tgz#2ed7555b7f52445d8a7cb6382a7bd1b97a3f7904" + integrity sha512-f9lCGwEJIwOOjpunMq8ALWHhSzd/8D4bgmEPsUrkHbTxSopKU1hPxTSPwGZvwNxWNsTJjACZsnAyyGcND+O5aQ== + +"@swc/html-linux-ppc64-gnu@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-linux-ppc64-gnu/-/html-linux-ppc64-gnu-1.16.0.tgz#b6472fb092b04bf94240a03ab1c9995fd5b5fcfa" + integrity sha512-Yc4Q4agRXBDLI1gs3HEwf6Rp2U0z+6ivmie77bfPjH5b1EOC3g/XrviNtAFfG7sEYzEjHZGHTr5ohs9Hd3ibYw== + +"@swc/html-linux-s390x-gnu@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-linux-s390x-gnu/-/html-linux-s390x-gnu-1.16.0.tgz#ad9188db0e37dd866a7c26424860d58fbae88619" + integrity sha512-0LqXAV+uBZJeqYCsLDE2QtZqHK2sAzOo51BJP45GQLqjIWYY5ujnSIMppZeaDclS/ZIpRIegluypTA2BoQW9qg== + +"@swc/html-linux-x64-gnu@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.16.0.tgz#4d2cb77943007da23a07d6b8dba90eaa457180cd" + integrity sha512-AglfxbBTnc1q+cDLufeqvgsNytiuSJbjPLxOJ9QM8fz49iZJQicD//Y4OgsD+2FVfbMsL4/g60+jE3aTEpGqbQ== + +"@swc/html-linux-x64-musl@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.16.0.tgz#3b009dd3852dd303a273e588e781bbae6ed20acc" + integrity sha512-Xa0sEUCowK9fN2Na0bguTGdx++BjLeONFG3omWVPMEd2VTJYOfNVhqka4pKbmQUocCVhQbxewuuZOxrO/6Fk6Q== + +"@swc/html-win32-arm64-msvc@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.16.0.tgz#a5d36e976b9a7c0fa72f926740d0e55779b4c319" + integrity sha512-8CR2aS/kWzr/cFlRschBUj94SiZ87f36U3ChUQX/fEoHTR1Z29PQTdmqtna4wueSNItk2Q1gyi6Y1OD0U/iDuQ== + +"@swc/html-win32-ia32-msvc@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.16.0.tgz#6ceeb3248f650577540510f12d0786b251d35add" + integrity sha512-UlNq29HY9HtDnVUEB37IRrzqMh/mdksc2djKikouNRJ0bJvp4wIcXfkRKNMS+9wDgXdtMWV8JNyAKOGTwvt4UQ== + +"@swc/html-win32-x64-msvc@1.16.0": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.16.0.tgz#dd61c46a5ffca51607c3c3ef9b0365e43577c155" + integrity sha512-3a+67eFx2XLWzDtYs5dg/t20J8uFXemF68tt7vIKyItdNzew+ivBu19JzQN/6wGSVHrXqf17vEQwmOO+gEYi1A== + +"@swc/html@^1.15.40": + version "1.16.0" + resolved "https://registry.yarnpkg.com/@swc/html/-/html-1.16.0.tgz#52250b60f3a15413af6a1802be85e07ce98ad159" + integrity sha512-mVJxXQo4Ga0OX5/aF6gKeclfps/aVsJpfaiEMifoplOhVBXGeKeMkr81Icspg/6WErbINVb1P47VFbj6cv+UrA== + dependencies: + "@swc/counter" "^0.1.3" + optionalDependencies: + "@swc/html-darwin-arm64" "1.16.0" + "@swc/html-darwin-x64" "1.16.0" + "@swc/html-linux-arm-gnueabihf" "1.16.0" + "@swc/html-linux-arm64-gnu" "1.16.0" + "@swc/html-linux-arm64-musl" "1.16.0" + "@swc/html-linux-ppc64-gnu" "1.16.0" + "@swc/html-linux-s390x-gnu" "1.16.0" + "@swc/html-linux-x64-gnu" "1.16.0" + "@swc/html-linux-x64-musl" "1.16.0" + "@swc/html-win32-arm64-msvc" "1.16.0" + "@swc/html-win32-ia32-msvc" "1.16.0" + "@swc/html-win32-x64-msvc" "1.16.0" + +"@swc/types@^0.1.28": + version "0.1.28" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.28.tgz#e3cd892383fba3b8904c40518bbe1265a50753f2" + integrity sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw== + dependencies: + "@swc/counter" "^0.1.3" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@tybys/wasm-util@^0.10.1": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.3.tgz#015cba9e9dd47ce14d03d2a8c5d547bfb169665d" + integrity sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg== + dependencies: + tslib "^2.4.0" + +"@types/body-parser@*": + version "1.19.6" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.6.tgz#1859bebb8fd7dac9918a45d54c1971ab8b5af474" + integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.5.4": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/d3-array@*": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.2.tgz#e02151464d02d4a1b44646d0fcdb93faf88fde8c" + integrity sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw== + +"@types/d3-axis@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.6.tgz#e760e5765b8188b1defa32bc8bb6062f81e4c795" + integrity sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-brush@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.6.tgz#c2f4362b045d472e1b186cdbec329ba52bdaee6c" + integrity sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-chord@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.6.tgz#1706ca40cf7ea59a0add8f4456efff8f8775793d" + integrity sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg== + +"@types/d3-color@*": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + +"@types/d3-contour@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.6.tgz#9ada3fa9c4d00e3a5093fed0356c7ab929604231" + integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== + dependencies: + "@types/d3-array" "*" + "@types/geojson" "*" + +"@types/d3-delaunay@*": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz#185c1a80cc807fdda2a3fe960f7c11c4a27952e1" + integrity sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw== + +"@types/d3-dispatch@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz#ef004d8a128046cfce434d17182f834e44ef95b2" + integrity sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA== + +"@types/d3-drag@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.7.tgz#b13aba8b2442b4068c9a9e6d1d82f8bcea77fc02" + integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-dsv@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz#0a351f996dc99b37f4fa58b492c2d1c04e3dac17" + integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g== + +"@types/d3-ease@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" + integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== + +"@types/d3-fetch@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz#c04a2b4f23181aa376f30af0283dbc7b3b569980" + integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA== + dependencies: + "@types/d3-dsv" "*" + +"@types/d3-force@*": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.10.tgz#6dc8fc6e1f35704f3b057090beeeb7ac674bff1a" + integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw== + +"@types/d3-format@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.4.tgz#b1e4465644ddb3fdf3a263febb240a6cd616de90" + integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== + +"@types/d3-geo@*": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.1.0.tgz#b9e56a079449174f0a2c8684a9a4df3f60522440" + integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== + dependencies: + "@types/geojson" "*" + +"@types/d3-hierarchy@*": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz#6023fb3b2d463229f2d680f9ac4b47466f71f17b" + integrity sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg== + +"@types/d3-interpolate@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" + integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.1.tgz#f632b380c3aca1dba8e34aa049bcd6a4af23df8a" + integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== + +"@types/d3-polygon@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz#dfae54a6d35d19e76ac9565bcb32a8e54693189c" + integrity sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA== + +"@types/d3-quadtree@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz#d4740b0fe35b1c58b66e1488f4e7ed02952f570f" + integrity sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg== + +"@types/d3-random@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.4.tgz#6bd3683b8332fc0f01e7059b7636bc5c7ede7337" + integrity sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA== + +"@types/d3-scale-chromatic@*": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#dc6d4f9a98376f18ea50bad6c39537f1b5463c39" + integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== + +"@types/d3-scale@*": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.9.tgz#57a2f707242e6fe1de81ad7bfcccaaf606179afb" + integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== + dependencies: + "@types/d3-time" "*" + +"@types/d3-selection@*": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.11.tgz#bd7a45fc0a8c3167a631675e61bc2ca2b058d4a3" + integrity sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w== + +"@types/d3-shape@*": + version "3.1.8" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.8.tgz#d1516cc508753be06852cd06758e3bb54a22b0e3" + integrity sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time-format@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz#d6bc1e6b6a7db69cccfbbdd4c34b70632d9e9db2" + integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg== + +"@types/d3-time@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f" + integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== + +"@types/d3-timer@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" + integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== + +"@types/d3-transition@*": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.9.tgz#1136bc57e9ddb3c390dccc9b5ff3b7d2b8d94706" + integrity sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-zoom@*": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz#dccb32d1c56b1e1c6e0f1180d994896f038bc40b" + integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== + dependencies: + "@types/d3-interpolate" "*" + "@types/d3-selection" "*" + +"@types/d3@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.4.3.tgz#d4550a85d08f4978faf0a4c36b848c61eaac07e2" + integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== + dependencies: + "@types/d3-array" "*" + "@types/d3-axis" "*" + "@types/d3-brush" "*" + "@types/d3-chord" "*" + "@types/d3-color" "*" + "@types/d3-contour" "*" + "@types/d3-delaunay" "*" + "@types/d3-dispatch" "*" + "@types/d3-drag" "*" + "@types/d3-dsv" "*" + "@types/d3-ease" "*" + "@types/d3-fetch" "*" + "@types/d3-force" "*" + "@types/d3-format" "*" + "@types/d3-geo" "*" + "@types/d3-hierarchy" "*" + "@types/d3-interpolate" "*" + "@types/d3-path" "*" + "@types/d3-polygon" "*" + "@types/d3-quadtree" "*" + "@types/d3-random" "*" + "@types/d3-scale" "*" + "@types/d3-scale-chromatic" "*" + "@types/d3-selection" "*" + "@types/d3-shape" "*" + "@types/d3-time" "*" + "@types/d3-time-format" "*" + "@types/d3-timer" "*" + "@types/d3-transition" "*" + "@types/d3-zoom" "*" + +"@types/debug@^4.0.0": + version "4.1.13" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.13.tgz#22d1cc9d542d3593caea764f974306ab36286ee7" + integrity sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw== + dependencies: + "@types/ms" "*" + +"@types/estree-jsx@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.8": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" + integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz#1a77faffee9572d39124933259be2523837d7eaa" + integrity sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express-serve-static-core@^4.17.21", "@types/express-serve-static-core@^4.17.33": + version "4.19.8" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz#99b960322a4d576b239a640ab52ef191989b036f" + integrity sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.6.tgz#2d724b2c990dcb8c8444063f3580a903f6d500cc" + integrity sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/serve-static" "^2" + +"@types/express@^4.17.25": + version "4.17.25" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.25.tgz#070c8c73a6fee6936d65c195dbbfb7da5026649b" + integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "^1" + +"@types/geojson@*": + version "7946.0.16" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.16.tgz#8ebe53d69efada7044454e3305c19017d97ced2a" + integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== + +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-cache-semantics@^4.0.2": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#f6a7788f438cbfde15f29acad46512b4c01913b3" + integrity sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q== + +"@types/http-errors@*": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472" + integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== + +"@types/http-proxy@^1.17.8": + version "1.17.17" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.17.tgz#d9e2c4571fe3507343cb210cd41790375e59a533" + integrity sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mdast@^4.0.0", "@types/mdast@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== + dependencies: + "@types/unist" "*" + +"@types/mdx@^2.0.0": + version "2.0.14" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.14.tgz#c1e54113265b152021ab0afe0434e3cadd90bfe3" + integrity sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/ms@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== + +"@types/node@*": + version "26.1.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-26.1.0.tgz#aa85f0727fc5611347091c478341c63650903439" + integrity sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw== + dependencies: + undici-types "~8.3.0" + +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/prismjs@^1.26.0": + version "1.26.6" + resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.6.tgz#6ea27c126d645319ae4f7055eda63a9e835c0187" + integrity sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw== + +"@types/prop-types@^15.7.15": + version "15.7.15" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" + integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== + +"@types/qs@*": + version "6.15.1" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.1.tgz#8606884272c63f0db96986bd3548650d8a9388bf" + integrity sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/react-router-config@*", "@types/react-router-config@^5.0.7": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.11.tgz#2761a23acc7905a66a94419ee40294a65aaa483a" + integrity sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "^5.1.0" + +"@types/react-router-dom@*": + version "5.3.3" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*", "@types/react-router@^5.1.0": + version "5.1.20" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + +"@types/react-transition-group@^4.4.12": + version "4.4.12" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" + integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== + +"@types/react@*": + version "19.2.17" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.17.tgz#dccac365baa0f1734ec270ff4b51c89465e8dc7f" + integrity sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw== + dependencies: + csstype "^3.2.2" + +"@types/retry@0.12.2": + version "0.12.2" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== + +"@types/sax@^1.2.1": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.7.tgz#ba5fe7df9aa9c89b6dff7688a19023dd2963091d" + integrity sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A== + dependencies: + "@types/node" "*" + +"@types/send@*": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-1.2.1.tgz#6a784e45543c18c774c049bff6d3dbaf045c9c74" + integrity sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ== + dependencies: + "@types/node" "*" + +"@types/send@<1": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.6.tgz#aeb5385be62ff58a52cd5459daa509ae91651d25" + integrity sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== + dependencies: + "@types/express" "*" + +"@types/serve-static@^1", "@types/serve-static@^1.15.5": + version "1.15.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.10.tgz#768169145a778f8f5dfcb6360aead414a3994fee" + integrity sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "<1" + +"@types/serve-static@^2": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-2.2.0.tgz#d4a447503ead0d1671132d1ab6bd58b805d8de6a" + integrity sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== + dependencies: + "@types/node" "*" + +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@types/unist@^2.0.0": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== + +"@types/ws@^8.5.10": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" + integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.35" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24" + integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== + dependencies: + "@types/yargs-parser" "*" + +"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.3.1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.2.tgz#a03ad82cd5676414d068ba86f880c5681194aadf" + integrity sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA== + +"@upsetjs/venn.js@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@upsetjs/venn.js/-/venn.js-2.0.0.tgz#3be192038cdda927aa4f8b22ab51af82abf47f34" + integrity sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw== + optionalDependencies: + d3-selection "^3.0.0" + d3-transition "^3.0.1" + +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== + +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== + +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== + +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== + +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" + +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== + +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-phases@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" + integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== + +acorn-jsx@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0: + version "8.3.5" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" + integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== + dependencies: + acorn "^8.11.0" + +acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.15.0, acorn@^8.16.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.17.0.tgz#1785adb84faf8d8add10369b93826fc2bd08f1fe" + integrity sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg== + +address@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/address/-/address-2.0.3.tgz#e910900615db3d8a20c040d4c710631062fc4ba8" + integrity sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.5: + version "6.15.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" + integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.9.0: + version "8.20.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9" + integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +algoliasearch-helper@^3.26.0: + version "3.29.1" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.29.1.tgz#4e764351493d461aa825d2a1209403a98e9b2477" + integrity sha512-6ck2YFudF2Pje7szQoPBiRFTGfd+1I+0I/WfLPGn0bj1kvrFoOQmNyedNiDxTk3/r4IfSLDYk+RA4G7u8H6+yA== + dependencies: + "@algolia/events" "^4.0.1" + +algoliasearch@^5.37.0: + version "5.55.1" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.55.1.tgz#d9c8a4636c79946881802a0d7426fc33333873e1" + integrity sha512-FyaFnnsbVPtevQwqSj/SdxE3jAsSsY0BEH8IVLf9rXxEBdAhAmT6VKCVSMWoaPIHVN1Eufh/1w8q6k8URpIkWw== + dependencies: + "@algolia/abtesting" "1.21.1" + "@algolia/client-abtesting" "5.55.1" + "@algolia/client-analytics" "5.55.1" + "@algolia/client-common" "5.55.1" + "@algolia/client-insights" "5.55.1" + "@algolia/client-personalization" "5.55.1" + "@algolia/client-query-suggestions" "5.55.1" + "@algolia/client-search" "5.55.1" + "@algolia/ingestion" "1.55.1" + "@algolia/monitoring" "1.55.1" + "@algolia/recommend" "5.55.1" + "@algolia/requester-browser-xhr" "5.55.1" + "@algolia/requester-fetch" "5.55.1" + "@algolia/requester-node-http" "5.55.1" + +ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + +ansis@^3.2.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7" + integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asn1js@^3.0.10, asn1js@^3.0.6: + version "3.0.10" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.10.tgz#df26c874c8a8b41ca605efea47b2ad07551013dd" + integrity sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg== + dependencies: + pvtsutils "^1.3.6" + pvutils "^1.1.5" + tslib "^2.8.1" + +astring@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.9.0.tgz#cc73e6062a7eb03e7d19c22d8b0b3451fd9bfeef" + integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== + +autoprefixer@^10.4.19, autoprefixer@^10.4.23: + version "10.5.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.5.2.tgz#5d7dcaab1c294038fe51e0fa3738d28e559caac0" + integrity sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q== + dependencies: + browserslist "^4.28.4" + caniuse-lite "^1.0.30001799" + fraction.js "^5.3.4" + picocolors "^1.1.1" + postcss-value-parser "^4.2.0" + +b4a@^1.6.4, b4a@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.8.1.tgz#7f16334ca80127aeb26064a28841acbf174840a4" + integrity sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw== + +babel-loader@^9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.2.1.tgz#04c7835db16c246dd19ba0914418f3937797587b" + integrity sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA== + dependencies: + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-polyfill-corejs2@^0.4.14, babel-plugin-polyfill-corejs2@^0.4.15: + version "0.4.17" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz#198f970f1c99a856b466d1187e88ce30bd199d91" + integrity sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w== + dependencies: + "@babel/compat-data" "^7.28.6" + "@babel/helper-define-polyfill-provider" "^0.6.8" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz#bb7f6aeef7addff17f7602a08a6d19a128c30164" + integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.5" + core-js-compat "^3.43.0" + +babel-plugin-polyfill-corejs3@^0.14.0: + version "0.14.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz#6ac08d2f312affb70c4c69c0fbba4cb417ee5587" + integrity sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.8" + core-js-compat "^3.48.0" + +babel-plugin-polyfill-regenerator@^0.6.5, babel-plugin-polyfill-regenerator@^0.6.6: + version "0.6.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz#8a6bfd5dd54239362b3d06ce47ac52b2d95d7721" + integrity sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.8" + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + +bare-events@^2.5.4, bare-events@^2.7.0: + version "2.9.1" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.9.1.tgz#5c86616966343bcb03a1b3155feab253eadbf349" + integrity sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg== + +bare-fs@^4.0.1, bare-fs@^4.5.5: + version "4.7.3" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.7.3.tgz#0f3c7daaff2830214abca580fb20bdb5191072b1" + integrity sha512-xRgplks8SvcKkdlv2M6Z2LZmRsmqd+x0nXXGXeMEjwdibj1HSDrlnqBRLeYdMvsgCox7Bq0e+DHwfczOfsn6IA== + dependencies: + bare-events "^2.5.4" + bare-path "^3.0.0" + bare-stream "^2.6.4" + bare-url "^2.2.2" + fast-fifo "^1.3.2" + +bare-os@^3.0.1: + version "3.9.3" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.9.3.tgz#eaf8a978a5fdda3dafc702b0f001449249eabe49" + integrity sha512-fF4Q7QsyKVF5Rj0qvI8BgUNjqzC2JvQlpTaPLjVJVxYVUX5Zr9un+y3w1HmA4nNKdFmRBT8z/WmrjvXzXVerKQ== + +bare-path@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.1.tgz#c12c81b527936b650e87c5d00264d59ef458082c" + integrity sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.6.4: + version "2.13.3" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.13.3.tgz#f6186c7cbb4bbf53a4560f35e48b16373ba51ce6" + integrity sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ== + dependencies: + b4a "^1.8.1" + streamx "^2.25.0" + teex "^1.0.1" + +bare-url@^2.2.2: + version "2.4.5" + resolved "https://registry.yarnpkg.com/bare-url/-/bare-url-2.4.5.tgz#50d205f8f2724eec60fd091ba9cebd675fca63aa" + integrity sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ== + dependencies: + bare-path "^3.0.0" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +baseline-browser-mapping@^2.10.42: + version "2.10.42" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz#195dcc76baa269a497f0b07decace169fee9ac58" + integrity sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@~1.20.5: + version "1.20.5" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.5.tgz#303c8c34423d1d6fa799bc764e93c1e4dc6ebf64" + integrity sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA== + dependencies: + bytes "~3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "~1.2.0" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + on-finished "~2.4.1" + qs "~6.15.1" + raw-body "~2.5.3" + type-is "~1.6.18" + unpipe "~1.0.0" + +bonjour-service@^1.2.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.4.2.tgz#33ce18eddf13047e5eeb08939018b20bae1a1473" + integrity sha512-lMskhnsW70yWHr4PhPeh2rvaIkLSaDpp+nmtbXBZaNKTXwxL73QOkW6HhbzqTImXjevn9TreGT4GACGBCGP9nQ== + dependencies: + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +boxen@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" + integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== + dependencies: + ansi-align "^3.0.1" + camelcase "^6.2.0" + chalk "^4.1.2" + cli-boxes "^3.0.0" + string-width "^5.0.1" + type-fest "^2.5.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" + +boxen@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== + dependencies: + ansi-align "^3.0.1" + camelcase "^7.0.1" + chalk "^5.2.0" + cli-boxes "^3.0.0" + string-width "^5.1.2" + type-fest "^2.13.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" + +brace-expansion@^1.1.7: + version "1.1.15" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.15.tgz#a6d90d54067236e5f42570a3b7378d594d9b7738" + integrity sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^5.0.5: + version "5.0.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.7.tgz#1b0e46965b479dad65af737b4a02790a05498337" + integrity sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA== + dependencies: + balanced-match "^4.0.2" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.2, browserslist@^4.28.1, browserslist@^4.28.4: + version "4.28.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.5.tgz#438b7d38c0d4b47740bbb36778d5bdca01b37838" + integrity sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ== + dependencies: + baseline-browser-mapping "^2.10.42" + caniuse-lite "^1.0.30001800" + electron-to-chromium "^1.5.387" + node-releases "^2.0.50" + update-browserslist-db "^1.2.3" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2, bytes@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +bytestreamjs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bytestreamjs/-/bytestreamjs-2.0.1.tgz#a32947c7ce389a6fa11a09a9a563d0a45889535e" + integrity sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ== + +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== + dependencies: + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.9.tgz#39a644700c80bc7d0ca9102fc6d1d43b2fd7eee7" + integrity sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + get-intrinsic "^1.3.0" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +camelcase@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001799, caniuse-lite@^1.0.30001800: + version "1.0.30001802" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001802.tgz#2671fb13d468930586c56ffa80feb1c51e18ec69" + integrity sha512-vmv8ub2xwTNmljSKf82mtCk5JH7hC+YgzLj3P5zotvA0tPQ9016tdNNOG8WRca1IxOnhSsivB+J0z5FeE5LOUw== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@^4.0.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.0.1, chalk@^5.2.0: + version "5.6.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + +chokidar@^3.5.3, chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +clean-css@^5.2.2, clean-css@^5.3.3, clean-css@~5.3.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-table3@^0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +clipboard@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.11.tgz#62180360b97dd668b6b3a84ec226975762a70be5" + integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clsx@^2.0.0, clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +collapse-white-space@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" + integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +colord@^2.9.3: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combine-promises@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.2.0.tgz#5f2e68451862acf85761ded4d9e2af7769c2ca6a" + integrity sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ== + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@7, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +compressible@~2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" + integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== + dependencies: + bytes "3.1.2" + compressible "~2.0.18" + debug "2.6.9" + negotiator "~0.6.4" + on-headers "~1.1.0" + safe-buffer "5.2.1" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== + dependencies: + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +consola@^3.2.3: + version "3.4.2" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" + integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== + +content-disposition@~0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== + +cookie@~0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +copy-text-to-clipboard@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz#99bc79db3f2d355ec33a08d573aff6804491ddb9" + integrity sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A== + +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.43.0, core-js-compat@^3.48.0: + version "3.49.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.49.0.tgz#06145447d92f4aaf258a0c44f24b47afaeaffef6" + integrity sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA== + dependencies: + browserslist "^4.28.1" + +core-js@^3.31.1: + version "3.49.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.49.0.tgz#8b4d520ac034311fa21aa616f017ada0e0dbbddd" + integrity sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cose-base@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" + integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== + dependencies: + layout-base "^1.0.0" + +cose-base@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" + integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== + dependencies: + layout-base "^2.0.0" + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cosmiconfig@^8.1.3, cosmiconfig@^8.3.5: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +css-blank-pseudo@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz#32020bff20a209a53ad71b8675852b49e8d57e46" + integrity sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag== + dependencies: + postcss-selector-parser "^7.0.0" + +css-declaration-sorter@^7.2.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz#9c215fbda2dcf4083bae69f125688158ae847deb" + integrity sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw== + +css-has-pseudo@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz#a5ee2daf5f70a2032f3cefdf1e36e7f52a243873" + integrity sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA== + dependencies: + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + postcss-value-parser "^4.2.0" + +css-loader@^6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" + integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.5.4" + +css-minimizer-webpack-plugin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz#33effe662edb1a0bf08ad633c32fa75d0f7ec565" + integrity sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + cssnano "^6.0.1" + jest-worker "^29.4.3" + postcss "^8.4.24" + schema-utils "^4.0.1" + serialize-javascript "^6.0.1" + +css-prefers-color-scheme@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz#ba001b99b8105b8896ca26fc38309ddb2278bd3c" + integrity sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ== + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-select@^5.1.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e" + integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + +css-what@^6.0.1, css-what@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea" + integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== + +cssdb@^8.6.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.9.0.tgz#e24d44824895957a4a5c75ba72c910f94e7aed77" + integrity sha512-J8jOU/hLjaXcO1LldOLraJSQpfLXRKof0I7mtbRyOy2AAXgqst0x9rlgi2qXeD6d0ou3ZLqcPAMqYVbpCbrxEw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz#82b090872b8f98c471f681d541c735acf8b94d3f" + integrity sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ== + dependencies: + autoprefixer "^10.4.19" + browserslist "^4.23.0" + cssnano-preset-default "^6.1.2" + postcss-discard-unused "^6.0.5" + postcss-merge-idents "^6.0.3" + postcss-reduce-idents "^6.0.3" + postcss-zindex "^6.0.2" + +cssnano-preset-default@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz#adf4b89b975aa775f2750c89dbaf199bbd9da35e" + integrity sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg== + dependencies: + browserslist "^4.23.0" + css-declaration-sorter "^7.2.0" + cssnano-utils "^4.0.2" + postcss-calc "^9.0.1" + postcss-colormin "^6.1.0" + postcss-convert-values "^6.1.0" + postcss-discard-comments "^6.0.2" + postcss-discard-duplicates "^6.0.3" + postcss-discard-empty "^6.0.3" + postcss-discard-overridden "^6.0.2" + postcss-merge-longhand "^6.0.5" + postcss-merge-rules "^6.1.1" + postcss-minify-font-values "^6.1.0" + postcss-minify-gradients "^6.0.3" + postcss-minify-params "^6.1.0" + postcss-minify-selectors "^6.0.4" + postcss-normalize-charset "^6.0.2" + postcss-normalize-display-values "^6.0.2" + postcss-normalize-positions "^6.0.2" + postcss-normalize-repeat-style "^6.0.2" + postcss-normalize-string "^6.0.2" + postcss-normalize-timing-functions "^6.0.2" + postcss-normalize-unicode "^6.1.0" + postcss-normalize-url "^6.0.2" + postcss-normalize-whitespace "^6.0.2" + postcss-ordered-values "^6.0.2" + postcss-reduce-initial "^6.1.0" + postcss-reduce-transforms "^6.0.2" + postcss-svgo "^6.0.3" + postcss-unique-selectors "^6.0.4" + +cssnano-utils@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.2.tgz#56f61c126cd0f11f2eef1596239d730d9fceff3c" + integrity sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ== + +cssnano@^6.0.1, cssnano@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.1.2.tgz#4bd19e505bd37ee7cf0dc902d3d869f6d79c66b8" + integrity sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA== + dependencies: + cssnano-preset-default "^6.1.2" + lilconfig "^3.1.1" + +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== + dependencies: + css-tree "~2.2.0" + +csstype@^3.0.2, csstype@^3.2.2, csstype@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== + +cytoscape-cose-bilkent@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" + integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== + dependencies: + cose-base "^1.0.0" + +cytoscape-fcose@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" + integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== + dependencies: + cose-base "^2.2.0" + +cytoscape@^3.33.3: + version "3.34.0" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.34.0.tgz#5fbe2eb1cf76b070a8ecd5647c35f65aa097c9c6" + integrity sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg== + +"d3-array@1 - 2": + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +d3-axis@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +"d3-color@1 - 3", d3-color@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@6: + version "6.0.4" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== + dependencies: + delaunator "5" + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +"d3-ease@1 - 3", d3-ease@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 3", d3-format@3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.2.tgz#01fdb46b58beb1f55b10b42ad70b6e344d5eb2ae" + integrity sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg== + +d3-geo@3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d" + integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-sankey@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/d3-sankey/-/d3-sankey-0.12.3.tgz#b3c268627bd72e5d80336e8de6acbfec9d15d01d" + integrity sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ== + dependencies: + d3-array "1 - 2" + d3-shape "^1.2.0" + +d3-scale-chromatic@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-shape@3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +"d3-time-format@2 - 4", d3-time-format@4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +"d3-timer@1 - 3", d3-timer@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3", d3-transition@3, d3-transition@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-zoom@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3@^7.9.0: + version "7.9.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d" + integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + +dagre-d3-es@7.0.14: + version "7.0.14" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz#1272276e26457cf3b97dac569f8f0531ec33c377" + integrity sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg== + dependencies: + d3 "^7.9.0" + lodash-es "^4.17.21" + +dayjs@^1.11.20: + version "1.11.21" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.21.tgz#57f87562e62de76f3c704bd2b8d522fc33068eb2" + integrity sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA== + +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +decode-named-character-reference@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz#3e40603760874c2e5867691b599d73a7da25b53f" + integrity sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q== + dependencies: + character-entities "^2.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-browser-id@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.1.tgz#f7a7ccb8f5104bf8e0f71ba3b1ccfa5eafdb21e8" + integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== + +default-browser@^5.2.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.0.tgz#2792e886f2422894545947cc80e1a444496c5976" + integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + +defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delaunator@5: + version "5.1.0" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.1.0.tgz#d13271fbf3aff6753f9ea6e235557f20901046ea" + integrity sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ== + dependencies: + robust-predicates "^3.0.2" + +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0, destroy@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^2.0.0, detect-libc@^2.0.2, detect-libc@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-2.1.0.tgz#03d72644891fa451ca5609b83107a8a0ebd03f91" + integrity sha512-epZuWb/6Q62L+nDHJc/hQAqf8pylsqgk3BpZXVBx1CDnr3nkrVNn73Uu1rXcFzkNcc+hkP3whuOg7JZYaQB65Q== + dependencies: + address "^2.0.1" + +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +dompurify@^3.3.3: + version "3.4.11" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.11.tgz#29c8ba496475f279ef4015784068452fb14a0680" + integrity sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.5.387: + version "1.5.388" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.388.tgz#002666dfda32e087c44fd01b7ce1719b6ec89c57" + integrity sha512-Pl/aJaqOOxYxda3vcx1IKSJimwYXHDkEnGn0F+kG2EE68dDtx2uCinaS+Vih8Z91B9t8CSAbiF/HKyWcnXjhzw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojilib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/emojilib/-/emojilib-2.4.0.tgz#ac518a8bb0d5f76dda57289ccb2fdf9d39ae721e" + integrity sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-4.1.0.tgz#d5a156868ee173095627a33de3f1e914c3dde79e" + integrity sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.22.2: + version "5.24.2" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.24.2.tgz#f25d703a24431cb1e02f944adb74aefa4fcb8d7e" + integrity sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.3.3" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +entities@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" + integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== + +error-ex@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" + integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.3.0.tgz#fda770234c345064c122eb905e1c4200ffa4ce7e" + integrity sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" + integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== + dependencies: + es-errors "^1.3.0" + +es-toolkit@^1.45.1: + version "1.49.0" + resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.49.0.tgz#93c5b031865792fc03cbf5bd20c132a4f976a52a" + integrity sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g== + +esast-util-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz#8d1cfb51ad534d2f159dc250e604f3478a79f1ad" + integrity sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + unist-util-position-from-estree "^2.0.0" + +esast-util-from-js@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz#5147bec34cc9da44accf52f87f239a40ac3e8225" + integrity sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw== + dependencies: + "@types/estree-jsx" "^1.0.0" + acorn "^8.0.0" + esast-util-from-estree "^2.0.0" + vfile-message "^4.0.0" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-goat@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" + integrity sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-util-attach-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" + integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" + integrity sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +estree-util-scope@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/estree-util-scope/-/estree-util-scope-1.0.0.tgz#9cbdfc77f5cb51e3d9ed4ad9c4adbff22d43e585" + integrity sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + +estree-util-to-js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" + integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-value-to-estree@^3.0.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz#cd70cf37e7f78eae3e110d66a3436ce0d18a8f80" + integrity sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-visit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" + integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^3.0.0" + +estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" + integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eval@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== + dependencies: + "@types/node" "*" + require-like ">= 0.1.1" + +eventemitter3@^4.0.0, eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events-universal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/events-universal/-/events-universal-1.0.1.tgz#b56a84fd611b6610e0a2d0f09f80fdf931e2dfe6" + integrity sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw== + dependencies: + bare-events "^2.7.0" + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +express@^4.22.1: + version "4.22.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.22.2.tgz#c17ae0981e5efc24b22272f0e041c4662503b700" + integrity sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "~1.20.5" + content-disposition "~0.5.4" + content-type "~1.0.4" + cookie "~0.7.1" + cookie-signature "~1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.3.1" + fresh "~0.5.2" + http-errors "~2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "~2.4.1" + parseurl "~1.3.3" + path-to-regexp "~0.1.12" + proxy-addr "~2.0.7" + qs "~6.15.1" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "~0.19.0" + serve-static "~1.16.2" + setprototypeof "1.2.0" + statuses "~2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + +fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-uri@^3.0.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.3.tgz#f695a40f006aba505631573a0021ddb21194ad11" + integrity sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg== + +fastq@^1.6.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" + integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== + dependencies: + reusify "^1.0.4" + +fault@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== + dependencies: + format "^0.2.0" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" + integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "~2.4.1" + parseurl "~1.3.3" + statuses "~2.0.2" + unpipe "~1.0.0" + +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== + dependencies: + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.0.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== + +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-5.3.4.tgz#8c0fcc6a9908262df4ed197427bdeef563e0699a" + integrity sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ== + +fresh@~0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^11.1.1, fs-extra@^11.2.0: + version "11.3.6" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.6.tgz#f7cb80e9df550cd1db6f537fa5cdd568d3e70d10" + integrity sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + +github-slugger@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" + integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regex.js@^1.0.0, glob-to-regex.js@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz#2b323728271d133830850e32311f40766c5f6413" + integrity sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ== + +glob@^13.0.0, glob@^13.0.3: + version "13.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d" + integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== + dependencies: + minimatch "^10.2.2" + minipass "^7.1.3" + path-scurry "^2.0.2" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.1: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== + dependencies: + delegate "^3.1.2" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +hachure-fill@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/hachure-fill/-/hachure-fill-0.5.2.tgz#d19bc4cc8750a5962b47fb1300557a85fcf934cc" + integrity sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-yarn@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" + integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== + +hasown@^2.0.2, hasown@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== + dependencies: + function-bind "^1.1.2" + +hast-util-from-parse5@^8.0.0: + version "8.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz#830a35022fff28c3fea3697a98c2f4cc6b835a2e" + integrity sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^9.0.0" + property-information "^7.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" + +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-raw@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.1.0.tgz#79b66b26f6f68fb50dfb4716b2cdca90d92adf2e" + integrity sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-from-parse5 "^8.0.0" + hast-util-to-parse5 "^8.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + parse5 "^7.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-estree@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz#e654c1c9374645135695cc0ab9f70b8fcaf733d7" + integrity sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-attach-comments "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + style-to-js "^1.0.0" + unist-util-position "^5.0.0" + zwitch "^2.0.0" + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.6" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz#ff31897aae59f62232e21594eac7ef6b63333e98" + integrity sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + style-to-js "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-to-parse5@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz#95aa391cc0514b4951418d01c883d1038af42f5d" + integrity sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-9.0.1.tgz#dbc84bef6051d40084342c229c451cd9dc567dff" + integrity sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-escaper@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-minifier-terser@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942" + integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA== + dependencies: + camel-case "^4.1.2" + clean-css "~5.3.2" + commander "^10.0.0" + entities "^4.4.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.15.1" + +html-tags@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + +html-webpack-plugin@^5.6.0: + version "5.6.7" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz#429bab4e12abf3c07e1c608886608e2df2c06b11" + integrity sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + +http-cache-semantics@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" + integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@~1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +http-errors@~2.0.0, http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== + dependencies: + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" + +http-parser-js@>=0.5.1: + version "0.5.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.10.tgz#b3277bd6d7ed5588e20ea73bf724fcbe44609075" + integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== + +http-proxy-middleware@^2.0.9: + version "2.0.10" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz#b2df7b705203d7a8c269ac8450cf96b00c532f94" + integrity sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +hyperdyperid@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" + integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== + +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +iconv-lite@~0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +image-size@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-2.0.2.tgz#84a7b43704db5736f364bf0d1b029821299b4bdc" + integrity sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w== + +import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +import-meta-resolve@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz#08cb85b5bd37ecc8eb1e0f670dc2767002d43734" + integrity sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infima@0.2.0-alpha.45: + version "0.2.0-alpha.45" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.45.tgz#542aab5a249274d81679631b492973dd2c1e7466" + integrity sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw== + +inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz#b1fc68bfc0313b8685745e4464e37f9376b9c909" + integrity sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA== + +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.4.0.tgz#038e9ceaf8219efc5bb76347b7eb787875d5095b" + integrity sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ== + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.4" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.4.tgz#1ee5553818511915685d33bb13d31bf854e5059d" + integrity sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.16.1: + version "2.16.2" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.2.tgz#3e07450a8080ebce3fbf0cac494f4d2ab324e082" + integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA== + dependencies: + hasown "^2.0.3" + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-network-error@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.3.2.tgz#9460bc30f8419a4bca77114f4de88a3ee5e0c519" + integrity sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA== + +is-npm@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.1.0.tgz#f70e0b6c132dfc817ac97d3badc0134945b098d3" + integrity sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-wsl@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.1.tgz#327897b26832a3eb117da6c27492d04ca132594f" + integrity sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw== + dependencies: + is-inside-container "^1.0.0" + +is-yarn-global@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" + integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.4.3: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jiti@^1.20.0: + version "1.21.7" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9" + integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== + +joi@^17.9.2: + version "17.13.4" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.4.tgz#ad6153d97ce558eb3a3b593e0d43eab51df1c474" + integrity sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ== + dependencies: + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.0.tgz#d1900572a7f7cf0b5f540c83673e60bad3436592" + integrity sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2, jsesc@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.1.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.1.tgz#b6e31717f22cc37330b081ce0051ed5de53af2f6" + integrity sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +katex@^0.16.45: + version "0.16.47" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.47.tgz#0a13a42c2deb4f74e61f162d440b9165a548030f" + integrity sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg== + dependencies: + commander "^8.3.0" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +khroma@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" + integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== + dependencies: + package-json "^8.1.0" + +launch-editor@^2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.14.1.tgz#f7e0da3f58aaea03fea01074d840b5f739ed7ddc" + integrity sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA== + dependencies: + picocolors "^1.1.1" + shell-quote "^1.8.4" + +layout-base@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" + integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== + +layout-base@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" + integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lightningcss-android-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968" + integrity sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg== + +lightningcss-darwin-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz#50b71871b01c8199584b649e292547faea7af9b5" + integrity sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ== + +lightningcss-darwin-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz#35f3e97332d130b9ca181e11b568ded6aebc6d5e" + integrity sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w== + +lightningcss-freebsd-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz#9777a76472b64ed6ff94342ad64c7bafd794a575" + integrity sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig== + +lightningcss-linux-arm-gnueabihf@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz#13ae652e1ab73b9135d7b7da172f666c410ad53d" + integrity sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw== + +lightningcss-linux-arm64-gnu@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz#417858795a94592f680123a1b1f9da8a0e1ef335" + integrity sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ== + +lightningcss-linux-arm64-musl@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz#6be36692e810b718040802fd809623cffe732133" + integrity sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg== + +lightningcss-linux-x64-gnu@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz#0b7803af4eb21cfd38dd39fe2abbb53c7dd091f6" + integrity sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA== + +lightningcss-linux-x64-musl@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz#88dc8ba865ddddb1ac5ef04b0f161804418c163b" + integrity sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg== + +lightningcss-win32-arm64-msvc@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz#4f30ba3fa5e925f5b79f945e8cc0d176c3b1ab38" + integrity sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw== + +lightningcss-win32-x64-msvc@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz#141aa5605645064928902bb4af045fa7d9f4220a" + integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q== + +lightningcss@^1.27.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.32.0.tgz#b85aae96486dcb1bf49a7c8571221273f4f1e4a9" + integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ== + dependencies: + detect-libc "^2.0.3" + optionalDependencies: + lightningcss-android-arm64 "1.32.0" + lightningcss-darwin-arm64 "1.32.0" + lightningcss-darwin-x64 "1.32.0" + lightningcss-freebsd-x64 "1.32.0" + lightningcss-linux-arm-gnueabihf "1.32.0" + lightningcss-linux-arm64-gnu "1.32.0" + lightningcss-linux-arm64-musl "1.32.0" + lightningcss-linux-x64-gnu "1.32.0" + lightningcss-linux-x64-musl "1.32.0" + lightningcss-win32-arm64-msvc "1.32.0" + lightningcss-win32-x64-msvc "1.32.0" + +lilconfig@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.2.tgz#9913d3a15971f8f635915e601fb5c9d495d918e9" + integrity sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash-es@^4.17.21: + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.18.1.tgz#b962eeb80d9d983a900bf342961fb7418ca10b1d" + integrity sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A== + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.20, lodash@^4.17.21: + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +loose-envify@^1.0.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +lru-cache@^11.0.0: + version "11.5.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.1.tgz#f3daa3540847b9737ebc02499ddb36765e54db4a" + integrity sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +markdown-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" + integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== + +markdown-table@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" + integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== + +marked@^16.3.0: + version "16.4.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-16.4.2.tgz#4959a64be6c486f0db7467ead7ce288de54290a3" + integrity sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mdast-util-directive@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz#f3656f4aab6ae3767d3c72cfab5e8055572ccba1" + integrity sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz#70a3174c894e14df722abf43bc250cbae44b11df" + integrity sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-from-markdown@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz#c95822b91aab75f18a4cbe8b2f51b873ed2cf0c7" + integrity sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-frontmatter@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" + integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + escape-string-regexp "^5.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz#abd557630337bd30a6d5a4bd8252e1c2dc0875d5" + integrity sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz#7778e9d9ca3df7238cc2bd3fa2b1bf6a65b19403" + integrity sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz#2cdf63b92c2a331406b0fb0db4c077c1b0331751" + integrity sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz#43f0abac9adc756e2086f63822a38c8d3c3a5096" + integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-jsx@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz#fd04c67a2a7499efb905a8a5c578dddc9fdada0d" + integrity sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" + integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.2.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz#d7ff84ca499a57e2c060ae67548ad950e689a053" + integrity sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +mdast-util-to-markdown@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz#f910ffe60897f04bb4b7e7ee434486f76288361b" + integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^4.17.0, memfs@^4.43.1: + version "4.58.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.58.0.tgz#b995e7183c09d71f28f803fbfd326704c9216390" + integrity sha512-0n6CDBqIT/eGrbWdDVNkLjasjupnEpOFjFOtXrS5p6EYYXGXBn5ZIMLetBlVdQYpP0hGK2MEOgYAC0/+NOr91w== + dependencies: + "@jsonjoy.com/fs-core" "4.58.0" + "@jsonjoy.com/fs-fsa" "4.58.0" + "@jsonjoy.com/fs-node" "4.58.0" + "@jsonjoy.com/fs-node-builtins" "4.58.0" + "@jsonjoy.com/fs-node-to-fsa" "4.58.0" + "@jsonjoy.com/fs-node-utils" "4.58.0" + "@jsonjoy.com/fs-print" "4.58.0" + "@jsonjoy.com/fs-snapshot" "4.58.0" + "@jsonjoy.com/json-pack" "^1.11.0" + "@jsonjoy.com/util" "^1.9.0" + glob-to-regex.js "^1.0.1" + thingies "^2.5.0" + tree-dump "^1.0.3" + tslib "^2.0.0" + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +mermaid@>=11.6.0: + version "11.16.0" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-11.16.0.tgz#dc946bc84bde9d093ba14940d49df1d9f7d8c32f" + integrity sha512-Zvm3kbstgdpvIJPPItlL7fppIZ3kibvc1oZIGxdvk9t6UFz6flv+Jw7FtRGKwfcI8OckmH04LqG6LlS6X4B1pA== + dependencies: + "@braintree/sanitize-url" "^7.1.2" + "@iconify/utils" "^3.0.2" + "@mermaid-js/parser" "^1.2.0" + "@types/d3" "^7.4.3" + "@upsetjs/venn.js" "^2.0.0" + cytoscape "^3.33.3" + cytoscape-cose-bilkent "^4.1.0" + cytoscape-fcose "^2.2.0" + d3 "^7.9.0" + d3-sankey "^0.12.3" + dagre-d3-es "7.0.14" + dayjs "^1.11.20" + dompurify "^3.3.3" + es-toolkit "^1.45.1" + katex "^0.16.45" + khroma "^2.1.0" + marked "^16.3.0" + roughjs "^4.6.6" + stylis "^4.3.6" + ts-dedent "^2.2.0" + uuid "^11.1.0 || ^12 || ^13 || ^14.0.0" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromark-core-commonmark@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz#c691630e485021a68cf28dbc2b2ca27ebf678cd4" + integrity sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-directive@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz#2eb61985d1995a7c1ff7621676a4f32af29409e8" + integrity sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + parse-entities "^4.0.0" + +micromark-extension-frontmatter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" + integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== + dependencies: + fault "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz#86106df8b3a692b5f6a92280d3879be6be46d923" + integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz#fac70bcbf51fe65f5f44033118d39be8a9b5940b" + integrity sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz#bcc34d805639829990ec175c3eea12bb5b781f2c" + integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-expression@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz#43d058d999532fb3041195a3c3c05c46fa84543b" + integrity sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-jsx@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz#ffc98bdb649798902fa9fc5689f67f9c1c902044" + integrity sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdx-md@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" + integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-mdxjs-esm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" + integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdxjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" + integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^3.0.0" + micromark-extension-mdx-jsx "^3.0.0" + micromark-extension-mdx-md "^2.0.0" + micromark-extension-mdxjs-esm "^3.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-mdx-expression@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz#bb09988610589c07d1c1e4425285895041b3dfa9" + integrity sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^1.0.0, micromark-util-character@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2" + integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== + +micromark-util-events-to-acorn@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz#e7a8a6b55a47e5a06c720d5a1c4abae8c37c98f3" + integrity sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg== + dependencies: + "@types/estree" "^1.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-util-html-tag-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz#d8ade5ba0f3197a1cf6a2999fbbfe6357a1a19ee" + integrity sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^1.0.0, micromark-util-symbol@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-symbol@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== + +micromark-util-types@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark-util-types@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" + integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== + +micromark@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.2.tgz#91395a3e1884a198e62116e33c9c568e39936fdb" + integrity sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromatch@^4.0.2, micromatch@^4.0.5, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34, mime-types@~2.1.35: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" + integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== + dependencies: + mime-db "^1.54.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + +mini-css-extract-plugin@^2.9.2: + version "2.10.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz#5c85ec9450c05d26e32531b465a15a08c3a57253" + integrity sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg== + dependencies: + schema-utils "^4.0.0" + tapable "^2.2.1" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^10.2.2: + version "10.2.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" + integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== + dependencies: + brace-expansion "^5.0.5" + +minimist@^1.2.0, minimist@^1.2.3: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minimizer-webpack-plugin@^5.6.1: + version "5.6.1" + resolved "https://registry.yarnpkg.com/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz#289922a4c96c4ed1ddb76b8a00bd8074e89a2f7f" + integrity sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + jest-worker "^27.4.5" + schema-utils "^4.3.0" + terser "^5.31.1" + +minipass@^7.1.2, minipass@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mrmime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" + integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@^3.3.12: + version "3.3.15" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.15.tgz#36c490fad8c6e86c824c940dfdde999b69ed4316" + integrity sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA== + +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-abi@^3.3.0: + version "3.94.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.94.0.tgz#007181ed0d1b56ae9670ea6c084d2bf83538405f" + integrity sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g== + dependencies: + semver "^7.3.5" + +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + +node-emoji@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.2.0.tgz#1d000e3c76e462577895be1b436f4aa2d6760eb0" + integrity sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw== + dependencies: + "@sindresorhus/is" "^4.6.0" + char-regex "^1.0.2" + emojilib "^2.4.0" + skin-tone "^2.0.0" + +node-releases@^2.0.50: + version "2.0.50" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.50.tgz#597197a852071ce42fc2550e58e223242bcba969" + integrity sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.1.1.tgz#751a20c8520e5725404c06015fea21d7567f25ef" + integrity sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +null-loader@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-4.0.1.tgz#8e63bd3a2dd3c64236a4679428632edd0a6dbc6a" + integrity sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@^2.4.1, on-finished@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" + integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^10.0.3: + version "10.2.0" + resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" + integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + wsl-utils "^0.1.0" + +open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-retry@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.1.tgz#81828f8dc61c6ef5a800585491572cc9892703af" + integrity sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ== + dependencies: + "@types/retry" "0.12.2" + is-network-error "^1.0.0" + retry "^0.13.1" + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +package-json-from-dist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== + dependencies: + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" + +package-manager-detector@^1.3.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-1.7.0.tgz#0a6d6d3856627b8ac9331f95fc891ea81247aafd" + integrity sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ== + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== + dependencies: + "@types/unist" "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b" + integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g== + dependencies: + domhandler "^5.0.3" + parse5 "^7.0.0" + +parse5@^7.0.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" + integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== + dependencies: + entities "^6.0.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-data-parser@0.1.0, path-data-parser@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/path-data-parser/-/path-data-parser-0.1.0.tgz#8f5ba5cc70fc7becb3dcefaea08e2659aba60b8c" + integrity sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" + integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + +path-to-regexp@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.3.0.tgz#f7f31d32e8518c2660862b644414b6d5c63a611b" + integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw== + +path-to-regexp@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.9.0.tgz#5dc0753acbf8521ca2e0f137b4578b917b10cf24" + integrity sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g== + dependencies: + isarray "0.0.1" + +path-to-regexp@~0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz#9b22ec16bc3ab88d05a0c7e369869421401ab17d" + integrity sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== + +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + +pkijs@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pkijs/-/pkijs-3.4.0.tgz#d9164def30ff6d97be2d88966d5e36192499ca9c" + integrity sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw== + dependencies: + "@noble/hashes" "1.4.0" + asn1js "^3.0.6" + bytestreamjs "^2.0.1" + pvtsutils "^1.3.6" + pvutils "^1.1.3" + tslib "^2.8.1" + +points-on-curve@0.2.0, points-on-curve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/points-on-curve/-/points-on-curve-0.2.0.tgz#7dbb98c43791859434284761330fa893cb81b4d1" + integrity sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A== + +points-on-path@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/points-on-path/-/points-on-path-0.2.1.tgz#553202b5424c53bed37135b318858eacff85dd52" + integrity sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g== + dependencies: + path-data-parser "0.1.0" + points-on-curve "0.2.0" + +postcss-attribute-case-insensitive@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz#0c4500e3bcb2141848e89382c05b5a31c23033a3" + integrity sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-calc@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" + integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== + dependencies: + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^7.0.12: + version "7.0.12" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz#9a3df2296889e629fde18b873bb1f50a4ecf4b83" + integrity sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +postcss-color-hex-alpha@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz#5dd3eba1f8facb4ea306cba6e3f7712e876b0c76" + integrity sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz#5ada28406ac47e0796dff4056b0a9d5a6ecead98" + integrity sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-colormin@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.1.0.tgz#076e8d3fb291fbff7b10e6b063be9da42ff6488d" + integrity sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw== + dependencies: + browserslist "^4.23.0" + caniuse-api "^3.0.0" + colord "^2.9.3" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz#3498387f8efedb817cbc63901d45bd1ceaa40f48" + integrity sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w== + dependencies: + browserslist "^4.23.0" + postcss-value-parser "^4.2.0" + +postcss-custom-media@^11.0.6: + version "11.0.6" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz#6b450e5bfa209efb736830066682e6567bd04967" + integrity sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" + +postcss-custom-properties@^14.0.6: + version "14.0.6" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz#1af73a650bf115ba052cf915287c9982825fc90e" + integrity sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz#9448ed37a12271d7ab6cb364b6f76a46a4a323e8" + integrity sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + postcss-selector-parser "^7.0.0" + +postcss-dir-pseudo-class@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz#80d9e842c9ae9d29f6bf5fd3cf9972891d6cc0ca" + integrity sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-discard-comments@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz#e768dcfdc33e0216380623652b0a4f69f4678b6c" + integrity sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw== + +postcss-discard-duplicates@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz#d121e893c38dc58a67277f75bb58ba43fce4c3eb" + integrity sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw== + +postcss-discard-empty@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz#ee39c327219bb70473a066f772621f81435a79d9" + integrity sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ== + +postcss-discard-overridden@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz#4e9f9c62ecd2df46e8fdb44dc17e189776572e2d" + integrity sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ== + +postcss-discard-unused@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz#c1b0e8c032c6054c3fbd22aaddba5b248136f338" + integrity sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA== + dependencies: + postcss-selector-parser "^6.0.16" + +postcss-double-position-gradients@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz#b482d08b5ced092b393eb297d07976ab482d4cad" + integrity sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-focus-visible@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz#1f7904904368a2d1180b220595d77b6f8a957868" + integrity sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-focus-within@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz#ac01ce80d3f2e8b2b3eac4ff84f8e15cd0057bc7" + integrity sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz#d5ff0bdf923c06686499ed2b12e125fe64054fed" + integrity sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw== + +postcss-image-set-function@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz#538e94e16716be47f9df0573b56bbaca86e1da53" + integrity sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-lab-function@^7.0.12: + version "7.0.12" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz#eb555ac542607730eb0a87555074e4a5c6eef6e4" + integrity sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w== + dependencies: + "@csstools/css-color-parser" "^3.1.0" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +postcss-loader@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" + integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== + dependencies: + cosmiconfig "^8.3.5" + jiti "^1.20.0" + semver "^7.5.4" + +postcss-logical@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-8.1.0.tgz#4092b16b49e3ecda70c4d8945257da403d167228" + integrity sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-merge-idents@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz#7b9c31c7bc823c94bec50f297f04e3c2b838ea65" + integrity sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g== + dependencies: + cssnano-utils "^4.0.2" + postcss-value-parser "^4.2.0" + +postcss-merge-longhand@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz#ba8a8d473617c34a36abbea8dda2b215750a065a" + integrity sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^6.1.1" + +postcss-merge-rules@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz#7aa539dceddab56019469c0edd7d22b64c3dea9d" + integrity sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ== + dependencies: + browserslist "^4.23.0" + caniuse-api "^3.0.0" + cssnano-utils "^4.0.2" + postcss-selector-parser "^6.0.16" + +postcss-minify-font-values@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz#a0e574c02ee3f299be2846369211f3b957ea4c59" + integrity sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz#ca3eb55a7bdb48a1e187a55c6377be918743dbd6" + integrity sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q== + dependencies: + colord "^2.9.3" + cssnano-utils "^4.0.2" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz#54551dec77b9a45a29c3cb5953bf7325a399ba08" + integrity sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA== + dependencies: + browserslist "^4.23.0" + cssnano-utils "^4.0.2" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz#197f7d72e6dd19eed47916d575d69dc38b396aff" + integrity sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ== + dependencies: + postcss-selector-parser "^6.0.16" + +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== + +postcss-modules-local-by-default@^4.0.5: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" + integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^7.0.0" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nesting@^13.0.2: + version "13.0.2" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-13.0.2.tgz#fde0d4df772b76d03b52eccc84372e8d1ca1402e" + integrity sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ== + dependencies: + "@csstools/selector-resolve-nested" "^3.1.0" + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + +postcss-normalize-charset@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz#1ec25c435057a8001dac942942a95ffe66f721e1" + integrity sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ== + +postcss-normalize-display-values@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz#54f02764fed0b288d5363cbb140d6950dbbdd535" + integrity sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz#e982d284ec878b9b819796266f640852dbbb723a" + integrity sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz#f8006942fd0617c73f049dd8b6201c3a3040ecf3" + integrity sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz#e3cc6ad5c95581acd1fc8774b309dd7c06e5e363" + integrity sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz#40cb8726cef999de984527cbd9d1db1f3e9062c0" + integrity sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz#aaf8bbd34c306e230777e80f7f12a4b7d27ce06e" + integrity sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg== + dependencies: + browserslist "^4.23.0" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz#292792386be51a8de9a454cb7b5c58ae22db0f79" + integrity sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz#fbb009e6ebd312f8b2efb225c2fcc7cf32b400cd" + integrity sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-opacity-percentage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz#0b0db5ed5db5670e067044b8030b89c216e1eb0a" + integrity sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ== + +postcss-ordered-values@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz#366bb663919707093451ab70c3f99c05672aaae5" + integrity sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q== + dependencies: + cssnano-utils "^4.0.2" + postcss-value-parser "^4.2.0" + +postcss-overflow-shorthand@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz#f5252b4a2ee16c68cd8a9029edb5370c4a9808af" + integrity sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-10.0.0.tgz#ba36ee4786ca401377ced17a39d9050ed772e5a9" + integrity sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^10.2.1: + version "10.6.1" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz#df30cfc54e90af2dcff5f94104e6f272359c9f65" + integrity sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g== + dependencies: + "@csstools/postcss-alpha-function" "^1.0.1" + "@csstools/postcss-cascade-layers" "^5.0.2" + "@csstools/postcss-color-function" "^4.0.12" + "@csstools/postcss-color-function-display-p3-linear" "^1.0.1" + "@csstools/postcss-color-mix-function" "^3.0.12" + "@csstools/postcss-color-mix-variadic-function-arguments" "^1.0.2" + "@csstools/postcss-content-alt-text" "^2.0.8" + "@csstools/postcss-contrast-color-function" "^2.0.12" + "@csstools/postcss-exponential-functions" "^2.0.9" + "@csstools/postcss-font-format-keywords" "^4.0.0" + "@csstools/postcss-gamut-mapping" "^2.0.11" + "@csstools/postcss-gradients-interpolation-method" "^5.0.12" + "@csstools/postcss-hwb-function" "^4.0.12" + "@csstools/postcss-ic-unit" "^4.0.4" + "@csstools/postcss-initial" "^2.0.1" + "@csstools/postcss-is-pseudo-class" "^5.0.3" + "@csstools/postcss-light-dark-function" "^2.0.11" + "@csstools/postcss-logical-float-and-clear" "^3.0.0" + "@csstools/postcss-logical-overflow" "^2.0.0" + "@csstools/postcss-logical-overscroll-behavior" "^2.0.0" + "@csstools/postcss-logical-resize" "^3.0.0" + "@csstools/postcss-logical-viewport-units" "^3.0.4" + "@csstools/postcss-media-minmax" "^2.0.9" + "@csstools/postcss-media-queries-aspect-ratio-number-values" "^3.0.5" + "@csstools/postcss-nested-calc" "^4.0.0" + "@csstools/postcss-normalize-display-values" "^4.0.1" + "@csstools/postcss-oklab-function" "^4.0.12" + "@csstools/postcss-position-area-property" "^1.0.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/postcss-property-rule-prelude-list" "^1.0.0" + "@csstools/postcss-random-function" "^2.0.1" + "@csstools/postcss-relative-color-syntax" "^3.0.12" + "@csstools/postcss-scope-pseudo-class" "^4.0.1" + "@csstools/postcss-sign-functions" "^1.1.4" + "@csstools/postcss-stepped-value-functions" "^4.0.9" + "@csstools/postcss-syntax-descriptor-syntax-production" "^1.0.1" + "@csstools/postcss-system-ui-font-family" "^1.0.0" + "@csstools/postcss-text-decoration-shorthand" "^4.0.3" + "@csstools/postcss-trigonometric-functions" "^4.0.9" + "@csstools/postcss-unset-value" "^4.0.0" + autoprefixer "^10.4.23" + browserslist "^4.28.1" + css-blank-pseudo "^7.0.1" + css-has-pseudo "^7.0.3" + css-prefers-color-scheme "^10.0.0" + cssdb "^8.6.0" + postcss-attribute-case-insensitive "^7.0.1" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^7.0.12" + postcss-color-hex-alpha "^10.0.0" + postcss-color-rebeccapurple "^10.0.0" + postcss-custom-media "^11.0.6" + postcss-custom-properties "^14.0.6" + postcss-custom-selectors "^8.0.5" + postcss-dir-pseudo-class "^9.0.1" + postcss-double-position-gradients "^6.0.4" + postcss-focus-visible "^10.0.1" + postcss-focus-within "^9.0.1" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^6.0.0" + postcss-image-set-function "^7.0.0" + postcss-lab-function "^7.0.12" + postcss-logical "^8.1.0" + postcss-nesting "^13.0.2" + postcss-opacity-percentage "^3.0.0" + postcss-overflow-shorthand "^6.0.0" + postcss-page-break "^3.0.4" + postcss-place "^10.0.0" + postcss-pseudo-class-any-link "^10.0.1" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^8.0.1" + +postcss-pseudo-class-any-link@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz#06455431171bf44b84d79ebaeee9fd1c05946544" + integrity sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-reduce-idents@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz#b0d9c84316d2a547714ebab523ec7d13704cd486" + integrity sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz#4401297d8e35cb6e92c8e9586963e267105586ba" + integrity sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw== + dependencies: + browserslist "^4.23.0" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz#6fa2c586bdc091a7373caeee4be75a0f3e12965d" + integrity sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz#f2df9c6ac9f95e9fe4416ca41a957eda16130172" + integrity sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16: + version "6.1.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz#fdec4ca80f5781bd216ca9bf89a2a0fccfffa5f0" + integrity sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-selector-parser@^7.0.0: + version "7.1.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz#69dc7a526517572ff6b150e352b36a016017b485" + integrity sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz#4556b3f982ef27d3bac526b99b6c0d3359a6cf97" + integrity sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA== + dependencies: + sort-css-media-queries "2.2.0" + +postcss-svgo@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.3.tgz#1d6e180d6df1fa8a3b30b729aaa9161e94f04eaa" + integrity sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^3.2.0" + +postcss-unique-selectors@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz#983ab308896b4bf3f2baaf2336e14e52c11a2088" + integrity sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg== + dependencies: + postcss-selector-parser "^6.0.16" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-zindex@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-6.0.2.tgz#e498304b83a8b165755f53db40e2ea65a99b56e1" + integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== + +postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4: + version "8.5.16" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.16.tgz#1230ce0b5df354c24c0ea45f99ce5f6a88279d28" + integrity sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg== + dependencies: + nanoid "^3.3.12" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prebuild-install@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^2.0.0" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz#ac63b7f78e56c8f2b5e76e823a976d5ede77e35f" + integrity sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig== + dependencies: + "@types/prismjs" "^1.26.0" + clsx "^2.0.0" + +prismjs@^1.29.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.30.0.tgz#d9709969d9d4e16403f6f348c63553b19f0975a9" + integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.2.0.tgz#0809b34264e995c0bfcd3227028a1e35210af80a" + integrity sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg== + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pump@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c" + integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pupa@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-3.3.0.tgz#bc4036f9e8920c08ad472bc18fb600067cb83810" + integrity sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA== + dependencies: + escape-goat "^4.0.0" + +pvtsutils@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.6.tgz#ec46e34db7422b9e4fdc5490578c1883657d6001" + integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg== + dependencies: + tslib "^2.8.1" + +pvutils@^1.1.3, pvutils@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.5.tgz#84b0dea4a5d670249aa9800511804ee0b7c2809c" + integrity sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA== + +qs@~6.15.1: + version "6.15.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.3.tgz#76852132a58ed5c7c0ef67e4441b9bb5d6061b3b" + integrity sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A== + dependencies: + es-define-property "^1.0.1" + side-channel "^1.1.1" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== + +range-parser@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.3.0.tgz#d7f19be812bb62721472b45d3be219ef09572b47" + integrity sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@~2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" + integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + unpipe "~1.0.0" + +rc@1.2.8, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-dom@^19.0.0: + version "19.2.7" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.7.tgz#0450dc9ae9ddbff76ef196401cd8b8c7fb466ccc" + integrity sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ== + dependencies: + scheduler "^0.27.0" + +react-fast-compare@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +"react-helmet-async@npm:@slorber/react-helmet-async@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz#11fbc6094605cf60aa04a28c17e0aab894b4ecff" + integrity sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A== + dependencies: + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" + prop-types "^15.7.2" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" + +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^19.2.3: + version "19.2.7" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.2.7.tgz#57668ee86a78574a542b0a539455212b2c086df2" + integrity sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A== + +react-json-view-lite@^2.3.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz#c7ff011c7cc80e9900abc7aa4916c6a5c6d6c1c6" + integrity sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g== + +react-loadable-ssr-addon-v5-slorber@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz#bb3791bf481222c63a5bc6b96ee23f68cb5614b9" + integrity sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ== + dependencies: + "@babel/runtime" "^7.10.3" + +"react-loadable@npm:@docusaurus/react-loadable@6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz#de6c7f73c96542bd70786b8e522d535d69069dc4" + integrity sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ== + dependencies: + "@types/react" "*" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.4" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.3.4, react-router@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^19.0.0: + version "19.2.7" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.7.tgz#1f47a1bfc06f8ec885752c6f4af14369a9f8260b" + integrity sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ== + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recma-build-jsx@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz#c02f29e047e103d2fab2054954e1761b8ea253c4" + integrity sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew== + dependencies: + "@types/estree" "^1.0.0" + estree-util-build-jsx "^3.0.0" + vfile "^6.0.0" + +recma-jsx@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/recma-jsx/-/recma-jsx-1.0.1.tgz#58e718f45e2102ed0bf2fa994f05b70d76801a1a" + integrity sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w== + dependencies: + acorn-jsx "^5.0.0" + estree-util-to-js "^2.0.0" + recma-parse "^1.0.0" + recma-stringify "^1.0.0" + unified "^11.0.0" + +recma-parse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-parse/-/recma-parse-1.0.0.tgz#c351e161bb0ab47d86b92a98a9d891f9b6814b52" + integrity sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ== + dependencies: + "@types/estree" "^1.0.0" + esast-util-from-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +recma-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-stringify/-/recma-stringify-1.0.0.tgz#54632030631e0c7546136ff9ef8fde8e7b44f130" + integrity sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g== + dependencies: + "@types/estree" "^1.0.0" + estree-util-to-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +reflect-metadata@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + +regenerate-unicode-properties@^10.2.2: + version "10.2.2" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz#aa113812ba899b630658c7623466be71e1f86f66" + integrity sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regexpu-core@^6.3.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" + integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.2" + regjsgen "^0.8.0" + regjsparser "^0.13.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.2.1" + +registry-auth-token@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.1.1.tgz#f1ff69c8e492e7edee07110b4752dd0a8aa82853" + integrity sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q== + dependencies: + "@pnpm/npm-conf" "^3.0.2" + +registry-url@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== + dependencies: + rc "1.2.8" + +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.13.0: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.2.tgz#f654734b5c588b22ba3e21693b30523417180808" + integrity sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ== + dependencies: + jsesc "~3.1.0" + +rehype-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" + integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== + dependencies: + "@types/hast" "^3.0.0" + hast-util-raw "^9.0.0" + vfile "^6.0.0" + +rehype-recma@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rehype-recma/-/rehype-recma-1.0.0.tgz#d68ef6344d05916bd96e25400c6261775411aa76" + integrity sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + hast-util-to-estree "^3.0.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +remark-directive@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-directive/-/remark-directive-3.0.1.tgz#689ba332f156cfe1118e849164cc81f157a3ef0a" + integrity sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-directive "^3.0.0" + micromark-extension-directive "^3.0.0" + unified "^11.0.0" + +remark-emoji@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-4.0.1.tgz#671bfda668047689e26b2078c7356540da299f04" + integrity sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg== + dependencies: + "@types/mdast" "^4.0.2" + emoticon "^4.0.1" + mdast-util-find-and-replace "^3.0.1" + node-emoji "^2.1.0" + unified "^11.0.4" + +remark-frontmatter@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" + integrity sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-frontmatter "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + unified "^11.0.0" + +remark-gfm@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.1.tgz#33227b2a74397670d357bf05c098eaf8513f0d6b" + integrity sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-mdx@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.1.1.tgz#047f97038bc7ec387aebb4b0a4fe23779999d845" + integrity sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.1.2" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.2.tgz#2addaadda80ca9bd9aa0da763e74d16327683b37" + integrity sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve@^1.19.0, resolve@^1.22.11: + version "1.22.12" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" + integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== + dependencies: + es-errors "^1.3.0" + is-core-module "^2.16.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +rimraf@^6.0.1: + version "6.1.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.1.3.tgz#afbee236b3bd2be331d4e7ce4493bac1718981af" + integrity sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA== + dependencies: + glob "^13.0.3" + package-json-from-dist "^1.0.1" + +robust-predicates@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.3.tgz#1099061b3349e2c5abec6c2ab0acd440d24d4062" + integrity sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA== + +roughjs@^4.6.6: + version "4.6.6" + resolved "https://registry.yarnpkg.com/roughjs/-/roughjs-4.6.6.tgz#1059f49a5e0c80dee541a005b20cc322b222158b" + integrity sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ== + dependencies: + hachure-fill "^0.5.2" + path-data-parser "^0.1.0" + points-on-curve "^0.2.0" + points-on-path "^0.2.1" + +rtlcss@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-4.3.0.tgz#f8efd4d5b64f640ec4af8fa25b65bacd9e07cc97" + integrity sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + postcss "^8.4.21" + strip-json-comments "^3.1.1" + +run-applescript@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" + integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4, sax@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b" + integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA== + +scheduler@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" + integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== + +schema-dts@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/schema-dts/-/schema-dts-1.1.5.tgz#9237725d305bac3469f02b292a035107595dc324" + integrity sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg== + +schema-utils@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46" + integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== + +selfsigned@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-5.5.0.tgz#4c9ab7c7c9f35f18fb6a9882c253eb0e6bd6557b" + integrity sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew== + dependencies: + "@peculiar/x509" "^1.14.2" + pkijs "^3.3.3" + +semver-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-4.0.0.tgz#3afcf5ed6d62259f5c72d0d5d50dffbdc9680df5" + integrity sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA== + dependencies: + semver "^7.3.5" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: + version "7.8.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" + integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== + +send@~0.19.0, send@~0.19.1: + version "0.19.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" + integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "~0.5.2" + http-errors "~2.0.1" + mime "1.6.0" + ms "2.1.3" + on-finished "~2.4.1" + range-parser "~1.2.1" + statuses "~2.0.2" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.7: + version "6.1.7" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.7.tgz#e9bb864e87ee71e8dab874cde44d146b77e3fb78" + integrity sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + mime-types "2.1.18" + minimatch "3.1.5" + path-is-inside "1.0.2" + path-to-regexp "3.3.0" + range-parser "1.2.0" + +serve-index@^1.9.1: + version "1.9.2" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.2.tgz#2988e3612106d78a5e4849ddff552ce7bd3d9bcb" + integrity sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ== + dependencies: + accepts "~1.3.8" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.8.0" + mime-types "~2.1.35" + parseurl "~1.3.3" + +serve-static@~1.16.2: + version "1.16.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" + integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "~0.19.1" + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setprototypeof@1.2.0, setprototypeof@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +sharp@^0.32.3: + version "0.32.6" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" + integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== + dependencies: + color "^4.2.3" + detect-libc "^2.0.2" + node-addon-api "^6.1.0" + prebuild-install "^7.1.1" + semver "^7.5.4" + simple-get "^4.0.1" + tar-fs "^3.0.4" + tunnel-agent "^0.6.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.4: + version "1.9.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.9.0.tgz#e108b1a136586d5964edb3300016d4bedba0fe57" + integrity sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA== + +side-channel-list@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" + integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.4" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab" + integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.4" + side-channel-list "^1.0.1" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0, simple-get@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.4.tgz#a8d11a45a11600d6a1ecdff6363329e3648c3667" + integrity sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw== + dependencies: + is-arrayish "^0.3.1" + +sirv@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.3.tgz#2b756f79f0b77527c0eaba280c722e4c66c08886" + integrity sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +skin-tone@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/skin-tone/-/skin-tone-2.0.0.tgz#4e3933ab45c0d4f4f781745d64b9f4c208e41237" + integrity sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA== + dependencies: + unicode-emoji-modifier-base "^1.0.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +sort-css-media-queries@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz#aa33cf4a08e0225059448b6c40eddbf9f1c8334c" + integrity sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA== + +source-map-js@^1.0.1, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.0: + version "0.7.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" + integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +srcset@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" + integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== + +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@~2.0.1, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + +std-env@^3.7.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" + integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== + +streamx@^2.12.5, streamx@^2.15.0, streamx@^2.25.0: + version "2.28.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.28.0.tgz#035ab56057b7ed2211b51d532e6973f0f99fbf11" + integrity sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw== + dependencies: + events-universal "^1.0.0" + fast-fifo "^1.3.2" + text-decoder "^1.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== + dependencies: + ansi-regex "^6.2.2" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +style-to-js@^1.0.0: + version "1.1.21" + resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.21.tgz#2908941187f857e79e28e9cd78008b9a0b3e0e8d" + integrity sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ== + dependencies: + style-to-object "1.0.14" + +style-to-object@1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.14.tgz#1d22f0e7266bb8c6d8cae5caf4ec4f005e08f611" + integrity sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw== + dependencies: + inline-style-parser "0.2.7" + +stylehacks@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.1.1.tgz#543f91c10d17d00a440430362d419f79c25545a6" + integrity sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg== + dependencies: + browserslist "^4.23.0" + postcss-selector-parser "^6.0.16" + +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +stylis@^4.3.6: + version "4.4.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.4.0.tgz#c5846c9345f4bfc51bd0cbd7ca35a0744f485a5d" + integrity sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^3.0.2, svgo@^3.2.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.3.tgz#8246aee0b08791fde3b0ed22b5661b471fadf58e" + integrity sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng== + dependencies: + commander "^7.2.0" + css-select "^5.1.0" + css-tree "^2.3.1" + css-what "^6.1.0" + csso "^5.0.5" + picocolors "^1.0.0" + sax "^1.5.0" + +swc-loader@^0.2.6: + version "0.2.7" + resolved "https://registry.yarnpkg.com/swc-loader/-/swc-loader-0.2.7.tgz#2d1611ab314c5d8342d74aa5e5901b3fbf490de2" + integrity sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w== + dependencies: + "@swc/counter" "^0.1.3" + +tapable@^2.0.0, tapable@^2.2.1, tapable@^2.3.0, tapable@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.3.tgz#5da7c9992c46038221267985ab28421a8879f160" + integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A== + +tar-fs@^2.0.0: + version "2.1.5" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.5.tgz#33e9c29413dce0c58ada7ff77db4e5a30afffe70" + integrity sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-fs@^3.0.4: + version "3.1.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.1.3.tgz#05668cc68a30741c3813f9c16593b8dec7dcbcd1" + integrity sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar-stream@^3.1.5: + version "3.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.2.0.tgz#0d0064d9b67ea3c9f5abde155e35faab0df37591" + integrity sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg== + dependencies: + b4a "^1.6.4" + bare-fs "^4.5.5" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +teex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/teex/-/teex-1.0.1.tgz#b8fa7245ef8e8effa8078281946c85ab780a0b12" + integrity sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg== + dependencies: + streamx "^2.12.5" + +terser-webpack-plugin@^5.3.9: + version "5.6.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz#47bc41bd8b8fab8383b62ec763b7394829097e7b" + integrity sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + jest-worker "^27.4.5" + schema-utils "^4.3.0" + terser "^5.31.1" + +terser@^5.10.0, terser@^5.15.1, terser@^5.31.1: + version "5.48.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.48.0.tgz#8b391171cfbb7ac4a88f9f04ba1cfabc54f643db" + integrity sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.15.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-decoder@^1.1.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.7.tgz#5d073a9a74b9c0a9d28dfadcab96b604af57d8ba" + integrity sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ== + dependencies: + b4a "^1.6.4" + +thingies@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.0.tgz#e09b98b9e6f6caf8a759eca8481fea1de974d2b1" + integrity sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + +tiny-invariant@^1.0.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + +tiny-warning@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tinyexec@^1.0.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.2.4.tgz#ae45bb2edebda94c70f4ea897e0f1243e470db71" + integrity sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg== + +tinypool@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" + integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1, toidentifier@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +tree-dump@^1.0.3, tree-dump@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4" + integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + +ts-dedent@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.3.0.tgz#8fac36c7902b541c154ac13a27ac467997af11f8" + integrity sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg== + +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tsyringe@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.10.0.tgz#d0c95815d584464214060285eaaadd94aa03299c" + integrity sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw== + dependencies: + tslib "^1.9.3" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +type-fest@^2.13.0, type-fest@^2.5.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +undici-types@~8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809" + integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== + +unicode-emoji-modifier-base@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz#dbbd5b54ba30f287e2a8d5a249da6c0cef369459" + integrity sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz#65a7adfad8574c219890e219285ce4c64ed67eaa" + integrity sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz#301d4f8a43d2b75c97adfad87c9dd5350c9475d1" + integrity sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ== + +unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: + version "11.0.5" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + dependencies: + crypto-random-string "^4.0.0" + +unist-util-is@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz#d0a3f86f2dd0db7acd7d8c2478080b5c67f9c6a9" + integrity sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" + integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz#777df7fb98652ce16b4b7cd999d0a1a40efa3a02" + integrity sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.1.0.tgz#9a2a28b0aa76a15e0da70a08a5863a2f060e2468" + integrity sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +update-notifier@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" + integrity sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og== + dependencies: + boxen "^7.0.0" + chalk "^5.0.1" + configstore "^6.0.0" + has-yarn "^3.0.0" + import-lazy "^4.0.0" + is-ci "^3.0.1" + is-installed-globally "^0.4.0" + is-npm "^6.0.0" + is-yarn-global "^0.4.0" + latest-version "^7.0.0" + pupa "^3.1.0" + semver "^7.3.7" + semver-diff "^4.0.0" + xdg-basedir "^5.1.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utility-types@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c" + integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^11.0.0, "uuid@^11.1.0 || ^12 || ^13 || ^14.0.0", uuid@^8.3.2: + version "11.1.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.1.tgz#f6d81d2e1c65d00762e5e29b16c5d2d995e208ad" + integrity sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ== + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.3.tgz#cb9eacd20f2b6426d19451e0eafa3d0a846225c3" + integrity sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + +vfile-message@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.3.tgz#87b44dddd7b70f0641c2e3ed0864ba73e2ea8df4" + integrity sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^6.0.0, vfile@^6.0.1: + version "6.0.3" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== + dependencies: + "@types/unist" "^3.0.0" + vfile-message "^4.0.0" + +watchpack@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.2.tgz#e12e82d84674266fc1c6dbfe38891b92ff0522ec" + integrity sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg== + dependencies: + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + +webpack-bundle-analyzer@^4.10.2: + version "4.10.2" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" + integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== + dependencies: + "@discoveryjs/json-ext" "0.5.7" + acorn "^8.0.4" + acorn-walk "^8.0.0" + commander "^7.2.0" + debounce "^1.2.1" + escape-string-regexp "^4.0.0" + gzip-size "^6.0.0" + html-escaper "^2.0.2" + opener "^1.5.2" + picocolors "^1.0.0" + sirv "^2.0.3" + ws "^7.3.1" + +webpack-dev-middleware@^7.4.2: + version "7.4.5" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz#d4e8720aa29cb03bc158084a94edb4594e3b7ac0" + integrity sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA== + dependencies: + colorette "^2.0.10" + memfs "^4.43.1" + mime-types "^3.0.1" + on-finished "^2.4.1" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^5.2.2: + version "5.2.6" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.6.tgz#3a5d41233cbb7504f814d19e59a59173fb8ae23d" + integrity sha512-HNLRmamRvVavZQ+avceZifmv8hmdUjg43t6MI4SqJDwFdW7RPQwH5vzGhDRZSX59SgfbeHhLnq3g+uooWo7pVw== + dependencies: + "@types/bonjour" "^3.5.13" + "@types/connect-history-api-fallback" "^1.5.4" + "@types/express" "^4.17.25" + "@types/express-serve-static-core" "^4.17.21" + "@types/serve-index" "^1.9.4" + "@types/serve-static" "^1.15.5" + "@types/sockjs" "^0.3.36" + "@types/ws" "^8.5.10" + ansi-html-community "^0.0.8" + bonjour-service "^1.2.1" + chokidar "^3.6.0" + colorette "^2.0.10" + compression "^1.8.1" + connect-history-api-fallback "^2.0.0" + express "^4.22.1" + graceful-fs "^4.2.6" + http-proxy-middleware "^2.0.9" + ipaddr.js "^2.1.0" + launch-editor "^2.14.1" + open "^10.0.3" + p-retry "^6.2.0" + schema-utils "^4.2.0" + selfsigned "^5.5.0" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^7.4.2" + ws "^8.18.0" + +webpack-merge@^5.9.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.0" + +webpack-merge@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" + integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.1" + +webpack-sources@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.1.tgz#76c2418486dcc02b2aa0694c104176c2858fe84a" + integrity sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw== + +webpack@^5.88.1, webpack@^5.95.0: + version "5.108.4" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.108.4.tgz#141818a411662773a0bb32dc5536acc5409943b7" + integrity sha512-yur8LyJoeiWh47dErD+Ok7vlbmDsJ3UbbRPAoxbGJ54WpE2y5yVo5G/inUzujnYgw3tPmBRdn+G7PoxXaYC33w== + dependencies: + "@types/estree" "^1.0.8" + "@types/json-schema" "^7.0.15" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.16.0" + acorn-import-phases "^1.0.3" + browserslist "^4.28.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.22.2" + es-module-lexer "^2.1.0" + eslint-scope "5.1.1" + events "^3.2.0" + graceful-fs "^4.2.11" + loader-runner "^4.3.2" + mime-db "^1.54.0" + minimizer-webpack-plugin "^5.6.1" + neo-async "^2.6.2" + schema-utils "^4.3.3" + tapable "^2.3.0" + watchpack "^2.5.2" + webpack-sources "^3.5.0" + +webpackbar@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-7.0.0.tgz#7228d32881af2392381b6514499ddea73cdf218a" + integrity sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q== + dependencies: + ansis "^3.2.0" + consola "^3.2.3" + pretty-time "^1.1.0" + std-env "^3.7.0" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.5.tgz#569d22764ab21f2de20af0e74b411e8ae5a0fa46" + integrity sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +wildcard@^2.0.0, wildcard@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.3.1: + version "7.5.11" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.11.tgz#9460daf1812bb81a423c5b9eac746941a86310fa" + integrity sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA== + +ws@^8.18.0: + version "8.21.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.0.tgz#012e413fc07429945121b0c153158c4343086951" + integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g== + +wsl-utils@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" + integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== + dependencies: + is-wsl "^3.1.0" + +xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yaml@^1.10.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.3.tgz#76e407ed95c42684fb8e14641e5de62fe65bbcb3" + integrity sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA== + +yocto-queue@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.2.tgz#3e09c95d3f1aa89a58c114c99223edf639152c00" + integrity sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ== + +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==