├── .circleci └── config.yml ├── .devcontainer └── devcontainer.json ├── .dockerignore ├── .github ├── dependabot.yml └── workflows │ └── pull-api-definitions.yml ├── .gitignore ├── .nvmrc ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── PR_TEMPLATE.md ├── README.md ├── api-customs.json ├── api-gql.gql ├── api-swagger.json ├── architecture-diagrams ├── README.md ├── fxa-subplat.dsl ├── structurizr-1-workspace.json └── structurizr.properties ├── babel.config.js ├── compose.yaml ├── docs ├── additional-docs.md ├── assets │ ├── IdPAuth-key-unwrap.png │ ├── IdPAuth-keys-client.png │ ├── IdPAuth-keys-server.png │ ├── admin-panel │ │ ├── image1.png │ │ ├── image10.png │ │ ├── image11.png │ │ ├── image12.png │ │ ├── image13.png │ │ ├── image14.png │ │ ├── image15.png │ │ ├── image16.png │ │ ├── image2.png │ │ ├── image3.png │ │ ├── image4.png │ │ ├── image5.png │ │ ├── image6.png │ │ ├── image7.png │ │ ├── image8.png │ │ └── image9.png │ ├── ci │ │ ├── ci-sequence-diagram.png │ │ ├── failed-build.png │ │ ├── fan-out.png │ │ ├── scripted-test-split.png │ │ ├── split-tests.png │ │ ├── test-lists.png │ │ └── test-report.png │ ├── coupons │ │ ├── codes.png │ │ ├── create.png │ │ ├── metadata.png │ │ └── navigation.png │ ├── fxa-client-diagram.png │ ├── fxa-pairing-desktop.png │ ├── fxa-pairing-mobile.png │ ├── fxa-scoped-keys-1.png │ ├── fxa-scoped-keys-2.png │ ├── logs-inbox-signin.png │ ├── maildev-inbox.png │ ├── onepw-auth.png │ ├── onepw-change-password.png │ ├── onepw-create.png │ ├── onepw-forgot-password.png │ ├── onepw-keys.png │ ├── onepw-reset.png │ ├── product-configs │ │ ├── sample-plan-config-doc.json │ │ └── sample-product-config-doc.json │ ├── storybook-circleci.png │ ├── subplat-contentful-nav.png │ ├── subplat-strapi-bundle.png │ ├── subplat-strapi-locale-dropdown.png │ ├── subplat-strapi-new-entry.png │ ├── subplat-strapi-subgroup.png │ └── tracing │ │ ├── fxa-otel-system-diagram.png │ │ ├── fxa-tracing-system-diagram.png │ │ ├── tracing-gcp-filter-by-method.png │ │ ├── tracing-gcp-filter-by-target.png │ │ ├── tracing-gcp-log-viewer-trace-slice.png │ │ ├── tracing-gcp-search-by-trace-id.png │ │ ├── tracing-gcp-trace-logs-view.png │ │ ├── tracing-jaeger-full-trace.png │ │ ├── tracing-jaeger-graph-view.png │ │ ├── tracing-jaeger-graph.png │ │ ├── tracing-jaeger-select-service.png │ │ ├── tracing-jaeger-sys-arch.png │ │ └── tracing-jaeger-traces.png ├── explanation │ ├── architectural-decision-records.md │ ├── content-server-architecture.md │ ├── metrics.md │ ├── onepw-protocol.md │ ├── pairing-flow-architecture.md │ └── scoped-keys.md ├── gql-api │ ├── api │ │ ├── _category_.yml │ │ ├── directives │ │ │ ├── _category_.yml │ │ │ ├── include.mdx │ │ │ └── skip.mdx │ │ ├── mutations │ │ │ ├── _category_.yml │ │ │ ├── account-reset.mdx │ │ │ ├── attached-client-disconnect.mdx │ │ │ ├── change-recovery-codes.mdx │ │ │ ├── create-password.mdx │ │ │ ├── create-secondary-email.mdx │ │ │ ├── create-totp.mdx │ │ │ ├── delete-avatar.mdx │ │ │ ├── delete-recovery-key.mdx │ │ │ ├── delete-secondary-email.mdx │ │ │ ├── delete-totp.mdx │ │ │ ├── destroy-session.mdx │ │ │ ├── email-verify-code.mdx │ │ │ ├── finish-setup.mdx │ │ │ ├── metrics-opt.mdx │ │ │ ├── password-change.mdx │ │ │ ├── password-forgot-code-status.mdx │ │ │ ├── password-forgot-send-code.mdx │ │ │ ├── password-forgot-verify-code.mdx │ │ │ ├── reauth-session.mdx │ │ │ ├── reject-unblock-code.mdx │ │ │ ├── resend-secondary-email-code.mdx │ │ │ ├── resend-verify-code.mdx │ │ │ ├── send-session-verification-code.mdx │ │ │ ├── sign-in.mdx │ │ │ ├── sign-up.mdx │ │ │ ├── update-display-name.mdx │ │ │ ├── update-primary-email.mdx │ │ │ ├── verify-code.mdx │ │ │ ├── verify-secondary-email.mdx │ │ │ ├── verify-session.mdx │ │ │ └── verify-totp.mdx │ │ ├── queries │ │ │ ├── _category_.yml │ │ │ ├── account-status.mdx │ │ │ ├── account.mdx │ │ │ ├── get-legal-doc.mdx │ │ │ ├── get-recovery-key-bundle.mdx │ │ │ ├── session-status.mdx │ │ │ └── session.mdx │ │ └── subscriptions │ │ │ ├── _category_.yml │ │ │ ├── cancel-at-period-end.mdx │ │ │ ├── created.mdx │ │ │ ├── current-period-end.mdx │ │ │ ├── current-period-start.mdx │ │ │ ├── end-at.mdx │ │ │ ├── latest-invoice.mdx │ │ │ ├── plan-id.mdx │ │ │ ├── product-id.mdx │ │ │ ├── product-name.mdx │ │ │ ├── status.mdx │ │ │ └── subscription-id.mdx │ ├── directives │ │ ├── _category_.yml │ │ ├── deprecated.mdx │ │ ├── include.mdx │ │ ├── skip.mdx │ │ └── specified-by.mdx │ ├── enums │ │ ├── _category_.yml │ │ └── cart-state.mdx │ ├── generated.md │ ├── inputs │ │ ├── _category_.yml │ │ ├── account-reset-input-options.mdx │ │ ├── account-reset-input.mdx │ │ ├── account-status-input.mdx │ │ ├── attached-client-disconnect-input.mdx │ │ ├── basic-mutation-input.mdx │ │ ├── cart-id-input.mdx │ │ ├── change-recovery-codes-input.mdx │ │ ├── create-password.mdx │ │ ├── create-totp-input.mdx │ │ ├── delete-avatar-input.mdx │ │ ├── delete-recovery-key-input.mdx │ │ ├── delete-totp-input.mdx │ │ ├── destroy-session-input.mdx │ │ ├── email-input.mdx │ │ ├── finish-setup-input.mdx │ │ ├── legal-input.mdx │ │ ├── metrics-context.mdx │ │ ├── metrics-opt-input.mdx │ │ ├── password-change-input-options.mdx │ │ ├── password-change-input.mdx │ │ ├── password-forgot-code-status-input.mdx │ │ ├── password-forgot-send-code-input.mdx │ │ ├── password-forgot-verify-code-input.mdx │ │ ├── recovery-key-bundle-input.mdx │ │ ├── reject-unblock-code-input.mdx │ │ ├── send-session-verification-input.mdx │ │ ├── session-reauth-input.mdx │ │ ├── session-reauth-options-input.mdx │ │ ├── session-verify-code-input.mdx │ │ ├── session-verify-code-options-input.mdx │ │ ├── setup-cart-input.mdx │ │ ├── sign-in-input.mdx │ │ ├── sign-in-options-input.mdx │ │ ├── sign-up-input.mdx │ │ ├── sign-up-options-input.mdx │ │ ├── update-cart-input.mdx │ │ ├── update-display-name-input.mdx │ │ ├── verify-email-code-input.mdx │ │ ├── verify-email-input.mdx │ │ ├── verify-session-input.mdx │ │ └── verify-totp-input.mdx │ ├── mutations │ │ ├── _category_.yml │ │ ├── account-reset.mdx │ │ ├── attached-client-disconnect.mdx │ │ ├── change-recovery-codes.mdx │ │ ├── checkout-cart.mdx │ │ ├── create-password.mdx │ │ ├── create-secondary-email.mdx │ │ ├── create-totp.mdx │ │ ├── delete-avatar.mdx │ │ ├── delete-recovery-key.mdx │ │ ├── delete-secondary-email.mdx │ │ ├── delete-totp.mdx │ │ ├── destroy-session.mdx │ │ ├── email-verify-code.mdx │ │ ├── finish-setup.mdx │ │ ├── metrics-opt.mdx │ │ ├── password-change.mdx │ │ ├── password-forgot-code-status.mdx │ │ ├── password-forgot-send-code.mdx │ │ ├── password-forgot-verify-code.mdx │ │ ├── reauth-session.mdx │ │ ├── reject-unblock-code.mdx │ │ ├── resend-secondary-email-code.mdx │ │ ├── resend-verify-code.mdx │ │ ├── restart-cart.mdx │ │ ├── send-session-verification-code.mdx │ │ ├── setup-cart.mdx │ │ ├── sign-in.mdx │ │ ├── sign-up.mdx │ │ ├── update-cart.mdx │ │ ├── update-display-name.mdx │ │ ├── update-primary-email.mdx │ │ ├── verify-code.mdx │ │ ├── verify-secondary-email.mdx │ │ ├── verify-session.mdx │ │ └── verify-totp.mdx │ ├── objects │ │ ├── _category_.yml │ │ ├── account-reset-payload.mdx │ │ ├── account-status-payload.mdx │ │ ├── account.mdx │ │ ├── attached-client.mdx │ │ ├── avatar.mdx │ │ ├── basic-payload.mdx │ │ ├── cart.mdx │ │ ├── change-recovery-codes-payload.mdx │ │ ├── create-totp-payload.mdx │ │ ├── email.mdx │ │ ├── finished-setup-account-payload.mdx │ │ ├── invoice.mdx │ │ ├── legal-doc.mdx │ │ ├── linked-account.mdx │ │ ├── location.mdx │ │ ├── password-change-payload.mdx │ │ ├── password-forgot-code-status-payload.mdx │ │ ├── password-forgot-send-code-payload.mdx │ │ ├── password-forgot-verify-code-payload.mdx │ │ ├── recovery-key-bundle-payload.mdx │ │ ├── security-event.mdx │ │ ├── session-reauthed-account-payload.mdx │ │ ├── session-reauthed-account-playload.mdx │ │ ├── session-status.mdx │ │ ├── session.mdx │ │ ├── signed-in-account-payload.mdx │ │ ├── signed-up-account-payload.mdx │ │ ├── tax-address.mdx │ │ ├── tax-amount.mdx │ │ ├── totp.mdx │ │ ├── update-display-name-payload.mdx │ │ └── verify-totp-payload.mdx │ ├── operations │ │ ├── _category_.yml │ │ ├── directives │ │ │ ├── _category_.yml │ │ │ ├── include.mdx │ │ │ └── skip.mdx │ │ ├── mutations │ │ │ ├── _category_.yml │ │ │ ├── account-reset.mdx │ │ │ ├── attached-client-disconnect.mdx │ │ │ ├── change-recovery-codes.mdx │ │ │ ├── create-password.mdx │ │ │ ├── create-secondary-email.mdx │ │ │ ├── create-totp.mdx │ │ │ ├── delete-avatar.mdx │ │ │ ├── delete-recovery-key.mdx │ │ │ ├── delete-secondary-email.mdx │ │ │ ├── delete-totp.mdx │ │ │ ├── destroy-session.mdx │ │ │ ├── email-verify-code.mdx │ │ │ ├── finish-setup.mdx │ │ │ ├── metrics-opt.mdx │ │ │ ├── password-change.mdx │ │ │ ├── password-forgot-code-status.mdx │ │ │ ├── password-forgot-send-code.mdx │ │ │ ├── password-forgot-verify-code.mdx │ │ │ ├── reauth-session.mdx │ │ │ ├── reject-unblock-code.mdx │ │ │ ├── resend-secondary-email-code.mdx │ │ │ ├── resend-verify-code.mdx │ │ │ ├── send-session-verification-code.mdx │ │ │ ├── sign-in.mdx │ │ │ ├── sign-up.mdx │ │ │ ├── update-display-name.mdx │ │ │ ├── update-primary-email.mdx │ │ │ ├── verify-code.mdx │ │ │ ├── verify-secondary-email.mdx │ │ │ ├── verify-session.mdx │ │ │ └── verify-totp.mdx │ │ ├── queries │ │ │ ├── _category_.yml │ │ │ ├── account-status.mdx │ │ │ ├── account.mdx │ │ │ ├── get-legal-doc.mdx │ │ │ ├── get-recovery-key-bundle.mdx │ │ │ ├── session-status.mdx │ │ │ └── session.mdx │ │ └── subscriptions │ │ │ ├── _category_.yml │ │ │ ├── cancel-at-period-end.mdx │ │ │ ├── created.mdx │ │ │ ├── current-period-end.mdx │ │ │ ├── current-period-start.mdx │ │ │ ├── end-at.mdx │ │ │ ├── latest-invoice.mdx │ │ │ ├── plan-id.mdx │ │ │ ├── product-id.mdx │ │ │ ├── product-name.mdx │ │ │ ├── status.mdx │ │ │ └── subscription-id.mdx │ ├── queries │ │ ├── _category_.yml │ │ ├── account-status.mdx │ │ ├── account.mdx │ │ ├── cart.mdx │ │ ├── get-legal-doc.mdx │ │ ├── get-recovery-key-bundle.mdx │ │ ├── session-status.mdx │ │ └── session.mdx │ ├── scalars │ │ ├── _category_.yml │ │ ├── boolean.mdx │ │ ├── float.mdx │ │ ├── id.mdx │ │ └── string.mdx │ ├── sidebar-schema.js │ ├── subscriptions │ │ ├── _category_.yml │ │ ├── cancel-at-period-end.mdx │ │ ├── created.mdx │ │ ├── current-period-end.mdx │ │ ├── current-period-start.mdx │ │ ├── end-at.mdx │ │ ├── latest-invoice.mdx │ │ ├── plan-id.mdx │ │ ├── product-id.mdx │ │ ├── product-name.mdx │ │ ├── status.mdx │ │ └── subscription-id.mdx │ └── types │ │ ├── _category_.yml │ │ ├── directives │ │ ├── _category_.yml │ │ ├── deprecated.mdx │ │ ├── one-of.mdx │ │ └── specified-by.mdx │ │ ├── inputs │ │ ├── _category_.yml │ │ ├── account-reset-input-options.mdx │ │ ├── account-reset-input.mdx │ │ ├── account-status-input.mdx │ │ ├── attached-client-disconnect-input.mdx │ │ ├── basic-mutation-input.mdx │ │ ├── change-recovery-codes-input.mdx │ │ ├── create-password.mdx │ │ ├── create-totp-input.mdx │ │ ├── delete-avatar-input.mdx │ │ ├── delete-recovery-key-input.mdx │ │ ├── delete-totp-input.mdx │ │ ├── destroy-session-input.mdx │ │ ├── email-input.mdx │ │ ├── finish-setup-input.mdx │ │ ├── legal-input.mdx │ │ ├── metrics-context.mdx │ │ ├── metrics-opt-input.mdx │ │ ├── password-change-input-options.mdx │ │ ├── password-change-input.mdx │ │ ├── password-forgot-code-status-input.mdx │ │ ├── password-forgot-send-code-input.mdx │ │ ├── password-forgot-verify-code-input.mdx │ │ ├── recovery-key-bundle-input.mdx │ │ ├── reject-unblock-code-input.mdx │ │ ├── send-session-verification-input.mdx │ │ ├── session-reauth-input.mdx │ │ ├── session-reauth-options-input.mdx │ │ ├── session-verify-code-input.mdx │ │ ├── session-verify-code-options-input.mdx │ │ ├── sign-in-input.mdx │ │ ├── sign-in-options-input.mdx │ │ ├── sign-up-input.mdx │ │ ├── sign-up-options-input.mdx │ │ ├── update-display-name-input.mdx │ │ ├── verify-email-code-input.mdx │ │ ├── verify-email-input.mdx │ │ ├── verify-session-input.mdx │ │ └── verify-totp-input.mdx │ │ ├── objects │ │ ├── _category_.yml │ │ ├── account-reset-payload.mdx │ │ ├── account-status-payload.mdx │ │ ├── account.mdx │ │ ├── attached-client.mdx │ │ ├── avatar.mdx │ │ ├── basic-payload.mdx │ │ ├── change-recovery-codes-payload.mdx │ │ ├── create-totp-payload.mdx │ │ ├── email.mdx │ │ ├── finished-setup-account-payload.mdx │ │ ├── legal-doc.mdx │ │ ├── linked-account.mdx │ │ ├── location.mdx │ │ ├── password-change-payload.mdx │ │ ├── password-forgot-code-status-payload.mdx │ │ ├── password-forgot-send-code-payload.mdx │ │ ├── password-forgot-verify-code-payload.mdx │ │ ├── recovery-key-bundle-payload.mdx │ │ ├── security-event.mdx │ │ ├── session-reauthed-account-payload.mdx │ │ ├── session-status.mdx │ │ ├── session.mdx │ │ ├── signed-in-account-payload.mdx │ │ ├── signed-up-account-payload.mdx │ │ ├── totp.mdx │ │ ├── update-display-name-payload.mdx │ │ └── verify-totp-payload.mdx │ │ └── scalars │ │ ├── _category_.yml │ │ ├── boolean.mdx │ │ ├── float.mdx │ │ ├── id.mdx │ │ └── string.mdx ├── how-tos │ ├── ci-guidelines.md │ ├── connecting-to-a-local-mysql-db.md │ ├── creating-an-account-locally.md │ ├── local-emails-with-maildev.md │ ├── managing-yarn-dependencies.md │ ├── node-debugging.md │ ├── rotating-secrets.md │ ├── using-a-custom-profile-with-firefox.md │ ├── using-sentry-locally.md │ ├── using-swagger-for-api-documentation.md │ ├── using-tracing-in-gcp.md │ ├── using-tracing-locally.md │ ├── using-twilio-locally.md │ ├── using-vscode-with-fxa.md │ └── working-with-metrics.md ├── intro.md ├── reference │ ├── admin-panel.md │ ├── application-logging.md │ ├── application-tracing.md │ ├── automation-testplan.md │ ├── browser-support.md │ ├── canceling-subscriptions-to-plan.md │ ├── continuous-integration-for-monorepos.md │ ├── database-structure.md │ ├── emails.md │ ├── experiments-ab-testing.md │ ├── functional-testing.md │ ├── github-strategies.md │ ├── localization.md │ ├── metrics.md │ ├── mobile-specifics.md │ ├── npm-scripts-and-nx.md │ ├── oauth-details.md │ ├── rate-limiting.md │ ├── storybook-deploys-with-circleci.md │ ├── style-guides │ │ ├── node-style-guide.md │ │ └── react-style-guide.md │ ├── system-diagrams.md │ ├── team-processes │ │ ├── development-process.md │ │ ├── pull-request-review-guidelines.md │ │ ├── release-process.md │ │ ├── triage-process.md │ │ └── work-breakdown-process.md │ ├── tests-in-circleci.md │ ├── third-party-authentication.md │ ├── tokens.md │ └── webchannels.md ├── relying-parties │ ├── how-tos │ │ ├── apple-iap.md │ │ ├── device-registration.md │ │ ├── end-to-end-encryption.md │ │ ├── google-iap.md │ │ └── product-metrics.md │ ├── reference │ │ ├── glossary.md │ │ ├── integration-requirements.md │ │ ├── metrics-for-relying-parties.md │ │ ├── query-parameters.md │ │ ├── sub-plat-coupons.md │ │ ├── sub-plat-features.md │ │ ├── sub-plat-overview.md │ │ ├── sub-plat-strapi.md │ │ └── using-apis.md │ └── tutorials │ │ ├── integrating-with-fxa.md │ │ ├── integration-with-subscription-platform.md │ │ └── pairing.md └── tutorials │ ├── development-setup.mdx │ └── subscription-platform.md ├── docusaurus.config.js ├── package.json ├── sidebars.js ├── src └── css │ └── custom.css ├── static ├── .nojekyll ├── css │ └── custom.css ├── diagrams │ ├── data_catalog_example.png │ ├── structurizr-1-AccountAuthenticationSystemLandscape-key.png │ ├── structurizr-1-AccountAuthenticationSystemLandscape.png │ ├── structurizr-1-AccountSystemLandscape-key.png │ ├── structurizr-1-AccountSystemLandscape.png │ ├── structurizr-1-Containers-key.png │ ├── structurizr-1-Containers.png │ ├── structurizr-1-ContainersPaymentSystem2_5-key.png │ ├── structurizr-1-ContainersPaymentSystem2_5.png │ ├── structurizr-1-ContainersPaymentSystem3-key.png │ ├── structurizr-1-ContainersPaymentSystem3.png │ ├── structurizr-1-EventBrokerSystem.png │ ├── structurizr-1-PaymentSystemLandscape-key.png │ ├── structurizr-1-PaymentSystemLandscape.png │ ├── structurizr-1-SendTab-key.png │ ├── structurizr-1-SendTab.png │ ├── structurizr-1-SystemLandscape-key.png │ └── structurizr-1-SystemLandscape.png ├── fonts │ ├── Inter-Bold.woff │ ├── Inter-Bold.woff2 │ ├── Inter-Regular.woff │ ├── Inter-Regular.woff2 │ ├── Metropolis-Bold.woff │ ├── Metropolis-Bold.woff2 │ ├── Metropolis-Regular.woff │ └── Metropolis-Regular.woff2 └── img │ └── firefox-logo.png ├── tsconfig.json └── yarn.lock /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | jobs: 4 | Deploy to GitHub pages: 5 | resource_class: medium+ 6 | docker: 7 | - image: cimg/node:18.12 8 | steps: 9 | - add_ssh_keys: 10 | fingerprints: 11 | - "cc:4c:4f:b8:68:5f:da:6c:fc:fd:58:85:78:5f:38:86" 12 | - checkout 13 | - run: 14 | name: Build and publish the docs portal 15 | command: | 16 | yarn install 17 | git config --global user.name "Application Services" 18 | git config --global user.email "application-services@mozilla.com" 19 | USE_SSH=true CUSTOM_COMMIT_MESSAGE="Deploy website [ci skip]" GIT_USER="Application Services" yarn deploy 20 | 21 | workflows: 22 | version: 2 23 | deploy-website: 24 | jobs: 25 | - Deploy to GitHub pages: 26 | filters: 27 | branches: 28 | only: master 29 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the 2 | // README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node 3 | { 4 | "name": "Node.js", 5 | // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile 6 | "image": "mcr.microsoft.com/devcontainers/base:bullseye", 7 | "features": { 8 | "ghcr.io/devcontainers/features/docker-in-docker:2": { 9 | "version": "latest", 10 | "enableNonRootDocker": "true", 11 | "moby": "true" 12 | }, 13 | // 🤷The jre/libxtst6 and java features below are needed for the structurizr DSL extension 14 | "ghcr.io/rocker-org/devcontainer-features/apt-packages:1": { 15 | "packages": "libxtst6,default-jre" 16 | }, 17 | "ghcr.io/devcontainers/features/java:1": {}, 18 | "ghcr.io/devcontainers/features/node:1": {} 19 | }, 20 | 21 | // Features to add to the dev container. More info: https://containers.dev/features. 22 | // "features": {}, 23 | 24 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 25 | "forwardPorts": [ 26 | 8080 27 | ], 28 | 29 | // Use 'postCreateCommand' to run commands after the container is created. 30 | "postCreateCommand": "bash -i -c 'nvm install'", 31 | 32 | // Configure tool-specific properties. 33 | "customizations": { 34 | "vscode": { 35 | "extensions": [ 36 | "systemticks.c4-dsl-extension" 37 | ] 38 | } 39 | } 40 | 41 | // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. 42 | // "remoteUser": "root" 43 | } 44 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | */node_modules 2 | *.log 3 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | groups: 8 | docusaurus: 9 | patterns: 10 | - "@docusaurus/*" 11 | open-pull-requests-limit: 6 12 | labels: 13 | - "dependencies" 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | /node_modules 3 | 4 | # production 5 | /build 6 | 7 | # generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | 22 | .yarn 23 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 18.12 2 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Community Participation Guidelines 2 | 3 | This repository is governed by Mozilla's code of conduct and etiquette guidelines. 4 | For more details, please read the 5 | [Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/). 6 | 7 | ## How to Report 8 | For more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page. 9 | 10 | ## Project Specific Etiquette 11 | 12 | ### Our Responsibilities 13 | 14 | Project maintainers are responsible for clarifying the standards of acceptable 15 | behavior and are expected to take appropriate and fair corrective action in 16 | response to any instances of unacceptable behavior. 17 | 18 | Project maintainers have the right and responsibility to remove, edit, or 19 | reject comments, commits, code, wiki edits, issues, and other contributions 20 | that are not aligned to this Code of Conduct, or to ban temporarily or 21 | permanently any contributor for other behaviors that they deem inappropriate, 22 | threatening, offensive, or harmful. 23 | 24 | Project maintainers who do not follow or enforce Mozilla's Participation Guidelines in good 25 | faith may face temporary or permanent repercussions. 26 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Thanks for contributing to our documentation. 2 | 3 | Our documentation is organized after the [divio system](https://documentation.divio.com/introduction/). Please familiarize yourself with the system to understand where your new documentation fits in this repository. 4 | 5 | Please name your files as slugs of the page title. For example, a page title of `Local Emails with Maildev` would be `local-emails-with-maildev.md`. 6 | 7 | Images should be named thoughtfully and stored in `/docs/assets`. -------------------------------------------------------------------------------- /PR_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## Description 2 | 3 | Describe these changes. 4 | 5 | ## Testing 6 | 7 | How should reviewers test? 8 | 9 | ## Issue(s) 10 | 11 | Closes [link](link). 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Firefox Ecosystem Platform Docs 2 | 3 | This repo hosts the source code and tooling for the [Firefox Ecosystem 4 | Platform](https://mozilla.github.io/ecosystem-platform/) documentation portal. 5 | 6 | ### Scope and Target Audience 7 | 8 | The docs in this repository are intended for engineers, designers or product managers working on 9 | applications in the Firefox Ecosystem. 10 | 11 | Our aim is to help them understand *how* and *why* to incorporate Account-related features into 12 | their application, in a way that makes the Firefox family of products feel like a cohesive 13 | cross-app and cross-device experience for users. 14 | 15 | ### Working on the Docs 16 | 17 | Our documentation is organized following a [Divio strategy](https://documentation.divio.com/). 18 | If you modify these docs please use that structure. 19 | 20 | The site is build using [Docusaurus](https://docusaurus.io/en/) and is automatically 21 | deployed from master to GitHub Pages using CircleCI. To build and run it locally you can: 22 | 23 | ``` 24 | $> yarn install 25 | $> yarn start 26 | ``` 27 | 28 | That should open a new browser window automatically, or you can manually browse 29 | to http://localhost:3333/ecosystem-platform/ to view the docs. 30 | -------------------------------------------------------------------------------- /architecture-diagrams/README.md: -------------------------------------------------------------------------------- 1 | # Mozilla accounts & Subscription Platform C4 Model 2 | 3 | The software architecture diagrams in FxA and SubPlat use the [c4 model](https://c4model.com) to separate layers and [structurizr](https://structurizr.com/) to render them. 4 | 5 | ## Overall Process for Editing / Creating C4 Model Diagrams Overview 6 | 7 | This assumes you have a copy of the ecosystem-platform documentation checked out and are in the root. 8 | 9 | 0. `docker pull structurizr/lite` 10 | 0. `cd architecture-diagrams` (that's the directory this file is in) 11 | 0. `docker run -it --rm -p 8080:8080 -v $(pwd):/usr/local/structurizr -e STRUCTURIZR_WORKSPACE_FILENAME=fxa-subplat structurizr/lite` . This starts an interactive docker container passing through the current directory as the working directory for structurizr. 12 | 0. Load http://localhost:8080 in your browser. 13 | -------------------------------------------------------------------------------- /architecture-diagrams/structurizr.properties: -------------------------------------------------------------------------------- 1 | structurizr.feature.ui.dslEditor=true 2 | structurizr.autoSaveInterval=5000 3 | structurizr.autoRefreshInterval=2000 4 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | structurizr: 3 | image: structurizr/onpremises 4 | ports: 5 | - "8080:8080" 6 | volumes: 7 | - ~/structurizr:/usr/local/structurizr 8 | -------------------------------------------------------------------------------- /docs/assets/IdPAuth-key-unwrap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/IdPAuth-key-unwrap.png -------------------------------------------------------------------------------- /docs/assets/IdPAuth-keys-client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/IdPAuth-keys-client.png -------------------------------------------------------------------------------- /docs/assets/IdPAuth-keys-server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/IdPAuth-keys-server.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image1.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image10.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image11.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image12.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image13.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image14.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image15.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image16.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image2.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image3.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image4.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image5.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image6.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image7.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image8.png -------------------------------------------------------------------------------- /docs/assets/admin-panel/image9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/admin-panel/image9.png -------------------------------------------------------------------------------- /docs/assets/ci/ci-sequence-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/ci/ci-sequence-diagram.png -------------------------------------------------------------------------------- /docs/assets/ci/failed-build.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/ci/failed-build.png -------------------------------------------------------------------------------- /docs/assets/ci/fan-out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/ci/fan-out.png -------------------------------------------------------------------------------- /docs/assets/ci/scripted-test-split.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/ci/scripted-test-split.png -------------------------------------------------------------------------------- /docs/assets/ci/split-tests.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/ci/split-tests.png -------------------------------------------------------------------------------- /docs/assets/ci/test-lists.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/ci/test-lists.png -------------------------------------------------------------------------------- /docs/assets/ci/test-report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/ci/test-report.png -------------------------------------------------------------------------------- /docs/assets/coupons/codes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/coupons/codes.png -------------------------------------------------------------------------------- /docs/assets/coupons/create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/coupons/create.png -------------------------------------------------------------------------------- /docs/assets/coupons/metadata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/coupons/metadata.png -------------------------------------------------------------------------------- /docs/assets/coupons/navigation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/coupons/navigation.png -------------------------------------------------------------------------------- /docs/assets/fxa-client-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/fxa-client-diagram.png -------------------------------------------------------------------------------- /docs/assets/fxa-pairing-desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/fxa-pairing-desktop.png -------------------------------------------------------------------------------- /docs/assets/fxa-pairing-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/fxa-pairing-mobile.png -------------------------------------------------------------------------------- /docs/assets/fxa-scoped-keys-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/fxa-scoped-keys-1.png -------------------------------------------------------------------------------- /docs/assets/fxa-scoped-keys-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/fxa-scoped-keys-2.png -------------------------------------------------------------------------------- /docs/assets/logs-inbox-signin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/logs-inbox-signin.png -------------------------------------------------------------------------------- /docs/assets/maildev-inbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/maildev-inbox.png -------------------------------------------------------------------------------- /docs/assets/onepw-auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/onepw-auth.png -------------------------------------------------------------------------------- /docs/assets/onepw-change-password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/onepw-change-password.png -------------------------------------------------------------------------------- /docs/assets/onepw-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/onepw-create.png -------------------------------------------------------------------------------- /docs/assets/onepw-forgot-password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/onepw-forgot-password.png -------------------------------------------------------------------------------- /docs/assets/onepw-keys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/onepw-keys.png -------------------------------------------------------------------------------- /docs/assets/onepw-reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/onepw-reset.png -------------------------------------------------------------------------------- /docs/assets/product-configs/sample-plan-config-doc.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "aa8d0fe6-7f25-4b27-92bf-5d1bb12bdef5", 3 | "productConfigId": "34bd9547-9439-49e2-a1e9-068b2b2172b2", 4 | "stripePriceId": "price_1JFoTYKb9q6OnNsLalexa03p", 5 | "active": true, 6 | "capabilities": { 7 | "e7xyz84c2db34a09": ["mdn_plus_5m"], 8 | "b6xyz7233f7ef8ee": ["mdn_plus_5m"] 9 | }, 10 | "productOrder": 1, 11 | "playSkuIds": [ 12 | "org.mozilla.excellent.product.1_month_subscription", 13 | "org.mozilla.excellent.product.6_month_subscription" 14 | ], 15 | "appStoreProductIds": [ 16 | "org.mozilla.excellent.product.1_month_subscription", 17 | "org.mozilla.excellent.product.6_month_subscription" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /docs/assets/storybook-circleci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/storybook-circleci.png -------------------------------------------------------------------------------- /docs/assets/subplat-contentful-nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/subplat-contentful-nav.png -------------------------------------------------------------------------------- /docs/assets/subplat-strapi-bundle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/subplat-strapi-bundle.png -------------------------------------------------------------------------------- /docs/assets/subplat-strapi-locale-dropdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/subplat-strapi-locale-dropdown.png -------------------------------------------------------------------------------- /docs/assets/subplat-strapi-new-entry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/subplat-strapi-new-entry.png -------------------------------------------------------------------------------- /docs/assets/subplat-strapi-subgroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/subplat-strapi-subgroup.png -------------------------------------------------------------------------------- /docs/assets/tracing/fxa-otel-system-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/fxa-otel-system-diagram.png -------------------------------------------------------------------------------- /docs/assets/tracing/fxa-tracing-system-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/fxa-tracing-system-diagram.png -------------------------------------------------------------------------------- /docs/assets/tracing/tracing-gcp-filter-by-method.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/tracing-gcp-filter-by-method.png -------------------------------------------------------------------------------- /docs/assets/tracing/tracing-gcp-filter-by-target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/tracing-gcp-filter-by-target.png -------------------------------------------------------------------------------- /docs/assets/tracing/tracing-gcp-log-viewer-trace-slice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/tracing-gcp-log-viewer-trace-slice.png -------------------------------------------------------------------------------- /docs/assets/tracing/tracing-gcp-search-by-trace-id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/tracing-gcp-search-by-trace-id.png -------------------------------------------------------------------------------- /docs/assets/tracing/tracing-gcp-trace-logs-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/tracing-gcp-trace-logs-view.png -------------------------------------------------------------------------------- /docs/assets/tracing/tracing-jaeger-full-trace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/tracing-jaeger-full-trace.png -------------------------------------------------------------------------------- /docs/assets/tracing/tracing-jaeger-graph-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/tracing-jaeger-graph-view.png -------------------------------------------------------------------------------- /docs/assets/tracing/tracing-jaeger-graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/tracing-jaeger-graph.png -------------------------------------------------------------------------------- /docs/assets/tracing/tracing-jaeger-select-service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/tracing-jaeger-select-service.png -------------------------------------------------------------------------------- /docs/assets/tracing/tracing-jaeger-sys-arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/tracing-jaeger-sys-arch.png -------------------------------------------------------------------------------- /docs/assets/tracing/tracing-jaeger-traces.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/docs/assets/tracing/tracing-jaeger-traces.png -------------------------------------------------------------------------------- /docs/explanation/architectural-decision-records.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Architectural Decision Records 3 | --- 4 | 5 | FxA records major architectural decisions in an [ADR][about] format. An ADR is needed whenever there are multiple viable options to pursue that will require a significant engineering effort. Please find FxA ADRs in the FxA repository: 6 | * https://github.com/mozilla/fxa/blob/main/docs/adr 7 | 8 | Before we used ADRs, we also archived our feature design documentation. It's still available online as well: 9 | * https://github.com/mozilla/fxa-archive/tree/master/features 10 | 11 | [about]: https://adr.github.io/ 12 | -------------------------------------------------------------------------------- /docs/gql-api/api/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Api 2 | position: 1 3 | className: graphql-markdown-api-section 4 | link: null 5 | collapsible: false 6 | collapsed: false 7 | -------------------------------------------------------------------------------- /docs/gql-api/api/directives/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Directives 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/api/directives/include.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: include 3 | title: include 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Directs the executor to include this field or fragment only when the `if` argument is true. 43 | 44 | 45 | ```graphql 46 | directive @include( 47 | if: Boolean! 48 | ) on 49 | | FIELD 50 | | FRAGMENT_SPREAD 51 | | INLINE_FRAGMENT 52 | ``` 53 | 54 | 55 | 56 | 57 | ### Arguments 58 | 59 | #### [include.if](#)[`Boolean!`](/gql-api/types/scalars/boolean) 60 | > 61 | > 62 | > Included when true. 63 | > 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /docs/gql-api/api/directives/skip.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: skip 3 | title: skip 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Directs the executor to skip this field or fragment when the `if` argument is true. 43 | 44 | 45 | ```graphql 46 | directive @skip( 47 | if: Boolean! 48 | ) on 49 | | FIELD 50 | | FRAGMENT_SPREAD 51 | | INLINE_FRAGMENT 52 | ``` 53 | 54 | 55 | 56 | 57 | ### Arguments 58 | 59 | #### [skip.if](#)[`Boolean!`](/gql-api/types/scalars/boolean) 60 | > 61 | > 62 | > Skipped when true. 63 | > 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /docs/gql-api/api/mutations/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Mutations 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/api/mutations/delete-avatar.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: delete-avatar 3 | title: deleteAvatar 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Delete the avatar. 43 | 44 | 45 | ```graphql 46 | deleteAvatar( 47 | input: DeleteAvatarInput! 48 | ): BasicPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [deleteAvatar.input](#)[`DeleteAvatarInput!`](/gql-api/types/inputs/delete-avatar-input) 57 | > 58 | > 59 | > 60 | > 61 | 62 | ### Type 63 | 64 | #### [`BasicPayload`](/gql-api/types/objects/basic-payload) 65 | > 66 | > 67 | > 68 | > 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /docs/gql-api/api/mutations/metrics-opt.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: metrics-opt 3 | title: metricsOpt 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Set the metrics opt in or out state 43 | 44 | 45 | ```graphql 46 | metricsOpt( 47 | input: MetricsOptInput! 48 | ): BasicPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [metricsOpt.input](#)[`MetricsOptInput!`](/gql-api/types/inputs/metrics-opt-input) 57 | > 58 | > 59 | > 60 | > 61 | 62 | ### Type 63 | 64 | #### [`BasicPayload`](/gql-api/types/objects/basic-payload) 65 | > 66 | > 67 | > 68 | > 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /docs/gql-api/api/mutations/sign-in.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: sign-in 3 | title: signIn 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Call auth-server to sign in an account 43 | 44 | 45 | ```graphql 46 | signIn( 47 | input: SignInInput! 48 | ): SignedInAccountPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [signIn.input](#)[`SignInInput!`](/gql-api/types/inputs/sign-in-input) 57 | > 58 | > 59 | > 60 | > 61 | 62 | ### Type 63 | 64 | #### [`SignedInAccountPayload`](/gql-api/types/objects/signed-in-account-payload) 65 | > 66 | > 67 | > 68 | > 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /docs/gql-api/api/mutations/sign-up.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: sign-up 3 | title: SignUp 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Call auth-server to sign up an account 43 | 44 | 45 | ```graphql 46 | SignUp( 47 | input: SignUpInput! 48 | ): SignedUpAccountPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [SignUp.input](#)[`SignUpInput!`](/gql-api/types/inputs/sign-up-input) 57 | > 58 | > 59 | > 60 | > 61 | 62 | ### Type 63 | 64 | #### [`SignedUpAccountPayload`](/gql-api/types/objects/signed-up-account-payload) 65 | > 66 | > 67 | > 68 | > 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /docs/gql-api/api/queries/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Queries 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/api/queries/account.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: account 3 | title: account 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | account: Account 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Account`](/gql-api/types/objects/account) 55 | > 56 | > 57 | > The current authenticated user's Firefox Account record. 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/queries/get-legal-doc.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: get-legal-doc 3 | title: getLegalDoc 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | getLegalDoc( 47 | input: LegalInput! 48 | ): LegalDoc! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [getLegalDoc.input](#)[`LegalInput!`](/gql-api/types/inputs/legal-input) 57 | > 58 | > 59 | > 60 | > 61 | 62 | ### Type 63 | 64 | #### [`LegalDoc`](/gql-api/types/objects/legal-doc) 65 | > 66 | > 67 | > 68 | > 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /docs/gql-api/api/queries/session-status.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: session-status 3 | title: sessionStatus 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | sessionStatus: SessionStatus! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`SessionStatus`](/gql-api/types/objects/session-status) 55 | > 56 | > 57 | > Session status 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/queries/session.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: session 3 | title: session 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | session: Session! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Session`](/gql-api/types/objects/session) 55 | > 56 | > 57 | > Session (token) info 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Subscriptions 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/cancel-at-period-end.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: cancel-at-period-end 3 | title: cancelAtPeriodEnd 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | cancelAtPeriodEnd: Boolean! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Boolean`](/gql-api/types/scalars/boolean) 55 | > 56 | > 57 | > The `Boolean` scalar type represents `true` or `false`. 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/created.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: created 3 | title: created 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | created: Float 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Float`](/gql-api/types/scalars/float) 55 | > 56 | > 57 | > The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/current-period-end.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: current-period-end 3 | title: currentPeriodEnd 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | currentPeriodEnd: Float! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Float`](/gql-api/types/scalars/float) 55 | > 56 | > 57 | > The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/current-period-start.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: current-period-start 3 | title: currentPeriodStart 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | currentPeriodStart: Float! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Float`](/gql-api/types/scalars/float) 55 | > 56 | > 57 | > The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/end-at.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: end-at 3 | title: endAt 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | endAt: Float! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Float`](/gql-api/types/scalars/float) 55 | > 56 | > 57 | > The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/latest-invoice.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: latest-invoice 3 | title: latestInvoice 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | latestInvoice: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string) 55 | > 56 | > 57 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/plan-id.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: plan-id 3 | title: planId 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | planId: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string) 55 | > 56 | > 57 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/product-id.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: product-id 3 | title: productId 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | productId: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string) 55 | > 56 | > 57 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/product-name.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: product-name 3 | title: productName 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | productName: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string) 55 | > 56 | > 57 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/status.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: status 3 | title: status 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | status: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string) 55 | > 56 | > 57 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/api/subscriptions/subscription-id.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: subscription-id 3 | title: subscriptionId 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | subscriptionId: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string) 55 | > 56 | > 57 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 58 | > 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/directives/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Directives 2 | link: null 3 | -------------------------------------------------------------------------------- /docs/gql-api/directives/include.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: include 3 | title: include 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | Directs the executor to include this field or fragment only when the `if` argument is true. 42 | 43 | 44 | ```graphql 45 | directive @include( 46 | if: Boolean! 47 | ) on 48 | | FIELD 49 | | FRAGMENT_SPREAD 50 | | INLINE_FRAGMENT 51 | ``` 52 | 53 | 54 | 55 | 56 | ### Arguments 57 | 58 | #### [include.if](#)[`Boolean!`](/gql-api/scalars/boolean) 59 | > 60 | > 61 | > Included when true. 62 | > 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /docs/gql-api/directives/skip.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: skip 3 | title: skip 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | Directs the executor to skip this field or fragment when the `if` argument is true. 42 | 43 | 44 | ```graphql 45 | directive @skip( 46 | if: Boolean! 47 | ) on 48 | | FIELD 49 | | FRAGMENT_SPREAD 50 | | INLINE_FRAGMENT 51 | ``` 52 | 53 | 54 | 55 | 56 | ### Arguments 57 | 58 | #### [skip.if](#)[`Boolean!`](/gql-api/scalars/boolean) 59 | > 60 | > 61 | > Skipped when true. 62 | > 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /docs/gql-api/directives/specified-by.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: specified-by 3 | title: specifiedBy 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | Exposes a URL that specifies the behavior of this scalar. 42 | 43 | 44 | ```graphql 45 | directive @specifiedBy( 46 | url: String! 47 | ) on SCALAR 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Arguments 54 | 55 | #### [specifiedBy.url](#)[`String!`](/gql-api/scalars/string) 56 | > 57 | > 58 | > The URL that specifies the behavior of this scalar. 59 | > 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /docs/gql-api/enums/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Enums 2 | position: 1 3 | link: null 4 | -------------------------------------------------------------------------------- /docs/gql-api/generated.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: schema 3 | slug: /gql-api 4 | title: Schema Documentation 5 | sidebar_position: 1 6 | hide_table_of_contents: true 7 | pagination_next: null 8 | pagination_prev: null 9 | sidebar_class_name: navbar__toggle 10 | --- 11 | 12 | This documentation has been automatically generated from the GraphQL schema. 13 | 14 | Use the docs in the sidebar to find out how to use the schema: 15 | 16 | - **Allowed operations**: queries and mutations. 17 | - **Schema-defined types**: scalars, objects, enums, interfaces, unions, and input objects. 18 | 19 | Generated on 5/16/2025, 8:08:21 AM. 20 | -------------------------------------------------------------------------------- /docs/gql-api/inputs/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Inputs 2 | link: null 3 | -------------------------------------------------------------------------------- /docs/gql-api/inputs/basic-mutation-input.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: basic-mutation-input 3 | title: BasicMutationInput 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | input BasicMutationInput { 46 | clientMutationId: String 47 | } 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Fields 54 | 55 | #### [BasicMutationInput.clientMutationId](#)[`String`](/gql-api/scalars/string) 56 | > 57 | > 58 | > A unique identifier for the client performing the mutation. 59 | > 60 | 61 | 62 | 63 | ### Member of 64 | 65 | [`resendVerifyCode`](/gql-api/mutations/resend-verify-code) 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/inputs/cart-id-input.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: cart-id-input 3 | title: CartIdInput 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | input CartIdInput { 46 | id: String! 47 | } 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Fields 54 | 55 | #### [CartIdInput.id](#)[`String!`](/gql-api/scalars/string) 56 | > 57 | > 58 | > Cart ID 59 | > 60 | 61 | 62 | 63 | ### Member of 64 | 65 | [`checkoutCart`](/gql-api/mutations/checkout-cart) [`restartCart`](/gql-api/mutations/restart-cart) 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/inputs/change-recovery-codes-input.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: change-recovery-codes-input 3 | title: ChangeRecoveryCodesInput 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | input ChangeRecoveryCodesInput { 46 | clientMutationId: String 47 | } 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Fields 54 | 55 | #### [ChangeRecoveryCodesInput.clientMutationId](#)[`String`](/gql-api/scalars/string) 56 | > 57 | > 58 | > A unique identifier for the client performing the mutation. 59 | > 60 | 61 | 62 | 63 | ### Member of 64 | 65 | [`changeRecoveryCodes`](/gql-api/mutations/change-recovery-codes) 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/inputs/delete-recovery-key-input.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: delete-recovery-key-input 3 | title: DeleteRecoveryKeyInput 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | input DeleteRecoveryKeyInput { 46 | clientMutationId: String 47 | } 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Fields 54 | 55 | #### [DeleteRecoveryKeyInput.clientMutationId](#)[`String`](/gql-api/scalars/string) 56 | > 57 | > 58 | > A unique identifier for the client performing the mutation. 59 | > 60 | 61 | 62 | 63 | ### Member of 64 | 65 | [`deleteRecoveryKey`](/gql-api/mutations/delete-recovery-key) 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/inputs/delete-totp-input.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: delete-totp-input 3 | title: DeleteTotpInput 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | input DeleteTotpInput { 46 | clientMutationId: String 47 | } 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Fields 54 | 55 | #### [DeleteTotpInput.clientMutationId](#)[`String`](/gql-api/scalars/string) 56 | > 57 | > 58 | > A unique identifier for the client performing the mutation. 59 | > 60 | 61 | 62 | 63 | ### Member of 64 | 65 | [`deleteTotp`](/gql-api/mutations/delete-totp) 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/inputs/destroy-session-input.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: destroy-session-input 3 | title: DestroySessionInput 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | input DestroySessionInput { 46 | clientMutationId: String 47 | } 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Fields 54 | 55 | #### [DestroySessionInput.clientMutationId](#)[`String`](/gql-api/scalars/string) 56 | > 57 | > 58 | > A unique identifier for the client performing the mutation. 59 | > 60 | 61 | 62 | 63 | ### Member of 64 | 65 | [`destroySession`](/gql-api/mutations/destroy-session) 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/mutations/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Mutations 2 | link: null 3 | -------------------------------------------------------------------------------- /docs/gql-api/mutations/delete-avatar.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: delete-avatar 3 | title: deleteAvatar 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | Delete the avatar. 42 | 43 | 44 | ```graphql 45 | deleteAvatar( 46 | input: DeleteAvatarInput! 47 | ): BasicPayload! 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Arguments 54 | 55 | #### [deleteAvatar.input](#)[`DeleteAvatarInput!`](/gql-api/inputs/delete-avatar-input) 56 | > 57 | > 58 | > 59 | > 60 | 61 | ### Type 62 | 63 | #### [`BasicPayload`](/gql-api/objects/basic-payload) 64 | > 65 | > 66 | > 67 | > 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /docs/gql-api/mutations/delete-totp.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: delete-totp 3 | title: deleteTotp 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | Deletes the current TOTP token for the user. 42 | 43 | 44 | ```graphql 45 | deleteTotp( 46 | input: DeleteTotpInput! 47 | ): BasicPayload! 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Arguments 54 | 55 | #### [deleteTotp.input](#)[`DeleteTotpInput!`](/gql-api/inputs/delete-totp-input) 56 | > 57 | > 58 | > 59 | > 60 | 61 | ### Type 62 | 63 | #### [`BasicPayload`](/gql-api/objects/basic-payload) 64 | > 65 | > 66 | > 67 | > 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /docs/gql-api/mutations/metrics-opt.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: metrics-opt 3 | title: metricsOpt 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | Set the metrics opt in or out state 42 | 43 | 44 | ```graphql 45 | metricsOpt( 46 | input: MetricsOptInput! 47 | ): BasicPayload! 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Arguments 54 | 55 | #### [metricsOpt.input](#)[`MetricsOptInput!`](/gql-api/inputs/metrics-opt-input) 56 | > 57 | > 58 | > 59 | > 60 | 61 | ### Type 62 | 63 | #### [`BasicPayload`](/gql-api/objects/basic-payload) 64 | > 65 | > 66 | > 67 | > 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /docs/gql-api/mutations/sign-in.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: sign-in 3 | title: signIn 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | Call auth-server to sign in an account 42 | 43 | 44 | ```graphql 45 | signIn( 46 | input: SignInInput! 47 | ): SignedInAccountPayload! 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Arguments 54 | 55 | #### [signIn.input](#)[`SignInInput!`](/gql-api/inputs/sign-in-input) 56 | > 57 | > 58 | > 59 | > 60 | 61 | ### Type 62 | 63 | #### [`SignedInAccountPayload`](/gql-api/objects/signed-in-account-payload) 64 | > 65 | > 66 | > 67 | > 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /docs/gql-api/mutations/sign-up.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: sign-up 3 | title: SignUp 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | Call auth-server to sign up an account 42 | 43 | 44 | ```graphql 45 | SignUp( 46 | input: SignUpInput! 47 | ): SignedUpAccountPayload! 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Arguments 54 | 55 | #### [SignUp.input](#)[`SignUpInput!`](/gql-api/inputs/sign-up-input) 56 | > 57 | > 58 | > 59 | > 60 | 61 | ### Type 62 | 63 | #### [`SignedUpAccountPayload`](/gql-api/objects/signed-up-account-payload) 64 | > 65 | > 66 | > 67 | > 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /docs/gql-api/mutations/verify-code.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: verify-code 3 | title: verifyCode 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | Verify a OTP code. 42 | 43 | 44 | ```graphql 45 | verifyCode( 46 | input: SessionVerifyCodeInput! 47 | ): BasicPayload! 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Arguments 54 | 55 | #### [verifyCode.input](#)[`SessionVerifyCodeInput!`](/gql-api/inputs/session-verify-code-input) 56 | > 57 | > 58 | > 59 | > 60 | 61 | ### Type 62 | 63 | #### [`BasicPayload`](/gql-api/objects/basic-payload) 64 | > 65 | > 66 | > 67 | > 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /docs/gql-api/objects/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Objects 2 | link: null 3 | -------------------------------------------------------------------------------- /docs/gql-api/objects/account-status-payload.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: account-status-payload 3 | title: AccountStatusPayload 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | type AccountStatusPayload { 46 | exists: Boolean! 47 | } 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Fields 54 | 55 | #### [AccountStatusPayload.exists](#)[`Boolean!`](/gql-api/scalars/boolean) 56 | > 57 | > 58 | > Whether or not the account exists 59 | > 60 | 61 | 62 | 63 | ### Returned by 64 | 65 | [`accountStatus`](/gql-api/queries/account-status) 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/objects/legal-doc.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: legal-doc 3 | title: LegalDoc 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | type LegalDoc { 46 | markdown: String! 47 | } 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Fields 54 | 55 | #### [LegalDoc.markdown](#)[`String!`](/gql-api/scalars/string) 56 | > 57 | > 58 | > Document in markdown format 59 | > 60 | 61 | 62 | 63 | ### Returned by 64 | 65 | [`getLegalDoc`](/gql-api/queries/get-legal-doc) 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/objects/recovery-key-bundle-payload.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: recovery-key-bundle-payload 3 | title: RecoveryKeyBundlePayload 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | type RecoveryKeyBundlePayload { 46 | recoveryData: String! 47 | } 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Fields 54 | 55 | #### [RecoveryKeyBundlePayload.recoveryData](#)[`String!`](/gql-api/scalars/string) 56 | > 57 | > 58 | > 59 | > 60 | 61 | 62 | 63 | ### Returned by 64 | 65 | [`getRecoveryKeyBundle`](/gql-api/queries/get-recovery-key-bundle) 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/objects/session.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: session 3 | title: Session 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | Session (token) info 42 | 43 | 44 | ```graphql 45 | type Session { 46 | verified: Boolean! 47 | } 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Fields 54 | 55 | #### [Session.verified](#)[`Boolean!`](/gql-api/scalars/boolean) 56 | > 57 | > 58 | > Whether the current session is verified 59 | > 60 | 61 | 62 | 63 | ### Returned by 64 | 65 | [`session`](/gql-api/queries/session) 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/operations/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Operations 2 | position: 1 3 | className: graphql-markdown-api-section 4 | link: null 5 | collapsible: false 6 | collapsed: false 7 | -------------------------------------------------------------------------------- /docs/gql-api/operations/directives/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Directives 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/operations/directives/include.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: include 3 | title: include 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Directs the executor to include this field or fragment only when the `if` argument is true. 43 | 44 | 45 | ```graphql 46 | directive @include( 47 | if: Boolean! 48 | ) on 49 | | FIELD 50 | | FRAGMENT_SPREAD 51 | | INLINE_FRAGMENT 52 | ``` 53 | 54 | 55 | 56 | 57 | ### Arguments 58 | 59 | #### [include.if](#)[`Boolean!`](/gql-api/types/scalars/boolean.mdx) 60 | Included when true. 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/operations/directives/skip.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: skip 3 | title: skip 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Directs the executor to skip this field or fragment when the `if` argument is true. 43 | 44 | 45 | ```graphql 46 | directive @skip( 47 | if: Boolean! 48 | ) on 49 | | FIELD 50 | | FRAGMENT_SPREAD 51 | | INLINE_FRAGMENT 52 | ``` 53 | 54 | 55 | 56 | 57 | ### Arguments 58 | 59 | #### [skip.if](#)[`Boolean!`](/gql-api/types/scalars/boolean.mdx) 60 | Skipped when true. 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /docs/gql-api/operations/mutations/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Mutations 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/operations/mutations/account-reset.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: account-reset 3 | title: accountReset 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Resets an account 43 | 44 | 45 | ```graphql 46 | accountReset( 47 | input: AccountResetInput! 48 | ): AccountResetPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [accountReset.input](#)[`AccountResetInput!`](/gql-api/types/inputs/account-reset-input.mdx) 57 | 58 | 59 | 60 | ### Type 61 | 62 | #### [`AccountResetPayload`](/gql-api/types/objects/account-reset-payload.mdx) 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /docs/gql-api/operations/mutations/delete-avatar.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: delete-avatar 3 | title: deleteAvatar 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Delete the avatar. 43 | 44 | 45 | ```graphql 46 | deleteAvatar( 47 | input: DeleteAvatarInput! 48 | ): BasicPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [deleteAvatar.input](#)[`DeleteAvatarInput!`](/gql-api/types/inputs/delete-avatar-input.mdx) 57 | 58 | 59 | 60 | ### Type 61 | 62 | #### [`BasicPayload`](/gql-api/types/objects/basic-payload.mdx) 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /docs/gql-api/operations/mutations/delete-totp.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: delete-totp 3 | title: deleteTotp 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Deletes the current TOTP token for the user. 43 | 44 | 45 | ```graphql 46 | deleteTotp( 47 | input: DeleteTotpInput! 48 | ): BasicPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [deleteTotp.input](#)[`DeleteTotpInput!`](/gql-api/types/inputs/delete-totp-input.mdx) 57 | 58 | 59 | 60 | ### Type 61 | 62 | #### [`BasicPayload`](/gql-api/types/objects/basic-payload.mdx) 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /docs/gql-api/operations/mutations/destroy-session.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: destroy-session 3 | title: destroySession 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Logs out the current session 43 | 44 | 45 | ```graphql 46 | destroySession( 47 | input: DestroySessionInput! 48 | ): BasicPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [destroySession.input](#)[`DestroySessionInput!`](/gql-api/types/inputs/destroy-session-input.mdx) 57 | 58 | 59 | 60 | ### Type 61 | 62 | #### [`BasicPayload`](/gql-api/types/objects/basic-payload.mdx) 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /docs/gql-api/operations/mutations/metrics-opt.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: metrics-opt 3 | title: metricsOpt 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Set the metrics opt in or out state 43 | 44 | 45 | ```graphql 46 | metricsOpt( 47 | input: MetricsOptInput! 48 | ): BasicPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [metricsOpt.input](#)[`MetricsOptInput!`](/gql-api/types/inputs/metrics-opt-input.mdx) 57 | 58 | 59 | 60 | ### Type 61 | 62 | #### [`BasicPayload`](/gql-api/types/objects/basic-payload.mdx) 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /docs/gql-api/operations/mutations/sign-in.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: sign-in 3 | title: signIn 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Call auth-server to sign in an account 43 | 44 | 45 | ```graphql 46 | signIn( 47 | input: SignInInput! 48 | ): SignedInAccountPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [signIn.input](#)[`SignInInput!`](/gql-api/types/inputs/sign-in-input.mdx) 57 | 58 | 59 | 60 | ### Type 61 | 62 | #### [`SignedInAccountPayload`](/gql-api/types/objects/signed-in-account-payload.mdx) 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /docs/gql-api/operations/mutations/sign-up.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: sign-up 3 | title: SignUp 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Call auth-server to sign up an account 43 | 44 | 45 | ```graphql 46 | SignUp( 47 | input: SignUpInput! 48 | ): SignedUpAccountPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [SignUp.input](#)[`SignUpInput!`](/gql-api/types/inputs/sign-up-input.mdx) 57 | 58 | 59 | 60 | ### Type 61 | 62 | #### [`SignedUpAccountPayload`](/gql-api/types/objects/signed-up-account-payload.mdx) 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /docs/gql-api/operations/mutations/verify-code.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: verify-code 3 | title: verifyCode 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Verify a OTP code. 43 | 44 | 45 | ```graphql 46 | verifyCode( 47 | input: SessionVerifyCodeInput! 48 | ): BasicPayload! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [verifyCode.input](#)[`SessionVerifyCodeInput!`](/gql-api/types/inputs/session-verify-code-input.mdx) 57 | 58 | 59 | 60 | ### Type 61 | 62 | #### [`BasicPayload`](/gql-api/types/objects/basic-payload.mdx) 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /docs/gql-api/operations/queries/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Queries 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/operations/queries/account.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: account 3 | title: account 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | account: Account 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Account`](/gql-api/types/objects/account.mdx) 55 | The current authenticated user's Firefox Account record. 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/queries/get-legal-doc.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: get-legal-doc 3 | title: getLegalDoc 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | getLegalDoc( 47 | input: LegalInput! 48 | ): LegalDoc! 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [getLegalDoc.input](#)[`LegalInput!`](/gql-api/types/inputs/legal-input.mdx) 57 | 58 | 59 | 60 | ### Type 61 | 62 | #### [`LegalDoc`](/gql-api/types/objects/legal-doc.mdx) 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /docs/gql-api/operations/queries/session-status.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: session-status 3 | title: sessionStatus 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | sessionStatus: SessionStatus! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`SessionStatus`](/gql-api/types/objects/session-status.mdx) 55 | Session status 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/queries/session.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: session 3 | title: session 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | session: Session! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Session`](/gql-api/types/objects/session.mdx) 55 | Session (token) info 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Subscriptions 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/cancel-at-period-end.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: cancel-at-period-end 3 | title: cancelAtPeriodEnd 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | cancelAtPeriodEnd: Boolean! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Boolean`](/gql-api/types/scalars/boolean.mdx) 55 | The `Boolean` scalar type represents `true` or `false`. 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/created.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: created 3 | title: created 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | created: Float 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Float`](/gql-api/types/scalars/float.mdx) 55 | The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/current-period-end.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: current-period-end 3 | title: currentPeriodEnd 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | currentPeriodEnd: Float! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Float`](/gql-api/types/scalars/float.mdx) 55 | The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/current-period-start.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: current-period-start 3 | title: currentPeriodStart 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | currentPeriodStart: Float! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Float`](/gql-api/types/scalars/float.mdx) 55 | The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/end-at.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: end-at 3 | title: endAt 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | endAt: Float! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`Float`](/gql-api/types/scalars/float.mdx) 55 | The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/latest-invoice.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: latest-invoice 3 | title: latestInvoice 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | latestInvoice: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string.mdx) 55 | The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/plan-id.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: plan-id 3 | title: planId 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | planId: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string.mdx) 55 | The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/product-id.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: product-id 3 | title: productId 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | productId: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string.mdx) 55 | The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/product-name.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: product-name 3 | title: productName 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | productName: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string.mdx) 55 | The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/status.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: status 3 | title: status 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | status: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string.mdx) 55 | The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/operations/subscriptions/subscription-id.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: subscription-id 3 | title: subscriptionId 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | subscriptionId: String! 47 | ``` 48 | 49 | 50 | 51 | 52 | ### Type 53 | 54 | #### [`String`](/gql-api/types/scalars/string.mdx) 55 | The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/gql-api/queries/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Queries 2 | link: null 3 | -------------------------------------------------------------------------------- /docs/gql-api/queries/account.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: account 3 | title: account 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | account: Account 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`Account`](/gql-api/objects/account) 54 | > 55 | > 56 | > The current authenticated user's Firefox Account record. 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/queries/cart.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: cart 3 | title: cart 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | cart: Cart 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`Cart`](/gql-api/objects/cart) 54 | > 55 | > 56 | > The Cart associated with a customer Subscription Platform checkout 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/queries/get-legal-doc.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: get-legal-doc 3 | title: getLegalDoc 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | getLegalDoc( 46 | input: LegalInput! 47 | ): LegalDoc! 48 | ``` 49 | 50 | 51 | 52 | 53 | ### Arguments 54 | 55 | #### [getLegalDoc.input](#)[`LegalInput!`](/gql-api/inputs/legal-input) 56 | > 57 | > 58 | > 59 | > 60 | 61 | ### Type 62 | 63 | #### [`LegalDoc`](/gql-api/objects/legal-doc) 64 | > 65 | > 66 | > 67 | > 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /docs/gql-api/queries/session-status.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: session-status 3 | title: sessionStatus 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | sessionStatus: SessionStatus! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`SessionStatus`](/gql-api/objects/session-status) 54 | > 55 | > 56 | > Session status 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/queries/session.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: session 3 | title: session 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | session: Session! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`Session`](/gql-api/objects/session) 54 | > 55 | > 56 | > Session (token) info 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/scalars/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Scalars 2 | link: null 3 | -------------------------------------------------------------------------------- /docs/gql-api/scalars/id.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: id 3 | title: ID 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. 42 | 43 | 44 | ```graphql 45 | scalar ID 46 | ``` 47 | 48 | 49 | 50 | 51 | 52 | 53 | ### Member of 54 | 55 | [`Account`](/gql-api/objects/account) 56 | 57 | -------------------------------------------------------------------------------- /docs/gql-api/sidebar-schema.js: -------------------------------------------------------------------------------- 1 | 2 | /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ 3 | 4 | module.exports = { 5 | "schemaSidebar": [ 6 | { 7 | "type": "autogenerated", 8 | "dirName": "gql-api" 9 | } 10 | ] 11 | }; 12 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Subscriptions 2 | link: null 3 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/cancel-at-period-end.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: cancel-at-period-end 3 | title: cancelAtPeriodEnd 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | cancelAtPeriodEnd: Boolean! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`Boolean`](/gql-api/scalars/boolean) 54 | > 55 | > 56 | > The `Boolean` scalar type represents `true` or `false`. 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/created.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: created 3 | title: created 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | created: Float 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`Float`](/gql-api/scalars/float) 54 | > 55 | > 56 | > The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/current-period-end.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: current-period-end 3 | title: currentPeriodEnd 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | currentPeriodEnd: Float! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`Float`](/gql-api/scalars/float) 54 | > 55 | > 56 | > The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/current-period-start.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: current-period-start 3 | title: currentPeriodStart 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | currentPeriodStart: Float! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`Float`](/gql-api/scalars/float) 54 | > 55 | > 56 | > The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/end-at.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: end-at 3 | title: endAt 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | endAt: Float! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`Float`](/gql-api/scalars/float) 54 | > 55 | > 56 | > The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/latest-invoice.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: latest-invoice 3 | title: latestInvoice 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | latestInvoice: String! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`String`](/gql-api/scalars/string) 54 | > 55 | > 56 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/plan-id.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: plan-id 3 | title: planId 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | planId: String! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`String`](/gql-api/scalars/string) 54 | > 55 | > 56 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/product-id.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: product-id 3 | title: productId 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | productId: String! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`String`](/gql-api/scalars/string) 54 | > 55 | > 56 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/product-name.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: product-name 3 | title: productName 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | productName: String! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`String`](/gql-api/scalars/string) 54 | > 55 | > 56 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/status.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: status 3 | title: status 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | status: String! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`String`](/gql-api/scalars/string) 54 | > 55 | > 56 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/subscriptions/subscription-id.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: subscription-id 3 | title: subscriptionId 4 | hide_table_of_contents: false 5 | --- 6 | 7 | 8 | export const Bullet = () => <> ●  9 | 10 | export const SpecifiedBy = (props) => <>Specification 11 | 12 | export const Badge = (props) => <>{props.text} 13 | 14 | import { useState } from 'react'; 15 | 16 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 17 | const [open, setOpen] = useState(startOpen); 18 | return ( 19 |
20 | { 22 | e.preventDefault(); 23 | setOpen((open) => !open); 24 | }} 25 | style={{ listStyle:'none' }} 26 | > 27 | {open ? dataOpen : dataClose} 28 | 29 | {open && children} 30 |
31 | ); 32 | }; 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | No description 42 | 43 | 44 | ```graphql 45 | subscriptionId: String! 46 | ``` 47 | 48 | 49 | 50 | 51 | ### Type 52 | 53 | #### [`String`](/gql-api/scalars/string) 54 | > 55 | > 56 | > The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. 57 | > 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/gql-api/types/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Types 2 | position: 1 3 | className: graphql-markdown-api-section 4 | link: null 5 | collapsible: false 6 | collapsed: false 7 | -------------------------------------------------------------------------------- /docs/gql-api/types/directives/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Directives 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/types/directives/one-of.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: one-of 3 | title: oneOf 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Indicates exactly one field must be supplied and this field must not be `null`. 43 | 44 | 45 | ```graphql 46 | directive @oneOf on INPUT_OBJECT 47 | ``` 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /docs/gql-api/types/directives/specified-by.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: specified-by 3 | title: specifiedBy 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Exposes a URL that specifies the behavior of this scalar. 43 | 44 | 45 | ```graphql 46 | directive @specifiedBy( 47 | url: String! 48 | ) on SCALAR 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Arguments 55 | 56 | #### [specifiedBy.url](#)[`String!`](/gql-api/types/scalars/string.mdx) 57 | The URL that specifies the behavior of this scalar. 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /docs/gql-api/types/inputs/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Inputs 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/types/inputs/basic-mutation-input.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: basic-mutation-input 3 | title: BasicMutationInput 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | input BasicMutationInput { 47 | clientMutationId: String 48 | } 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Fields 55 | 56 | #### [BasicMutationInput.clientMutationId](#)[`String`](/gql-api/types/scalars/string.mdx) 57 | A unique identifier for the client performing the mutation. 58 | 59 | 60 | 61 | 62 | 63 | 64 | ### Member Of 65 | 66 | [`resendVerifyCode`](/gql-api/operations/mutations/resend-verify-code.mdx) 67 | 68 | -------------------------------------------------------------------------------- /docs/gql-api/types/inputs/delete-totp-input.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: delete-totp-input 3 | title: DeleteTotpInput 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | input DeleteTotpInput { 47 | clientMutationId: String 48 | } 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Fields 55 | 56 | #### [DeleteTotpInput.clientMutationId](#)[`String`](/gql-api/types/scalars/string.mdx) 57 | A unique identifier for the client performing the mutation. 58 | 59 | 60 | 61 | 62 | 63 | 64 | ### Member Of 65 | 66 | [`deleteTotp`](/gql-api/operations/mutations/delete-totp.mdx) 67 | 68 | -------------------------------------------------------------------------------- /docs/gql-api/types/inputs/destroy-session-input.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: destroy-session-input 3 | title: DestroySessionInput 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | input DestroySessionInput { 47 | clientMutationId: String 48 | } 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Fields 55 | 56 | #### [DestroySessionInput.clientMutationId](#)[`String`](/gql-api/types/scalars/string.mdx) 57 | A unique identifier for the client performing the mutation. 58 | 59 | 60 | 61 | 62 | 63 | 64 | ### Member Of 65 | 66 | [`destroySession`](/gql-api/operations/mutations/destroy-session.mdx) 67 | 68 | -------------------------------------------------------------------------------- /docs/gql-api/types/objects/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Objects 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/types/objects/account-status-payload.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: account-status-payload 3 | title: AccountStatusPayload 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | type AccountStatusPayload { 47 | exists: Boolean! 48 | } 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Fields 55 | 56 | #### [AccountStatusPayload.exists](#)[`Boolean!`](/gql-api/types/scalars/boolean.mdx) 57 | Whether or not the account exists 58 | 59 | 60 | 61 | 62 | 63 | 64 | ### Returned By 65 | 66 | [`accountStatus`](/gql-api/operations/queries/account-status.mdx) 67 | 68 | -------------------------------------------------------------------------------- /docs/gql-api/types/objects/legal-doc.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: legal-doc 3 | title: LegalDoc 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | No description 43 | 44 | 45 | ```graphql 46 | type LegalDoc { 47 | markdown: String! 48 | } 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Fields 55 | 56 | #### [LegalDoc.markdown](#)[`String!`](/gql-api/types/scalars/string.mdx) 57 | Document in markdown format 58 | 59 | 60 | 61 | 62 | 63 | 64 | ### Returned By 65 | 66 | [`getLegalDoc`](/gql-api/operations/queries/get-legal-doc.mdx) 67 | 68 | -------------------------------------------------------------------------------- /docs/gql-api/types/objects/session.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: session 3 | title: Session 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Session (token) info 43 | 44 | 45 | ```graphql 46 | type Session { 47 | verified: Boolean! 48 | } 49 | ``` 50 | 51 | 52 | 53 | 54 | ### Fields 55 | 56 | #### [Session.verified](#)[`Boolean!`](/gql-api/types/scalars/boolean.mdx) 57 | Whether the current session is verified 58 | 59 | 60 | 61 | 62 | 63 | 64 | ### Returned By 65 | 66 | [`session`](/gql-api/operations/queries/session.mdx) 67 | 68 | -------------------------------------------------------------------------------- /docs/gql-api/types/scalars/_category_.yml: -------------------------------------------------------------------------------- 1 | label: Scalars 2 | position: 1 3 | link: null 4 | collapsible: true 5 | collapsed: true 6 | -------------------------------------------------------------------------------- /docs/gql-api/types/scalars/id.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | id: id 3 | title: ID 4 | --- 5 | 6 | 7 | 8 | 9 | export const Bullet = () => <> ●  10 | 11 | export const SpecifiedBy = (props) => <>Specification 12 | 13 | export const Badge = (props) => <>{props.text} 14 | 15 | import { useState } from 'react'; 16 | 17 | export const Details = ({ dataOpen, dataClose, children, startOpen = false }) => { 18 | const [open, setOpen] = useState(startOpen); 19 | return ( 20 |
21 | { 23 | e.preventDefault(); 24 | setOpen((open) => !open); 25 | }} 26 | style={{ listStyle:'none' }} 27 | > 28 | {open ? dataOpen : dataClose} 29 | 30 | {open && children} 31 |
32 | ); 33 | }; 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. 43 | 44 | 45 | ```graphql 46 | scalar ID 47 | ``` 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | ### Member Of 57 | 58 | [`Account`](/gql-api/types/objects/account.mdx) 59 | 60 | -------------------------------------------------------------------------------- /docs/how-tos/connecting-to-a-local-mysql-db.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Connecting to a local MySQL DB 3 | --- 4 | 5 | FxA has several databases, for example `fxa`, `fxa_profile` and `pushbox`. Sometimes changes need to be made to a database, or it is helpful to read local data for development. 6 | 7 | **Prerequisites** 8 | 9 | - FxA running locally 10 | - Docker 11 | - [mysql CLI](https://dev.mysql.com/doc/refman/en/mysql.html) 12 | - If using the `mysql-client` option below, this can be installed via Homebrew with `brew install mysql-client`. 13 | 14 | **Steps** 15 | 16 | Execute an interactive shell on the MySQL DB container and start the MySQL shell: 17 | 18 | ```shell 19 | yarn mysql 20 | ``` 21 | 22 | OR 23 | 24 | Start the MySQL shell through the MySQL client: 25 | 26 | ```shell 27 | mysql -uroot --host=127.0.0.1 --port=3306 28 | ``` 29 | 30 | Note: `mysql` is located in the `mysql-client` installation directory, e.g. at `/usr/local/opt/mysql-client/bin/mysql`. 31 | -------------------------------------------------------------------------------- /docs/how-tos/creating-an-account-locally.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Creating an Account Locally 3 | --- 4 | 5 | Once you've got FxA running locally you'll probably want to create an account that you can use for development and testing purposes. This process can be done almost exactly like you would in production: 6 | 7 | 1. Visit the [root page](http://localhost:3030/), which should ask you to enter your email. Enter the email you want to use for the account. 8 | 9 | If you're taken to `/signin` you can just click "Use a different account" to return to the email field. 10 | 1. Fill out the next form with your password and age, then click "Create account". 11 | 1. You'll be taken to a page asking you to enter a verification code. From your terminal run `yarn pm2 logs inbox`, which will have the most recent verification code. Copy this code into the form field and click "Verify". 12 | 13 | ![Terminal preview of inbox service](../assets/logs-inbox-signin.png) 14 | 15 | If you'd rather receive the actual verification code email instead of using the terminal, check out how to [use MailDev](local-emails-with-maildev) for local emails. 16 | 1. That's it! You'll be taken to `/settings` with the message "Account verified successfully" appearing along the top. 17 | -------------------------------------------------------------------------------- /docs/how-tos/local-emails-with-maildev.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Local Emails with MailDev 3 | --- 4 | 5 | If you're interested in receiving emails locally you can use [MailDev](https://www.npmjs.com/package/maildev) to intercept emails and display them in a local inbox. 6 | 7 | :::important 8 | MailDev is handy to verify that emails look as expected. However, functional tests that rely on email require the inbox service and will fail if MailDev is on. 9 | ::: 10 | 11 | 1. Install the MailDev CLI globally: 12 | 13 | ```shell 14 | npm i -g maildev 15 | ``` 16 | 17 | 1. Assuming you have FxA running locally you'll need to stop the `inbox` service: 18 | 19 | ```shell 20 | yarn pm2 stop inbox 21 | ``` 22 | 23 | 1. Start MailDev on port 9999. You may need to start it with `sudo` permissions: 24 | 25 | ```shell 26 | sudo maildev -s 9999 27 | ``` 28 | 29 | 1. All emails will now be sent to the local inbox, which you can access at [http://localhost:1080](http://localhost:1080) 30 | 31 | ![MailDev inbox preview](../assets/maildev-inbox.png) 32 | -------------------------------------------------------------------------------- /docs/reference/browser-support.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Browser Support 3 | --- 4 | 5 | Mozilla accounts is required to work in at least the following environments: 6 | 7 | - Firefox Desktop ESR - 1 8 | - Firefox for Android ESR - 1 9 | - Latest versions of modern browsers: [Chrome](https://www.google.com/chrome/index.html), [Safari](https://www.apple.com/safari/), [Opera](https://www.opera.com/), [Edge](https://www.microsoft.com/en-us/edge) 10 | - Latest version of [Firefox for iOS](https://apps.apple.com/us/app/firefox-private-safe-browser/id989804926) and iOS Web View 11 | - Latest version of [Firefox for Android](https://play.google.com/store/apps/details?id=org.mozilla.firefox) and Android WebView 12 | -------------------------------------------------------------------------------- /docs/reference/canceling-subscriptions-to-plan.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Canceling Subscriptions to Plan 3 | --- 4 | 5 | Last updated: June 2024 6 | 7 | In order to cancel a plan with active subscriptions, SubPlat engineers will need to collaborate with the SRE and Support teams. 8 | 9 | After creating test data, request SRE to run the `cancel-subscriptions-to-plan` script in `fxa-auth-server` and for the stdout, stderr, and csv outputs via Wormhole. At this time, the script cancels active subscriptions and refunds Stripe subscriptions only; the refund portion does not work for PayPal subscriptions and Support will need to manually refund them. 10 | 11 | The command to run the script is as follows: 12 | 13 | ``` 14 | node -r esbuild-register scripts/cancel-subscriptions-to-plan.ts -r 10 -p --refund 15 | ``` 16 | 17 | - ``: the Stripe Price ID of the plan with active subscriptions 18 | - `-r`: rate limit 19 | 20 | :::note 21 | Stripe's rate limit is 10 requests per second on Stage, and 100 requests per second on Prod (but we should use less to allow for other prod traffic) 22 | ::: 23 | 24 | SRE can add the `--dry-run` flag to see what will be generated. They may also need to add `esbuild-register` in the pod before running the script. During the previous sunset process, we attempted to run the command below; however, it failed due to new decorators. 25 | 26 | ``` 27 | npx tsx scripts/cancel-subscriptions-to-plan.ts -r 10 -p price_1NctsnKb9q6OnNsLRl5HMcCm --refund 28 | ``` 29 | -------------------------------------------------------------------------------- /docs/relying-parties/how-tos/end-to-end-encryption.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: end-to-end-encryption 3 | title: End-to-end encryption 4 | sidebar_label: End-to-end Encryption 5 | --- 6 | 7 | Mozilla accounts offers an end-to-end encryption support feature for OAuth reliers by deriving a strong encryption key from user's password. Keep in mind that Mozilla accounts does not provide a storage solution, it is up to you to use the generated key and encrypt the data with that key. 8 | 9 | ### WebExtensions 10 | 11 | To use this feature in WebExtensions you need to do the following: 12 | 13 | 1. [Register an OAuth client](https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Firefox_Accounts/Introduction#OAuth_2.0_API) and an OAuth app scope with Mozilla accounts 14 | 2. Install the [fxa-crypto-relier](https://github.com/mozilla/fxa-crypto-relier) library into your WebExtension 15 | 3. [Follow the documentation](https://github.com/mozilla/fxa-crypto-relier/tree/master/docs) to trigger the Mozilla accounts login screen 16 | 4. Consume the derived key after the successful login 17 | 18 | ### Examples 19 | 20 | You can find an example of this feature in the [TestPilot Notes source code](https://github.com/mozilla/notes/blob/5be89e52956182e57356b7ba9102d57cdb72be6f/src/background.js#L53-L72). Here's a simplified diagram of a scoped key generated for a WebExtension: 21 | 22 | ![](https://www.lucidchart.com/publicSegments/view/53ce9405-4ab6-481f-b8fe-0d47c0d29723/image.jpeg) 23 | 24 | An example of a key generated by Mozilla accounts: 25 | 26 | ![](https://i.imgur.com/GdXHWVu.jpg) 27 | 28 | The generated key can be imported using existing WebCrypto APIs: 29 | 30 | ``` 31 | function shared_key(key) { 32 | return crypto.subtle.importKey( 33 | 'jwk', 34 | { kty: key.kty, k: key.k.replace(/=/, '') }, 35 | 'AES-KW', 36 | true, 37 | ['wrapKey', 'unwrapKey'] 38 | ); 39 | } 40 | ``` -------------------------------------------------------------------------------- /static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/.nojekyll -------------------------------------------------------------------------------- /static/diagrams/data_catalog_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/data_catalog_example.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-AccountAuthenticationSystemLandscape-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-AccountAuthenticationSystemLandscape-key.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-AccountAuthenticationSystemLandscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-AccountAuthenticationSystemLandscape.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-AccountSystemLandscape-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-AccountSystemLandscape-key.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-AccountSystemLandscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-AccountSystemLandscape.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-Containers-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-Containers-key.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-Containers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-Containers.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-ContainersPaymentSystem2_5-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-ContainersPaymentSystem2_5-key.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-ContainersPaymentSystem2_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-ContainersPaymentSystem2_5.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-ContainersPaymentSystem3-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-ContainersPaymentSystem3-key.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-ContainersPaymentSystem3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-ContainersPaymentSystem3.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-EventBrokerSystem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-EventBrokerSystem.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-PaymentSystemLandscape-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-PaymentSystemLandscape-key.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-PaymentSystemLandscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-PaymentSystemLandscape.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-SendTab-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-SendTab-key.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-SendTab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-SendTab.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-SystemLandscape-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-SystemLandscape-key.png -------------------------------------------------------------------------------- /static/diagrams/structurizr-1-SystemLandscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/diagrams/structurizr-1-SystemLandscape.png -------------------------------------------------------------------------------- /static/fonts/Inter-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/fonts/Inter-Bold.woff -------------------------------------------------------------------------------- /static/fonts/Inter-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/fonts/Inter-Bold.woff2 -------------------------------------------------------------------------------- /static/fonts/Inter-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/fonts/Inter-Regular.woff -------------------------------------------------------------------------------- /static/fonts/Inter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/fonts/Inter-Regular.woff2 -------------------------------------------------------------------------------- /static/fonts/Metropolis-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/fonts/Metropolis-Bold.woff -------------------------------------------------------------------------------- /static/fonts/Metropolis-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/fonts/Metropolis-Bold.woff2 -------------------------------------------------------------------------------- /static/fonts/Metropolis-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/fonts/Metropolis-Regular.woff -------------------------------------------------------------------------------- /static/fonts/Metropolis-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/fonts/Metropolis-Regular.woff2 -------------------------------------------------------------------------------- /static/img/firefox-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla/ecosystem-platform/9df52965a425af54b8a77ac71c3ede418dfecd15/static/img/firefox-logo.png -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // This file is not used in compilation. It is here just for a nice editor experience. 3 | "extends": "@tsconfig/docusaurus/tsconfig.json", 4 | "compilerOptions": { 5 | "baseUrl": "." 6 | } 7 | } 8 | --------------------------------------------------------------------------------